From 8908a686d248176b4c9a839ff538e1e513421f6b Mon Sep 17 00:00:00 2001 From: MarinaGryphon Date: Fri, 5 Nov 2021 08:43:07 -0500 Subject: [PATCH 0001/1518] Convert a lot of improper noun names to lowercase --- .../mob/living/simple_animal/friendly/corgi.dm | 2 +- .../modules/reagents/reagent_containers/condiment.dm | 2 +- code/modules/reagents/reagent_containers/dropper.dm | 2 +- code/modules/reagents/reagent_containers/syringes.dm | 12 ++++++------ 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 3e3ea1df273..ef3b57dbc73 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -101,7 +101,7 @@ return /obj/item/chems/food/meat/corgi - name = "Corgi meat" + name = "corgi meat" desc = "Tastes like... well you know..." /mob/living/simple_animal/corgi/attackby(var/obj/item/O, var/mob/user) //Marker -Agouri diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index 30256ef845d..f2d5ecd8083 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -6,7 +6,7 @@ //Food items that aren't eaten normally and leave an empty container behind. /obj/item/chems/condiment - name = "Condiment Container" + name = "condiment container" desc = "Just your average condiment container." icon = 'icons/obj/food.dmi' icon_state = "emptycondiment" diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index aa41d31786a..6335e3fda49 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -2,7 +2,7 @@ /// Droppers. //////////////////////////////////////////////////////////////////////////////// /obj/item/chems/dropper - name = "Dropper" + name = "dropper" desc = "A small glass tube with a bulbous rubber blister on one end. Used to drop very precise amounts of reagents between vessels." icon = 'icons/obj/items/chem/dropper.dmi' icon_state = "dropper0" diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index ca083ea0f41..e2c593e964d 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -313,7 +313,7 @@ update_icon() /obj/item/chems/syringe/ld50_syringe - name = "Lethal Injection Syringe" + name = "lethal injection syringe" desc = "A syringe used for lethal injections." amount_per_transfer_from_this = 60 volume = 60 @@ -341,7 +341,7 @@ //////////////////////////////////////////////////////////////////////////////// /obj/item/chems/syringe/stabilizer - name = "Syringe (stabilizer)" + name = "syringe (stabilizer)" desc = "Contains stabilizer - for patients in danger of brain damage." /obj/item/chems/syringe/stabilizer/Initialize() @@ -351,7 +351,7 @@ update_icon() /obj/item/chems/syringe/antitoxin - name = "Syringe (anti-toxin)" + name = "syringe (anti-toxin)" desc = "Contains anti-toxins." /obj/item/chems/syringe/antitoxin/Initialize() @@ -361,7 +361,7 @@ update_icon() /obj/item/chems/syringe/antibiotic - name = "Syringe (antibiotics)" + name = "syringe (antibiotics)" desc = "Contains antibiotic agents." /obj/item/chems/syringe/antibiotic/Initialize() @@ -371,7 +371,7 @@ update_icon() /obj/item/chems/syringe/drugs - name = "Syringe (drugs)" + name = "syringe (drugs)" desc = "Contains aggressive drugs meant for torture." /obj/item/chems/syringe/drugs/Initialize() @@ -383,7 +383,7 @@ update_icon() /obj/item/chems/syringe/steroid - name = "Syringe (anabolic steroids)" + name = "syringe (anabolic steroids)" desc = "Contains drugs for muscle growth." /obj/item/chems/syringe/steroid/Initialize() From 303d25b323182da3c2ff55a09e602e479224b78f Mon Sep 17 00:00:00 2001 From: MarinaGryphon Date: Fri, 5 Nov 2021 15:43:52 -0500 Subject: [PATCH 0002/1518] Converts more names to lowercase --- code/game/machinery/OpTable.dm | 2 +- code/game/machinery/biogenerator.dm | 2 +- code/game/machinery/bodyscanner_display.dm | 2 +- code/game/machinery/cryopod.dm | 4 ++-- code/game/machinery/floodlight.dm | 4 +--- code/game/objects/items/weapons/staff.dm | 2 +- code/modules/atmospherics/pipes.dm | 16 +++++++-------- code/modules/awaymissions/exile.dm | 2 +- code/modules/clothing/head/helmet.dm | 2 +- .../clothing/spacesuits/miscellaneous.dm | 2 +- code/modules/clothing/suits/wiz_robe.dm | 18 ++++++++--------- code/modules/clothing/under/jobs/security.dm | 12 +++++------ .../integrated_electronics/subtypes/input.dm | 8 ++++---- code/modules/paperwork/photography.dm | 2 +- .../xenoarcheaology/tools/equipment.dm | 20 +++++++++---------- maps/away/unishi/unishi.dm | 4 ++-- .../government/away_sites/icarus/icarus.dm | 2 +- 17 files changed, 51 insertions(+), 53 deletions(-) diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 27736d8c7e1..453853de469 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -1,5 +1,5 @@ /obj/machinery/optable - name = "Operating Table" + name = "operating table" desc = "Used for advanced medical procedures." icon = 'icons/obj/surgery.dmi' icon_state = "table2-idle" diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index 4bf64a002cd..cfd2185c4be 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -5,7 +5,7 @@ #define BG_EMPTY 4 /obj/machinery/biogenerator - name = "Biogenerator" + name = "biogenerator" desc = "" icon = 'icons/obj/biogenerator.dmi' icon_state = "biogen-stand" diff --git a/code/game/machinery/bodyscanner_display.dm b/code/game/machinery/bodyscanner_display.dm index 9107ca349f8..229d61dcc7a 100644 --- a/code/game/machinery/bodyscanner_display.dm +++ b/code/game/machinery/bodyscanner_display.dm @@ -1,5 +1,5 @@ /obj/machinery/body_scan_display - name = "Body Scan Display" + name = "body scan display" desc = "A wall-mounted display linked to a body scanner." icon = 'icons/obj/modular_computers/modular_telescreen.dmi' icon_state = "operating" diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index cd40f066a19..b43e449d089 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -116,12 +116,12 @@ . = TOPIC_REFRESH /obj/item/stock_parts/circuitboard/cryopodcontrol - name = "Circuit board (Cryogenic Oversight Console)" + name = "circuit board (Cryogenic Oversight Console)" build_path = /obj/machinery/computer/cryopod origin_tech = "{'programming':3}" /obj/item/stock_parts/circuitboard/robotstoragecontrol - name = "Circuit board (Robotic Storage Console)" + name = "circuit board (Robotic Storage Console)" build_path = /obj/machinery/computer/cryopod/robot origin_tech = "{'programming':3}" diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index 7989b701d3f..69fac1b1b6c 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -1,7 +1,5 @@ -//these are probably broken - /obj/machinery/floodlight - name = "Emergency Floodlight" + name = "emergency floodlight" icon = 'icons/obj/machines/floodlight.dmi' icon_state = "flood00" density = 1 diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm index bb4b88baf71..30980179554 100644 --- a/code/game/objects/items/weapons/staff.dm +++ b/code/game/objects/items/weapons/staff.dm @@ -17,7 +17,7 @@ icon_state = "broom" /obj/item/staff/gentcane - name = "Gentlemans Cane" + name = "gentleman's cane" desc = "An ebony can with an ivory tip." icon = 'icons/obj/items/cane.dmi' icon_state = "cane" diff --git a/code/modules/atmospherics/pipes.dm b/code/modules/atmospherics/pipes.dm index 2df4e480c46..cc543a3cf16 100644 --- a/code/modules/atmospherics/pipes.dm +++ b/code/modules/atmospherics/pipes.dm @@ -273,7 +273,7 @@ level = 2 /obj/machinery/atmospherics/pipe/simple/visible/scrubbers - name = "Scrubbers pipe" + name = "scrubbers pipe" desc = "A one meter section of scrubbers pipe." icon_state = "11-scrubbers" connect_types = CONNECT_TYPE_SCRUBBER @@ -281,7 +281,7 @@ color = PIPE_COLOR_RED /obj/machinery/atmospherics/pipe/simple/visible/supply - name = "Air supply pipe" + name = "air supply pipe" desc = "A one meter section of supply pipe." icon_state = "11-supply" connect_types = CONNECT_TYPE_SUPPLY @@ -307,7 +307,7 @@ color = PIPE_COLOR_BLUE /obj/machinery/atmospherics/pipe/simple/visible/fuel - name = "Fuel pipe" + name = "fuel pipe" color = PIPE_COLOR_ORANGE maximum_pressure = 420*ONE_ATMOSPHERE fatigue_pressure = 350*ONE_ATMOSPHERE @@ -319,7 +319,7 @@ alpha = 128 //set for the benefit of mapping - this is reset to opaque when the pipe is spawned in game /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers - name = "Scrubbers pipe" + name = "scrubbers pipe" desc = "A one meter section of scrubbers pipe." icon_state = "11-scrubbers" connect_types = CONNECT_TYPE_SCRUBBER @@ -327,7 +327,7 @@ color = PIPE_COLOR_RED /obj/machinery/atmospherics/pipe/simple/hidden/supply - name = "Air supply pipe" + name = "air supply pipe" desc = "A one meter section of supply pipe." icon_state = "11-supply" connect_types = CONNECT_TYPE_SUPPLY @@ -353,7 +353,7 @@ color = PIPE_COLOR_BLUE /obj/machinery/atmospherics/pipe/simple/hidden/fuel - name = "Fuel pipe" + name = "fuel pipe" color = PIPE_COLOR_ORANGE maximum_pressure = 420*ONE_ATMOSPHERE fatigue_pressure = 350*ONE_ATMOSPHERE @@ -435,7 +435,7 @@ color = PIPE_COLOR_BLUE /obj/machinery/atmospherics/pipe/manifold/visible/fuel - name = "Fuel pipe manifold" + name = "fuel pipe manifold" color = PIPE_COLOR_ORANGE connect_types = CONNECT_TYPE_FUEL @@ -479,7 +479,7 @@ color = PIPE_COLOR_BLUE /obj/machinery/atmospherics/pipe/manifold/hidden/fuel - name = "Fuel pipe manifold" + name = "fuel pipe manifold" color = PIPE_COLOR_ORANGE connect_types = CONNECT_TYPE_FUEL diff --git a/code/modules/awaymissions/exile.dm b/code/modules/awaymissions/exile.dm index c3529aa0104..51e98d91008 100644 --- a/code/modules/awaymissions/exile.dm +++ b/code/modules/awaymissions/exile.dm @@ -17,7 +17,7 @@ return dat /obj/item/implantcase/exile - name = "Glass Case- 'Exile'" + name = "glass case - 'Exile'" desc = "A case containing an exile implant." icon_state = "implantcase-r" imp = /obj/item/implant/exile diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 22d64a1d8d5..c658a85a3c3 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -171,7 +171,7 @@ siemens_coefficient = 1 /obj/item/clothing/head/helmet/augment - name = "Augment Array" + name = "augment array" desc = "A helmet with optical and cranial augments coupled to it." icon = 'icons/clothing/head/armor/augment.dmi' valid_accessory_slots = null diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 48bfafb480d..e37955054ba 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -5,7 +5,7 @@ flash_protection = FLASH_PROTECTION_NONE /obj/item/clothing/suit/space/emergency - name = "Emergency Softsuit" + name = "emergency softsuit" icon = 'icons/clothing/spacesuit/emergency/suit.dmi' desc = "A thin, ungainly softsuit colored in blaze orange for rescuers to easily locate, looks pretty fragile." diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 4f85ac206ba..13811a42acf 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -20,20 +20,20 @@ body_parts_covered = SLOT_HEAD|SLOT_FACE /obj/item/clothing/head/wizard/marisa - name = "Witch Hat" + name = "witch hat" desc = "Strange-looking hat-wear, makes you want to cast fireballs." icon = 'icons/clothing/head/wizard/marisa.dmi' siemens_coefficient = 0.8 /obj/item/clothing/head/wizard/magus - name = "Magus Helm" + name = "magus helm" desc = "A mysterious helmet that hums with an unearthly power." icon = 'icons/clothing/head/wizard/magus.dmi' siemens_coefficient = 0.8 body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES /obj/item/clothing/head/wizard/cap - name = "Gentlemans Cap" + name = "gentleman's cap" desc = "A checkered gray flat cap woven together with the rarest of threads." icon = 'icons/clothing/head/flatcap.dmi' siemens_coefficient = 0.8 @@ -63,18 +63,18 @@ icon = 'icons/clothing/suit/wizard/red.dmi' /obj/item/clothing/suit/wizrobe/marisa - name = "Witch Robe" + name = "witch robe" desc = "Magic is all about the spell power, ZE!" icon = 'icons/clothing/suit/wizard/marisa.dmi' /obj/item/clothing/suit/wizrobe/magusblue - name = "Magus Robe" + name = "magus robe" desc = "A set of armoured robes that seem to radiate a dark power." icon = 'icons/clothing/suit/wizard/magusblue.dmi' body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_HANDS|SLOT_LEGS|SLOT_FEET /obj/item/clothing/suit/wizrobe/magusred - name = "Magus Robe" + name = "magus robe" desc = "A set of armoured robes that seem to radiate a dark power." icon = 'icons/clothing/suit/wizard/magusred.dmi' body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_HANDS|SLOT_LEGS|SLOT_FEET @@ -86,7 +86,7 @@ gender = PLURAL /obj/item/clothing/suit/wizrobe/gentlecoat - name = "Gentlemans Coat" + name = "gentleman's coat" desc = "A heavy threaded tweed gray jacket. For a different sort of Gentleman." icon = 'icons/clothing/suit/wizard/gentleman.dmi' body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS @@ -99,13 +99,13 @@ siemens_coefficient = 1.0 /obj/item/clothing/head/wizard/marisa/fake - name = "Witch Hat" + name = "witch hat" desc = "Strange-looking hat-wear, makes you want to cast fireballs." armor = null siemens_coefficient = 1.0 /obj/item/clothing/suit/wizrobe/marisa/fake - name = "Witch Robe" + name = "witch robe" desc = "Magic is all about the spell power, ZE!" body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS armor = null diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index e783e434230..7f33d391bd5 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -102,7 +102,7 @@ icon = 'icons/clothing/head/detective.dmi' color = "#725443" armor = list( - melee = ARMOR_MELEE_RESISTANT, + melee = ARMOR_MELEE_RESISTANT, laser = ARMOR_LASER_SMALL, energy = ARMOR_ENERGY_MINOR ) @@ -144,7 +144,7 @@ origin_tech = "{'materials':1,'engineering':1, 'combat':1}" /obj/item/clothing/head/HoS - name = "Head of Security Hat" + name = "Head of Security hat" desc = "The hat of the Head of Security. For showing the officers who's in charge." icon = 'icons/clothing/head/hos.dmi' body_parts_covered = 0 @@ -157,10 +157,10 @@ icon = 'icons/clothing/suit/hos.dmi' body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS armor = list( - melee = ARMOR_MELEE_MAJOR, - bullet = ARMOR_BALLISTIC_PISTOL, - laser = ARMOR_LASER_HANDGUNS, - energy = ARMOR_ENERGY_MINOR, + melee = ARMOR_MELEE_MAJOR, + bullet = ARMOR_BALLISTIC_PISTOL, + laser = ARMOR_LASER_HANDGUNS, + energy = ARMOR_ENERGY_MINOR, bomb = ARMOR_BOMB_PADDED ) flags_inv = HIDEJUMPSUIT diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 20cc4a5eb28..c2ea97beac7 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -363,7 +363,7 @@ activate_pin(2) /obj/item/integrated_circuit/input/turfpoint - name = "Tile pointer" + name = "tile pointer" desc = "This circuit will get a tile ref with the provided absolute coordinates." extended_desc = "If the machine cannot see the target, it will not be able to calculate the correct direction.\ This circuit only works while inside an assembly." @@ -1031,9 +1031,9 @@ power_draw_per_use = 40 var/list/mtypes = list( /decl/material/solid/metal/steel, - /decl/material/solid/metal/silver, - /decl/material/solid/metal/gold, - /decl/material/solid/gemstone/diamond, + /decl/material/solid/metal/silver, + /decl/material/solid/metal/gold, + /decl/material/solid/gemstone/diamond, /decl/material/solid/metal/uranium, /decl/material/solid/metal/plasteel, /decl/material/solid/metal/titanium, diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index c6da65ce65a..d783b48761f 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -105,7 +105,7 @@ var/global/photo_count = 0 * photo album * **************/ /obj/item/storage/photo_album - name = "Photo album" + name = "photo album" icon = 'icons/obj/photography.dmi' icon_state = "album" item_state = "briefcase" diff --git a/code/modules/xenoarcheaology/tools/equipment.dm b/code/modules/xenoarcheaology/tools/equipment.dm index c49948b3171..367c4eac061 100644 --- a/code/modules/xenoarcheaology/tools/equipment.dm +++ b/code/modules/xenoarcheaology/tools/equipment.dm @@ -1,11 +1,11 @@ /obj/item/clothing/suit/bio_suit/anomaly - name = "Anomaly suit" + name = "anomaly suit" desc = "A suit that protects against exotic alien energies and biological contamination." anomaly_shielding = 0.7 icon = 'icons/clothing/suit/biosuit/anomaly.dmi' /obj/item/clothing/head/bio_hood/anomaly - name = "Anomaly hood" + name = "anomaly hood" desc = "A hood that protects the head and face from exotic alien energies and biological contamination." icon = 'icons/clothing/head/biosuit/anomaly.dmi' anomaly_shielding = 0.3 @@ -15,10 +15,10 @@ desc = "A specially shielded voidsuit that insulates against some exotic alien energies, as well as the more mundane dangers of excavation." icon = 'icons/clothing/spacesuit/void/excavation/suit.dmi' armor = list( - melee = ARMOR_MELEE_RESISTANT, - energy = ARMOR_ENERGY_RESISTANT, - bomb = ARMOR_BOMB_PADDED, - bio = ARMOR_BIO_SHIELDED, + melee = ARMOR_MELEE_RESISTANT, + energy = ARMOR_ENERGY_RESISTANT, + bomb = ARMOR_BOMB_PADDED, + bio = ARMOR_BIO_SHIELDED, rad = ARMOR_RAD_SHIELDED ) anomaly_shielding = 0.6 @@ -29,10 +29,10 @@ desc = "A sophisticated voidsuit helmet, capable of protecting the wearer from many exotic alien energies." icon = 'icons/clothing/spacesuit/void/excavation/helmet.dmi' armor = list( - melee = ARMOR_MELEE_RESISTANT, - energy = ARMOR_ENERGY_RESISTANT, - bomb = ARMOR_BOMB_PADDED, - bio = ARMOR_BIO_SHIELDED, + melee = ARMOR_MELEE_RESISTANT, + energy = ARMOR_ENERGY_RESISTANT, + bomb = ARMOR_BOMB_PADDED, + bio = ARMOR_BIO_SHIELDED, rad = ARMOR_RAD_SHIELDED ) anomaly_shielding = 0.2 diff --git a/maps/away/unishi/unishi.dm b/maps/away/unishi/unishi.dm index bd2d660731e..0ecdfa99a11 100644 --- a/maps/away/unishi/unishi.dm +++ b/maps/away/unishi/unishi.dm @@ -88,11 +88,11 @@ /obj/structure/closet/crate/secure/large/supermatter/experimentalsm/WillContain() return list(/obj/machinery/power/supermatter/randomsample) /obj/item/paper/prof1 - name = "Error log" + name = "error log" info = " COMPUTER ID: 15231
Attempting recovery of document directory.
Three files recovered
Printing file (1/2)
... about your concerns. I told you that the shielding is strong enough to avoid ANY leaks of radiation or hazardous materials. The entire lab is 100% isolated from the ship in terms of even the air supply. Leave me and my students the fuck alone. Your job is to maintain the fucking reactor an !#@!dqma211.
File (2/3) Tested SM This thing has a lot of potential. It doesn't produce any measurable levels of gas, or even significant thermal signature. The potential is nearly limitless. We've had to fine tune our activation procedures as even a short beam of the emitter seems to activate this thing. CTI Engineering dept still won't fucking answer where they got this thing, but it's simply amazing. I've sent an ema #@^%da12k" /obj/item/paper/prof2 - name = "Error log" + name = "error log" info = " COMPUTER ID: 15131
Attempting recovery of document directory.
Three files recovered
Printing file (1/2)
Email to iodc@net
To whom it may concern,
I recieved your email today in regards to the research I am conducting. You have no legal right to question our research or attempt to block it. Per article 323, scientific research is protected information, that you have absolutely zero claim to. The compound is secret in composition, but I can fully promise you that it contains absolutely no proprietary molecules, and thus you have no claim whatsoever to it or the technologies to it. Your threats are laughable at best, and have been forwarded to CTI legal. Do not contact me aga!#!41asjw.
Printing file (2/2)
Email from fuckyou@12cmal
We have ways of making you comply. " /obj/machinery/computer/log_printer diff --git a/mods/content/government/away_sites/icarus/icarus.dm b/mods/content/government/away_sites/icarus/icarus.dm index 8fb0aa0eb5f..331a185df83 100644 --- a/mods/content/government/away_sites/icarus/icarus.dm +++ b/mods/content/government/away_sites/icarus/icarus.dm @@ -82,7 +82,7 @@ color = COLOR_GRAY40 label = "label_warning" /obj/item/paper/icarus/log - name = "Printed piece of paper" + name = "printed piece of paper" info = "\[LOG\]: Orbit stabilized. Next correction burst, est.: 2 hrs 12 m
\ \[LOG\]: Orbit stabiliztion. Announcing...
\ \[ANN\]: Attention all hands, SEV Icarus is stabilizing orbit in 30 seconds. Prepare for possible gravitational spikes.
\ From 8ce92d5c5696b6152ca062bb0513a5a57620af88 Mon Sep 17 00:00:00 2001 From: MarinaGryphon Date: Sun, 20 Mar 2022 15:25:00 -0500 Subject: [PATCH 0003/1518] Refactor get_access/get_id_card to use extensions --- code/datums/extensions/access_provider.dm | 18 +++++++++ code/game/jobs/access.dm | 47 ++++++++++++++--------- mods/species/ascent/items/id_control.dm | 22 +++++++---- nebula.dme | 1 + 4 files changed, 62 insertions(+), 26 deletions(-) create mode 100644 code/datums/extensions/access_provider.dm diff --git a/code/datums/extensions/access_provider.dm b/code/datums/extensions/access_provider.dm new file mode 100644 index 00000000000..f9f367c070e --- /dev/null +++ b/code/datums/extensions/access_provider.dm @@ -0,0 +1,18 @@ +/datum/extension/access_provider + base_type = /datum/extension/access_provider + expected_type = /atom/movable + var/list/atom/movable/registered_ids + +/datum/extension/access_provider/Destroy() + LAZYCLEARLIST(registered_ids) + . = ..() + +/datum/extension/access_provider/proc/register_id(atom/movable/to_register) + LAZYDISTINCTADD(registered_ids, to_register) + +/datum/extension/access_provider/proc/unregister_id(atom/movable/to_unregister) + LAZYREMOVE(registered_ids, to_unregister) + +/datum/extension/access_provider/proc/GetIdCards() + for(var/atom/movable/registered_id in registered_ids) + LAZYDISTINCTADD(., registered_id.GetIdCards()) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 2c15361663c..3e66f5214c0 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -7,14 +7,23 @@ return FALSE return check_access_list(M.GetAccess()) -/atom/movable/proc/GetAccess() +/atom/movable/proc/GetAccess(var/union = FALSE) . = list() - var/obj/item/card/id/id = GetIdCard() + if(union) + for(var/atom/movable/id in GetIdCards()) + . |= id.GetAccess() + return . + var/atom/movable/id = GetIdCard() if(id) - . += id.GetAccess() + . = id.GetAccess() /atom/movable/proc/GetIdCard() - return null + return LAZYACCESS(GetIdCards(), 1) + +/atom/movable/proc/GetIdCards() + var/datum/extension/access_provider/our_provider + if((our_provider = get_extension(src, /datum/extension/access_provider))) + LAZYDISTINCTADD(., our_provider.GetIdCards()) /atom/movable/proc/check_access(atom/movable/A) return check_access_list(A ? A.GetAccess() : list()) @@ -224,21 +233,21 @@ var/global/list/priv_region_access // Gets the ID card of a mob, but will not check types in the exceptions list /mob/living/carbon/human/GetIdCard(exceptions = null) - var/list/id_cards = get_held_items() - LAZYDISTINCTADD(id_cards, wear_id) - for(var/obj/item/I in id_cards) - if(is_type_in_list(I, exceptions)) - continue - var/obj/item/card/id = I ? I.GetIdCard() : null - if(istype(id)) - return id - -/mob/living/carbon/human/GetAccess() - . = list() - var/list/id_cards = get_held_items() - LAZYDISTINCTADD(id_cards, wear_id) - for(var/obj/item/I in id_cards) - . |= I.GetAccess() + return LAZYACCESS(GetIdCards(exceptions), 1) + +/mob/living/carbon/human/GetIdCards(exceptions = null) + . = ..() + var/list/candidates = get_held_items() + LAZYDISTINCTADD(candidates, wear_id) + for(var/atom/movable/candidate in candidates) + if(!candidate || is_type_in_list(candidate, exceptions)) + continue + var/obj/item/card/id/id_card = candidate?.GetIdCard() + if(istype(id_card)) + LAZYDISTINCTADD(., id_card) + +/mob/living/carbon/human/GetAccess(var/union = TRUE) + . = ..(union) /mob/living/silicon/GetIdCard() if(stat || (ckey && !client)) diff --git a/mods/species/ascent/items/id_control.dm b/mods/species/ascent/items/id_control.dm index dd52074677b..9c4b549a927 100644 --- a/mods/species/ascent/items/id_control.dm +++ b/mods/species/ascent/items/id_control.dm @@ -38,15 +38,19 @@ var/obj/item/card/id/id_card = /obj/item/card/id/ascent /obj/item/organ/internal/controller/do_install(mob/living/carbon/human/target, obj/item/organ/external/affected) - . = ..() - if(owner) - owner.set_id_info(id_card) - owner.add_language(/decl/language/mantid/worldnet) + if(!(. = ..()) || !owner) + return + var/datum/extension/access_provider/owner_access = get_or_create_extension(owner, /datum/extension/access_provider) + owner_access?.register_id(src) + owner?.set_id_info(id_card) + owner?.add_language(/decl/language/mantid/worldnet) /obj/item/organ/internal/controller/do_uninstall(in_place, detach, ignore_children) var/mob/living/carbon/H = owner + var/datum/extension/access_provider/owner_access = get_extension(owner, /datum/extension/access_provider) + owner_access?.unregister_id(src) . = ..() - if(istype(H) && H != owner && !(locate(type) in H.get_internal_organs())) + if(H && !(locate(type) in H.get_internal_organs())) H.remove_language(/decl/language/mantid/worldnet) /obj/item/organ/internal/controller/Initialize() @@ -59,6 +63,10 @@ if(damage < min_broken_damage) return id_card +/obj/item/organ/internal/controller/GetIdCards() + if(damage < min_broken_damage) + return list(id_card) + /obj/item/organ/internal/controller/GetAccess() - if(id_card && damage < min_broken_damage) - return id_card.GetAccess() + if(damage < min_broken_damage) + return id_card?.GetAccess() diff --git a/nebula.dme b/nebula.dme index c1a0ac5aa02..710846319ad 100644 --- a/nebula.dme +++ b/nebula.dme @@ -298,6 +298,7 @@ #include "code\datums\composite_sounds\_composite_sound.dm" #include "code\datums\composite_sounds\machinery_sounds.dm" #include "code\datums\extensions\_defines.dm" +#include "code\datums\extensions\access_provider.dm" #include "code\datums\extensions\deity_be_near.dm" #include "code\datums\extensions\event_registration.dm" #include "code\datums\extensions\extensions.dm" From 0b6a5136d17a0a2e55f3dc44545e0fb45554ae10 Mon Sep 17 00:00:00 2001 From: MarinaGryphon Date: Sun, 20 Mar 2022 20:56:21 -0500 Subject: [PATCH 0004/1518] Refactor radios to use radio provider extension --- code/datums/extensions/radio_provider.dm | 29 +++++++++ .../objects/items/devices/radio/headset.dm | 5 +- code/modules/mob/living/carbon/human/say.dm | 62 ++++++++----------- nebula.dme | 1 + 4 files changed, 60 insertions(+), 37 deletions(-) create mode 100644 code/datums/extensions/radio_provider.dm diff --git a/code/datums/extensions/radio_provider.dm b/code/datums/extensions/radio_provider.dm new file mode 100644 index 00000000000..850bf07ce55 --- /dev/null +++ b/code/datums/extensions/radio_provider.dm @@ -0,0 +1,29 @@ +/datum/extension/radio_provider + base_type = /datum/extension/radio_provider + expected_type = /atom/movable + var/list/atom/movable/registered_radios + +/datum/extension/radio_provider/Destroy() + LAZYCLEARLIST(registered_radios) + . = ..() + +/datum/extension/radio_provider/proc/register_radio(atom/movable/to_register) + LAZYDISTINCTADD(registered_radios, to_register) + +/datum/extension/radio_provider/proc/unregister_radio(atom/movable/to_unregister) + LAZYREMOVE(registered_radios, to_unregister) + +/datum/extension/radio_provider/proc/GetRadios(message_mode) + for(var/atom/movable/registered_radio in registered_radios) + LAZYDISTINCTADD(., registered_radio.GetRadios(message_mode)) + +/datum/extension/radio_provider/proc/GetRadio(message_mode) + return LAZYACCESS(GetRadios(message_mode), 1) + +/atom/movable/proc/GetRadios(message_mode) + var/datum/extension/radio_provider/radio_provider = get_extension(src, /datum/extension/radio_provider) + if(istype(radio_provider)) + return radio_provider.GetRadios(message_mode) + +/atom/movable/proc/GetRadio(message_mode) + return LAZYACCESS(GetRadios(message_mode), 1) \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 61ad3e9d55d..9127bac4145 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -23,9 +23,10 @@ /obj/item/radio/headset/Initialize() . = ..() internal_channels.Cut() - for(var/T in encryption_keys) + for(var/i in 1 to LAZYLEN(encryption_keys)) + var/T = encryption_keys[i] if(ispath(T)) - encryption_keys = new T(src) + encryption_keys[i] = new T(src) if(ks1type) encryption_keys += new ks1type(src) if(ks2type) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 359e9b504ee..143b345c8a5 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -125,60 +125,52 @@ . = ..(message_data) /mob/living/carbon/human/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) + var/use_mode = null switch(message_mode) if("intercom") - if(!src.restrained()) + if(!restrained()) for(var/obj/item/radio/I in view(1)) if(I.intercom_handling) - I.talk_into(src, message, null, verb, speaking) - I.add_fingerprint(src) used_radios += I if("headset") - if(l_ear && istype(l_ear,/obj/item/radio)) - var/obj/item/radio/R = l_ear - R.talk_into(src,message,null,verb,speaking) + if(istype(l_ear,/obj/item/radio)) used_radios += l_ear - else if(r_ear && istype(r_ear,/obj/item/radio)) - var/obj/item/radio/R = r_ear - R.talk_into(src,message,null,verb,speaking) + else if(istype(r_ear,/obj/item/radio)) used_radios += r_ear + else + used_radios += GetRadio("headset") if("right ear") - var/obj/item/radio/R - var/has_radio = 0 - if(r_ear && istype(r_ear,/obj/item/radio)) - R = r_ear - has_radio = 1 var/datum/inventory_slot/inv_slot = LAZYACCESS(held_item_slots, BP_R_HAND) - if(istype(inv_slot?.holding, /obj/item/radio)) - R = inv_slot.holding - has_radio = 1 - if(has_radio) - R.talk_into(src,message,null,verb,speaking) - used_radios += R + if(istype(r_ear,/obj/item/radio)) + used_radios += r_ear + else if(istype(inv_slot?.holding, /obj/item/radio)) + used_radios += inv_slot.holding + else + used_radios += GetRadio("right ear") if("left ear") - var/obj/item/radio/R - var/has_radio = 0 - if(l_ear && istype(l_ear,/obj/item/radio)) - R = l_ear - has_radio = 1 var/datum/inventory_slot/inv_slot = LAZYACCESS(held_item_slots, BP_L_HAND) - if(istype(inv_slot?.holding, /obj/item/radio)) - R = inv_slot.holding - has_radio = 1 - if(has_radio) - R.talk_into(src,message,null,verb,speaking) - used_radios += R + if(istype(l_ear,/obj/item/radio)) + used_radios += l_ear + else if(istype(inv_slot?.holding, /obj/item/radio)) + used_radios += inv_slot.holding + else + used_radios += GetRadio("left ear") if("whisper") //It's going to get sanitized again immediately, so decode. whisper_say(html_decode(message), speaking, alt_name) return 1 else if(message_mode) - if(l_ear && istype(l_ear,/obj/item/radio)) - l_ear.talk_into(src,message, message_mode, verb, speaking) + use_mode = message_mode + if(istype(l_ear,/obj/item/radio)) used_radios += l_ear - else if(r_ear && istype(r_ear,/obj/item/radio)) - r_ear.talk_into(src,message, message_mode, verb, speaking) + else if(istype(r_ear,/obj/item/radio)) used_radios += r_ear + else + used_radios += GetRadio() + + for(var/obj/item/radio in used_radios) + radio.add_fingerprint(src) + radio.talk_into(src,message,use_mode,verb,speaking) /mob/living/carbon/human/handle_speech_sound() if(species.speech_sounds && prob(species.speech_chance)) diff --git a/nebula.dme b/nebula.dme index 710846319ad..add7e306abf 100644 --- a/nebula.dme +++ b/nebula.dme @@ -310,6 +310,7 @@ #include "code\datums\extensions\lockable.dm" #include "code\datums\extensions\parts_stash.dm" #include "code\datums\extensions\penetration.dm" +#include "code\datums\extensions\radio_provider.dm" #include "code\datums\extensions\state_machine.dm" #include "code\datums\extensions\appearance\appearance.dm" #include "code\datums\extensions\appearance\base_icon_state.dm" From 2e79c33711a7ae25ba1c0536eaeb47473698c864 Mon Sep 17 00:00:00 2001 From: MarinaGryphon Date: Tue, 29 Mar 2022 09:11:41 -0500 Subject: [PATCH 0005/1518] Fix GetIdCard(s) indentation --- code/game/jobs/access.dm | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 3e66f5214c0..a24c133c1ae 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -233,18 +233,18 @@ var/global/list/priv_region_access // Gets the ID card of a mob, but will not check types in the exceptions list /mob/living/carbon/human/GetIdCard(exceptions = null) - return LAZYACCESS(GetIdCards(exceptions), 1) + return LAZYACCESS(GetIdCards(exceptions), 1) /mob/living/carbon/human/GetIdCards(exceptions = null) - . = ..() - var/list/candidates = get_held_items() - LAZYDISTINCTADD(candidates, wear_id) - for(var/atom/movable/candidate in candidates) - if(!candidate || is_type_in_list(candidate, exceptions)) - continue - var/obj/item/card/id/id_card = candidate?.GetIdCard() - if(istype(id_card)) - LAZYDISTINCTADD(., id_card) + . = ..() + var/list/candidates = get_held_items() + LAZYDISTINCTADD(candidates, wear_id) + for(var/atom/movable/candidate in candidates) + if(!candidate || is_type_in_list(candidate, exceptions)) + continue + var/obj/item/card/id/id_card = candidate?.GetIdCard() + if(istype(id_card)) + LAZYDISTINCTADD(., id_card) /mob/living/carbon/human/GetAccess(var/union = TRUE) . = ..(union) From 8da4bcc4839ae54347f36c6fbf1edb7597abbc3d Mon Sep 17 00:00:00 2001 From: jade-lavenza Date: Wed, 27 Apr 2022 09:54:04 -0500 Subject: [PATCH 0006/1518] Address suggestions from code review --- code/game/jobs/access.dm | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index a24c133c1ae..c1e466c641c 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -21,8 +21,8 @@ return LAZYACCESS(GetIdCards(), 1) /atom/movable/proc/GetIdCards() - var/datum/extension/access_provider/our_provider - if((our_provider = get_extension(src, /datum/extension/access_provider))) + var/datum/extension/access_provider/our_provider = get_extension(src, /datum/extension/access_provider) + if(our_provider) LAZYDISTINCTADD(., our_provider.GetIdCards()) /atom/movable/proc/check_access(atom/movable/A) @@ -238,13 +238,14 @@ var/global/list/priv_region_access /mob/living/carbon/human/GetIdCards(exceptions = null) . = ..() var/list/candidates = get_held_items() - LAZYDISTINCTADD(candidates, wear_id) + if(wear_id) + LAZYDISTINCTADD(candidates, wear_id) for(var/atom/movable/candidate in candidates) if(!candidate || is_type_in_list(candidate, exceptions)) continue - var/obj/item/card/id/id_card = candidate?.GetIdCard() - if(istype(id_card)) - LAZYDISTINCTADD(., id_card) + var/list/obj/item/card/id/id_cards = candidate.GetIdCards() + if(LAZYLEN(id_cards)) + LAZYDISTINCTADD(., id_cards) /mob/living/carbon/human/GetAccess(var/union = TRUE) . = ..(union) From 1070c855efe36e388893191ee50e092f7484d7a7 Mon Sep 17 00:00:00 2001 From: jade-lavenza Date: Wed, 27 Apr 2022 09:54:18 -0500 Subject: [PATCH 0007/1518] Refactor GetIdCards on certain subtypes --- code/game/jobs/access.dm | 26 ++++++++++++------- code/game/objects/items/weapons/cards_ids.dm | 3 +++ .../objects/items/weapons/storage/wallets.dm | 14 +++------- code/modules/mechs/mech.dm | 6 +++-- .../mob/living/simple_animal/crow/crow.dm | 6 +++-- code/modules/mob_holder/_holder.dm | 12 +++------ .../computers/modular_computer/core.dm | 5 ++-- mods/species/ascent/items/id_control.dm | 9 +++---- 8 files changed, 40 insertions(+), 41 deletions(-) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index c1e466c641c..2dc1752b02e 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -18,7 +18,8 @@ . = id.GetAccess() /atom/movable/proc/GetIdCard() - return LAZYACCESS(GetIdCards(), 1) + var/list/cards = GetIdCards() + return LAZYACCESS(cards, LAZYLEN(cards)) /atom/movable/proc/GetIdCards() var/datum/extension/access_provider/our_provider = get_extension(src, /datum/extension/access_provider) @@ -220,16 +221,19 @@ var/global/list/priv_region_access /mob/observer/ghost var/static/obj/item/card/id/all_access/ghost_all_access -/mob/observer/ghost/GetIdCard() - if(!is_admin(src)) - return +/mob/observer/ghost/GetIdCards() + . = ..() + if (!is_admin(src)) + return . - if(!ghost_all_access) + if (!ghost_all_access) ghost_all_access = new() - return ghost_all_access + LAZYDISTINCTADD(., ghost_all_access) -/mob/living/bot/GetIdCard() - return botcard +/mob/living/bot/GetIdCards() + . = ..() + if(istype(botcard)) + LAZYDISTINCTADD(., botcard) // Gets the ID card of a mob, but will not check types in the exceptions list /mob/living/carbon/human/GetIdCard(exceptions = null) @@ -250,10 +254,12 @@ var/global/list/priv_region_access /mob/living/carbon/human/GetAccess(var/union = TRUE) . = ..(union) -/mob/living/silicon/GetIdCard() +/mob/living/silicon/GetIdCards() + . = ..() if(stat || (ckey && !client)) return // Unconscious, dead or once possessed but now client-less silicons are not considered to have id access. - return idcard + if(istype(idcard)) + LAZYDISTINCTADD(., idcard) /proc/FindNameFromID(var/mob/M, var/missing_id_name = "Unknown") var/obj/item/card/id/C = M.GetIdCard() diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 1617f2e0543..8d497fab874 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -304,6 +304,9 @@ var/global/const/NO_EMAG_ACT = -50 /obj/item/card/id/GetIdCard() return src +/obj/item/card/id/GetIdCards() + return list(src) + /obj/item/card/id/verb/read() set name = "Read ID Card" set category = "Object" diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index 0ca60c4e1cf..001b0ec1917 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -88,20 +88,14 @@ tiny_image.appearance_flags = RESET_COLOR overlays += tiny_image -/obj/item/storage/wallet/GetIdCard() - return front_id +/obj/item/storage/wallet/GetIdCards() + . = ..() + if(istype(front_id)) + LAZYDISTINCTADD(., front_id) /obj/item/storage/wallet/GetChargeStick() return front_stick -/obj/item/storage/wallet/GetAccess() - var/obj/item/I = GetIdCard() - if(I) - return I.GetAccess() - else - return ..() - - /obj/item/storage/wallet/AltClick(mob/user) if (user != loc || user.incapacitated() || !ishuman(user)) return ..() diff --git a/code/modules/mechs/mech.dm b/code/modules/mechs/mech.dm index 41801061217..96e47b99775 100644 --- a/code/modules/mechs/mech.dm +++ b/code/modules/mechs/mech.dm @@ -210,8 +210,10 @@ /mob/living/exosuit/return_air() return (body && body.pilot_coverage >= 100 && hatch_closed && body.cockpit) ? body.cockpit : loc.return_air() -/mob/living/exosuit/GetIdCard() - return access_card +/mob/living/exosuit/GetIdCards() + . = ..() + if(istype(access_card)) + LAZYDISTINCTADD(., access_card) /mob/living/exosuit/set_dir() . = ..() diff --git a/code/modules/mob/living/simple_animal/crow/crow.dm b/code/modules/mob/living/simple_animal/crow/crow.dm index 7a90d3f6524..d4f1d7d1367 100644 --- a/code/modules/mob/living/simple_animal/crow/crow.dm +++ b/code/modules/mob/living/simple_animal/crow/crow.dm @@ -40,8 +40,10 @@ messenger_bag = new(src) update_icon() -/mob/living/simple_animal/crow/GetIdCard() - return access_card +/mob/living/simple_animal/crow/GetIdCards() + . = ..() + if (istype(access_card)) + LAZYDISTINCTADD(., access_card) /mob/living/simple_animal/crow/show_inv(var/mob/user) if(user.incapacitated()) diff --git a/code/modules/mob_holder/_holder.dm b/code/modules/mob_holder/_holder.dm index 286502ae7c9..c6db17b37f5 100644 --- a/code/modules/mob_holder/_holder.dm +++ b/code/modules/mob_holder/_holder.dm @@ -98,16 +98,10 @@ return loc.loc return ..() -/obj/item/holder/GetIdCard() +/obj/item/holder/GetIdCards() + . = ..() for(var/mob/M in contents) - var/obj/item/I = M.GetIdCard() - if(I) - return I - return null - -/obj/item/holder/GetAccess() - var/obj/item/I = GetIdCard() - return I ? I.GetAccess() : ..() + LAZYDISTINCTADD(., M.GetIdCards()) /obj/item/holder/attack_self() for(var/mob/M in contents) diff --git a/code/modules/modular_computers/computers/modular_computer/core.dm b/code/modules/modular_computers/computers/modular_computer/core.dm index 4c099ded936..db57f4d7399 100644 --- a/code/modules/modular_computers/computers/modular_computer/core.dm +++ b/code/modules/modular_computers/computers/modular_computer/core.dm @@ -123,11 +123,12 @@ if(user) ui_interact(user) -/obj/item/modular_computer/GetIdCard() +/obj/item/modular_computer/GetIdCards() + . = ..() var/datum/extension/assembly/assembly = get_extension(src, /datum/extension/assembly) var/obj/item/stock_parts/computer/card_slot/card_slot = assembly.get_component(PART_CARD) if(card_slot && card_slot.can_broadcast && istype(card_slot.stored_card) && card_slot.check_functionality()) - return card_slot.stored_card + LAZYDISTINCTADD(., card_slot.stored_card) /obj/item/modular_computer/GetChargeStick() var/datum/extension/assembly/assembly = get_extension(src, /datum/extension/assembly) diff --git a/mods/species/ascent/items/id_control.dm b/mods/species/ascent/items/id_control.dm index 9c4b549a927..e7a3b3c4f8a 100644 --- a/mods/species/ascent/items/id_control.dm +++ b/mods/species/ascent/items/id_control.dm @@ -58,14 +58,11 @@ id_card = new id_card(src) . = ..() -/obj/item/organ/internal/controller/GetIdCard() - //Not using is_broken() because it should be able to function when CUT_AWAY is set - if(damage < min_broken_damage) - return id_card - /obj/item/organ/internal/controller/GetIdCards() + . = ..() + //Not using is_broken() because it should be able to function when CUT_AWAY is set if(damage < min_broken_damage) - return list(id_card) + LAZYDISTINCTADD(., id_card) /obj/item/organ/internal/controller/GetAccess() if(damage < min_broken_damage) From 42f2d7396d9a4ef03238f33ee798289328a84871 Mon Sep 17 00:00:00 2001 From: jade-lavenza Date: Mon, 2 May 2022 17:25:06 -0500 Subject: [PATCH 0008/1518] Readd detached check in controller/do_install --- mods/species/ascent/items/id_control.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/species/ascent/items/id_control.dm b/mods/species/ascent/items/id_control.dm index eae13e8ea7e..55b68fc58d2 100644 --- a/mods/species/ascent/items/id_control.dm +++ b/mods/species/ascent/items/id_control.dm @@ -39,7 +39,7 @@ /obj/item/organ/internal/controller/do_install(mob/living/carbon/human/target, obj/item/organ/external/affected, in_place, update_icon, detached) . = ..() - if(!owner) + if(detached || !owner) return var/datum/extension/access_provider/owner_access = get_or_create_extension(owner, /datum/extension/access_provider) owner_access?.register_id(src) From c8548f061bf9f79b061a348fbdaf8ccbe387128f Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 10 May 2022 12:41:27 +1000 Subject: [PATCH 0009/1518] Swaps direct level list references out for procs. --- code/_helpers/game.dm | 9 ++++++++- code/_helpers/turfs.dm | 2 +- .../subsystems/initialization/persistence.dm | 4 ++-- code/datums/helper_datums/teleport.dm | 6 +++--- code/datums/security_state.dm | 2 +- code/game/atoms_movable.dm | 2 +- .../endgame/supermatter_cascade/universe.dm | 2 +- code/game/machinery/alarm.dm | 4 ++-- code/game/machinery/camera/tracking.dm | 4 ++-- code/game/machinery/computer/robot.dm | 2 +- code/game/machinery/doors/airlock.dm | 2 +- code/game/machinery/teleporter.dm | 4 ++-- code/game/objects/structures/bookcase.dm | 2 +- code/modules/admin/verbs/diagnostics.dm | 2 +- .../clothing/spacesuits/rig/modules/ninja.dm | 2 +- code/modules/events/apc_damage.dm | 2 +- code/modules/events/camera_damage.dm | 2 +- code/modules/events/computer_update.dm | 2 +- code/modules/events/solar_storm.dm | 4 ++-- code/modules/hydroponics/trays/tray_soil.dm | 2 +- code/modules/mob/observer/ghost/ghost.dm | 2 +- code/modules/mob/observer/observer.dm | 2 +- code/modules/nano/nanoui.dm | 2 +- code/modules/persistence/persistence_datum.dm | 4 ++-- code/modules/persistence/persistence_datum_book.dm | 6 +++--- .../spells/artifacts/spellbound_servants.dm | 14 +++++++------- code/modules/spells/spell_code.dm | 2 +- code/modules/supermatter/supermatter.dm | 12 ++++++------ 28 files changed, 56 insertions(+), 49 deletions(-) diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index 3b2b1c60051..087466c691b 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -3,7 +3,7 @@ /proc/is_on_same_plane_or_station(var/z1, var/z2) if(z1 == z2) return 1 - if((z1 in global.using_map.station_levels) && (z2 in global.using_map.station_levels)) + if(isStationLevel(z1) && isStationLevel(z2)) return 1 return 0 @@ -51,6 +51,13 @@ return heard +// These are procs rather than macros so they can be used as predicates, I think(?) +/proc/isSealedLevel(var/level) + return level in global.using_map.sealed_levels + +/proc/isMapLevel(var/level) + return level in global.using_map.map_levels + /proc/isStationLevel(var/level) return level in global.using_map.station_levels diff --git a/code/_helpers/turfs.dm b/code/_helpers/turfs.dm index 4bf084380f1..e9ed70392ea 100644 --- a/code/_helpers/turfs.dm +++ b/code/_helpers/turfs.dm @@ -33,7 +33,7 @@ return var/list/turfs = list() for(var/turf/T in orange(origin, outer_range)) - if(!(T.z in global.using_map.sealed_levels)) // Picking a turf outside the map edge isn't recommended + if(!isSealedLevel(T.z)) // Picking a turf outside the map edge isn't recommended if(T.x >= world.maxx-TRANSITIONEDGE || T.x <= TRANSITIONEDGE) continue if(T.y >= world.maxy-TRANSITIONEDGE || T.y <= TRANSITIONEDGE) continue if(!inner_range || get_dist(origin, T) >= inner_range) diff --git a/code/controllers/subsystems/initialization/persistence.dm b/code/controllers/subsystems/initialization/persistence.dm index 63569aa14e4..ffad9f38179 100644 --- a/code/controllers/subsystems/initialization/persistence.dm +++ b/code/controllers/subsystems/initialization/persistence.dm @@ -44,7 +44,7 @@ SUBSYSTEM_DEF(persistence) if(!A || (A.area_flags & AREA_FLAG_IS_NOT_PERSISTENT)) return - if(!(T.z in global.using_map.station_levels)) + if(!isStationLevel(T.z)) return if(!tracking_values[track_type]) @@ -53,7 +53,7 @@ SUBSYSTEM_DEF(persistence) /datum/controller/subsystem/persistence/proc/is_tracking(var/atom/value, var/track_type) . = (value in tracking_values[track_type]) - + /datum/controller/subsystem/persistence/proc/forget_value(var/atom/value, var/track_type) if(tracking_values[track_type]) tracking_values[track_type] -= value diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 45bb23c33a5..b63645e0430 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -21,8 +21,8 @@ /decl/teleport/proc/can_reach_z(var/oz, var/tz) - if(oz in global.using_map.admin_levels) - return (tz in global.using_map.admin_levels) || (tz in global.using_map.station_levels) || (tz in global.using_map.contact_levels) + if(isAdminLevel(oz)) + return isAdminLevel(tz) || isStationLevel(tz) || isContactLevel(tz) var/list/accessible_z_levels = GetConnectedZlevels(oz) var/obj/effect/overmap/sector = global.overmap_sectors["[oz]"] @@ -45,7 +45,7 @@ accessible_z_levels |= neighbor.map_z return (tz in accessible_z_levels) - + /decl/teleport/proc/can_teleport(var/atom/movable/target, var/atom/destination) if(!destination || !target?.loc) return FALSE diff --git a/code/datums/security_state.dm b/code/datums/security_state.dm index abd8e0da125..864d996283a 100644 --- a/code/datums/security_state.dm +++ b/code/datums/security_state.dm @@ -196,7 +196,7 @@ /decl/security_level/default/proc/notify_station() for(var/obj/machinery/firealarm/FA in SSmachines.machinery) - if(FA.z in global.using_map.contact_levels) + if(isContactLevel(FA.z)) FA.update_icon() post_status("alert") diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 2b2ca6005c5..4c589cdd511 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -321,7 +321,7 @@ if(!simulated) return - if(!z || (z in global.using_map.sealed_levels)) + if(!z || isSealedLevel(z)) return if(!global.universe.OnTouchMapEdge(src)) diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm index ba28b618763..08fe8e75428 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm @@ -89,7 +89,7 @@ var/global/universe_has_ended = 0 /datum/universal_state/supermatter_cascade/OverlayAndAmbientSet() spawn(0) for(var/datum/lighting_corner/L in world) - if(L.z in global.using_map.admin_levels) + if(isAdminLevel(L.z)) L.update_lumcount(1,1,1) else L.update_lumcount(0.0, 0.4, 1) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index f6a826505bb..f97a1301cc1 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -828,7 +828,7 @@ FIRE ALARM /obj/machinery/firealarm/examine(mob/user) . = ..() - if(loc.z in global.using_map.contact_levels) + if(isContactLevel(loc.z)) var/decl/security_state/security_state = GET_DECL(global.using_map.security_state) to_chat(user, "The current alert level is [security_state.current_security_level.name].") @@ -881,7 +881,7 @@ FIRE ALARM if(!detecting) overlays += get_cached_overlay("fire1") set_light(2, 0.25, COLOR_RED) - else if(z in global.using_map.contact_levels) + else if(isContactLevel(z)) var/decl/security_state/security_state = GET_DECL(global.using_map.security_state) var/decl/security_level/sl = security_state.current_security_level diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index cb3279370e7..c22453cc8cf 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -6,7 +6,7 @@ /mob/living/silicon/ai/var/stored_locations[0] /proc/InvalidPlayerTurf(turf/T) - return !(T && (T.z in global.using_map.player_levels)) + return !(T && isPlayerLevel(T.z)) /mob/living/silicon/ai/proc/get_camera_list() if(src.stat == 2) @@ -232,7 +232,7 @@ if(. == TRACKING_NO_COVERAGE) var/turf/T = get_turf(src) - if(T && (T.z in global.using_map.station_levels) && hassensorlevel(src, SUIT_SENSOR_TRACKING)) + if(T && isStationLevel(T.z) && hassensorlevel(src, SUIT_SENSOR_TRACKING)) return TRACKING_POSSIBLE /mob/living/proc/tracking_initiated() diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index f92dfc2964a..28969330666 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -121,7 +121,7 @@ var/turf/T = get_turf(R) var/area/A = get_area(T) - if(istype(T) && istype(A) && (T.z in global.using_map.contact_levels)) + if(istype(T) && istype(A) && isContactLevel(T.z)) robot["location"] = "[A.name] ([T.x], [T.y])" else robot["location"] = "Unknown" diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 8240edc22bd..11e588d7450 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -992,7 +992,7 @@ About the new airlock wires panel: . = ..() //wires var/turf/T = get_turf(loc) - if(T && (T.z in global.using_map.admin_levels)) + if(T && isAdminLevel(T.z)) secured_wires = TRUE if (secured_wires) wires = new/datum/wires/airlock/secure(src) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index baf4b146850..d2566c7b8d1 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -94,7 +94,7 @@ var/turf/T = get_turf(R) if (!T) continue - if(!(T.z in global.using_map.player_levels)) + if(!isPlayerLevel(T.z)) continue var/tmpname = T.loc.name if(areaindex[tmpname]) @@ -114,7 +114,7 @@ var/turf/T = get_turf(M) if(!T) continue - if(!(T.z in global.using_map.player_levels)) + if(!isPlayerLevel(T.z)) continue var/tmpname = M.real_name if(areaindex[tmpname]) diff --git a/code/game/objects/structures/bookcase.dm b/code/game/objects/structures/bookcase.dm index 311ec958699..9dbacb5b045 100644 --- a/code/game/objects/structures/bookcase.dm +++ b/code/game/objects/structures/bookcase.dm @@ -15,7 +15,7 @@ var/global/list/station_bookcases = list() for(var/obj/item/I in loc) if(istype(I, /obj/item/book)) I.forceMove(src) - if(z in global.using_map.station_levels) + if(isStationLevel(z)) global.station_bookcases += src . = ..() diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index fda1604b252..ad407536f92 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -17,7 +17,7 @@ var/inactive_on_main_station = 0 for(var/zone/zone in SSair.zones) var/turf/simulated/turf = locate() in zone.contents - if(turf && (turf.z in global.using_map.station_levels)) + if(turf && isStationLevel(turf.z)) if(zone.needs_update) active_on_main_station++ else diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index f3efb462173..e1ebf71b21f 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -112,7 +112,7 @@ to_chat(H, "You cannot teleport into solid walls.") return 0 - if(T.z in global.using_map.admin_levels) + if(isAdminLevel(T.z)) to_chat(H, "You cannot use your teleporter on this Z-level.") return 0 diff --git a/code/modules/events/apc_damage.dm b/code/modules/events/apc_damage.dm index 8143e928e79..a3af950e8e2 100644 --- a/code/modules/events/apc_damage.dm +++ b/code/modules/events/apc_damage.dm @@ -46,4 +46,4 @@ /datum/event/apc_damage/proc/is_valid_apc(var/obj/machinery/power/apc/apc) var/turf/T = get_turf(apc) - return !apc.is_critical && !apc.emagged && T && (T.z in global.using_map.player_levels) + return !apc.is_critical && !apc.emagged && T && isPlayerLevel(T.z) diff --git a/code/modules/events/camera_damage.dm b/code/modules/events/camera_damage.dm index 76fcbd127f2..da971e4b060 100644 --- a/code/modules/events/camera_damage.dm +++ b/code/modules/events/camera_damage.dm @@ -36,4 +36,4 @@ /datum/event/camera_damage/proc/is_valid_camera(var/obj/machinery/camera/C) // Only return a functional camera, not installed in a silicon, and that exists somewhere players have access var/turf/T = get_turf(C) - return T && C.can_use() && (T.z in global.using_map.player_levels) + return T && C.can_use() && isPlayerLevel(T.z) diff --git a/code/modules/events/computer_update.dm b/code/modules/events/computer_update.dm index d86b2baff43..02c5b291f91 100644 --- a/code/modules/events/computer_update.dm +++ b/code/modules/events/computer_update.dm @@ -12,7 +12,7 @@ updates_to_install = rand(500000, 1000000) for(var/obj/C in (SSobj.processing + SSmachines.machinery)) - if((C.z in global.using_map.station_levels)) + if(isStationLevel(C.z)) var/datum/extension/interactive/os/os = get_extension(C, /datum/extension/interactive/os) if(os && os.get_network_status() && os.receives_updates) os.updates = updates_to_install diff --git a/code/modules/events/solar_storm.dm b/code/modules/events/solar_storm.dm index 0fb92c81fc4..e57c8687fba 100644 --- a/code/modules/events/solar_storm.dm +++ b/code/modules/events/solar_storm.dm @@ -34,7 +34,7 @@ if(L.loc?.atom_flags & ATOM_FLAG_SHIELD_CONTENTS) continue var/turf/T = get_turf(L) - if(!T || !(T.z in global.using_map.player_levels)) + if(!T || !isPlayerLevel(T.z)) continue if(!istype(T.loc,/area/space) && !isspaceturf(T)) //Make sure you're in a space area or on a space turf @@ -43,7 +43,7 @@ //Apply some heat or burn damage from the sun. if(L.increaseBodyTemp(temp_incr)) continue - + L.adjustFireLoss(fire_loss) diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm index 00127ec53e0..f6af18ffb6a 100644 --- a/code/modules/hydroponics/trays/tray_soil.dm +++ b/code/modules/hydroponics/trays/tray_soil.dm @@ -54,7 +54,7 @@ if(!seed) qdel_self() return - if(z in global.using_map.station_levels) //plants on station always tick + if(isStationLevel(z)) //plants on station always tick return ..() if(living_observers_present(connected_zlevels)) return ..() diff --git a/code/modules/mob/observer/ghost/ghost.dm b/code/modules/mob/observer/ghost/ghost.dm index b53132fcb80..98128937a19 100644 --- a/code/modules/mob/observer/ghost/ghost.dm +++ b/code/modules/mob/observer/ghost/ghost.dm @@ -382,7 +382,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return var/turf/T = get_turf(src) - if(!T || (T.z in global.using_map.admin_levels)) + if(!T || isAdminLevel(T.z)) to_chat(src, "You may not spawn as a mouse on this Z-level.") return diff --git a/code/modules/mob/observer/observer.dm b/code/modules/mob/observer/observer.dm index 0429629f9a8..6c15f3fc371 100644 --- a/code/modules/mob/observer/observer.dm +++ b/code/modules/mob/observer/observer.dm @@ -63,7 +63,7 @@ var/global/const/GHOST_IMAGE_ALL = ~GHOST_IMAGE_NONE stat = DEAD // They are also always dead /mob/observer/touch_map_edge(var/overmap_id = OVERMAP_ID_SPACE) - if(z in global.using_map.sealed_levels) + if(isSealedLevel(z)) return var/new_x = x diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index 07b94d70fb5..15150ff5902 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -515,7 +515,7 @@ nanoui is used to open and update nano browser uis if(href_list["mapZLevel"]) var/map_z = text2num(href_list["mapZLevel"]) - if(map_z in global.using_map.map_levels) + if(isMapLevel(map_z)) set_map_z_level(map_z) map_update = 1 diff --git a/code/modules/persistence/persistence_datum.dm b/code/modules/persistence/persistence_datum.dm index 907f8aaca43..bc9ec852689 100644 --- a/code/modules/persistence/persistence_datum.dm +++ b/code/modules/persistence/persistence_datum.dm @@ -23,7 +23,7 @@ entries_decay_at = FLOOR(entries_expire_at * entries_decay_at) /decl/persistence_handler/proc/GetValidTurf(var/turf/T, var/list/tokens) - if(T && (T.z in global.using_map.station_levels) && CheckTurfContents(T, tokens)) + if(T && isStationLevel(T.z) && CheckTurfContents(T, tokens)) return T /decl/persistence_handler/proc/CheckTurfContents(var/turf/T, var/list/tokens) @@ -73,7 +73,7 @@ if(!isnull(entries_expire_at) && GetEntryAge(entry) >= entries_expire_at) return FALSE var/turf/T = get_turf(entry) - if(!ignore_invalid_loc && (!T || !(T.z in global.using_map.station_levels))) + if(!ignore_invalid_loc && (!T || !isStationLevel(T.z))) return FALSE var/area/A = get_area(T) if(!ignore_area_flags && (!A || (A.area_flags & AREA_FLAG_IS_NOT_PERSISTENT))) diff --git a/code/modules/persistence/persistence_datum_book.dm b/code/modules/persistence/persistence_datum_book.dm index e555cb9bfa8..c890055a7e1 100644 --- a/code/modules/persistence/persistence_datum_book.dm +++ b/code/modules/persistence/persistence_datum_book.dm @@ -6,8 +6,8 @@ /decl/persistence_handler/book/CreateEntryInstance(var/turf/creating, var/list/tokens) var/obj/item/book/book = new(creating) - book.dat = tokens["message"] - book.title = tokens["title"] + book.dat = tokens["message"] + book.title = tokens["title"] book.author = tokens["writer"] book.icon_state = tokens["icon_state"] book.last_modified_ckey = tokens["author"] || "unknown" @@ -36,7 +36,7 @@ .["icon_state"] = book.icon_state || "book" var/turf/T = get_turf(entry) - if(!T || !(T.z in global.using_map.station_levels)) + if(!T || !isStationLevel(T.z)) .["x"] = 0 .["y"] = 0 .["z"] = 0 diff --git a/code/modules/spells/artifacts/spellbound_servants.dm b/code/modules/spells/artifacts/spellbound_servants.dm index 1ee835de585..8f04b50e82b 100644 --- a/code/modules/spells/artifacts/spellbound_servants.dm +++ b/code/modules/spells/artifacts/spellbound_servants.dm @@ -117,17 +117,17 @@ var/datum/extension/armor/A = get_extension(under, /datum/extension/armor) if(A) A.armor_values = list( - melee = ARMOR_MELEE_VERY_HIGH, - bullet = ARMOR_BALLISTIC_PISTOL, - laser = ARMOR_LASER_SMALL, + melee = ARMOR_MELEE_VERY_HIGH, + bullet = ARMOR_BALLISTIC_PISTOL, + laser = ARMOR_LASER_SMALL, energy = ARMOR_ENERGY_SMALL ) //More armor A = get_extension(head, /datum/extension/armor) if(A) A.armor_values = list( - melee = ARMOR_MELEE_RESISTANT, - bullet = ARMOR_BALLISTIC_MINOR, - laser = ARMOR_LASER_MINOR, + melee = ARMOR_MELEE_RESISTANT, + bullet = ARMOR_BALLISTIC_MINOR, + laser = ARMOR_LASER_MINOR, energy = ARMOR_ENERGY_MINOR ) familiar_type = /mob/living/simple_animal/hostile/bear @@ -241,7 +241,7 @@ w_class = ITEM_SIZE_TINY /obj/item/summoning_stone/attack_self(var/mob/user) - if(user.z in global.using_map.admin_levels) + if(isAdminLevel(user.z)) to_chat(user, "You cannot use \the [src] here.") return user.set_machine(src) diff --git a/code/modules/spells/spell_code.dm b/code/modules/spells/spell_code.dm index 4ca9520eac2..c4acd43cca2 100644 --- a/code/modules/spells/spell_code.dm +++ b/code/modules/spells/spell_code.dm @@ -226,7 +226,7 @@ var/global/list/spells = typesof(/spell) //needed for the badmin verb for now if(!user_turf) to_chat(user, "You cannot cast spells in null space!") - if((spell_flags & Z2NOCAST) && (user_turf.z in global.using_map.admin_levels)) //Certain spells are not allowed on the centcomm zlevel + if((spell_flags & Z2NOCAST) && isAdminLevel(user_turf.z)) //Certain spells are not allowed on the centcomm zlevel return 0 if(spell_flags & CONSTRUCT_CHECK) diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 9457e820d25..ecebd152202 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -50,7 +50,7 @@ var/global/list/supermatter_delam_accent_sounds = list( 'sound/machines/sm/accent/delam/4.ogg', 'sound/machines/sm/accent/delam/5.ogg', - + ) // Returns a truthy value that is also used for power generation by the supermatter core itself. @@ -413,7 +413,7 @@ var/global/list/supermatter_delam_accent_sounds = list( global.using_map.unbolt_saferooms() for(var/mob/M in global.player_list) var/turf/T = get_turf(M) - if(T && (T.z in global.using_map.station_levels) && !istype(M,/mob/new_player) && !isdeaf(M)) + if(T && isStationLevel(T.z) && !istype(M,/mob/new_player) && !isdeaf(M)) sound_to(M, 'sound/ambience/matteralarm.ogg') else if(safe_warned && public_alert) announcer.autosay(alert_msg, "Supermatter Monitor") @@ -431,14 +431,14 @@ var/global/list/supermatter_delam_accent_sounds = list( if(damage > explosion_point) if(!exploded) - if(!isspaceturf(L) && (L.z in global.using_map.station_levels)) + if(!isspaceturf(L) && isStationLevel(L.z)) announce_warning() explode() else if(damage > warning_point) // while the core is still damaged and it's still worth noting its status shift_light(5, warning_color) if(damage > emergency_point) shift_light(7, emergency_color) - if(!isspaceturf(L) && ((world.timeofday - lastwarning) >= WARNING_DELAY * 10) && (L.z in global.using_map.station_levels)) + if(!isspaceturf(L) && ((world.timeofday - lastwarning) >= WARNING_DELAY * 10) && isStationLevel(L.z)) announce_warning() else shift_light(4,base_color) @@ -457,7 +457,7 @@ var/global/list/supermatter_delam_accent_sounds = list( soundloop.mid_sounds = list('sound/machines/sm/loops/delamming.ogg' = 1) else soundloop.mid_sounds = list('sound/machines/sm/loops/calm.ogg' = 1) - + // Play Delam/Neutral sounds at rate determined by power and damage. if(last_accent_sound < world.time && prob(20)) var/aggression = min(((damage / 800) * (power / 2500)), 1.0) * 100 @@ -558,7 +558,7 @@ var/global/list/supermatter_delam_accent_sounds = list( power -= (power/decay_factor)**3 //energy losses due to radiation handle_admin_warnings() - return 1 + return 1 /obj/machinery/power/supermatter/bullet_act(var/obj/item/projectile/Proj) var/turf/L = loc From 831a0bfbb681e000811e428fb774be965ad30512 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 13 May 2022 22:25:01 +1000 Subject: [PATCH 0010/1518] Adding a roleplay summary var to species preview. --- .../modules/client/preference_setup/background/01_species.dm | 5 ++++- code/modules/species/species.dm | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/client/preference_setup/background/01_species.dm b/code/modules/client/preference_setup/background/01_species.dm index a237921a5c6..cef115b9190 100644 --- a/code/modules/client/preference_setup/background/01_species.dm +++ b/code/modules/client/preference_setup/background/01_species.dm @@ -66,7 +66,10 @@ else . += "No preview available." - var/desc = current_species.description || "No additional details." + var/desc = current_species.description ? "

Species Summary

[current_species.description]

" : null + if(current_species.roleplay_summary) + desc = "[desc]

Roleplaying Summary

[current_species.roleplay_summary]

" + if(hide_species && length(desc) > 200) desc = "[copytext(desc, 1, 194)] \[...\]" . += "[desc]" diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index 8c42ebabd90..a843842877f 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -10,6 +10,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 var/name_plural // Pluralized name (since "[name]s" is not always valid) var/description var/codex_description + var/roleplay_summary var/ooc_codex_information var/cyborg_noun = "Cyborg" var/hidden_from_codex = TRUE From 2568ba5d7be8931e1e9f74dbff1a58e99fe8c0bb Mon Sep 17 00:00:00 2001 From: eckff <44920739+eckff@users.noreply.github.com> Date: Mon, 26 Apr 2021 14:23:25 +0300 Subject: [PATCH 0011/1518] progress-bar: rewrites progress bar to use gradient --- code/__defines/misc.dm | 5 + code/_helpers/mobs.dm | 18 +- code/_onclick/hud/hud.dm | 2 +- code/datums/progress_bar.dm | 213 ++++++++++++++++++ code/datums/progressbar.dm | 82 ------- code/modules/mob/mob_defines.dm | 3 +- icons/effects/progress_bar/default.dmi | Bin 0 -> 312 bytes icons/effects/progress_bar/default_slim.dmi | Bin 0 -> 307 bytes .../stub.dmi} | Bin 1059 -> 1059 bytes icons/effects/progress_bar/warning.dmi | Bin 0 -> 315 bytes icons/effects/progress_bar/warning_slim.dmi | Bin 0 -> 304 bytes nebula.dme | 2 +- 12 files changed, 231 insertions(+), 94 deletions(-) create mode 100644 code/datums/progress_bar.dm delete mode 100644 code/datums/progressbar.dm create mode 100644 icons/effects/progress_bar/default.dmi create mode 100644 icons/effects/progress_bar/default_slim.dmi rename icons/effects/{progressbar.dmi => progress_bar/stub.dmi} (87%) create mode 100644 icons/effects/progress_bar/warning.dmi create mode 100644 icons/effects/progress_bar/warning_slim.dmi diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 2ea0204a841..c2c1d7107f8 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -284,3 +284,8 @@ // arbitrary low pressure bound for wind weather effects #define MIN_WIND_PRESSURE 10 + +// https://secure.byond.com/docs/ref/info.html#/atom/var/mouse_opacity +#define MOUSE_OPACITY_TRANSPARENT 0 +#define MOUSE_OPACITY_ICON 1 +#define MOUSE_OPACITY_OPAQUE 2 diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm index b60ffd76257..2a0888787ac 100644 --- a/code/_helpers/mobs.dm +++ b/code/_helpers/mobs.dm @@ -20,7 +20,7 @@ /proc/random_name(gender, species) if(species) var/decl/species/current_species = get_species_by_key(species) - if(current_species) + if(current_species) var/decl/cultural_info/current_culture = GET_DECL(current_species.default_cultural_info[TAG_CULTURE]) if(current_culture) return current_culture.get_random_name(null, gender) @@ -71,7 +71,7 @@ /proc/get_exposed_defense_zone(var/atom/movable/target) return pick(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_FOOT, BP_R_FOOT, BP_L_ARM, BP_R_ARM, BP_L_LEG, BP_R_LEG, BP_CHEST, BP_GROIN) -/proc/do_mob(mob/user , mob/target, time = 30, target_zone = 0, uninterruptible = 0, progress = 1, var/incapacitation_flags = INCAPACITATION_DEFAULT) +/proc/do_mob(mob/user , mob/target, time = 30, target_zone = 0, uninterruptible = 0, progress = 1, var/incapacitation_flags = INCAPACITATION_DEFAULT, theme = /datum/progress_bar/default) if(!user || !target) return 0 var/user_loc = user.loc @@ -83,9 +83,9 @@ var/target_loc = target.loc var/holding = user.get_active_hand() - var/datum/progressbar/progbar + var/datum/progress_bar/progbar if (progress) - progbar = new(user, time, target) + progbar = create_progress_bar(user, time, target, theme) var/endtime = world.time+time var/starttime = world.time @@ -121,9 +121,9 @@ break if (progbar) - qdel(progbar) + progbar.stop() -/proc/do_after(mob/user, delay, atom/target = null, needhand = 1, progress = 1, var/incapacitation_flags = INCAPACITATION_DEFAULT, var/same_direction = 0, var/can_move = 0) +/proc/do_after(mob/user, delay, atom/target = null, needhand = 1, progress = 1, incapacitation_flags = INCAPACITATION_DEFAULT, same_direction = 0, can_move = 0, theme = /datum/progress_bar/default) if(!user) return 0 var/atom/target_loc = null @@ -143,9 +143,9 @@ var/holding = user.get_active_hand() - var/datum/progressbar/progbar + var/datum/progress_bar/progbar if (progress) - progbar = new(user, delay, target) + progbar = create_progress_bar(user, delay, target, theme) var/endtime = world.time + delay var/starttime = world.time @@ -173,7 +173,7 @@ break if (progbar) - qdel(progbar) + progbar.stop() /proc/able_mobs_in_oview(var/origin) var/list/mobs = list() diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 158729f5557..93b71b30c69 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -341,7 +341,7 @@ /obj/screen/stamina name = "stamina" - icon = 'icons/effects/progressbar.dmi' + icon = 'icons/effects/progress_bar/stub.dmi' icon_state = "prog_bar_100" invisibility = INVISIBILITY_MAXIMUM screen_loc = ui_stamina diff --git a/code/datums/progress_bar.dm b/code/datums/progress_bar.dm new file mode 100644 index 00000000000..2f322d8942d --- /dev/null +++ b/code/datums/progress_bar.dm @@ -0,0 +1,213 @@ +/datum/progress_bar + // Settings + var/name + /// The goal value to reach. When [/datum/progress_bar/proc/update] is called, a fraction is calculated with the goal. + var/goal = 100 + /// The icon file to use for the visual element. + var/icon + /// The total height in pixels of the theme's progress bar. + var/height + /// The width in pixels of the theme's fill sprite. + var/fill_width + /// The total time that determines the speed for appear animation. + var/animation_time_appear = 0.5 SECOND + /// The total time that determines the speed for fade animation. + var/animation_time_fade = 0.5 SECOND + /// The total time that determines the speed for shift down animation. + var/animation_time_shift = 0.5 SECOND + + // Variables + /// The target to display the progress bar on. + var/atom/target + /// The main visual element holding everything up. + var/image/holder + /// The backdrop visual element. Contains the fill and mask as overlays. + var/image/backdrop + /// The fill visual element. + var/image/fill + /// The mob currently owning the progress bar, used to calculate the bar's vertical position. + var/mob/user + /// The client currently owning the progress bar for display. + var/client/client + /// The bar's index number within the owning mob's active progress bar list. + var/list_index + /// Whether the bar is stopping. + var/stopping = FALSE + /// Stored progress number for the goal fail effect. + var/last_progress = 0 + +/datum/progress_bar/New(mob/param_user, param_goal, atom/param_target) + . = ..() + if(!istype(param_target)) + throw EXCEPTION("datum/progress_bar: Invalid param given - param_target") + + target = param_target + user = param_user + goal = param_goal + init_images(target) + + if(user) + client = user.client + client?.images |= holder + + LAZYINITLIST(user.progress_bars) + LAZYINITLIST(user.progress_bars[target]) + var/list/bars = user.progress_bars[target] + bars += src + list_index = length(bars) + animate(holder, pixel_z = world.icon_size + (height * (list_index - 1)), alpha = 255, time = animation_time_appear, easing = SINE_EASING | EASE_OUT, flags = ANIMATION_PARALLEL) + else + animate(holder, alpha = 255, time = animation_time_appear, easing = SINE_EASING | EASE_OUT, flags = ANIMATION_PARALLEL) + +/datum/progress_bar/Destroy() + stop() + client?.images -= holder + QDEL_NULL(holder) + QDEL_NULL(backdrop) + QDEL_NULL(fill) + target = null + user = null + client = null + return ..() + +/** + * Stops the progress bar and removes it after a bit. + */ +/datum/progress_bar/proc/stop() + if(stopping) + return + + if(user?.progress_bars[target]) + var/list/bars = user.progress_bars[target] + var/list_index = bars.Find(src) + for(var/i = list_index, i <= length(bars), i++) + var/datum/progress_bar/P = bars[i] + P.shift() + + bars -= src + if(!length(bars)) + LAZYREMOVE(user.progress_bars, target) + + if(!QDELING(src)) + stopping = TRUE + update(last_progress) + animate(holder, alpha = 0, time = animation_time_fade, flags = ANIMATION_PARALLEL) + QDEL_IN(src, animation_time_fade) +/** + * Initializes the visual elements. + * + * Arguments: + * * target - The atom to parent the images to. + */ +/datum/progress_bar/proc/init_images(target) + holder = image('icons/effects/effects.dmi', target, "nothing", HUD_ABOVE_ITEM_LAYER) + holder.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + holder.alpha = 0 + holder.plane = HUD_PLANE + holder.appearance_flags = KEEP_TOGETHER | APPEARANCE_UI_IGNORE_ALPHA + + backdrop = image(icon, target, "backdrop") + + fill = image(icon, target, "fill") + fill.filters = filter(type = "alpha", icon = icon(icon, "mask"), x = -fill_width) + + holder.overlays += backdrop + holder.overlays += fill + +/** + * Call periodically to update the progress bar's progress. + * + * Arguments: + * * progress - The new value, divided with the given goal on creation to calculate the fraction. + */ +/datum/progress_bar/proc/update(progress) + if(QDELETED(target)) + qdel(src) + return + + if(user?.client != client) + client?.images -= holder + if(!QDELETED(user) && user?.client) + client = user.client + client.images += holder + + . = clamp(progress / goal, 0, 1) + last_progress = progress + if(fill) + holder.overlays -= fill + update_fill(.) + holder.overlays += fill + +/** + * Updates the fill. Do your visual changes here. + * + * Arguments: + * * fraction - The new (value / goal) fraction. + */ +/datum/progress_bar/proc/update_fill(fraction) + UNLINT(fill?.filters[1]?.x = -fill_width * (1 - fraction)) + +/** + * Shifts the progress bar down. + */ +/datum/progress_bar/proc/shift() + animate(holder, + pixel_z = holder.pixel_z - height, + time = animation_time_shift, + easing = SINE_EASING | EASE_OUT, + flags = ANIMATION_PARALLEL + ) + +/datum/progress_bar/default + name = "default" + icon = 'icons/effects/progress_bar/default.dmi' + fill_width = 22 + height = 7 + +/datum/progress_bar/default/update_fill(fraction) + . = ..() + if(!stopping) + fill.color = gradient(0, "#cc0033", 0.25, "#cc6633", 0.5, "#d1cc33", 0.75, "#00cc33", fraction) + else if(last_progress != goal) + animate(fill, time = 0.5 SECOND, loop = -1, flags = ANIMATION_PARALLEL, alpha = 0, color = "#cc0033") + animate(time = 0.5 SECOND, alpha = 255) + else + fill.color = COLOR_YELLOW + +/datum/progress_bar/default/slim + name = "default (slim)" + icon = 'icons/effects/progress_bar/default_slim.dmi' + height = 5 + +/** + * An example progress bar that stays yellow then blinks red every now and then. + */ +/datum/progress_bar/warning + name = "warning" + icon = 'icons/effects/progress_bar/warning.dmi' + fill_width = 22 + height = 7 + +/datum/progress_bar/warning/update_fill(fraction) + . = ..() + if(fraction <= 0.5) + fill.color = COLOR_YELLOW + else + fill.color = gradient(0.5, COLOR_YELLOW, 0.5, COLOR_RED, "loop", fraction * 10) + +/datum/progress_bar/warning/slim + name = "warning (slim)" + icon = 'icons/effects/progress_bar/warning_slim.dmi' + height = 5 + +/** + * Creates a new progress bar datum with the given theme. + * + * Arguments: + * * user - The mob seeing the progress bar. + * * goal - The goal number. + * * target - The atom to display the bar on. + * * theme - The progress bar's theme (type). + */ +/proc/create_progress_bar(mob/user, goal, atom/target, theme = /datum/progress_bar/default) + return new theme(user, goal, target) diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm deleted file mode 100644 index db9d2743f76..00000000000 --- a/code/datums/progressbar.dm +++ /dev/null @@ -1,82 +0,0 @@ -#define PROGRESSBAR_HEIGHT 6 -#define PROGRESSBAR_ANIMATION_TIME 5 - -/datum/progressbar - var/goal = 1 - var/last_progress = 0 - var/image/bar - var/shown = 0 - var/mob/user - var/client/client - var/listindex - -/datum/progressbar/New(mob/user, goal_number, atom/target) - . = ..() - if(!target) target = user - if (!istype(target)) - EXCEPTION("Invalid target given") - if (goal_number) - goal = goal_number - bar = image('icons/effects/progressbar.dmi', target, "prog_bar_0") - bar.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA - bar.plane = HUD_PLANE - bar.layer = HUD_ABOVE_ITEM_LAYER - src.user = user - if(user) - client = user.client - - LAZYINITLIST(user.progressbars) - LAZYINITLIST(user.progressbars[bar.loc]) - var/list/bars = user.progressbars[bar.loc] - bars.Add(src) - listindex = bars.len - bar.pixel_y = 0 - bar.alpha = 0 - animate(bar, pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)), alpha = 255, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING) - -/datum/progressbar/proc/update(progress) - if (!user || !user.client) - shown = FALSE - return - if (user.client != client) - client.images.Remove(bar) - shown = FALSE - client = user.client - - progress = Clamp(progress, 0, goal) - bar.icon_state = "prog_bar_[round(((progress / goal) * 100), 5)]" - if (!shown && user.get_preference_value(/datum/client_preference/show_progress_bar) == PREF_SHOW) - user.client.images.Add(bar) - shown = TRUE - -/datum/progressbar/proc/shiftDown() - --listindex - bar.pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)) - var/dist_to_travel = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)) - PROGRESSBAR_HEIGHT - animate(bar, pixel_y = dist_to_travel, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING) - -/datum/progressbar/Destroy() - if(last_progress != goal) - bar.icon_state = "[bar.icon_state]_fail" - for(var/I in user.progressbars[bar.loc]) - var/datum/progressbar/P = I - if(P != src && P.listindex > listindex) - P.shiftDown() - - var/list/bars = user.progressbars[bar.loc] - bars.Remove(src) - if(!bars.len) - LAZYREMOVE(user.progressbars, bar.loc) - - animate(bar, alpha = 0, time = PROGRESSBAR_ANIMATION_TIME) - addtimer(CALLBACK(src, .proc/remove_from_client), PROGRESSBAR_ANIMATION_TIME, TIMER_CLIENT_TIME) - QDEL_IN(bar, PROGRESSBAR_ANIMATION_TIME * 2) //for garbage collection safety - . = ..() - -/datum/progressbar/proc/remove_from_client() - if(client) - client.images.Remove(bar) - client = null - -#undef PROGRESSBAR_ANIMATION_TIME -#undef PROGRESSBAR_HEIGHT \ No newline at end of file diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index d5c2f3cd246..0ecf99a90fd 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -169,7 +169,8 @@ var/list/additional_vision_handlers // A lazylist of atoms from which additional vision data is retrieved - var/list/progressbars = null //for stacking do_after bars + /// A list for stacking do_after bars + var/list/progress_bars = null var/datum/ai/ai // Type abused. Define with path and will automagically create. Determines behaviour for clientless mobs. diff --git a/icons/effects/progress_bar/default.dmi b/icons/effects/progress_bar/default.dmi new file mode 100644 index 0000000000000000000000000000000000000000..45d9865068034b895ad4a83e22f0ec337e6c60e3 GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ei2$Dv*8>L*2nmVk>6n9;N!wQN@ zzkdlX`1tjSmbb3fxija3H-s8oG=A_%=e&>RNrs}H-W?XkLB^Mjy%gp=nsj7Rh(fTY zrlFCy literal 0 HcmV?d00001 diff --git a/icons/effects/progress_bar/default_slim.dmi b/icons/effects/progress_bar/default_slim.dmi new file mode 100644 index 0000000000000000000000000000000000000000..9db0f7f7de85ac38b4dacba77d5cd3766c3d456f GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e(Ey(i*8>L*2nmVk>6rZg|KH5i z8pxeCZCcH@=l6jM7)yfuf*Bm1-ADs+s;WXFN?cNllZ!G7N;32F7#J$%1cwzAm45#c zT=4Ph6D@CDt#fD22X6>9xM=*~k!lj|9Xh*>RX4AY&`3FPbY|F;8MC<(4~sri6H6BknKEtWF%APdOcL<~hvc{K3eO#3X*aV!g@+pot8gu6{1-oD!MN5lTV=(#A+&a|;^DKh}L*2nmVk=`j5N{~yQ( z3Ky{D0!aqOk|4ie28U-i(tw<*s*s2hm(=3qqRfJl%=|nChKf1CVFg8{-@gPGeEj-E z%Uf6L+?n&i8$t~(8b5fXbKXbuBtub8?+y#&Amhu%UJ7#_O*%3uL?KvH)6mj-sm6YX z&TeDX%_}4{QcfJ588&6cY_7z^qR-UC(uG5&Oq)5m*?Z!qrq%PgZ}c);w9tQGYbUP^ zbVZ=2i(`mKXL5oB>*55F3Ct`L8Nyhdyb2a@JTjI(+<0(7pu+`mpiB=_6vMTI%K?uA z3zopr E06Xn&r~m)} literal 0 HcmV?d00001 diff --git a/icons/effects/progress_bar/warning_slim.dmi b/icons/effects/progress_bar/warning_slim.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e7fd0aa1bbf9f520a1adc23371a4d11c5a4baa25 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ep#Yx{*8>L*2nmVk=`j5N{~yQ( z3Ky{D0!aqOk|4ie28U-i(tw<*s*s2hm(=3qqRfJl%=|nChKf1CVFg8{-@gPGeEj-E z%Uf6L+?n&i8$t~(8b5fXbKXbuBtub8?+y#&Amhu%UJ7#_O*%3uL?KvH)6mj-sm6YX z&TeDX%_}4{QcfJ588&6cY_7z^qR-UC(uG5&Oq)5m*?Z!qrq%PgZ}c);w9tQGYbUP^ zbcLIzi(`mKXL5oB>*53v9v%S~rU+3E&4Z0f9p`g+*x5pY94_zzWqO(pa?bE|?saZH t*uq%G8W5=<*bvI7eTO0V4c7-|hEI1yf2m#1w+5QX;OXk;vd$@?2>>DcYXJZN literal 0 HcmV?d00001 diff --git a/nebula.dme b/nebula.dme index 5072747511e..709679302ea 100644 --- a/nebula.dme +++ b/nebula.dme @@ -268,7 +268,7 @@ #include "code\datums\mil_ranks.dm" #include "code\datums\mutable_appearance.dm" #include "code\datums\position_point_vector.dm" -#include "code\datums\progressbar.dm" +#include "code\datums\progress_bar.dm" #include "code\datums\recipe.dm" #include "code\datums\ruins.dm" #include "code\datums\security_state.dm" From 32011ccb886aaf5ae3a2fb496cd5ca8311c36ad9 Mon Sep 17 00:00:00 2001 From: quardbreak <44920739+quardbreak@users.noreply.github.com> Date: Sat, 14 May 2022 20:28:56 +0300 Subject: [PATCH 0012/1518] Splits the stop function --- code/datums/progress_bar.dm | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/code/datums/progress_bar.dm b/code/datums/progress_bar.dm index 2f322d8942d..839fe296e21 100644 --- a/code/datums/progress_bar.dm +++ b/code/datums/progress_bar.dm @@ -60,7 +60,7 @@ animate(holder, alpha = 255, time = animation_time_appear, easing = SINE_EASING | EASE_OUT, flags = ANIMATION_PARALLEL) /datum/progress_bar/Destroy() - stop() + cleanup() client?.images -= holder QDEL_NULL(holder) QDEL_NULL(backdrop) @@ -71,12 +71,21 @@ return ..() /** - * Stops the progress bar and removes it after a bit. + * Stops the progress bar and destoy it after a bit. */ /datum/progress_bar/proc/stop() - if(stopping) - return + set waitfor = FALSE + + shift_down_all() + update(last_progress) + animate(holder, alpha = 0, time = animation_time_fade, flags = ANIMATION_PARALLEL) + sleep(animation_time_fade) + qdel(src) +/** + * Calls the shift animation on all attached bars. + */ +/datum/progress_bar/proc/shift_down_all() if(user?.progress_bars[target]) var/list/bars = user.progress_bars[target] var/list_index = bars.Find(src) @@ -84,15 +93,16 @@ var/datum/progress_bar/P = bars[i] P.shift() +/** + * Cleanups before deletion. + */ +/datum/progress_bar/proc/cleanup() + if(user?.progress_bars[target]) + var/list/bars = user.progress_bars[target] bars -= src if(!length(bars)) LAZYREMOVE(user.progress_bars, target) - if(!QDELING(src)) - stopping = TRUE - update(last_progress) - animate(holder, alpha = 0, time = animation_time_fade, flags = ANIMATION_PARALLEL) - QDEL_IN(src, animation_time_fade) /** * Initializes the visual elements. * From 0547b933d29e779c64da9928873e3d7a7870744f Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 15 May 2022 00:55:49 +0000 Subject: [PATCH 0013/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 5 +++++ html/changelogs/AutoChangeLog-pr-2333.yml | 6 ------ 3 files changed, 11 insertions(+), 6 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2333.yml diff --git a/html/changelog.html b/html/changelog.html index d173254e2f7..dbf3568ff87 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
+

15 May 2022

+

tag if you want to specify another name or several people. --> updated:

+
    +
  • Upward pointing cable stubs now give proper feedback, and install properly when clicked on with a cable coil in hands. You used to need to click on the turf instead before, which was a bit confusing.
  • +
+

13 May 2022

MistakeNot4892 updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index e77eed2c605..1b50744239e 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14166,3 +14166,8 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: Dislocating someone's limb now causes pain again. - tweak: Now get feedback when trying to use a jointlock or dislocate someone's limbs and don't have the required skills. +2022-05-15: + tag if you want to specify another name or several people. -->: + - tweak: Upward pointing cable stubs now give proper feedback, and install properly + when clicked on with a cable coil in hands. You used to need to click on the + turf instead before, which was a bit confusing. diff --git a/html/changelogs/AutoChangeLog-pr-2333.yml b/html/changelogs/AutoChangeLog-pr-2333.yml deleted file mode 100644 index 147f170404f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2333.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: tag if you want to specify another name or several people. --> -delete-after: true -changes: - - tweak: Upward pointing cable stubs now give proper feedback, and install properly - when clicked on with a cable coil in hands. You used to need to click on the - turf instead before, which was a bit confusing. From 982bb3e19119cd587311f6268cad45e503eb5132 Mon Sep 17 00:00:00 2001 From: quardbreak <44920739+quardbreak@users.noreply.github.com> Date: Sun, 15 May 2022 22:59:44 +0300 Subject: [PATCH 0014/1518] Little cleanup --- code/__defines/lists.dm | 4 ++++ code/datums/progress_bar.dm | 32 +++++++++++--------------------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/code/__defines/lists.dm b/code/__defines/lists.dm index 6805b26b7f7..6697db9fd23 100644 --- a/code/__defines/lists.dm +++ b/code/__defines/lists.dm @@ -29,6 +29,10 @@ #define LAZYISIN(L, I) (L ? (I in L) : FALSE) // Null-safe L.Cut() #define LAZYCLEARLIST(L) if(L) { L.Cut(); L = null; } +// This is used to add onto lazy assoc list when the value you're adding is a /list/. This one has extra safety because the value could be null (and thus cant be used to += objects) +#define LAZYASSOCLISTADD(L, K, V) if(!L) { L = list(); } L[K] += list(V); +// Removes value V and key K from associative list L +#define LAZYASSOCLISTREMOVE(L, K, V) if(L) { if(L[K]) { L[K] -= V; if(!length(L[K])) L -= K; } if(!length(L)) L = null; } // Reads L or an empty list if L is not a list. Note: Does NOT assign, L may be an expression. #define SANITIZE_LIST(L) ( islist(L) ? L : list() ) diff --git a/code/datums/progress_bar.dm b/code/datums/progress_bar.dm index 839fe296e21..a64565d8921 100644 --- a/code/datums/progress_bar.dm +++ b/code/datums/progress_bar.dm @@ -41,33 +41,32 @@ if(!istype(param_target)) throw EXCEPTION("datum/progress_bar: Invalid param given - param_target") - target = param_target user = param_user goal = param_goal + target = param_target init_images(target) if(user) client = user.client client?.images |= holder - - LAZYINITLIST(user.progress_bars) - LAZYINITLIST(user.progress_bars[target]) - var/list/bars = user.progress_bars[target] - bars += src - list_index = length(bars) - animate(holder, pixel_z = world.icon_size + (height * (list_index - 1)), alpha = 255, time = animation_time_appear, easing = SINE_EASING | EASE_OUT, flags = ANIMATION_PARALLEL) + LAZYASSOCLISTADD(user.progress_bars, target, src) + animate(holder, pixel_z = world.icon_size + (height * LAZYLEN(user.progress_bars[target]) - 1), alpha = 255, time = animation_time_appear, easing = SINE_EASING | EASE_OUT, flags = ANIMATION_PARALLEL) else animate(holder, alpha = 255, time = animation_time_appear, easing = SINE_EASING | EASE_OUT, flags = ANIMATION_PARALLEL) /datum/progress_bar/Destroy() - cleanup() client?.images -= holder + QDEL_NULL(holder) QDEL_NULL(backdrop) QDEL_NULL(fill) + + LAZYASSOCLISTREMOVE(user.progress_bars, target, src) + target = null user = null client = null + return ..() /** @@ -79,6 +78,8 @@ shift_down_all() update(last_progress) animate(holder, alpha = 0, time = animation_time_fade, flags = ANIMATION_PARALLEL) + LAZYASSOCLISTREMOVE(user.progress_bars, target, src) + sleep(animation_time_fade) qdel(src) @@ -88,21 +89,10 @@ /datum/progress_bar/proc/shift_down_all() if(user?.progress_bars[target]) var/list/bars = user.progress_bars[target] - var/list_index = bars.Find(src) - for(var/i = list_index, i <= length(bars), i++) + for(var/i = bars.Find(src), i <= length(bars), i++) var/datum/progress_bar/P = bars[i] P.shift() -/** - * Cleanups before deletion. - */ -/datum/progress_bar/proc/cleanup() - if(user?.progress_bars[target]) - var/list/bars = user.progress_bars[target] - bars -= src - if(!length(bars)) - LAZYREMOVE(user.progress_bars, target) - /** * Initializes the visual elements. * From cd30584062f7885b653f23b691b613c4ee5fb082 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 16 May 2022 00:45:22 +0000 Subject: [PATCH 0015/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index dbf3568ff87..c27ba878540 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -141,18 +141,6 @@

    tag if you want to specify another name or several people. --
    • Fixes potential index out-of-bound error when filling grown foods with reagents.
    - -

    14 March 2022

    -

    keIgaras updated:

    -
      -
    • added sofa, rounded chairs and updated armchair sprites
    • -
    • fixed names of chairs in the construction panel
    • -
    -

    tag if you want to specify another name or several people. --> updated:

    -
      -
    • Deaf mobs no longer see 'You hear something about' messages while asleep.
    • -
    • fixed names of chairs in the construction panel
    • -
From 75983c74b897ec47721a133033b75d6f65a0112c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 16 May 2022 15:39:37 +1000 Subject: [PATCH 0016/1518] Splitting serpentids into their own modpack. --- code/modules/species/species.dm | 3 +- maps/exodus/exodus.dm | 1 + maps/ministation/ministation.dm | 1 + maps/modpack_testing/modpack_testing.dm | 1 + maps/tradeship/tradeship.dm | 3 +- mods/species/ascent/_ascent.dme | 2 - mods/species/ascent/ascent.dm | 6 +- mods/species/ascent/datum/aspects.dm | 2 - mods/species/ascent/datum/culture.dm | 19 +- mods/species/ascent/datum/languages.dm | 3 +- mods/species/ascent/datum/species.dm | 265 ------------------ .../species/ascent/datum/species_bodytypes.dm | 26 -- mods/species/ascent/effects/razorweb.dm | 3 +- mods/species/ascent/items/clothing.dm | 25 +- mods/species/ascent/items/guns.dm | 5 +- mods/species/ascent/items/rig.dm | 45 +-- mods/species/serpentid/_serpentid.dme | 10 + .../{ascent => serpentid}/datum/attacks.dm | 3 +- mods/species/serpentid/datum/species.dm | 257 +++++++++++++++++ .../serpentid/datum/species_bodytypes.dm | 26 ++ .../icons}/blood_overlays.dmi | Bin .../icons}/body_green.dmi | Bin .../icons}/body_grey.dmi | Bin .../serpentid => serpentid/icons}/eyes.dmi | Bin .../serpentid => serpentid/icons}/threat.dmi | Bin .../mobs/bodyparts_serpentid.dm | 2 +- mods/species/serpentid/serpentid.dm | 4 + 27 files changed, 325 insertions(+), 387 deletions(-) create mode 100644 mods/species/serpentid/_serpentid.dme rename mods/species/{ascent => serpentid}/datum/attacks.dm (85%) create mode 100644 mods/species/serpentid/datum/species.dm create mode 100644 mods/species/serpentid/datum/species_bodytypes.dm rename mods/species/{ascent/icons/species/body/serpentid => serpentid/icons}/blood_overlays.dmi (100%) rename mods/species/{ascent/icons/species/body/serpentid => serpentid/icons}/body_green.dmi (100%) rename mods/species/{ascent/icons/species/body/serpentid => serpentid/icons}/body_grey.dmi (100%) rename mods/species/{ascent/icons/species/body/serpentid => serpentid/icons}/eyes.dmi (100%) rename mods/species/{ascent/icons/species/body/serpentid => serpentid/icons}/threat.dmi (100%) rename mods/species/{ascent => serpentid}/mobs/bodyparts_serpentid.dm (98%) create mode 100644 mods/species/serpentid/serpentid.dm diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index a843842877f..1186f92ee28 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -197,8 +197,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 var/obj/effect/decal/cleanable/blood/tracks/move_trail = /obj/effect/decal/cleanable/blood/tracks/footprints // What marks are left when walking // An associative list of target zones (ex. BP_CHEST, BP_MOUTH) mapped to all possible keys associated - // with the zone. Used for species with body layouts that do not map directly to the standard humanoid - // body, currently serpentids and mantids. + // with the zone. Used for species with body layouts that do not map directly to a standard humanoid body. var/list/limb_mapping var/list/has_limbs = list( diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index 9486e7c2ca3..3a780b5b2d3 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -15,6 +15,7 @@ #include "../../mods/mobs/borers/_borers.dme" #include "../../mods/species/ascent/_ascent.dme" + #include "../../mods/species/serpentid/_serpentid.dme" #include "../../mods/species/utility_frames/_utility_frames.dme" #include "../../mods/species/tajaran/_tajaran.dme" #include "../../mods/species/lizard/_lizard.dme" diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index 4b2882c78d1..be49574a4fa 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -10,6 +10,7 @@ Now poorly imported for Nebula! #include "../../mods/content/corporate/_corporate.dme" #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/species/ascent/_ascent.dme" + #include "../../mods/species/serpentid/_serpentid.dme" #define USING_MAP_DATUM /datum/map/ministation diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index 180c1dd49a3..56948af1579 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -21,6 +21,7 @@ #include "../../mods/species/adherent/_adherent.dme" #include "../../mods/species/ascent/_ascent.dme" + #include "../../mods/species/serpentid/_serpentid.dme" #include "../../mods/species/lizard/_lizard.dme" #include "../../mods/species/neoavians/_neoavians.dme" #include "../../mods/species/tajaran/_tajaran.dme" diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index 15e094016a9..3b380183f12 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -11,12 +11,13 @@ #include "../../mods/content/psionics/_psionics.dme" #include "../../mods/content/scaling_descriptors.dm" #include "../../mods/content/xenobiology/_xenobiology.dme" + #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/mobs/borers/_borers.dme" #include "../../mods/species/ascent/_ascent.dme" - #include "../../mods/content/matchmaking/_matchmaking.dme" + #include "../../mods/species/serpentid/_serpentid.dme" #include "../../mods/species/utility_frames/_utility_frames.dme" #include "../../mods/species/tajaran/_tajaran.dme" #include "../../mods/species/tritonian/_tritonian.dme" diff --git a/mods/species/ascent/_ascent.dme b/mods/species/ascent/_ascent.dme index cf54d81f8e4..a8bf66e1a9c 100644 --- a/mods/species/ascent/_ascent.dme +++ b/mods/species/ascent/_ascent.dme @@ -6,7 +6,6 @@ #include "datum\ai_laws.dm" #include "datum\antagonist.dm" #include "datum\aspects.dm" -#include "datum\attacks.dm" #include "datum\codex.dm" #include "datum\culture.dm" #include "datum\descriptors.dm" @@ -31,7 +30,6 @@ #include "machines\ship_machines.dm" #include "mobs\bodyparts.dm" #include "mobs\bodyparts_insectoid.dm" -#include "mobs\bodyparts_serpentid.dm" #include "mobs\drone.dm" #include "mobs\insectoid_egg.dm" #include "mobs\nymph\_nymph.dm" diff --git a/mods/species/ascent/ascent.dm b/mods/species/ascent/ascent.dm index 985c709e2bf..fab1c882806 100644 --- a/mods/species/ascent/ascent.dm +++ b/mods/species/ascent/ascent.dm @@ -1,18 +1,14 @@ -#define SPECIES_SERPENTID "Serpentid" #define SPECIES_MANTID_ALATE "Kharmaan Alate" #define SPECIES_MANTID_GYNE "Kharmaan Gyne" #define SPECIES_MANTID_NYMPH "Kharmaan Nymph" -#define BODYTYPE_SNAKE "snakelike body" #define BODYTYPE_MANTID_SMALL "small mantid body" #define BODYTYPE_MANTID_LARGE "large mantid body" -#define BODY_FLAG_SNAKE BITFLAG(3) #define BODY_FLAG_ALATE BITFLAG(4) #define BODY_FLAG_GYNE BITFLAG(5) #define IS_MANTID "mantid" -#define IS_SERPENTID "serpentid" #define BP_L_HAND_UPPER "l_u_hand" #define BP_R_HAND_UPPER "r_u_hand" @@ -23,7 +19,7 @@ ##_thing/ascent/desc = "Some kind of strange alien " + _desc + " technology."; \ ##_thing/ascent/color = COLOR_PURPLE; -#define ALL_ASCENT_SPECIES list(SPECIES_MANTID_ALATE, SPECIES_MANTID_GYNE, SPECIES_SERPENTID) +#define ALL_ASCENT_SPECIES list(SPECIES_MANTID_ALATE, SPECIES_MANTID_GYNE) /decl/modpack/ascent name = "The Ascent" diff --git a/mods/species/ascent/datum/aspects.dm b/mods/species/ascent/datum/aspects.dm index 456a9598274..cdabb680d26 100644 --- a/mods/species/ascent/datum/aspects.dm +++ b/mods/species/ascent/datum/aspects.dm @@ -1,7 +1,6 @@ /decl/aspect/Initialize() . = ..() LAZYINITLIST(blocked_species) - blocked_species |= SPECIES_SERPENTID blocked_species |= SPECIES_MANTID_ALATE blocked_species |= SPECIES_MANTID_GYNE blocked_species |= SPECIES_MANTID_NYMPH @@ -9,7 +8,6 @@ /decl/aspect/ascent/Initialize() . = ..() blocked_species = global.all_species.Copy() - blocked_species -= SPECIES_SERPENTID blocked_species -= SPECIES_MANTID_ALATE blocked_species -= SPECIES_MANTID_GYNE blocked_species -= SPECIES_MANTID_NYMPH diff --git a/mods/species/ascent/datum/culture.dm b/mods/species/ascent/datum/culture.dm index 99fe5cdaa6a..f1061fd2058 100644 --- a/mods/species/ascent/datum/culture.dm +++ b/mods/species/ascent/datum/culture.dm @@ -68,11 +68,12 @@ var/global/list/gyne_architecture = list( additional_langs = list(/decl/language/mantid/worldnet, /decl/language/mantid) hidden = TRUE description = "The Ascent is an ancient, isolated stellar empire composed of the mantid-cephalopodean \ - Kharmaani, the Serpentids, and their gaggle of AI servitors. Day to day existence in the Ascent is \ - largely a matter of navigating a bewildering labyrinth of social obligations, gyne power dynamics, factional \ - tithing, protection rackets, industry taxes and plain old interpersonal backstabbing. Both member cultures of \ + Kharmaani and their gaggle of AI servitors. Day to day existence in the Ascent is largely a matter of \ + navigating a bewildering labyrinth of social obligations, gyne power dynamics, factional tithing, \ + protection rackets, industry taxes and plain old interpersonal backstabbing. Both member cultures of \ this stellar power are eusocial to an extent, and their society is shaped around the teeming masses \ - of workers, soldiers, technicians and 'lesser' citizens supporting a throng of imperious and all-powerful queens." + of workers, soldiers, technicians and 'lesser' citizens supporting a throng of imperious and all-powerful \ + queens." /decl/cultural_info/culture/ascent/get_random_name(var/mob/M, var/gender) var/mob/living/carbon/human/H = M @@ -94,16 +95,6 @@ var/global/list/gyne_architecture = list( social culture, the surface itself is a pristine monument to the Kharmaan evolutionary past." hidden = TRUE -/decl/cultural_info/faction/ascent_serpentid - name = "Ascent Serpentid" - language = /decl/language/mantid/nonvocal - description = "Members of the Ascent tend to be organized along the natural lines of their respective species. \ - For Kharmaani, this is oriented around individual gynes and their power structures. Serpentids have a slightly less \ - manipulative approach, as well as more numerous and less self-absorbed queens. They tend to cluster in broad social groups, \ - usually within the designated oxygen-rich 'mezzanines' each fortress-nest happily allocates to them. As mild as they are by \ - comparison to their fellows, Serpentid political and social culture is still factional and often vicious." - hidden = TRUE - /decl/cultural_info/faction/ascent_alate name = "Ascent Alate" language = /decl/language/mantid/nonvocal diff --git a/mods/species/ascent/datum/languages.dm b/mods/species/ascent/datum/languages.dm index 7a75dc3cc96..44231fa56a6 100644 --- a/mods/species/ascent/datum/languages.dm +++ b/mods/species/ascent/datum/languages.dm @@ -13,8 +13,7 @@ machine_understands = FALSE var/list/correct_mouthbits = list( SPECIES_MANTID_ALATE, - SPECIES_MANTID_GYNE, - SPECIES_SERPENTID + SPECIES_MANTID_GYNE ) /decl/language/mantid/can_be_spoken_properly_by(var/mob/speaker) diff --git a/mods/species/ascent/datum/species.dm b/mods/species/ascent/datum/species.dm index 670eb60d7fd..cf9e9fa025c 100644 --- a/mods/species/ascent/datum/species.dm +++ b/mods/species/ascent/datum/species.dm @@ -18,19 +18,6 @@ chargen_min_index = 5 chargen_max_index = 9 -/datum/appearance_descriptor/age/serpentid - chargen_min_index = 3 - chargen_max_index = 6 - standalone_value_descriptors = list( - "a larva" = 1, - "a nymph" = 2, - "a juvenile" = 3, - "an adolescent" = 5, - "a young adult" = 12, - "a full adult" = 30, - "senescent" = 45 - ) - /decl/blood_type/hemolymph/mantid name = "crystalline ichor" antigens = list("Hc") // hemocyanin, more of an octopus thing than a bug thing but whatever, it sounds neat @@ -219,255 +206,3 @@ "storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store_str, "state" = "pocket"), "belt" = list("loc" = ui_belt, "name" = "Belt", "slot" = slot_belt_str, "state" = "belt") ) - -/decl/species/serpentid - name = SPECIES_SERPENTID - name_plural = "Serpentids" - spawn_flags = SPECIES_IS_RESTRICTED - - blood_types = list(/decl/blood_type/hemolymph) - - has_organ = list( - BP_BRAIN = /obj/item/organ/internal/brain/insectoid/serpentid, - BP_EYES = /obj/item/organ/internal/eyes/insectoid/serpentid, - BP_TRACH = /obj/item/organ/internal/lungs/insectoid/serpentid, - BP_HEART = /obj/item/organ/internal/heart/open, - BP_LIVER = /obj/item/organ/internal/liver/insectoid/serpentid, - BP_STOMACH = /obj/item/organ/internal/stomach/insectoid, - BP_SYSTEM_CONTROLLER = /obj/item/organ/internal/controller - ) - - has_limbs = list( - BP_CHEST = list("path" = /obj/item/organ/external/chest/insectoid/serpentid), - BP_GROIN = list("path" = /obj/item/organ/external/groin/insectoid/serpentid), - BP_HEAD = list("path" = /obj/item/organ/external/head/insectoid/serpentid), - BP_L_ARM = list("path" = /obj/item/organ/external/arm/insectoid), - BP_L_HAND = list("path" = /obj/item/organ/external/hand/insectoid), - BP_L_HAND_UPPER = list("path" = /obj/item/organ/external/hand/insectoid/upper), - BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/insectoid), - BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/insectoid), - BP_R_HAND_UPPER = list("path" = /obj/item/organ/external/hand/right/insectoid/upper), - BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/insectoid), - BP_L_LEG = list("path" = /obj/item/organ/external/leg/insectoid), - BP_L_FOOT = list("path" = /obj/item/organ/external/foot/insectoid), - BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/insectoid) - ) - - limb_mapping = list( - BP_L_HAND = list(BP_L_HAND, BP_L_HAND_UPPER), - BP_R_HAND = list(BP_R_HAND, BP_R_HAND_UPPER) - ) - - force_cultural_info = list( - TAG_CULTURE = /decl/cultural_info/culture/ascent, - TAG_HOMEWORLD = /decl/cultural_info/location/kharmaani, - TAG_FACTION = /decl/cultural_info/faction/ascent_serpentid, - TAG_RELIGION = /decl/cultural_info/religion/kharmaani - ) - - hidden_from_codex = TRUE - silent_steps = TRUE - age_descriptor = /datum/appearance_descriptor/age/serpentid - skin_material = /decl/material/solid/skin/insect - bone_material = null - speech_sounds = list('sound/voice/bug.ogg') - speech_chance = 2 - warning_low_pressure = 50 - hazard_low_pressure = -1 - body_temperature = null - flesh_color = "#525252" - blood_oxy = 0 - reagent_tag = IS_SERPENTID - - available_bodytypes = list( - /decl/bodytype/serpentid, - /decl/bodytype/serpentid/green - ) - - darksight_range = 8 - slowdown = -0.5 - rarity_value = 4 - hud_type = /datum/hud_data/serpentid - total_health = 200 - brute_mod = 0.9 - burn_mod = 1.35 - - natural_armour_values = list( - melee = ARMOR_MELEE_KNIVES, - bullet = ARMOR_BALLISTIC_MINOR, - bomb = ARMOR_BOMB_PADDED, - bio = ARMOR_BIO_SHIELDED, - rad = 0.5*ARMOR_RAD_MINOR - ) - gluttonous = GLUT_SMALLER - mob_size = MOB_SIZE_LARGE - strength = STR_HIGH - breath_pressure = 25 - blood_volume = 840 - spawns_with_stack = 0 - heat_level_1 = 410 //Default 360 - Higher is better - heat_level_2 = 440 //Default 400 - heat_level_3 = 800 //Default 1000 - species_flags = SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_BLOCK | SPECIES_FLAG_NO_MINOR_CUT | SPECIES_FLAG_NEED_DIRECT_ABSORB - appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_SKIN_TONE_NORMAL - spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED - bump_flag = HEAVY - push_flags = ALLMOBS - swap_flags = ALLMOBS - breathing_organ = BP_TRACH - move_trail = /obj/effect/decal/cleanable/blood/tracks/snake - - unarmed_attacks = list(/decl/natural_attack/serpentid) - appearance_descriptors = list( - /datum/appearance_descriptor/height = 1.75, - /datum/appearance_descriptor/body_length = 1 - ) - pain_emotes_with_pain_level = list( - list(/decl/emote/audible/bug_hiss) = 40 - ) - var/list/skin_overlays = list() - -/decl/species/serpentid/can_overcome_gravity(var/mob/living/carbon/human/H) - var/datum/gas_mixture/mixture = H.loc.return_air() - - if(mixture) - var/pressure = mixture.return_pressure() - if(pressure > 50) - var/turf/below = GetBelow(H) - var/turf/T = H.loc - if(!T.CanZPass(H, DOWN) || !below.CanZPass(H, DOWN)) - return TRUE - - return FALSE - -/decl/species/serpentid/handle_environment_special(var/mob/living/carbon/human/H) - if(!H.on_fire && H.fire_stacks < 2) - H.fire_stacks += 0.2 - return - -/decl/species/serpentid/can_fall(var/mob/living/carbon/human/H) - var/datum/gas_mixture/mixture = H.loc.return_air() - var/turf/T = GetBelow(H.loc) - for(var/obj/O in T) - if(istype(O, /obj/structure/stairs)) - return TRUE - if(mixture) - var/pressure = mixture.return_pressure() - if(pressure > 80) - return FALSE - return TRUE - -/decl/species/serpentid/handle_fall_special(var/mob/living/carbon/human/H, var/turf/landing) - - var/datum/gas_mixture/mixture = H.loc.return_air() - var/turf/T = GetBelow(H.loc) - for(var/obj/O in T) - if(istype(O, /obj/structure/stairs)) - return FALSE - - if(mixture) - var/pressure = mixture.return_pressure() - if(pressure > 50) - if(istype(landing) && landing.is_open()) - H.visible_message("\The [H] descends from the deck above through \the [landing]!", "Your wings slow your descent.") - else - H.visible_message("\The [H] buzzes down from \the [landing], wings slowing their descent!", "You land on \the [landing], folding your wings.") - - return TRUE - - return FALSE - -/decl/species/serpentid/can_shred(var/mob/living/carbon/human/H, var/ignore_intent, var/ignore_antag) - if(!H.handcuffed || H.buckled) - return ..(H, ignore_intent, TRUE) - else - return 0 - -/decl/species/serpentid/handle_movement_delay_special(var/mob/living/carbon/human/H) - var/tally = 0 - - H.remove_cloaking_source(src) - - var/obj/item/organ/internal/B = H.get_organ(BP_BRAIN) - if(istype(B,/obj/item/organ/internal/brain/insectoid/serpentid)) - var/obj/item/organ/internal/brain/insectoid/serpentid/N = B - tally += N.lowblood_tally * 2 - return tally - -/decl/species/serpentid/update_skin(var/mob/living/carbon/human/H) - - if(H.stat) - H.skin_state = SKIN_NORMAL - - switch(H.skin_state) - if(SKIN_NORMAL) - return - if(SKIN_THREAT) - - var/image_key = "[H.bodytype.get_icon_cache_uid(H)]" - - for(var/organ_tag in H.species.has_limbs) - var/obj/item/organ/external/part = H.get_organ(organ_tag) - if(isnull(part) || part.is_stump()) - image_key += "0" - continue - if(part) - image_key += "[part.bodytype.get_icon_cache_uid(part.owner)]" - if(BP_IS_PROSTHETIC(part)) - image_key += "2[part.model ? "-[part.model]": ""]" - else if(part.status & ORGAN_DEAD) - image_key += "3" - else - image_key += "1" - - var/image/threat_image = skin_overlays[image_key] - if(!threat_image) - var/icon/base_icon = icon(H.stand_icon) - var/icon/I = new('mods/species/ascent/icons/species/body/serpentid/threat.dmi', "threat") - base_icon.Blend(COLOR_BLACK, ICON_MULTIPLY) - base_icon.Blend(I, ICON_ADD) - threat_image = image(base_icon) - skin_overlays[image_key] = threat_image - - return(threat_image) - - -/decl/species/serpentid/disarm_attackhand(var/mob/living/carbon/human/attacker, var/mob/living/carbon/human/target) - if(attacker.pulling_punches || target.lying || attacker == target) - return ..(attacker, target) - if(world.time < attacker.last_attack + 20) - to_chat(attacker, SPAN_NOTICE("You can't attack again so soon.")) - return 0 - attacker.last_attack = world.time - var/turf/T = get_step(get_turf(target), get_dir(get_turf(attacker), get_turf(target))) - playsound(target.loc, 'sound/weapons/pushhiss.ogg', 50, 1, -1) - if(!T.density) - step(target, get_dir(get_turf(attacker), get_turf(target))) - target.visible_message(SPAN_DANGER("[pick("[target] was sent flying backward!", "[target] staggers back from the impact!")]")) - else - target.turf_collision(T, target.throw_speed / 2) - if(prob(50)) - target.set_dir(global.reverse_dir[target.dir]) - -/decl/species/serpentid/skills_from_age(age) //Converts an age into a skill point allocation modifier. Can be used to give skill point bonuses/penalities not depending on job. - switch(age) - if(0 to 18) . = 8 - if(19 to 27) . = 2 - if(28 to 40) . = -2 - else . = -4 - -/datum/hud_data/serpentid - gear = list( - "i_clothing" = list("loc" = ui_iclothing, "name" = "Uniform", "slot" = slot_w_uniform_str, "state" = "center", "toggle" = 1), - "o_clothing" = list("loc" = ui_shoes, "name" = "Suit", "slot" = slot_wear_suit_str, "state" = "suit", "toggle" = 1), - "l_ear" = list("loc" = ui_oclothing, "name" = "Ear", "slot" = slot_l_ear_str, "state" = "ears", "toggle" = 1), - "gloves" = list("loc" = ui_gloves, "name" = "Gloves", "slot" = slot_gloves_str, "state" = "gloves", "toggle" = 1), - "head" = list("loc" = ui_mask, "name" = "Hat", "slot" = slot_head_str, "state" = "hair", "toggle" = 1), - "eyes" = list("loc" = ui_glasses, "name" = "Glasses", "slot" = slot_glasses_str, "state" = "glasses","toggle" = 1), - "suit storage" = list("loc" = ui_sstore1, "name" = "Suit Storage", "slot" = slot_s_store_str, "state" = "suitstore"), - "back" = list("loc" = ui_back, "name" = "Back", "slot" = slot_back_str, "state" = "back"), - "id" = list("loc" = ui_id, "name" = "ID", "slot" = slot_wear_id_str, "state" = "id"), - "storage1" = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = slot_l_store_str, "state" = "pocket"), - "storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store_str, "state" = "pocket"), - "belt" = list("loc" = ui_belt, "name" = "Belt", "slot" = slot_belt_str, "state" = "belt") - ) \ No newline at end of file diff --git a/mods/species/ascent/datum/species_bodytypes.dm b/mods/species/ascent/datum/species_bodytypes.dm index ebb57a0b140..7dffe028c67 100644 --- a/mods/species/ascent/datum/species_bodytypes.dm +++ b/mods/species/ascent/datum/species_bodytypes.dm @@ -30,29 +30,3 @@ ) . = ..() -/decl/bodytype/serpentid - name = "grey" - icon_template = 'icons/mob/human_races/species/template_tall.dmi' - icon_base = 'mods/species/ascent/icons/species/body/serpentid/body_grey.dmi' - blood_overlays = 'mods/species/ascent/icons/species/body/serpentid/blood_overlays.dmi' - limb_blend = ICON_MULTIPLY - bodytype_category = BODYTYPE_SNAKE - antaghud_offset_y = 8 - bodytype_flag = BODY_FLAG_SNAKE - -/decl/bodytype/serpentid/Initialize() - equip_adjust = list( - BP_L_HAND_UPPER = list("[NORTH]" = list("x" = 0, "y" = 8), "[EAST]" = list("x" = 0, "y" = 8), "[SOUTH]" = list("x" = -0, "y" = 8), "[WEST]" = list("x" = 0, "y" = 8)), - BP_R_HAND_UPPER = list("[NORTH]" = list("x" = 0, "y" = 8), "[EAST]" = list("x" = 0, "y" = 8), "[SOUTH]" = list("x" = 0, "y" = 8), "[WEST]" = list("x" = 0, "y" = 8)), - BP_L_HAND = list("[NORTH]" = list("x" = 4, "y" = 0), "[EAST]" = list("x" = 0, "y" = 0), "[SOUTH]" = list("x" = -4, "y" = 0), "[WEST]" = list("x" = 0, "y" = 0)), - BP_R_HAND = list("[NORTH]" = list("x" = -4, "y" = 0), "[EAST]" = list("x" = 0, "y" = 0), "[SOUTH]" = list("x" = 4, "y" = 0), "[WEST]" = list("x" = 0, "y" = 0)), - slot_head_str = list("[NORTH]" = list("x" = 0, "y" = 7), "[EAST]" = list("x" = 0, "y" = 8), "[SOUTH]" = list("x" = 0, "y" = 8), "[WEST]" = list("x" = 0, "y" = 8)), - slot_back_str = list("[NORTH]" = list("x" = 0, "y" = 7), "[EAST]" = list("x" = 0, "y" = 8), "[SOUTH]" = list("x" = 0, "y" = 8), "[WEST]" = list("x" = 0, "y" = 8)), - slot_belt_str = list("[NORTH]" = list("x" = 0, "y" = 0), "[EAST]" = list("x" = 8, "y" = 0), "[SOUTH]" = list("x" = 0, "y" = 0), "[WEST]" = list("x" = -8, "y" = 0)), - slot_glasses_str = list("[NORTH]" = list("x" = 0, "y" = 10), "[EAST]" = list("x" = 0, "y" = 11), "[SOUTH]" = list("x" = 0, "y" = 11), "[WEST]" = list("x" = 0, "y" = 11)) - ) - . = ..() - -/decl/bodytype/serpentid/green - name = "green" - icon_base = 'mods/species/ascent/icons/species/body/serpentid/body_green.dmi' diff --git a/mods/species/ascent/effects/razorweb.dm b/mods/species/ascent/effects/razorweb.dm index 4b1d3c3dc39..1323e5d3fd2 100644 --- a/mods/species/ascent/effects/razorweb.dm +++ b/mods/species/ascent/effects/razorweb.dm @@ -32,8 +32,7 @@ var/image/web var/static/species_immunity_list = list( SPECIES_MANTID_ALATE = TRUE, - SPECIES_MANTID_GYNE = TRUE, - SPECIES_SERPENTID = TRUE + SPECIES_MANTID_GYNE = TRUE ) /obj/effect/razorweb/Destroy() diff --git a/mods/species/ascent/items/clothing.dm b/mods/species/ascent/items/clothing.dm index 1808fc65012..42f162c4829 100644 --- a/mods/species/ascent/items/clothing.dm +++ b/mods/species/ascent/items/clothing.dm @@ -22,10 +22,7 @@ desc = "An alien facemask with chunky gas filters and a breathing valve." filter_water = TRUE icon = 'mods/species/ascent/icons/clothing/mask.dmi' - sprite_sheets = list( - BODYTYPE_SNAKE = 'mods/species/ascent/icons/clothing/mask_serpentid.dmi', - BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/clothing/mask_gyne.dmi' - ) + sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/clothing/mask_gyne.dmi') bodytype_equip_flags = BODY_FLAG_GYNE | BODY_FLAG_ALATE filtered_gases = list( /decl/material/gas/nitrous_oxide, @@ -36,19 +33,6 @@ ) flags_inv = 0 -/obj/item/clothing/mask/gas/ascent/monarch - name = "serpentid facemask" - desc = "An alien facemask with chunky gas filters and a breathing valve." - filtered_gases = list( - /decl/material/gas/nitrous_oxide, - /decl/material/gas/chlorine, - /decl/material/gas/ammonia, - /decl/material/gas/carbon_monoxide, - /decl/material/gas/methyl_bromide, - /decl/material/gas/methane - ) - bodytype_equip_flags = BODY_FLAG_SNAKE - /obj/item/clothing/shoes/magboots/ascent name = "mantid mag-claws" desc = "A set of powerful gripping claws." @@ -71,13 +55,10 @@ /obj/item/clothing/suit/storage/ascent name = "mantid gear harness" desc = "A complex tangle of articulated cables and straps." - bodytype_equip_flags = BODY_FLAG_GYNE | BODY_FLAG_ALATE | BODY_FLAG_SNAKE + bodytype_equip_flags = BODY_FLAG_GYNE | BODY_FLAG_ALATE icon_state = ICON_STATE_WORLD icon = 'mods/species/ascent/icons/clothing/under_harness.dmi' - sprite_sheets = list( - BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/clothing/under_harness_gyne.dmi', - BODYTYPE_SNAKE = 'mods/species/ascent/icons/clothing/under_harness_serpentid.dmi' - ) + sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/clothing/under_harness_gyne.dmi') body_parts_covered = 0 slot_flags = SLOT_OVER_BODY | SLOT_LOWER_BODY allowed = list( diff --git a/mods/species/ascent/items/guns.dm b/mods/species/ascent/items/guns.dm index 45b9cbfb5ee..dff87fe2328 100644 --- a/mods/species/ascent/items/guns.dm +++ b/mods/species/ascent/items/guns.dm @@ -21,10 +21,7 @@ list(mode_name="shock", projectile_type = /obj/item/projectile/beam/stun/shock), list(mode_name="lethal", projectile_type = /obj/item/projectile/beam/particle) ) - sprite_sheets = list( - BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/particle_rifle/inhands_gyne.dmi', - BODYTYPE_SNAKE = 'mods/species/ascent/icons/particle_rifle/inhands_serpentid.dmi' - ) + sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/particle_rifle/inhands_gyne.dmi') /obj/item/gun/energy/particle/small name = "particle projector" diff --git a/mods/species/ascent/items/rig.dm b/mods/species/ascent/items/rig.dm index e99df1f183f..c9b2cecb1bc 100644 --- a/mods/species/ascent/items/rig.dm +++ b/mods/species/ascent/items/rig.dm @@ -28,10 +28,7 @@ gloves = /obj/item/clothing/gloves/rig/mantid update_visible_name = TRUE - sprite_sheets = list( - BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_gyne.dmi', - BODYTYPE_SNAKE = 'mods/species/ascent/icons/rig/rig_serpentid.dmi' - ) + sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_gyne.dmi') initial_modules = list( /obj/item/rig_module/vision/thermal, /obj/item/rig_module/ai_container, @@ -181,11 +178,6 @@ starting_pressure[refill_gas_type] = (6 * ONE_ATMOSPHERE) . = ..() -/obj/item/tank/mantid/reactor/oxygen - name = "serpentid gas reactor" - refill_gas_type = /decl/material/gas/oxygen - distribute_pressure = 31 - /obj/item/tank/mantid/reactor/Process() ..() var/obj/item/rig/holder = loc @@ -236,16 +228,6 @@ /obj/item/rig_module/maneuvering_jets ) -/obj/item/rig/mantid/serpentid - name = "serpentid support exosuit" - mantid_caste = SPECIES_SERPENTID - air_supply = /obj/item/tank/mantid/reactor/oxygen - chest = /obj/item/clothing/suit/space/rig/mantid/serpentid - boots = FALSE - -/obj/item/clothing/suit/space/rig/mantid/serpentid - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_FEET - /obj/item/rig/mantid/mob_can_equip(var/mob/M, var/slot) . = ..() if(. && slot == slot_back_str) @@ -257,16 +239,13 @@ /obj/item/clothing/head/helmet/space/rig/mantid light_color = "#00ffff" desc = "More like a torpedo casing than a helmet." - bodytype_equip_flags = BODY_FLAG_GYNE | BODY_FLAG_ALATE | BODY_FLAG_SNAKE + bodytype_equip_flags = BODY_FLAG_GYNE | BODY_FLAG_ALATE icon = 'mods/species/ascent/icons/rig/rig_helmet.dmi' - sprite_sheets = list( - BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_helmet_gyne.dmi', - BODYTYPE_SNAKE = 'mods/species/ascent/icons/rig/rig_helmet_serpentid.dmi' - ) + sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_helmet_gyne.dmi') /obj/item/clothing/suit/space/rig/mantid desc = "It's closer to a mech than a suit." - bodytype_equip_flags = BODY_FLAG_GYNE | BODY_FLAG_ALATE | BODY_FLAG_SNAKE + bodytype_equip_flags = BODY_FLAG_GYNE | BODY_FLAG_ALATE icon = 'mods/species/ascent/icons/rig/rig_chest.dmi' allowed = list( /obj/item/clustertool, @@ -276,24 +255,16 @@ /obj/item/stack/medical/resin, /obj/item/chems/drinks/cans/waterbottle/ascent ) - sprite_sheets = list( - BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_chest_gyne.dmi', - BODYTYPE_SNAKE = 'mods/species/ascent/icons/rig/rig_chest_serpentid.dmi' - ) + sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_chest_gyne.dmi') /obj/item/clothing/shoes/magboots/rig/mantid icon = 'mods/species/ascent/icons/rig/rig_boots.dmi' desc = "It's like a highly advanced forklift." bodytype_equip_flags = BODY_FLAG_GYNE | BODY_FLAG_ALATE - sprite_sheets = list( - BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_boots_gyne.dmi' - ) + sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_boots_gyne.dmi') /obj/item/clothing/gloves/rig/mantid icon = 'mods/species/ascent/icons/rig/rig_gloves.dmi' desc = "They look like a cross between a can opener and a Swiss army knife the size of a shoebox." - bodytype_equip_flags = BODY_FLAG_GYNE | BODY_FLAG_ALATE | BODY_FLAG_SNAKE - sprite_sheets = list( - BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_gloves_gyne.dmi', - BODYTYPE_SNAKE = 'mods/species/ascent/icons/rig/rig_gloves_serpentid.dmi' - ) + bodytype_equip_flags = BODY_FLAG_GYNE | BODY_FLAG_ALATE + sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_gloves_gyne.dmi') diff --git a/mods/species/serpentid/_serpentid.dme b/mods/species/serpentid/_serpentid.dme new file mode 100644 index 00000000000..b4ca6c14098 --- /dev/null +++ b/mods/species/serpentid/_serpentid.dme @@ -0,0 +1,10 @@ +#ifndef MODPACK_SERPENTID +#define MODPACK_SERPENTID +// BEGIN_INCLUDE +#include "serpentid.dm" +#include "datum\attacks.dm" +#include "datum\species.dm" +#include "datum\species_bodytypes.dm" +#include "mobs\bodyparts_serpentid.dm" +// END_INCLUDE +#endif diff --git a/mods/species/ascent/datum/attacks.dm b/mods/species/serpentid/datum/attacks.dm similarity index 85% rename from mods/species/ascent/datum/attacks.dm rename to mods/species/serpentid/datum/attacks.dm index f8b0b7d4fbf..b94d3322306 100644 --- a/mods/species/ascent/datum/attacks.dm +++ b/mods/species/serpentid/datum/attacks.dm @@ -1,4 +1,3 @@ - /decl/natural_attack/serpentid attack_verb = list("mauled", "slashed", "struck", "pierced") attack_noun = list("forelimb") @@ -10,4 +9,4 @@ eye_attack_text = "a forelimb" eye_attack_text_victim = "a forelimb" name = "forelimb slash" - usable_with_limbs = list(BP_L_HAND, BP_R_HAND) \ No newline at end of file + usable_with_limbs = list(BP_L_HAND, BP_R_HAND) diff --git a/mods/species/serpentid/datum/species.dm b/mods/species/serpentid/datum/species.dm new file mode 100644 index 00000000000..eb67eb89c94 --- /dev/null +++ b/mods/species/serpentid/datum/species.dm @@ -0,0 +1,257 @@ +/datum/appearance_descriptor/age/serpentid + chargen_min_index = 3 + chargen_max_index = 6 + standalone_value_descriptors = list( + "a larva" = 1, + "a nymph" = 2, + "a juvenile" = 3, + "an adolescent" = 5, + "a young adult" = 12, + "a full adult" = 30, + "senescent" = 45 + ) + +/decl/species/serpentid + name = SPECIES_SERPENTID + name_plural = "Serpentids" + spawn_flags = SPECIES_IS_RESTRICTED + + blood_types = list(/decl/blood_type/hemolymph) + + has_organ = list( + BP_BRAIN = /obj/item/organ/internal/brain/insectoid/serpentid, + BP_EYES = /obj/item/organ/internal/eyes/insectoid/serpentid, + BP_TRACH = /obj/item/organ/internal/lungs/insectoid/serpentid, + BP_HEART = /obj/item/organ/internal/heart/open, + BP_LIVER = /obj/item/organ/internal/liver/insectoid/serpentid, + BP_STOMACH = /obj/item/organ/internal/stomach/insectoid, + BP_SYSTEM_CONTROLLER = /obj/item/organ/internal/controller + ) + + has_limbs = list( + BP_CHEST = list("path" = /obj/item/organ/external/chest/insectoid/serpentid), + BP_GROIN = list("path" = /obj/item/organ/external/groin/insectoid/serpentid), + BP_HEAD = list("path" = /obj/item/organ/external/head/insectoid/serpentid), + BP_L_ARM = list("path" = /obj/item/organ/external/arm/insectoid), + BP_L_HAND = list("path" = /obj/item/organ/external/hand/insectoid), + BP_L_HAND_UPPER = list("path" = /obj/item/organ/external/hand/insectoid/upper), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/insectoid), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/insectoid), + BP_R_HAND_UPPER = list("path" = /obj/item/organ/external/hand/right/insectoid/upper), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/insectoid), + BP_L_LEG = list("path" = /obj/item/organ/external/leg/insectoid), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot/insectoid), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/insectoid) + ) + + limb_mapping = list( + BP_L_HAND = list(BP_L_HAND, BP_L_HAND_UPPER), + BP_R_HAND = list(BP_R_HAND, BP_R_HAND_UPPER) + ) + + hidden_from_codex = TRUE + silent_steps = TRUE + age_descriptor = /datum/appearance_descriptor/age/serpentid + skin_material = /decl/material/solid/skin/insect + bone_material = null + speech_sounds = list('sound/voice/bug.ogg') + speech_chance = 2 + warning_low_pressure = 50 + hazard_low_pressure = -1 + body_temperature = null + flesh_color = "#525252" + blood_oxy = 0 + reagent_tag = IS_SERPENTID + + available_bodytypes = list( + /decl/bodytype/serpentid, + /decl/bodytype/serpentid/green + ) + + darksight_range = 8 + slowdown = -0.5 + rarity_value = 4 + hud_type = /datum/hud_data/serpentid + total_health = 200 + brute_mod = 0.9 + burn_mod = 1.35 + + natural_armour_values = list( + melee = ARMOR_MELEE_KNIVES, + bullet = ARMOR_BALLISTIC_MINOR, + bomb = ARMOR_BOMB_PADDED, + bio = ARMOR_BIO_SHIELDED, + rad = 0.5*ARMOR_RAD_MINOR + ) + gluttonous = GLUT_SMALLER + mob_size = MOB_SIZE_LARGE + strength = STR_HIGH + breath_pressure = 25 + blood_volume = 840 + spawns_with_stack = 0 + heat_level_1 = 410 //Default 360 - Higher is better + heat_level_2 = 440 //Default 400 + heat_level_3 = 800 //Default 1000 + species_flags = SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_BLOCK | SPECIES_FLAG_NO_MINOR_CUT | SPECIES_FLAG_NEED_DIRECT_ABSORB + appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_SKIN_TONE_NORMAL + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED + bump_flag = HEAVY + push_flags = ALLMOBS + swap_flags = ALLMOBS + breathing_organ = BP_TRACH + move_trail = /obj/effect/decal/cleanable/blood/tracks/snake + + unarmed_attacks = list(/decl/natural_attack/serpentid) + appearance_descriptors = list( + /datum/appearance_descriptor/height = 1.75, + /datum/appearance_descriptor/body_length = 1 + ) + pain_emotes_with_pain_level = list( + list(/decl/emote/audible/bug_hiss) = 40 + ) + var/list/skin_overlays = list() + +/decl/species/serpentid/can_overcome_gravity(var/mob/living/carbon/human/H) + var/datum/gas_mixture/mixture = H.loc.return_air() + + if(mixture) + var/pressure = mixture.return_pressure() + if(pressure > 50) + var/turf/below = GetBelow(H) + var/turf/T = H.loc + if(!T.CanZPass(H, DOWN) || !below.CanZPass(H, DOWN)) + return TRUE + + return FALSE + +/decl/species/serpentid/handle_environment_special(var/mob/living/carbon/human/H) + if(!H.on_fire && H.fire_stacks < 2) + H.fire_stacks += 0.2 + return + +/decl/species/serpentid/can_fall(var/mob/living/carbon/human/H) + var/datum/gas_mixture/mixture = H.loc.return_air() + var/turf/T = GetBelow(H.loc) + for(var/obj/O in T) + if(istype(O, /obj/structure/stairs)) + return TRUE + if(mixture) + var/pressure = mixture.return_pressure() + if(pressure > 80) + return FALSE + return TRUE + +/decl/species/serpentid/handle_fall_special(var/mob/living/carbon/human/H, var/turf/landing) + + var/datum/gas_mixture/mixture = H.loc.return_air() + var/turf/T = GetBelow(H.loc) + for(var/obj/O in T) + if(istype(O, /obj/structure/stairs)) + return FALSE + + if(mixture) + var/pressure = mixture.return_pressure() + if(pressure > 50) + if(istype(landing) && landing.is_open()) + H.visible_message("\The [H] descends from the deck above through \the [landing]!", "Your wings slow your descent.") + else + H.visible_message("\The [H] buzzes down from \the [landing], wings slowing their descent!", "You land on \the [landing], folding your wings.") + + return TRUE + + return FALSE + +/decl/species/serpentid/can_shred(var/mob/living/carbon/human/H, var/ignore_intent, var/ignore_antag) + if(!H.handcuffed || H.buckled) + return ..(H, ignore_intent, TRUE) + else + return 0 + +/decl/species/serpentid/handle_movement_delay_special(var/mob/living/carbon/human/H) + var/tally = 0 + + H.remove_cloaking_source(src) + + var/obj/item/organ/internal/B = H.get_organ(BP_BRAIN) + if(istype(B,/obj/item/organ/internal/brain/insectoid/serpentid)) + var/obj/item/organ/internal/brain/insectoid/serpentid/N = B + tally += N.lowblood_tally * 2 + return tally + +/decl/species/serpentid/update_skin(var/mob/living/carbon/human/H) + + if(H.stat) + H.skin_state = SKIN_NORMAL + + switch(H.skin_state) + if(SKIN_NORMAL) + return + if(SKIN_THREAT) + + var/image_key = "[H.bodytype.get_icon_cache_uid(H)]" + + for(var/organ_tag in H.species.has_limbs) + var/obj/item/organ/external/part = H.get_organ(organ_tag) + if(isnull(part) || part.is_stump()) + image_key += "0" + continue + if(part) + image_key += "[part.bodytype.get_icon_cache_uid(part.owner)]" + if(BP_IS_PROSTHETIC(part)) + image_key += "2[part.model ? "-[part.model]": ""]" + else if(part.status & ORGAN_DEAD) + image_key += "3" + else + image_key += "1" + + var/image/threat_image = skin_overlays[image_key] + if(!threat_image) + var/icon/base_icon = icon(H.stand_icon) + var/icon/I = new('mods/species/serpentid/icons/threat.dmi', "threat") + base_icon.Blend(COLOR_BLACK, ICON_MULTIPLY) + base_icon.Blend(I, ICON_ADD) + threat_image = image(base_icon) + skin_overlays[image_key] = threat_image + + return(threat_image) + + +/decl/species/serpentid/disarm_attackhand(var/mob/living/carbon/human/attacker, var/mob/living/carbon/human/target) + if(attacker.pulling_punches || target.lying || attacker == target) + return ..(attacker, target) + if(world.time < attacker.last_attack + 20) + to_chat(attacker, SPAN_NOTICE("You can't attack again so soon.")) + return 0 + attacker.last_attack = world.time + var/turf/T = get_step(get_turf(target), get_dir(get_turf(attacker), get_turf(target))) + playsound(target.loc, 'sound/weapons/pushhiss.ogg', 50, 1, -1) + if(!T.density) + step(target, get_dir(get_turf(attacker), get_turf(target))) + target.visible_message(SPAN_DANGER("[pick("[target] was sent flying backward!", "[target] staggers back from the impact!")]")) + else + target.turf_collision(T, target.throw_speed / 2) + if(prob(50)) + target.set_dir(global.reverse_dir[target.dir]) + +/decl/species/serpentid/skills_from_age(age) //Converts an age into a skill point allocation modifier. Can be used to give skill point bonuses/penalities not depending on job. + switch(age) + if(0 to 18) . = 8 + if(19 to 27) . = 2 + if(28 to 40) . = -2 + else . = -4 + +/datum/hud_data/serpentid + gear = list( + "i_clothing" = list("loc" = ui_iclothing, "name" = "Uniform", "slot" = slot_w_uniform_str, "state" = "center", "toggle" = 1), + "o_clothing" = list("loc" = ui_shoes, "name" = "Suit", "slot" = slot_wear_suit_str, "state" = "suit", "toggle" = 1), + "l_ear" = list("loc" = ui_oclothing, "name" = "Ear", "slot" = slot_l_ear_str, "state" = "ears", "toggle" = 1), + "gloves" = list("loc" = ui_gloves, "name" = "Gloves", "slot" = slot_gloves_str, "state" = "gloves", "toggle" = 1), + "head" = list("loc" = ui_mask, "name" = "Hat", "slot" = slot_head_str, "state" = "hair", "toggle" = 1), + "eyes" = list("loc" = ui_glasses, "name" = "Glasses", "slot" = slot_glasses_str, "state" = "glasses","toggle" = 1), + "suit storage" = list("loc" = ui_sstore1, "name" = "Suit Storage", "slot" = slot_s_store_str, "state" = "suitstore"), + "back" = list("loc" = ui_back, "name" = "Back", "slot" = slot_back_str, "state" = "back"), + "id" = list("loc" = ui_id, "name" = "ID", "slot" = slot_wear_id_str, "state" = "id"), + "storage1" = list("loc" = ui_storage1, "name" = "Left Pocket", "slot" = slot_l_store_str, "state" = "pocket"), + "storage2" = list("loc" = ui_storage2, "name" = "Right Pocket", "slot" = slot_r_store_str, "state" = "pocket"), + "belt" = list("loc" = ui_belt, "name" = "Belt", "slot" = slot_belt_str, "state" = "belt") + ) diff --git a/mods/species/serpentid/datum/species_bodytypes.dm b/mods/species/serpentid/datum/species_bodytypes.dm new file mode 100644 index 00000000000..f8d9fd8a034 --- /dev/null +++ b/mods/species/serpentid/datum/species_bodytypes.dm @@ -0,0 +1,26 @@ +/decl/bodytype/serpentid + name = "grey" + icon_template = 'icons/mob/human_races/species/template_tall.dmi' + icon_base = 'mods/species/serpentid/icons/body_grey.dmi' + blood_overlays = 'mods/species/serpentid/icons/blood_overlays.dmi' + limb_blend = ICON_MULTIPLY + bodytype_category = BODYTYPE_SNAKE + antaghud_offset_y = 8 + bodytype_flag = BODY_FLAG_SNAKE + +/decl/bodytype/serpentid/Initialize() + equip_adjust = list( + BP_L_HAND_UPPER = list("[NORTH]" = list("x" = 0, "y" = 8), "[EAST]" = list("x" = 0, "y" = 8), "[SOUTH]" = list("x" = -0, "y" = 8), "[WEST]" = list("x" = 0, "y" = 8)), + BP_R_HAND_UPPER = list("[NORTH]" = list("x" = 0, "y" = 8), "[EAST]" = list("x" = 0, "y" = 8), "[SOUTH]" = list("x" = 0, "y" = 8), "[WEST]" = list("x" = 0, "y" = 8)), + BP_L_HAND = list("[NORTH]" = list("x" = 4, "y" = 0), "[EAST]" = list("x" = 0, "y" = 0), "[SOUTH]" = list("x" = -4, "y" = 0), "[WEST]" = list("x" = 0, "y" = 0)), + BP_R_HAND = list("[NORTH]" = list("x" = -4, "y" = 0), "[EAST]" = list("x" = 0, "y" = 0), "[SOUTH]" = list("x" = 4, "y" = 0), "[WEST]" = list("x" = 0, "y" = 0)), + slot_head_str = list("[NORTH]" = list("x" = 0, "y" = 7), "[EAST]" = list("x" = 0, "y" = 8), "[SOUTH]" = list("x" = 0, "y" = 8), "[WEST]" = list("x" = 0, "y" = 8)), + slot_back_str = list("[NORTH]" = list("x" = 0, "y" = 7), "[EAST]" = list("x" = 0, "y" = 8), "[SOUTH]" = list("x" = 0, "y" = 8), "[WEST]" = list("x" = 0, "y" = 8)), + slot_belt_str = list("[NORTH]" = list("x" = 0, "y" = 0), "[EAST]" = list("x" = 8, "y" = 0), "[SOUTH]" = list("x" = 0, "y" = 0), "[WEST]" = list("x" = -8, "y" = 0)), + slot_glasses_str = list("[NORTH]" = list("x" = 0, "y" = 10), "[EAST]" = list("x" = 0, "y" = 11), "[SOUTH]" = list("x" = 0, "y" = 11), "[WEST]" = list("x" = 0, "y" = 11)) + ) + . = ..() + +/decl/bodytype/serpentid/green + name = "green" + icon_base = 'mods/species/serpentid/icons/body_green.dmi' diff --git a/mods/species/ascent/icons/species/body/serpentid/blood_overlays.dmi b/mods/species/serpentid/icons/blood_overlays.dmi similarity index 100% rename from mods/species/ascent/icons/species/body/serpentid/blood_overlays.dmi rename to mods/species/serpentid/icons/blood_overlays.dmi diff --git a/mods/species/ascent/icons/species/body/serpentid/body_green.dmi b/mods/species/serpentid/icons/body_green.dmi similarity index 100% rename from mods/species/ascent/icons/species/body/serpentid/body_green.dmi rename to mods/species/serpentid/icons/body_green.dmi diff --git a/mods/species/ascent/icons/species/body/serpentid/body_grey.dmi b/mods/species/serpentid/icons/body_grey.dmi similarity index 100% rename from mods/species/ascent/icons/species/body/serpentid/body_grey.dmi rename to mods/species/serpentid/icons/body_grey.dmi diff --git a/mods/species/ascent/icons/species/body/serpentid/eyes.dmi b/mods/species/serpentid/icons/eyes.dmi similarity index 100% rename from mods/species/ascent/icons/species/body/serpentid/eyes.dmi rename to mods/species/serpentid/icons/eyes.dmi diff --git a/mods/species/ascent/icons/species/body/serpentid/threat.dmi b/mods/species/serpentid/icons/threat.dmi similarity index 100% rename from mods/species/ascent/icons/species/body/serpentid/threat.dmi rename to mods/species/serpentid/icons/threat.dmi diff --git a/mods/species/ascent/mobs/bodyparts_serpentid.dm b/mods/species/serpentid/mobs/bodyparts_serpentid.dm similarity index 98% rename from mods/species/ascent/mobs/bodyparts_serpentid.dm rename to mods/species/serpentid/mobs/bodyparts_serpentid.dm index a3c4f0ddb58..667185bfc30 100644 --- a/mods/species/ascent/mobs/bodyparts_serpentid.dm +++ b/mods/species/serpentid/mobs/bodyparts_serpentid.dm @@ -3,7 +3,7 @@ innate_flash_protection = FLASH_PROTECTION_VULNERABLE contaminant_guard = 1 action_button_name = "Toggle Eye Shields" - eye_icon = 'mods/species/ascent/icons/species/body/serpentid/eyes.dmi' + eye_icon = 'mods/species/serpentid/icons/eyes.dmi' var/eyes_shielded /obj/item/organ/internal/eyes/insectoid/serpentid/get_special_overlay() diff --git a/mods/species/serpentid/serpentid.dm b/mods/species/serpentid/serpentid.dm new file mode 100644 index 00000000000..941a18bc874 --- /dev/null +++ b/mods/species/serpentid/serpentid.dm @@ -0,0 +1,4 @@ +#define SPECIES_SERPENTID "Serpentid" +#define BODYTYPE_SNAKE "snakelike body" +#define IS_SERPENTID "serpentid" +#define BODY_FLAG_SNAKE BITFLAG(3) \ No newline at end of file From 4acf27603a21ca76dec817ea3935bb1d8904afdd Mon Sep 17 00:00:00 2001 From: quardbreak <44920739+quardbreak@users.noreply.github.com> Date: Mon, 16 May 2022 09:09:00 +0300 Subject: [PATCH 0017/1518] Removes AS_ANYTHING macro due no need --- code/__defines/misc.dm | 6 ------ code/_helpers/icons.dm | 2 +- code/_helpers/overmap.dm | 2 +- code/_helpers/visual_filters.dm | 2 +- code/controllers/subsystems/fluids.dm | 2 +- code/controllers/subsystems/mapping.dm | 2 +- code/controllers/subsystems/weather.dm | 2 +- code/datums/composite_sounds/_composite_sound.dm | 2 +- code/datums/movement/mob.dm | 2 +- code/datums/recipe.dm | 2 +- code/datums/state_machine/state.dm | 2 +- code/game/atoms_movable.dm | 2 +- .../endgame/supermatter_cascade/universe.dm | 2 +- code/game/jobs/job/_job.dm | 2 +- code/game/objects/structures/tables.dm | 2 +- code/game/turfs/simulated.dm | 2 +- code/game/turfs/simulated/wall_icon.dm | 2 +- code/game/turfs/turf_fluids.dm | 2 +- code/game/world_topic_commands.dm | 2 +- code/modules/ZAS/Airflow.dm | 2 +- code/modules/ZAS/ConnectionGroup.dm | 2 +- code/modules/admin/verbs/fluids.dm | 2 +- code/modules/atmospherics/atmospherics.dm | 12 ++++++------ .../components/binary_devices/binary_atmos_base.dm | 6 +++--- .../components/omni_devices/_omni_extras.dm | 6 +++--- .../components/omni_devices/omni_base.dm | 2 +- code/modules/atmospherics/components/tvalve.dm | 2 +- .../atmospherics/components/unary/vent_pump.dm | 2 +- .../atmospherics/components/unary/vent_scrubber.dm | 2 +- code/modules/atmospherics/components/valve.dm | 2 +- code/modules/atmospherics/he_pipes.dm | 2 +- code/modules/atmospherics/pipes.dm | 4 ++-- .../client/preference_setup/general/01_basic.dm | 4 ++-- .../client/preference_setup/global/preferences.dm | 2 +- code/modules/events/electrical_storm.dm | 8 ++++---- code/modules/maps/map_template.dm | 2 +- .../mob/living/carbon/human/human_movement.dm | 2 +- code/modules/mob/living/living.dm | 10 +++++----- code/modules/mob/living/living_defense.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 2 +- .../mob/living/silicon/robot/modules/_module.dm | 2 +- code/modules/mob/login.dm | 2 +- code/modules/mob/mob.dm | 4 ++-- code/modules/mob/mob_layering.dm | 6 +++--- code/modules/nano/modules/human_appearance.dm | 4 ++-- code/modules/overmap/sectors.dm | 2 +- code/modules/overmap/ships/computers/helm.dm | 2 +- code/modules/power/geothermal/_geothermal.dm | 6 +++--- .../projectiles/targeting/targeting_triggers.dm | 2 +- code/modules/shuttles/shuttle.dm | 4 ++-- code/modules/status_conditions/_status_markers.dm | 6 +++--- code/modules/weather/_weather.dm | 2 +- code/modules/weather/weather_init.dm | 2 +- code/unit_tests/aspects.dm | 2 +- code/unit_tests/atmospherics_tests.dm | 2 +- code/unit_tests/codex.dm | 2 +- code/unit_tests/map_tests.dm | 2 +- 57 files changed, 83 insertions(+), 89 deletions(-) diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 2ea0204a841..c8864e4bd55 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -256,12 +256,6 @@ #define Z_ALL_TURFS(Z) block(locate(1, 1, Z), locate(world.maxx, world.maxy, Z)) -#if DM_BUILD < 1540 -#define AS_ANYTHING as() -#else -#define AS_ANYTHING as anything -#endif - //NOTE: INTENT_HOTKEY_* defines are not actual intents! //they are here to support hotkeys #define INTENT_HOTKEY_LEFT "left" diff --git a/code/_helpers/icons.dm b/code/_helpers/icons.dm index 2955ed44bde..8f2ee604df1 100644 --- a/code/_helpers/icons.dm +++ b/code/_helpers/icons.dm @@ -714,7 +714,7 @@ The _flatIcons list is a cache for generated icon files. var/addY2 var/icon/add // Icon of overlay being added - for(var/image/I AS_ANYTHING in layers) + for(var/image/I as anything in layers) if(I.alpha == 0) continue diff --git a/code/_helpers/overmap.dm b/code/_helpers/overmap.dm index b314a348d22..049a44e209e 100644 --- a/code/_helpers/overmap.dm +++ b/code/_helpers/overmap.dm @@ -5,5 +5,5 @@ var/global/list/overmaps_by_z = list() /proc/get_empty_zlevel(var/base_turf_type) . = INCREMENT_WORLD_Z_SIZE if(base_turf_type && base_turf_type != world.turf) - for(var/turf/T AS_ANYTHING in block(locate(1, 1, .),locate(world.maxx, world.maxy, .))) + for(var/turf/T as anything in block(locate(1, 1, .),locate(world.maxx, world.maxy, .))) T.ChangeTurf(base_turf_type) diff --git a/code/_helpers/visual_filters.dm b/code/_helpers/visual_filters.dm index 3e3b99ff42e..e76a194fd0a 100644 --- a/code/_helpers/visual_filters.dm +++ b/code/_helpers/visual_filters.dm @@ -52,6 +52,6 @@ // If we're being copied by Z-Mimic, update mimics too. if (bound_overlay) - for (var/atom/movable/AM AS_ANYTHING in get_above_oo()) + for (var/atom/movable/AM as anything in get_above_oo()) monkeypatched_params[1] = AM.filters[index] animate(arglist(monkeypatched_params)) \ No newline at end of file diff --git a/code/controllers/subsystems/fluids.dm b/code/controllers/subsystems/fluids.dm index 71457a3d1d7..b921af44e65 100644 --- a/code/controllers/subsystems/fluids.dm +++ b/code/controllers/subsystems/fluids.dm @@ -219,7 +219,7 @@ SUBSYSTEM_DEF(fluids) current_turf = current_fluid.loc var/pushed_something = FALSE if(reagent_holder.total_volume > FLUID_SHALLOW && current_fluid.last_flow_strength >= 10) - for(var/atom/movable/AM AS_ANYTHING in current_turf.get_contained_external_atoms()) + for(var/atom/movable/AM as anything in current_turf.get_contained_external_atoms()) if(AM.is_fluid_pushable(current_fluid.last_flow_strength)) AM.pushed(current_fluid.last_flow_dir) pushed_something = TRUE diff --git a/code/controllers/subsystems/mapping.dm b/code/controllers/subsystems/mapping.dm index 8105d9f381d..932d7a0332d 100644 --- a/code/controllers/subsystems/mapping.dm +++ b/code/controllers/subsystems/mapping.dm @@ -17,7 +17,7 @@ SUBSYSTEM_DEF(mapping) overmap_event_handler = GET_DECL(/decl/overmap_event_handler) // Load templates and build away sites. - for(var/obj/abstract/landmark/map_load_mark/marker AS_ANYTHING in compile_time_map_markers) + for(var/obj/abstract/landmark/map_load_mark/marker as anything in compile_time_map_markers) compile_time_map_markers -= marker marker.load_template() diff --git a/code/controllers/subsystems/weather.dm b/code/controllers/subsystems/weather.dm index 21d9224ea7a..7332ff74158 100644 --- a/code/controllers/subsystems/weather.dm +++ b/code/controllers/subsystems/weather.dm @@ -13,7 +13,7 @@ SUBSYSTEM_DEF(weather) /datum/controller/subsystem/weather/Initialize(start_timeofday) . = ..() - for(var/obj/abstract/weather_system/weather AS_ANYTHING in weather_systems) + for(var/obj/abstract/weather_system/weather as anything in weather_systems) weather.init_weather() /datum/controller/subsystem/weather/fire(resumed) diff --git a/code/datums/composite_sounds/_composite_sound.dm b/code/datums/composite_sounds/_composite_sound.dm index bdf1301bc71..b7de5e43b9d 100644 --- a/code/datums/composite_sounds/_composite_sound.dm +++ b/code/datums/composite_sounds/_composite_sound.dm @@ -68,7 +68,7 @@ /datum/composite_sound/proc/play(soundfile) var/sound/S = sound(soundfile) - for(var/atom/thing AS_ANYTHING in output_atoms) + for(var/atom/thing as anything in output_atoms) playsound(thing, S, volume) /datum/composite_sound/proc/get_sound(starttime, _mid_sounds) diff --git a/code/datums/movement/mob.dm b/code/datums/movement/mob.dm index 7675f341da4..2283e0d872c 100644 --- a/code/datums/movement/mob.dm +++ b/code/datums/movement/mob.dm @@ -156,7 +156,7 @@ to_chat(mob, SPAN_WARNING("You're pinned down by \a [mob.pinned[1]]!")) return MOVEMENT_STOP - for(var/obj/item/grab/G AS_ANYTHING in mob.grabbed_by) + for(var/obj/item/grab/G as anything in mob.grabbed_by) if(G.assailant != mob && G.assailant != mover && (mob.restrained() || G.stop_move())) if(mover == mob) to_chat(mob, SPAN_WARNING("You're restrained and cannot move!")) diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm index a318d3c0a3e..e5debd15b7c 100644 --- a/code/datums/recipe.dm +++ b/code/datums/recipe.dm @@ -214,6 +214,6 @@ //If we're here, then holder is a buffer containing the total reagents for all the results. //So now we redistribute it among them var/total = holder.total_volume - for(var/atom/a AS_ANYTHING in results) + for(var/atom/a as anything in results) holder.trans_to(a, total / length(results)) return results \ No newline at end of file diff --git a/code/datums/state_machine/state.dm b/code/datums/state_machine/state.dm index 614ff9dbb6d..55bb1a93fff 100644 --- a/code/datums/state_machine/state.dm +++ b/code/datums/state_machine/state.dm @@ -16,7 +16,7 @@ // Returns a list of transitions that a FSM could switch to. // Note that `holder` is NOT the FSM, but instead the thing the FSM is attached to. /decl/state/proc/get_open_transitions(datum/holder) - for(var/decl/state_transition/T AS_ANYTHING in transitions) + for(var/decl/state_transition/T as anything in transitions) if(T.is_open(holder)) LAZYADD(., T) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 2b2ca6005c5..f96105ca7ff 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -470,7 +470,7 @@ var/mob/living/M = unbuckle_mob() if(M) show_unbuckle_message(M, user) - for(var/obj/item/grab/G AS_ANYTHING in (M.grabbed_by|grabbed_by)) + for(var/obj/item/grab/G as anything in (M.grabbed_by|grabbed_by)) qdel(G) add_fingerprint(user) return M diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm index ba28b618763..ef699bf5c76 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm @@ -77,7 +77,7 @@ var/global/universe_has_ended = 0 universe_has_ended = TRUE /datum/universal_state/supermatter_cascade/proc/AreaSet() - for(var/area/A AS_ANYTHING in global.areas) + for(var/area/A as anything in global.areas) var/invalid_area = FALSE for(var/check_area in global.using_map.get_universe_end_evac_areas()) if(istype(A, check_area)) diff --git a/code/game/jobs/job/_job.dm b/code/game/jobs/job/_job.dm index 45b263d8e18..587b156d685 100644 --- a/code/game/jobs/job/_job.dm +++ b/code/game/jobs/job/_job.dm @@ -449,7 +449,7 @@ spawnpos = null if(!spawnpos) // Step through all spawnpoints and pick first appropriate for job - for(var/decl/spawnpoint/candidate AS_ANYTHING in global.using_map.allowed_spawns) + for(var/decl/spawnpoint/candidate as anything in global.using_map.allowed_spawns) if(candidate?.check_job_spawning(src)) spawnpos = candidate break diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm index a85955be361..38ce109ba83 100644 --- a/code/game/objects/structures/tables.dm +++ b/code/game/objects/structures/tables.dm @@ -94,7 +94,7 @@ additional_reinf_material = null . = ..() if(istype(oldloc)) - for(var/turf/turf AS_ANYTHING in RANGE_TURFS(oldloc, 1)) + for(var/turf/turf as anything in RANGE_TURFS(oldloc, 1)) for(var/obj/structure/table/table in turf) table.update_connections(FALSE) table.update_icon() diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index a200cd8609f..4499bfcddb9 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -179,7 +179,7 @@ . = ..() /turf/simulated/initialize_ambient_light(var/mapload) - for(var/turf/T AS_ANYTHING in RANGE_TURFS(src, 1)) + for(var/turf/T as anything in RANGE_TURFS(src, 1)) T.update_ambient_light(mapload) /turf/simulated/Destroy() diff --git a/code/game/turfs/simulated/wall_icon.dm b/code/game/turfs/simulated/wall_icon.dm index aa0a5dec919..0b15202bcaf 100644 --- a/code/game/turfs/simulated/wall_icon.dm +++ b/code/game/turfs/simulated/wall_icon.dm @@ -19,7 +19,7 @@ W.wall_connections = null W.other_connections = null iterate_turfs += W - for(var/turf/simulated/wall/W AS_ANYTHING in iterate_turfs) + for(var/turf/simulated/wall/W as anything in iterate_turfs) W.update_icon() else wall_connections = null diff --git a/code/game/turfs/turf_fluids.dm b/code/game/turfs/turf_fluids.dm index 2465aedbf8e..4d8b4fd6218 100644 --- a/code/game/turfs/turf_fluids.dm +++ b/code/game/turfs/turf_fluids.dm @@ -83,7 +83,7 @@ /turf/fluid_act(var/datum/reagents/fluids) fluids.touch(src) - for(var/atom/movable/AM AS_ANYTHING in get_contained_external_atoms()) + for(var/atom/movable/AM as anything in get_contained_external_atoms()) AM.fluid_act(fluids) /turf/proc/remove_fluids(var/amount, var/defer_update) diff --git a/code/game/world_topic_commands.dm b/code/game/world_topic_commands.dm index 8559cdcabdc..840111fb20c 100644 --- a/code/game/world_topic_commands.dm +++ b/code/game/world_topic_commands.dm @@ -181,7 +181,7 @@ var/global/list/decl/topic_command/topic_commands = list() return "No client provided." var/client/C - for(var/client/K AS_ANYTHING in global.clients) + for(var/client/K as anything in global.clients) if(K.ckey == target) C = K break diff --git a/code/modules/ZAS/Airflow.dm b/code/modules/ZAS/Airflow.dm index d27b0e07aa1..052ef03b408 100644 --- a/code/modules/ZAS/Airflow.dm +++ b/code/modules/ZAS/Airflow.dm @@ -12,7 +12,7 @@ Contains helper procs for airflow, called by /connection_group. if(check_airflow_movable(differential) && length(connecting_turfs)) //Check for things that are in range of the midpoint turfs. var/list/close_turfs - for(var/turf/connecting_turf AS_ANYTHING in connecting_turfs) + for(var/turf/connecting_turf as anything in connecting_turfs) if(get_dist(src, connecting_turf) < world.view) LAZYADD(close_turfs, connecting_turf) if(LAZYLEN(close_turfs)) diff --git a/code/modules/ZAS/ConnectionGroup.dm b/code/modules/ZAS/ConnectionGroup.dm index ba1b08cf3f6..e652d176948 100644 --- a/code/modules/ZAS/ConnectionGroup.dm +++ b/code/modules/ZAS/ConnectionGroup.dm @@ -95,7 +95,7 @@ Class Procs: /connection_edge/proc/recheck() /connection_edge/proc/flow(list/movable, differential, repelled) - for(var/atom/movable/M AS_ANYTHING in movable) + for(var/atom/movable/M as anything in movable) //If they're already being tossed, don't do it again. M.handle_airflow(differential, connecting_turfs, repelled) diff --git a/code/modules/admin/verbs/fluids.dm b/code/modules/admin/verbs/fluids.dm index f0af67fa73f..6e36c8baf13 100644 --- a/code/modules/admin/verbs/fluids.dm +++ b/code/modules/admin/verbs/fluids.dm @@ -17,7 +17,7 @@ if(!reagent_type || !user || !check_rights(R_SPAWN)) return var/turf/flooding = get_turf(user) - for(var/turf/T AS_ANYTHING in RANGE_TURFS(flooding, spawn_range)) + for(var/turf/T as anything in RANGE_TURFS(flooding, spawn_range)) T.add_fluid(reagent_type, reagent_amount) /datum/admins/proc/jump_to_fluid_source() diff --git a/code/modules/atmospherics/atmospherics.dm b/code/modules/atmospherics/atmospherics.dm index f149facbd5b..8c2acd4a942 100644 --- a/code/modules/atmospherics/atmospherics.dm +++ b/code/modules/atmospherics/atmospherics.dm @@ -48,7 +48,7 @@ Pipelines + Other Objects -> Pipe network . = ..() /obj/machinery/atmospherics/Destroy() - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes_to_networks) + for(var/obj/machinery/atmospherics/node as anything in nodes_to_networks) QDEL_NULL(nodes_to_networks[node]) node.disconnect(src) nodes_to_networks = null @@ -56,7 +56,7 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/proc/atmos_init() atmos_initalized = TRUE - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes_to_networks) + for(var/obj/machinery/atmospherics/node as anything in nodes_to_networks) QDEL_NULL(nodes_to_networks[node]) nodes_to_networks = null for(var/direction in global.cardinal) @@ -105,7 +105,7 @@ Pipelines + Other Objects -> Pipe network return var/disconnected_directions = initialize_directions var/visible_directions = 0 - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes_to_networks) + for(var/obj/machinery/atmospherics/node as anything in nodes_to_networks) var/node_dir = get_dir(src, node) disconnected_directions &= ~node_dir if(hide_hidden_pipes && !T.is_plating() && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) @@ -144,7 +144,7 @@ Pipelines + Other Objects -> Pipe network // Note don't forget to have neighbors look as well! // Default behavior is: one network for all nodes in a given dir - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes_in_dir(get_dir(src, reference))) + for(var/obj/machinery/atmospherics/node as anything in nodes_in_dir(get_dir(src, reference))) if(nodes_to_networks[node] != new_network) qdel(nodes_to_networks[node]) nodes_to_networks[node] = new_network @@ -260,8 +260,8 @@ Pipelines + Other Objects -> Pipe network // called after being built by hand, before the pipe item or circuit is deleted /obj/machinery/atmospherics/proc/build(obj/item/builder) atmos_init() - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes_to_networks) + for(var/obj/machinery/atmospherics/node as anything in nodes_to_networks) node.atmos_init() build_network() - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes_to_networks) + for(var/obj/machinery/atmospherics/node as anything in nodes_to_networks) node.build_network() \ No newline at end of file diff --git a/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm b/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm index afe002c6d9d..4190ef22d0a 100644 --- a/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm +++ b/code/modules/atmospherics/components/binary_devices/binary_atmos_base.dm @@ -35,13 +35,13 @@ if(anchored) set_dir(dir) // making sure atmos_init() - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes_to_networks) + for(var/obj/machinery/atmospherics/node as anything in nodes_to_networks) node.atmos_init() build_network() - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes_to_networks) + for(var/obj/machinery/atmospherics/node as anything in nodes_to_networks) node.build_network() else - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes_to_networks) + for(var/obj/machinery/atmospherics/node as anything in nodes_to_networks) node.disconnect(src) for(var/node in nodes_to_networks) QDEL_NULL(nodes_to_networks[node]) diff --git a/code/modules/atmospherics/components/omni_devices/_omni_extras.dm b/code/modules/atmospherics/components/omni_devices/_omni_extras.dm index 8c83bc15c3f..cd6f35c4d11 100644 --- a/code/modules/atmospherics/components/omni_devices/_omni_extras.dm +++ b/code/modules/atmospherics/components/omni_devices/_omni_extras.dm @@ -44,14 +44,14 @@ if(LAZYLEN(nodes)) return master.atmos_init() - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes) + for(var/obj/machinery/atmospherics/node as anything in nodes) node.atmos_init() master.build_network() - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes) + for(var/obj/machinery/atmospherics/node as anything in nodes) node.build_network() /datum/omni_port/proc/disconnect() - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes) + for(var/obj/machinery/atmospherics/node as anything in nodes) node.disconnect(master) master.disconnect(node) diff --git a/code/modules/atmospherics/components/omni_devices/omni_base.dm b/code/modules/atmospherics/components/omni_devices/omni_base.dm index 18c97047cc8..7e06e01fce7 100644 --- a/code/modules/atmospherics/components/omni_devices/omni_base.dm +++ b/code/modules/atmospherics/components/omni_devices/omni_base.dm @@ -236,7 +236,7 @@ if((reference in P.nodes) && (new_network != P.network)) qdel(P.network) P.network = new_network - for(var/obj/machinery/atmospherics/node AS_ANYTHING in P.nodes) + for(var/obj/machinery/atmospherics/node as anything in P.nodes) if(node != reference) node.network_expand(new_network, src) diff --git a/code/modules/atmospherics/components/tvalve.dm b/code/modules/atmospherics/components/tvalve.dm index dd10921a547..d6ae21d12f9 100644 --- a/code/modules/atmospherics/components/tvalve.dm +++ b/code/modules/atmospherics/components/tvalve.dm @@ -62,7 +62,7 @@ . |= nodes_in_dir(other_dir) /obj/machinery/atmospherics/tvalve/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - for(var/obj/machinery/atmospherics/node AS_ANYTHING in get_nodes_connected_to(reference)) + for(var/obj/machinery/atmospherics/node as anything in get_nodes_connected_to(reference)) if(nodes_to_networks[node] != new_network) QDEL_NULL(nodes_to_networks[node]) nodes_to_networks[node] = new_network diff --git a/code/modules/atmospherics/components/unary/vent_pump.dm b/code/modules/atmospherics/components/unary/vent_pump.dm index 9a239eff0bd..0aeed6bcde9 100644 --- a/code/modules/atmospherics/components/unary/vent_pump.dm +++ b/code/modules/atmospherics/components/unary/vent_pump.dm @@ -313,7 +313,7 @@ return SPAN_WARNING("You cannot unwrench \the [src], turn it off first.") var/turf/T = src.loc var/hidden_pipe_check = FALSE - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes_to_networks) + for(var/obj/machinery/atmospherics/node as anything in nodes_to_networks) if(node.level) hidden_pipe_check = TRUE break diff --git a/code/modules/atmospherics/components/unary/vent_scrubber.dm b/code/modules/atmospherics/components/unary/vent_scrubber.dm index b5f0871da85..3e9b8fa2f47 100644 --- a/code/modules/atmospherics/components/unary/vent_scrubber.dm +++ b/code/modules/atmospherics/components/unary/vent_scrubber.dm @@ -169,7 +169,7 @@ return SPAN_WARNING("You cannot take this [src] apart, turn it off first.") var/turf/T = get_turf(src) var/hidden_pipe_check = FALSE - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes_to_networks) + for(var/obj/machinery/atmospherics/node as anything in nodes_to_networks) if(node.level) hidden_pipe_check = TRUE break diff --git a/code/modules/atmospherics/components/valve.dm b/code/modules/atmospherics/components/valve.dm index 89f8488d22c..63ea42e8bc9 100644 --- a/code/modules/atmospherics/components/valve.dm +++ b/code/modules/atmospherics/components/valve.dm @@ -46,7 +46,7 @@ /obj/machinery/atmospherics/valve/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) if(open) // connect everything - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes_to_networks) + for(var/obj/machinery/atmospherics/node as anything in nodes_to_networks) if(nodes_to_networks[node] != new_network) QDEL_NULL(nodes_to_networks[node]) nodes_to_networks[node] = new_network diff --git a/code/modules/atmospherics/he_pipes.dm b/code/modules/atmospherics/he_pipes.dm index d8684900aee..9054106ba7d 100644 --- a/code/modules/atmospherics/he_pipes.dm +++ b/code/modules/atmospherics/he_pipes.dm @@ -34,7 +34,7 @@ /obj/machinery/atmospherics/pipe/simple/heat_exchanging/atmos_init() atmos_initalized = TRUE - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes_to_networks) + for(var/obj/machinery/atmospherics/node as anything in nodes_to_networks) QDEL_NULL(nodes_to_networks[node]) nodes_to_networks = null for(var/direction in global.cardinal) diff --git a/code/modules/atmospherics/pipes.dm b/code/modules/atmospherics/pipes.dm index 621d797fd71..7822d95ea86 100644 --- a/code/modules/atmospherics/pipes.dm +++ b/code/modules/atmospherics/pipes.dm @@ -174,7 +174,7 @@ /obj/machinery/atmospherics/pipe/set_color(new_color) ..() //for updating connected atmos device pipes (i.e. vents, manifolds, etc) - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes_to_networks) + for(var/obj/machinery/atmospherics/node as anything in nodes_to_networks) node.update_icon() /obj/machinery/atmospherics/pipe/proc/try_leak() @@ -717,7 +717,7 @@ /obj/machinery/atmospherics/proc/universal_underlays(var/direction) var/turf/T = loc var/connections = list("", "-supply", "-scrubbers") - for(var/obj/machinery/atmospherics/node AS_ANYTHING in nodes_in_dir(direction)) + for(var/obj/machinery/atmospherics/node as anything in nodes_in_dir(direction)) if(node.icon_connect_type in connections) connections[node.icon_connect_type] = node for(var/suffix in connections) diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm index eb256a0d4bf..548a88fa022 100644 --- a/code/modules/client/preference_setup/general/01_basic.dm +++ b/code/modules/client/preference_setup/general/01_basic.dm @@ -16,7 +16,7 @@ pref.be_random_name = R.read("name_is_always_random") pref.spawnpoint = R.read("spawnpoint") - for(var/decl/spawnpoint/spawnpoint AS_ANYTHING in global.using_map.allowed_spawns) + for(var/decl/spawnpoint/spawnpoint as anything in global.using_map.allowed_spawns) if(pref.spawnpoint == spawnpoint.name) pref.spawnpoint = spawnpoint.type break @@ -35,7 +35,7 @@ /datum/category_item/player_setup_item/physical/basic/sanitize_character() var/valid_spawn = FALSE - for(var/decl/spawnpoint/spawnpoint AS_ANYTHING in global.using_map.allowed_spawns) + for(var/decl/spawnpoint/spawnpoint as anything in global.using_map.allowed_spawns) if(pref.spawnpoint == spawnpoint.type) valid_spawn = TRUE break diff --git a/code/modules/client/preference_setup/global/preferences.dm b/code/modules/client/preference_setup/global/preferences.dm index a4fe9445119..fa902474ac1 100644 --- a/code/modules/client/preference_setup/global/preferences.dm +++ b/code/modules/client/preference_setup/global/preferences.dm @@ -261,7 +261,7 @@ var/global/list/_client_preferences_by_type /datum/client_preference/show_status_markers/changed(mob/preference_mob, new_value) . = ..() if(preference_mob.client) - for(var/datum/status_marker_holder/marker AS_ANYTHING in global.status_marker_holders) + for(var/datum/status_marker_holder/marker as anything in global.status_marker_holders) var/marker_image = (preference_mob.status_markers == marker) ? marker.mob_image_personal : marker.mob_image if(new_value == PREF_HIDE) preference_mob.client.images -= marker_image diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index 7d7ed5f238d..391550545ca 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -62,7 +62,7 @@ var/list/shields = list() if(overmap_only) - for(var/obj/effect/overmap/visitable/sector AS_ANYTHING in overmap_sectors) + for(var/obj/effect/overmap/visitable/sector as anything in overmap_sectors) var/list/sector_shields = sector.get_linked_machines_of_type(/obj/machinery/shield_generator) if(length(sector_shields)) shields |= sector_shields @@ -71,7 +71,7 @@ if(G.z in affecting_z) shields |= G - for(var/obj/machinery/shield_generator/G AS_ANYTHING in shields) + for(var/obj/machinery/shield_generator/G as anything in shields) if(!(G.running) || !G.check_flag(MODEFLAG_EM)) shields -= G @@ -83,7 +83,7 @@ shielded = TRUE valid_apcs = list() - for(var/obj/machinery/power/apc/A AS_ANYTHING in global.all_apcs) + for(var/obj/machinery/power/apc/A as anything in global.all_apcs) if(!A.is_critical && (A.z in affecting_z)) valid_apcs.Add(A) @@ -94,7 +94,7 @@ for(var/i=0, i< severity*2, i++) // up to 2/4/6 APCs per tick depending on severity picked_apcs |= pick(valid_apcs) - for(var/obj/machinery/power/apc/T AS_ANYTHING in picked_apcs) + for(var/obj/machinery/power/apc/T as anything in picked_apcs) // Main breaker is turned off. Consider this APC protected. if(!T.operating || T.failure_timer) continue diff --git a/code/modules/maps/map_template.dm b/code/modules/maps/map_template.dm index 9ee55fd17af..03df6ab816a 100644 --- a/code/modules/maps/map_template.dm +++ b/code/modules/maps/map_template.dm @@ -187,7 +187,7 @@ return TRUE /datum/map_template/proc/after_load(z) - for(var/obj/abstract/landmark/map_load_mark/mark AS_ANYTHING in subtemplates_to_spawn) + for(var/obj/abstract/landmark/map_load_mark/mark as anything in subtemplates_to_spawn) subtemplates_to_spawn -= mark mark.load_template() subtemplates_to_spawn = null diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 2cbef3dddfb..ff68c308f88 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -132,7 +132,7 @@ if(.) //We moved var/stamina_cost = 0 - for(var/obj/item/grab/G AS_ANYTHING in get_active_grabs()) + for(var/obj/item/grab/G as anything in get_active_grabs()) stamina_cost -= G.grab_slowdown() stamina_cost = round(stamina_cost) if(stamina_cost < 0) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 0b633e11a54..5ca36332c8c 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -503,13 +503,13 @@ default behaviour is: return if(isturf(old_loc)) - for(var/atom/movable/AM AS_ANYTHING in ret_grab()) + for(var/atom/movable/AM as anything in ret_grab()) if(AM != src && AM.loc != loc && !AM.anchored && old_loc.Adjacent(AM)) AM.glide_size = glide_size // This is adjusted by grabs again from events/some of the procs below, but doing it here makes it more likely to work with recursive movement. AM.DoMove(get_dir(get_turf(AM), old_loc), src, TRUE) var/list/mygrabs = get_active_grabs() - for(var/obj/item/grab/G AS_ANYTHING in mygrabs) + for(var/obj/item/grab/G as anything in mygrabs) if(G.assailant_reverse_facing()) set_dir(global.reverse_dir[direction]) G.assailant_moved() @@ -527,7 +527,7 @@ default behaviour is: var/txt_dir = (direction & UP) ? "upwards" : "downwards" if(old_loc) old_loc.visible_message(SPAN_NOTICE("\The [src] moves [txt_dir].")) - for(var/obj/item/grab/G AS_ANYTHING in mygrabs) + for(var/obj/item/grab/G as anything in mygrabs) var/turf/start = G.affecting.loc var/turf/destination = (direction == UP) ? GetAbove(G.affecting) : GetBelow(G.affecting) if(!start.CanZPass(G.affecting, direction)) @@ -552,7 +552,7 @@ default behaviour is: continue if(length(mygrabs) && !skill_check(SKILL_MEDICAL, SKILL_BASIC)) - for(var/obj/item/grab/grab AS_ANYTHING in mygrabs) + for(var/obj/item/grab/grab as anything in mygrabs) var/mob/living/affecting_mob = grab.get_affecting_mob() if(affecting_mob) affecting_mob.handle_grab_damage() @@ -761,7 +761,7 @@ default behaviour is: ..() cut_overlays() if(auras) - for(var/obj/aura/aura AS_ANYTHING in auras) + for(var/obj/aura/aura as anything in auras) var/image/A = new() A.appearance = aura add_overlay(A) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index e23ebb7e2ea..4d5dfac1987 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -53,7 +53,7 @@ return TRUE . = TRUE var/list/newargs = args - args[1] - for(var/obj/aura/aura AS_ANYTHING in auras) + for(var/obj/aura/aura as anything in auras) var/result = 0 switch(type) if(AURA_TYPE_WEAPON) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 0338b3d2b09..80fe3057385 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -239,7 +239,7 @@ var/global/list/custom_ai_icons_by_ckey_and_name = list() if(global.custom_ai_icons_by_ckey_and_name["[ckey][real_name]"]) selected_sprite = global.custom_ai_icons_by_ckey_and_name["[ckey][real_name]"] else - for(var/datum/custom_icon/cicon AS_ANYTHING in SScustomitems.custom_icons_by_ckey[ckey]) + for(var/datum/custom_icon/cicon as anything in SScustomitems.custom_icons_by_ckey[ckey]) if(cicon.category == "AI Icon" && lowertext(real_name) == cicon.character_name) selected_sprite = new /datum/ai_icon("Custom Icon - [cicon.character_name]", cicon.ids_to_icons[1], cicon.ids_to_icons[2], COLOR_WHITE, cicon.ids_to_icons[cicon.ids_to_icons[1]]) global.custom_ai_icons_by_ckey_and_name["[ckey][real_name]"] = selected_sprite diff --git a/code/modules/mob/living/silicon/robot/modules/_module.dm b/code/modules/mob/living/silicon/robot/modules/_module.dm index 0443702aec5..807f2bf1188 100644 --- a/code/modules/mob/living/silicon/robot/modules/_module.dm +++ b/code/modules/mob/living/silicon/robot/modules/_module.dm @@ -128,7 +128,7 @@ /obj/item/robot_module/proc/get_sprites_for(var/mob/living/silicon/robot/R) . = module_sprites if(R.ckey) - for(var/datum/custom_icon/cicon AS_ANYTHING in SScustomitems.custom_icons_by_ckey[R.ckey]) + for(var/datum/custom_icon/cicon as anything in SScustomitems.custom_icons_by_ckey[R.ckey]) if(cicon.category == display_name && lowertext(R.real_name) == cicon.character_name) for(var/state in cicon.ids_to_icons) .[state] = cicon.ids_to_icons[state] diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index c866a66e3ba..5c150b19d40 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -117,7 +117,7 @@ if(get_preference_value(/datum/client_preference/show_status_markers) == PREF_SHOW) if(status_markers) client.images |= status_markers.mob_image_personal - for(var/datum/status_marker_holder/marker AS_ANYTHING in global.status_marker_holders) + for(var/datum/status_marker_holder/marker as anything in global.status_marker_holders) if(marker != status_markers) client.images |= marker.mob_image return TRUE diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 31710c8596d..ed33b38fff0 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -214,7 +214,7 @@ #undef ENCUMBERANCE_MOVEMENT_MOD /mob/proc/encumbrance() - for(var/obj/item/grab/G AS_ANYTHING in get_active_grabs()) + for(var/obj/item/grab/G as anything in get_active_grabs()) . = max(., G.grab_slowdown()) . *= (0.8 ** size_strength_mod()) . *= (0.5 + 1.5 * (SKILL_MAX - get_skill_value(SKILL_HAULING))/(SKILL_MAX - SKILL_MIN)) @@ -1065,7 +1065,7 @@ if(brolly.gives_weather_protection()) LAZYADD(., brolly) if(!LAZYLEN(.)) - for(var/turf/T AS_ANYTHING in RANGE_TURFS(loc, 1)) + for(var/turf/T as anything in RANGE_TURFS(loc, 1)) for(var/obj/structure/flora/tree/tree in T) if(tree.protects_against_weather) LAZYADD(., tree) diff --git a/code/modules/mob/mob_layering.dm b/code/modules/mob/mob_layering.dm index d3643b74995..33f8325c27a 100644 --- a/code/modules/mob/mob_layering.dm +++ b/code/modules/mob/mob_layering.dm @@ -12,7 +12,7 @@ else if(length(grabbed_by)) var/draw_under = TRUE var/adjust_layer = FALSE - for(var/obj/item/grab/G AS_ANYTHING in grabbed_by) + for(var/obj/item/grab/G as anything in grabbed_by) if(get_dir(G.assailant, src) & SOUTH) draw_under = FALSE if(G.current_grab.adjust_plane) @@ -31,7 +31,7 @@ if(buckled && buckled.buckle_layer_above) new_plane = buckled.plane else if(length(grabbed_by)) - for(var/obj/item/grab/G AS_ANYTHING in grabbed_by) + for(var/obj/item/grab/G as anything in grabbed_by) if(G.current_grab.adjust_plane) new_plane = max(new_plane, G.assailant.plane) if(last_plane != new_plane) @@ -66,7 +66,7 @@ if(isturf(loc)) // Update offsets from grabs. if(length(grabbed_by)) - for(var/obj/item/grab/G AS_ANYTHING in grabbed_by) + for(var/obj/item/grab/G as anything in grabbed_by) var/grab_dir = get_dir(G.assailant, src) if(grab_dir && G.current_grab.shift > 0) if(grab_dir & WEST) diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm index cc8a6663271..b011f0a265a 100644 --- a/code/modules/nano/modules/human_appearance.dm +++ b/code/modules/nano/modules/human_appearance.dm @@ -94,7 +94,7 @@ data["change_gender"] = can_change(APPEARANCE_GENDER) if(data["change_gender"]) var/genders[0] - for(var/decl/pronouns/G AS_ANYTHING in owner.species.available_pronouns) + for(var/decl/pronouns/G as anything in owner.species.available_pronouns) genders[++genders.len] = list("gender_name" = capitalize(G.name), "gender_key" = G.name) data["genders"] = genders @@ -102,7 +102,7 @@ data["change_bodytype"] = can_change(APPEARANCE_BODY) if(data["change_bodytype"]) var/bodytypes[0] - for(var/decl/bodytype/B AS_ANYTHING in owner.species.available_bodytypes) + for(var/decl/bodytype/B as anything in owner.species.available_bodytypes) bodytypes += capitalize(B.name) data["bodytypes"] = bodytypes diff --git a/code/modules/overmap/sectors.dm b/code/modules/overmap/sectors.dm index 89a5ac137b7..4aed4295da1 100644 --- a/code/modules/overmap/sectors.dm +++ b/code/modules/overmap/sectors.dm @@ -74,7 +74,7 @@ var/global/list/known_overmap_sectors LAZYADD(global.known_overmap_sectors, src) layer = ABOVE_LIGHTING_LAYER plane = ABOVE_LIGHTING_PLANE - for(var/obj/machinery/computer/ship/helm/H AS_ANYTHING in global.overmap_helm_computers) + for(var/obj/machinery/computer/ship/helm/H as anything in global.overmap_helm_computers) H.add_known_sector(src) LAZYADD(SSshuttle.sectors_to_initialize, src) //Queued for further init. Will populate the waypoint lists; waypoints not spawned yet will be added in as they spawn. diff --git a/code/modules/overmap/ships/computers/helm.dm b/code/modules/overmap/ships/computers/helm.dm index 557a0a3f46d..bb9d2b11273 100644 --- a/code/modules/overmap/ships/computers/helm.dm +++ b/code/modules/overmap/ships/computers/helm.dm @@ -29,7 +29,7 @@ var/global/list/overmap_helm_computers /obj/machinery/computer/ship/helm/Initialize() . = ..() LAZYADD(global.overmap_helm_computers, src) - for(var/obj/effect/overmap/visitable/sector AS_ANYTHING in global.known_overmap_sectors) + for(var/obj/effect/overmap/visitable/sector as anything in global.known_overmap_sectors) add_known_sector(sector) /obj/machinery/computer/ship/helm/Destroy() diff --git a/code/modules/power/geothermal/_geothermal.dm b/code/modules/power/geothermal/_geothermal.dm index 54193bbf856..7753bbce23a 100644 --- a/code/modules/power/geothermal/_geothermal.dm +++ b/code/modules/power/geothermal/_geothermal.dm @@ -74,7 +74,7 @@ var/global/const/MAX_GEOTHERMAL_PRESSURE = 2000 if(LAZYLEN(neighbors)) remaining_pressure = round(remaining_pressure / LAZYLEN(neighbors)) if(remaining_pressure) - for(var/obj/machinery/geothermal/neighbor AS_ANYTHING in neighbors) + for(var/obj/machinery/geothermal/neighbor as anything in neighbors) neighbor.add_pressure(remaining_pressure) /obj/machinery/geothermal/proc/refresh_neighbors() @@ -89,7 +89,7 @@ var/global/const/MAX_GEOTHERMAL_PRESSURE = 2000 /obj/machinery/geothermal/Initialize() . = ..() refresh_neighbors() - for(var/turf/T AS_ANYTHING in RANGE_TURFS(loc, 1)) + for(var/turf/T as anything in RANGE_TURFS(loc, 1)) for(var/obj/machinery/geothermal/neighbor in T) neighbor.refresh_neighbors() STOP_PROCESSING_MACHINE(src, MACHINERY_PROCESS_SELF) @@ -98,7 +98,7 @@ var/global/const/MAX_GEOTHERMAL_PRESSURE = 2000 var/atom/last_loc = loc . = ..() if(istype(last_loc)) - for(var/turf/T AS_ANYTHING in RANGE_TURFS(last_loc, 1)) + for(var/turf/T as anything in RANGE_TURFS(last_loc, 1)) for(var/obj/machinery/geothermal/neighbor in T) neighbor.refresh_neighbors() diff --git a/code/modules/projectiles/targeting/targeting_triggers.dm b/code/modules/projectiles/targeting/targeting_triggers.dm index 6ac41164cc2..d318f1f3275 100644 --- a/code/modules/projectiles/targeting/targeting_triggers.dm +++ b/code/modules/projectiles/targeting/targeting_triggers.dm @@ -3,7 +3,7 @@ return /mob/living/trigger_aiming(var/trigger_type) - for(var/obj/aiming_overlay/AO AS_ANYTHING in aimed_at_by) + for(var/obj/aiming_overlay/AO as anything in aimed_at_by) if(AO.aiming_at == src) AO.update_aiming() if(AO.aiming_at == src) diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index 0e8e0b56f09..7b998ebabe4 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -291,9 +291,9 @@ var/datum/powernet/NewPN = new() NewPN.add_cable(C) propagate_network(C,C.powernet) - for(var/obj/machinery/atmospherics/pipe AS_ANYTHING in pipes) + for(var/obj/machinery/atmospherics/pipe as anything in pipes) pipe.atmos_init() // this will clear pipenet/pipeline - for(var/obj/machinery/atmospherics/pipe AS_ANYTHING in pipes) + for(var/obj/machinery/atmospherics/pipe as anything in pipes) pipe.build_network() //returns 1 if the shuttle has a valid arrive time diff --git a/code/modules/status_conditions/_status_markers.dm b/code/modules/status_conditions/_status_markers.dm index 67e3e9076cc..9b2371a762d 100644 --- a/code/modules/status_conditions/_status_markers.dm +++ b/code/modules/status_conditions/_status_markers.dm @@ -28,9 +28,9 @@ var/image/mob_image_personal /datum/status_marker_holder/proc/clear_markers() - for(var/marker AS_ANYTHING in markers) + for(var/marker as anything in markers) animate(markers[marker], pixel_z = 12, alpha = 0, time = 3) - for(var/marker AS_ANYTHING in markers_personal) + for(var/marker as anything in markers_personal) animate(markers_personal[marker], pixel_z = 12, alpha = 0, time = 3) /datum/status_marker_holder/New(var/mob/owner) @@ -103,7 +103,7 @@ /datum/status_marker_holder/proc/apply_offsets(var/mob/owner, var/list/markers_to_check, var/check_show_status = TRUE) var/list/visible_markers - for(var/decl/status_condition/stat AS_ANYTHING in markers_to_check) + for(var/decl/status_condition/stat as anything in markers_to_check) if(HAS_STATUS(owner, stat.type) && (!check_show_status || stat.show_status(owner))) LAZYADD(visible_markers, markers_to_check[stat]) else diff --git a/code/modules/weather/_weather.dm b/code/modules/weather/_weather.dm index 1180384a13f..bed4828649b 100644 --- a/code/modules/weather/_weather.dm +++ b/code/modules/weather/_weather.dm @@ -63,7 +63,7 @@ var/global/list/weather_by_z = list() for(var/tz in affecting_zs) if(global.weather_by_z["[tz]"] == src) global.weather_by_z -= "[tz]" - for(var/turf/T AS_ANYTHING in block(locate(1, 1, tz), locate(world.maxx, world.maxy, tz))) + for(var/turf/T as anything in block(locate(1, 1, tz), locate(world.maxx, world.maxy, tz))) if(T.weather == src) remove_vis_contents(T, vis_contents_additions) T.weather = null diff --git a/code/modules/weather/weather_init.dm b/code/modules/weather/weather_init.dm index 4f25a693418..f3ac5ba7af5 100644 --- a/code/modules/weather/weather_init.dm +++ b/code/modules/weather/weather_init.dm @@ -32,6 +32,6 @@ INITIALIZE_IMMEDIATE(/obj/abstract/weather_system) global.weather_by_z["[tz]"] = src // Update turf weather. - for(var/turf/T AS_ANYTHING in block(locate(1, 1, highest_z), locate(world.maxx, world.maxy, highest_z))) + for(var/turf/T as anything in block(locate(1, 1, highest_z), locate(world.maxx, world.maxy, highest_z))) T.update_weather(src) CHECK_TICK diff --git a/code/unit_tests/aspects.dm b/code/unit_tests/aspects.dm index 7276031e3bb..38c8acc6323 100644 --- a/code/unit_tests/aspects.dm +++ b/code/unit_tests/aspects.dm @@ -32,7 +32,7 @@ var/decl/aspect/aspect = all_aspects[atype] if(initial(aspect.parent) && !istype(aspect.parent)) failures += "[atype] - invalid parent - [aspect.parent || "NULL"]" - for(var/decl/aspect/A AS_ANYTHING in aspect.children) + for(var/decl/aspect/A as anything in aspect.children) if(!istype(A)) failures += "[atype] - invalid child - [A || "NULL"]" else if(A.parent != aspect) diff --git a/code/unit_tests/atmospherics_tests.dm b/code/unit_tests/atmospherics_tests.dm index 7f9a5f49d9a..15d2e474e7c 100644 --- a/code/unit_tests/atmospherics_tests.dm +++ b/code/unit_tests/atmospherics_tests.dm @@ -339,7 +339,7 @@ /datum/unit_test/atmos_machinery_node_reciprocity/start_test() var/fail = FALSE for(var/obj/machinery/atmospherics/machine in SSmachines.machinery) - for(var/obj/machinery/atmospherics/node AS_ANYTHING in machine.nodes_to_networks) + for(var/obj/machinery/atmospherics/node as anything in machine.nodes_to_networks) if(node == machine) log_bad("[log_info_line(machine)] was its own node.") fail = TRUE diff --git a/code/unit_tests/codex.dm b/code/unit_tests/codex.dm index 0e63d5c04a8..2c09bebc93c 100644 --- a/code/unit_tests/codex.dm +++ b/code/unit_tests/codex.dm @@ -4,7 +4,7 @@ /datum/unit_test/codex_string_uniqueness/start_test() var/list/failures = list() var/list/seen_strings = list() - for(var/datum/codex_entry/entry AS_ANYTHING in SScodex.all_entries) + for(var/datum/codex_entry/entry as anything in SScodex.all_entries) for(var/associated_string in entry.associated_strings) if(seen_strings[associated_string]) failures |= "'[associated_string]' - \ref[entry]#[entry.name] - first seen: [seen_strings[associated_string]]" diff --git a/code/unit_tests/map_tests.dm b/code/unit_tests/map_tests.dm index db1d63e9c97..6e2f41b9bfd 100644 --- a/code/unit_tests/map_tests.dm +++ b/code/unit_tests/map_tests.dm @@ -266,7 +266,7 @@ /datum/unit_test/correct_allowed_spawn_test/start_test() var/list/failed = list() - for(var/decl/spawnpoint/spawnpoint AS_ANYTHING in global.using_map.allowed_spawns) + for(var/decl/spawnpoint/spawnpoint as anything in global.using_map.allowed_spawns) if(!length(spawnpoint.turfs)) log_unit_test("Map allows spawning in [spawnpoint.name], but [spawnpoint.name] has no associated spawn turfs.") failed += spawnpoint.type From e1fdb104daa3d4ae0e5d5904f83018721095d580 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 16 May 2022 19:01:43 +1000 Subject: [PATCH 0018/1518] Flash refactor. --- code/game/objects/items/devices/flash.dm | 206 +++++------------- code/modules/mob/living/carbon/carbon.dm | 15 ++ code/modules/mob/living/carbon/human/human.dm | 8 + .../mob/living/silicon/robot/inventory.dm | 6 +- .../modules/mob/living/silicon/robot/robot.dm | 11 + code/modules/mob/living/silicon/silicon.dm | 6 +- .../mob/living/simple_animal/simple_animal.dm | 12 + code/modules/mob/mob.dm | 6 + nebula.dme | 6 +- 9 files changed, 122 insertions(+), 154 deletions(-) diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 0aa5707b6d9..ca107bb3001 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -40,169 +40,79 @@ last_used = world.time times_used = max(0,round(times_used)) //sanity -//attack_as_weapon -/obj/item/flash/attack(mob/living/M, mob/living/user, var/target_zone) - if(!user || !M) return 0 //sanity - admin_attack_log(user, M, "flashed their victim using \a [src].", "Was flashed by \a [src].", "used \a [src] to flash") +/obj/item/flash/proc/do_flash_animation(var/mob/user, var/mob/target) + if(user) + if(target) + user.do_attack_animation(target) + user.do_flash_animation() + playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) + flick("[initial(icon_state)]-on", src) - if(!clown_check(user)) return 0 - if(broken) - to_chat(user, "\The [src] is broken.") - return 0 +/obj/item/flash/proc/check_usability(var/mob/user) + if(times_used > 5) + if(user) + to_chat(user, SPAN_WARNING("*click* *click*")) + return FALSE + + last_used = world.time + times_used++ + if(times_used > 1 && prob(times_used)) //if you use it 5 times in a minute it has a 10% chance to break! + broken = TRUE + if(user) + to_chat(user, SPAN_WARNING("The bulb has burnt out!")) + icon_state = "[initial(icon_state)]-burnt" + return FALSE + + return TRUE + +/obj/item/flash/proc/general_flash_check(var/mob/user) + if(!clown_check(user)) + return FALSE + if(broken) + if(user) + to_chat(user, SPAN_WARNING("\The [src] is broken.")) + return FALSE flash_recharge() + if(!check_usability(user)) + return FALSE + return TRUE - //spamming the flash before it's fully charged (60seconds) increases the chance of it breaking - //It will never break on the first use. - switch(times_used) - if(0 to 5) - last_used = world.time - if(prob(times_used)) //if you use it 5 times in a minute it has a 10% chance to break! - broken = 1 - to_chat(user, "The bulb has burnt out!") - icon_state = "[initial(icon_state)]-burnt" - return 0 - times_used++ - else //can only use it 5 times a minute - to_chat(user, "*click* *click*") - return 0 +//attack_as_weapon +/obj/item/flash/attack(mob/living/M, mob/living/user, var/target_zone) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - user.do_attack_animation(M) + if(!user || !M || !general_flash_check(user)) + return FALSE - playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) - var/flashfail = 0 - var/flash_strength = (rand(str_min,str_max)) - - if(iscarbon(M)) - if(M.stat!=DEAD) - var/mob/living/carbon/C = M - var/safety = C.eyecheck() - if(safety < FLASH_PROTECTION_MODERATE) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - flash_strength = round(H.getFlashMod() * flash_strength) - if(safety > FLASH_PROTECTION_NONE) - flash_strength = (flash_strength / 2) - if(flash_strength > 0) - M.flash_eyes(FLASH_PROTECTION_MODERATE - safety) - SET_STATUS_MAX(M, STAT_STUN, (flash_strength / 2)) - SET_STATUS_MAX(M, STAT_BLURRY, flash_strength) - SET_STATUS_MAX(M, STAT_CONFUSE, (flash_strength + 2)) - if(flash_strength > 3) - M.drop_held_items() - if(flash_strength > 5) - SET_STATUS_MAX(M, STAT_WEAK, 2) - else - flashfail = 1 - - else if(isanimal(M)) - var/mob/living/simple_animal/SA = M - var/safety = SA.eyecheck() - if(safety < FLASH_PROTECTION_MAJOR) - SET_STATUS_MAX(SA, STAT_WEAK, 2) - if(safety < FLASH_PROTECTION_MODERATE) - SET_STATUS_MAX(SA, STAT_STUN, (flash_strength - 2)) - SET_STATUS_MAX(SA, STAT_BLURRY, flash_strength) - SET_STATUS_MAX(SA, STAT_CONFUSE, flash_strength) - SA.flash_eyes(2) - else - flashfail = 1 - - else if(issilicon(M)) - SET_STATUS_MAX(M, STAT_WEAK, rand(str_min,6)) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + do_flash_animation(user, M) - else - flashfail = 1 - - if(isrobot(user)) - spawn(0) - var/atom/movable/overlay/animation = new(user) - animation.plane = user.plane - animation.layer = user.layer + 0.01 - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - flick("blspell", animation) - sleep(5) - qdel(animation) - - if(!flashfail) - flick("[initial(icon_state)]-on", src) - if(!issilicon(M)) - user.visible_message("[user] blinds [M] with \the [src]!") + if(M.stat != DEAD && M.handle_flashed(src, rand(str_min,str_max))) + admin_attack_log(user, M, "flashed their victim using \a [src].", "Was flashed by \a [src].", "used \a [src] to flash") + if(!M.isSynthetic()) + user.visible_message(SPAN_DANGER("[user] blinds [M] with \the [src]!")) else - user.visible_message("[user] overloads [M]'s sensors with \the [src]!") + user.visible_message(SPAN_DANGER("[user] overloads [M]'s sensors with \the [src]!")) else - user.visible_message("[user] fails to blind [M] with \the [src]!") - return 1 - - - + user.visible_message(SPAN_WARNING("[user] fails to blind [M] with \the [src]!")) + return TRUE /obj/item/flash/attack_self(mob/user, flag = 0, emp = 0) - if(!user || !clown_check(user)) return 0 - - if(broken) - user.show_message("The [src.name] is broken", 2) - return 0 - - flash_recharge() - - //spamming the flash before it's fully charged (60seconds) increases the chance of it breaking - //It will never break on the first use. - switch(times_used) - if(0 to 5) - if(prob(2*times_used)) //if you use it 5 times in a minute it has a 10% chance to break! - broken = 1 - to_chat(user, "The bulb has burnt out!") - icon_state = "[initial(icon_state)]-burnt" - return 0 - times_used++ - else //can only use it 5 times a minute - user.show_message("*click* *click*", 2) - return 0 + if(!user || !general_flash_check(user)) + return FALSE + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) - flick("[initial(icon_state)]-on", src) - if(user && isrobot(user)) - spawn(0) - var/atom/movable/overlay/animation = new(user.loc) - animation.plane = user.plane - animation.layer = user.layer + 0.01 - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = user - flick("blspell", animation) - sleep(5) - qdel(animation) - + do_flash_animation(user) for(var/mob/living/carbon/M in oviewers(3, null)) - var/safety = M.eyecheck() - if(safety < FLASH_PROTECTION_MODERATE) - if(!M.blinded) - M.flash_eyes() - SET_STATUS_MAX(M, STAT_BLURRY, 2) - - return 1 + M.handle_flashed(src, rand(str_min,str_max)) + return TRUE /obj/item/flash/emp_act(severity) - if(broken) return - flash_recharge() - switch(times_used) - if(0 to 5) - if(prob(2*times_used)) - broken = 1 - update_icon() - return - times_used++ - if(istype(loc, /mob/living/carbon)) - var/mob/living/carbon/M = loc - var/safety = M.eyecheck() - if(safety < FLASH_PROTECTION_MODERATE) - SET_STATUS_MAX(M, STAT_WEAK, 10) - M.flash_eyes() - M.visible_message("\The [M] is blinded by \the [src]!") - ..() + if(broken || !general_flash_check()) + return FALSE + do_flash_animation() + for(var/mob/living/carbon/M in oviewers(3, null)) + M.handle_flashed(src, rand(str_min,str_max)) /obj/item/flash/synthetic //not for regular use, weaker effects name = "modified flash" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index dc684b7ff66..3f829b1474f 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -520,3 +520,18 @@ set_internals(selected_obj, "\the [selected_obj] [selected_from] your [selected_slot]") else set_internals(selected_obj, "\the [selected_obj]") + +/mob/living/carbon/handle_flashed(var/obj/item/flash/flash, var/flash_strength) + + var/safety = eyecheck() + if(safety >= FLASH_PROTECTION_MODERATE || flash_strength <= 0) // May be modified by human proc. + return FALSE + + flash_eyes(FLASH_PROTECTION_MODERATE - safety) + SET_STATUS_MAX(src, STAT_STUN, (flash_strength / 2)) + SET_STATUS_MAX(src, STAT_BLURRY, flash_strength) + SET_STATUS_MAX(src, STAT_CONFUSE, (flash_strength + 2)) + if(flash_strength > 3) + drop_held_items() + if(flash_strength > 5) + SET_STATUS_MAX(src, STAT_WEAK, 2) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 0b9e25b1955..9bf59eb6796 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1351,3 +1351,11 @@ //Runs last after setup and after the parent init has been executed. /mob/living/carbon/human/proc/post_setup(var/species_name = null, var/datum/dna/new_dna = null) refresh_visible_overlays() //Do this exactly once per setup + +/mob/living/carbon/human/handle_flashed(var/obj/item/flash/flash, var/flash_strength) + var/safety = eyecheck() + if(safety < FLASH_PROTECTION_MODERATE) + flash_strength = round(getFlashMod() * flash_strength) + if(safety > FLASH_PROTECTION_NONE) + flash_strength = (flash_strength / 2) + . = ..() diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 781bc637b99..8fa8b2fff14 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -49,7 +49,8 @@ module_state_3 = null inv3.icon_state = "inv3" update_icon() - hud_used.update_robot_modules_display() + if(!isnull(hud_used)) + hud_used.update_robot_modules_display() /mob/living/silicon/robot/proc/uneq_all() module_active = null @@ -79,7 +80,8 @@ module_state_3 = null inv3.icon_state = "inv3" update_icon() - hud_used.update_robot_modules_display() + if(!isnull(hud_used)) + hud_used.update_robot_modules_display() /mob/living/silicon/robot/proc/activated(obj/item/O) if(module_state_1 == O) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index ee6ce2ed631..4980c6187f7 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1113,3 +1113,14 @@ /mob/living/silicon/robot/handle_pre_transformation() QDEL_NULL(mmi) + +/mob/living/silicon/robot/do_flash_animation() + set waitfor = FALSE + var/atom/movable/overlay/animation = new(src) + animation.plane = plane + animation.layer = layer + 0.01 + animation.icon_state = "blank" + animation.icon = 'icons/mob/mob.dmi' + flick("blspell", animation) + sleep(5) + qdel(animation) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 904c01b1841..826558800a3 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -440,4 +440,8 @@ /mob/living/silicon/proc/process_os() var/datum/extension/interactive/os = get_extension(src, /datum/extension/interactive/os) if(os) - os.Process() \ No newline at end of file + os.Process() + +/mob/living/silicon/handle_flashed(var/obj/item/flash/flash, var/flash_strength) + SET_STATUS_MAX(src, STAT_WEAK, flash_strength) + return TRUE diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index a208a54d7d4..1f0c10f0461 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -595,3 +595,15 @@ /mob/living/simple_animal/get_telecomms_race_info() return list("Domestic Animal", FALSE) + +/mob/living/simple_animal/handle_flashed(var/obj/item/flash/flash, var/flash_strength) + var/safety = eyecheck() + if(safety < FLASH_PROTECTION_MAJOR) + SET_STATUS_MAX(src, STAT_WEAK, 2) + if(safety < FLASH_PROTECTION_MODERATE) + SET_STATUS_MAX(src, STAT_STUN, (flash_strength - 2)) + SET_STATUS_MAX(src, STAT_BLURRY, flash_strength) + SET_STATUS_MAX(src, STAT_CONFUSE, flash_strength) + flash_eyes(2) + return TRUE + return FALSE diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 31710c8596d..7947ff74848 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1136,3 +1136,9 @@ return A.is_open() && neighbor.Adjacent(A) return FALSE + +/mob/proc/handle_flashed(var/obj/item/flash/flash, var/flash_strength) + return FALSE + +/mob/proc/do_flash_animation() + return diff --git a/nebula.dme b/nebula.dme index 5072747511e..6c3b1066b37 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2588,13 +2588,13 @@ #include "code\modules\modular_computers\hardware\scanners\scanner_atmos.dm" #include "code\modules\modular_computers\hardware\scanners\scanner_medical.dm" #include "code\modules\modular_computers\hardware\scanners\scanner_paper.dm" -#include "code\modules\modular_computers\networking\accounts\_network_accounts.dm" #include "code\modules\modular_computers\hardware\scanners\scanner_reagent.dm" #include "code\modules\modular_computers\networking\_network.dm" -#include "code\modules\modular_computers\networking\accounts\account.dm" -#include "code\modules\modular_computers\networking\accounts\email_message.dm" #include "code\modules\modular_computers\networking\network_cable.dm" #include "code\modules\modular_computers\networking\network_files.dm" +#include "code\modules\modular_computers\networking\accounts\_network_accounts.dm" +#include "code\modules\modular_computers\networking\accounts\account.dm" +#include "code\modules\modular_computers\networking\accounts\email_message.dm" #include "code\modules\modular_computers\networking\device_types\_network_device.dm" #include "code\modules\modular_computers\networking\device_types\acl.dm" #include "code\modules\modular_computers\networking\device_types\broadcaster.dm" From f3563642ac37219141c0d88e1f07dd1956206449 Mon Sep 17 00:00:00 2001 From: keIgaras Date: Mon, 16 May 2022 23:26:52 +0300 Subject: [PATCH 0019/1518] new sprites for vents and scrubbers --- icons/atmos/vent_pump.dmi | Bin 36806 -> 5604 bytes icons/atmos/vent_scrubber.dmi | Bin 1667 -> 2164 bytes icons/obj/pipe-item.dmi | Bin 32659 -> 31840 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/atmos/vent_pump.dmi b/icons/atmos/vent_pump.dmi index ee89a02b4a768574bc59201c5011d9e26aaeb46e..3d9445bec1c3f4e1683c749d1a5e5d8645ebabfd 100644 GIT binary patch literal 5604 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 diff --git a/icons/atmos/vent_scrubber.dmi b/icons/atmos/vent_scrubber.dmi index 55790e7ddf438be4eece44e7ac290ed42ad330d5..aef1cb1822a0415d26ce576634a538bef03bdf09 100644 GIT binary patch delta 2080 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 diff --git a/icons/obj/pipe-item.dmi b/icons/obj/pipe-item.dmi index 8849029e1b18f8a494243e2aed6079ae99af709b..e0b7b9bc44c82e8df070d55c26dcbcf79eefc377 100644 GIT binary patch literal 31840 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 a4*oEc@M_`h4|sDpLR-T?y;#*Y@c#h}?kC*< literal 32659 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 Date: Tue, 17 May 2022 15:38:41 +1000 Subject: [PATCH 0020/1518] Automatic changelog generation for PR #2372 [ci skip] --- html/changelogs/AutoChangeLog-pr-2372.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2372.yml diff --git a/html/changelogs/AutoChangeLog-pr-2372.yml b/html/changelogs/AutoChangeLog-pr-2372.yml new file mode 100644 index 00000000000..19428dcd3f6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2372.yml @@ -0,0 +1,4 @@ +author: keIgaras +delete-after: true +changes: + - rscadd: new icons for vents and scrubbers From 95756b99d870b1640f221d635cb7219ef413ab60 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 17 May 2022 19:26:59 +1000 Subject: [PATCH 0021/1518] Implemented nopain todo. --- code/modules/reagents/chems/chems_compounds.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/modules/reagents/chems/chems_compounds.dm b/code/modules/reagents/chems/chems_compounds.dm index c698933fb65..b52768d977c 100644 --- a/code/modules/reagents/chems/chems_compounds.dm +++ b/code/modules/reagents/chems/chems_compounds.dm @@ -137,7 +137,7 @@ var/mouth_covered = 0 var/partial_mouth_covered = 0 var/stun_probability = 50 - var/no_pain = 0 + var/no_pain = !M.can_feel_pain() var/obj/item/eye_protection = null var/obj/item/face_protection = null var/obj/item/partial_face_protection = null @@ -148,8 +148,6 @@ if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M protection = list(H.head, H.glasses, H.wear_mask) - if(!H.can_feel_pain()) - no_pain = 1 //TODO: living-level can_feel_pain() proc else protection = list(M.wear_mask) From e4ff6ae93e817783a698e2b6643b46ac1257353f Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 17 May 2022 19:28:40 +1000 Subject: [PATCH 0022/1518] Implements distance check todo in storage. --- code/game/objects/items/weapons/storage/storage.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 35b2db95d8b..9d247662f68 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -204,7 +204,7 @@ for(var/mob/M in viewers(usr, null)) if (M == usr) to_chat(usr, "You put \the [W] into [src].") - else if (M in range(1, src)) //If someone is standing close enough, they can tell what it is... TODO replace with distance check + else if (get_dist(src, M) <= 1) //If someone is standing close enough, they can tell what it is... M.show_message("\The [usr] puts [W] into [src].", VISIBLE_MESSAGE) else if (W && W.w_class >= ITEM_SIZE_NORMAL) //Otherwise they can only see large or normal items from a distance... M.show_message("\The [usr] puts [W] into [src].", VISIBLE_MESSAGE) From 6157c99d23be7dc6921be247df1c7b9cfa940840 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 17 May 2022 18:16:28 +1000 Subject: [PATCH 0023/1518] Swaps damtype strings out for defines. --- code/__defines/damage_organs.dm | 2 -- code/__defines/shields.dm | 2 +- code/controllers/verbs.dm | 3 --- code/game/machinery/deployable.dm | 4 ++-- code/game/objects/auras/starlight.dm | 2 +- code/game/objects/items/weapons/flame.dm | 2 +- code/game/objects/objs.dm | 2 +- code/game/objects/structures/grille.dm | 4 ++-- code/game/objects/structures/railing.dm | 2 +- code/modules/admin/view_variables/helpers.dm | 12 ++++++------ code/modules/admin/view_variables/topic.dm | 12 ++++++------ code/modules/blob/blob.dm | 4 ++-- code/modules/clothing/masks/smokable.dm | 6 +++--- code/modules/organs/external/_external.dm | 4 ++-- code/modules/organs/external/head.dm | 4 ++-- 15 files changed, 30 insertions(+), 35 deletions(-) diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm index 01333652cd6..2c22fc7891b 100644 --- a/code/__defines/damage_organs.dm +++ b/code/__defines/damage_organs.dm @@ -1,5 +1,3 @@ -// Damage things. TODO: Merge these down to reduce on defines. -// Way to waste perfectly good damage-type names (BRUTE) on this... If you were really worried about case sensitivity, you could have just used lowertext(damagetype) in the proc. #define BRUTE "brute" #define BURN "fire" #define TOX "tox" diff --git a/code/__defines/shields.dm b/code/__defines/shields.dm index 85de1ae89f0..f3b075265e4 100644 --- a/code/__defines/shields.dm +++ b/code/__defines/shields.dm @@ -1,4 +1,4 @@ -#define SHIELD_DAMTYPE_PHYSICAL 1 // Physical damage - bullets, meteors, various hand objects - aka. "brute" damtype. +#define SHIELD_DAMTYPE_PHYSICAL 1 // Physical damage - bullets, meteors, various hand objects - aka. BRUTE damtype. #define SHIELD_DAMTYPE_EM 2 // Electromagnetic damage - Ion weaponry, stun beams, ... #define SHIELD_DAMTYPE_HEAT 3 // Heat damage - Lasers, fire diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 0c2ab618ee7..dff70c19021 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -1,6 +1,3 @@ -//TODO: rewrite and standardise all controller datums to the datum/controller type -//TODO: allow all controllers to be deleted for clean restarts (see WIP master controller stuff) - MC done - lighting done - /client/proc/debug_antagonist_template() set category = "Debug" set name = "Debug Antagonist" diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 56d34ac0949..5d790f2ccf2 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -53,9 +53,9 @@ return else switch(W.damtype) - if("fire") + if(BURN) src.health -= W.force * 0.75 - if("brute") + if(BRUTE) src.health -= W.force * 0.5 else if (src.health <= 0) diff --git a/code/game/objects/auras/starlight.dm b/code/game/objects/auras/starlight.dm index f42ad404b7f..5250704ac33 100644 --- a/code/game/objects/auras/starlight.dm +++ b/code/game/objects/auras/starlight.dm @@ -13,7 +13,7 @@ return 0 /obj/aura/starborn/attackby(var/obj/item/I, var/mob/i_user) - if(I.damtype == "fire") + if(I.damtype == BURN) to_chat(i_user, "\The [I] seems to only feed into \the [user]'s flames.") user.adjustBruteLoss(-I.force) return AURA_FALSE diff --git a/code/game/objects/items/weapons/flame.dm b/code/game/objects/items/weapons/flame.dm index ebf44634093..f1d9272b651 100644 --- a/code/game/objects/items/weapons/flame.dm +++ b/code/game/objects/items/weapons/flame.dm @@ -11,7 +11,7 @@ /obj/item/flame/proc/extinguish(var/mob/user, var/no_message) lit = 0 - damtype = "brute" + damtype = BRUTE STOP_PROCESSING(SSobj, src) /obj/item/flame/fluid_act(var/datum/reagents/fluids) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 172637e20da..5fa1e942928 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -11,7 +11,7 @@ var/sharp = 0 // whether this object cuts var/edge = 0 // whether this object is more likely to dismember var/in_use = 0 // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! - var/damtype = "brute" + var/damtype = BRUTE var/armor_penetration = 0 var/anchor_fall = FALSE var/holographic = 0 //if the obj is a holographic object spawned by the holodeck diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 502687e5a4b..fb5a6146dd6 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -204,9 +204,9 @@ user.do_attack_animation(src) playsound(loc, 'sound/effects/grillehit.ogg', 80, 1) switch(W.damtype) - if("fire") + if(BURN) take_damage(W.force) - if("brute") + if(BRUTE) take_damage(W.force * 0.1) ..() diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index b166924ae4f..b859330cc26 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -276,7 +276,7 @@ update_icon() return - if(W.force && (W.damtype == "fire" || W.damtype == "brute")) + if(W.force && (W.damtype == BURN || W.damtype == BRUTE)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) visible_message("\The [src] has been [LAZYLEN(W.attack_verb) ? pick(W.attack_verb) : "attacked"] with \the [W] by \the [user]!") take_damage(W.force) diff --git a/code/modules/admin/view_variables/helpers.dm b/code/modules/admin/view_variables/helpers.dm index cec01fdd4b0..652ba6ce496 100644 --- a/code/modules/admin/view_variables/helpers.dm +++ b/code/modules/admin/view_variables/helpers.dm @@ -20,12 +20,12 @@
<< [dir2text(dir)] >>
[ckey ? ckey : "No ckey"] / [real_name ? real_name : "No real name"]
- BRUTE:[getBruteLoss()] - FIRE:[getFireLoss()] - TOXIN:[getToxLoss()] - OXY:[getOxyLoss()] - CLONE:[getCloneLoss()] - BRAIN:[getBrainLoss()] + BRUTE:[getBruteLoss()] + FIRE:[getFireLoss()] + TOXIN:[getToxLoss()] + OXY:[getOxyLoss()] + CLONE:[getCloneLoss()] + BRAIN:[getBrainLoss()] "} diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index 3ca2ef0b36e..fa43b34740d 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -559,12 +559,12 @@ return switch(Text) - if("brute") L.adjustBruteLoss(amount) - if("fire") L.adjustFireLoss(amount) - if("toxin") L.adjustToxLoss(amount) - if("oxygen")L.adjustOxyLoss(amount) - if("brain") L.adjustBrainLoss(amount) - if("clone") L.adjustCloneLoss(amount) + if(BRUTE) L.adjustBruteLoss(amount) + if(BURN) L.adjustFireLoss(amount) + if(TOX) L.adjustToxLoss(amount) + if(OXY) L.adjustOxyLoss(amount) + if(BP_BRAIN) L.adjustBrainLoss(amount) + if(CLONE) L.adjustCloneLoss(amount) else to_chat(usr, "You caused an error. DEBUG: Text:[Text] Mob:[L]") return diff --git a/code/modules/blob/blob.dm b/code/modules/blob/blob.dm index 5b1a8d8f8e9..b32f0fea865 100644 --- a/code/modules/blob/blob.dm +++ b/code/modules/blob/blob.dm @@ -178,11 +178,11 @@ var/damage = 0 switch(W.damtype) - if("fire") + if(BURN) damage = (W.force / fire_resist) if(isWelder(W)) playsound(loc, 'sound/items/Welder.ogg', 100, 1) - if("brute") + if(BRUTE) damage = (W.force / brute_resist) take_damage(damage) diff --git a/code/modules/clothing/masks/smokable.dm b/code/modules/clothing/masks/smokable.dm index 252abdb5ed8..8ca22b7045c 100644 --- a/code/modules/clothing/masks/smokable.dm +++ b/code/modules/clothing/masks/smokable.dm @@ -127,7 +127,7 @@ to_chat(usr, "You cannot light \the [src] underwater.") return lit = 1 - damtype = "fire" + damtype = BURN if(REAGENT_VOLUME(reagents, /decl/material/liquid/fuel)) // the fuel explodes var/datum/effect/effect/system/reagents_explosion/e = new() e.set_up(round(REAGENT_VOLUME(reagents, /decl/material/liquid/fuel) / 5, 1), get_turf(src), 0, 0) @@ -145,7 +145,7 @@ /obj/item/clothing/mask/smokable/proc/extinguish(var/mob/user, var/no_message) lit = 0 - damtype = "brute" + damtype = BRUTE STOP_PROCESSING(SSobj, src) set_light(0) update_icon() @@ -480,7 +480,7 @@ to_chat(usr, "You cannot light \the [src] underwater.") return lit = 1 - damtype = "fire" + damtype = BURN var/turf/T = get_turf(src) T.visible_message(flavor_text) START_PROCESSING(SSobj, src) diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index a5fed95c69a..d72191990c3 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -1437,11 +1437,11 @@ Note that amputating the affected organ does in fact remove the infection from t is_detached = FALSE //External prosthetics are never detached return ..(is_detached) -/obj/item/organ/external/proc/disfigure(var/type = "brute") +/obj/item/organ/external/proc/disfigure(var/type = BRUTE) if(status & ORGAN_DISFIGURED) return if(owner) - if(type == "brute") + if(type == BRUTE) owner.visible_message("You hear a sickening cracking sound coming from \the [owner]'s [name].", \ "Your [name] becomes a mangled mess!", \ "You hear a sickening crack.") diff --git a/code/modules/organs/external/head.dm b/code/modules/organs/external/head.dm index 489af427207..fdb3a8418af 100644 --- a/code/modules/organs/external/head.dm +++ b/code/modules/organs/external/head.dm @@ -89,9 +89,9 @@ if (!(status & ORGAN_DISFIGURED)) if (brute_dam > 40) if (prob(50)) - disfigure("brute") + disfigure(BRUTE) if (burn_dam > 40) - disfigure("burn") + disfigure(BURN) /obj/item/organ/external/head/on_update_icon() From f8f07b13f297b6bad66ade791d3868eb0de3c617 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Wed, 18 May 2022 00:38:04 +0000 Subject: [PATCH 0024/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-2372.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2372.yml diff --git a/html/changelog.html b/html/changelog.html index c27ba878540..501e13702a7 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
+

18 May 2022

+

keIgaras updated:

+
    +
  • new icons for vents and scrubbers
  • +
+

15 May 2022

tag if you want to specify another name or several people. --> updated:

From 27e57de22ed919390b4cea4a9bb08bb3707beb06 Mon Sep 17 00:00:00 2001 From: NataKilar Date: Thu, 14 Jul 2022 20:15:28 -0400 Subject: [PATCH 0210/1518] Overmap movement fixes --- code/modules/overmap/overmap_object.dm | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/code/modules/overmap/overmap_object.dm b/code/modules/overmap/overmap_object.dm index d6ac17dea30..6e4ca4662dd 100644 --- a/code/modules/overmap/overmap_object.dm +++ b/code/modules/overmap/overmap_object.dm @@ -79,14 +79,16 @@ var/global/list/overmap_unknown_ids = list() var/datum/overmap/overmap = global.overmaps_by_z["[T.z]"] var/nx = x var/ny = y + + var/heading_dir = get_heading_dir() - if((dir & WEST) && x == 1) + if((heading_dir & WEST) && x == 1) nx = overmap.map_size_y - 1 - else if((dir & EAST) && x == overmap.map_size_y) + else if((heading_dir & EAST) && x == overmap.map_size_y) nx = 2 - if((dir & SOUTH) && y == 1) + if((heading_dir & SOUTH) && y == 1) ny = overmap.map_size_y - 1 - else if((dir & NORTH) && y == overmap.map_size_y) + else if((heading_dir & NORTH) && y == overmap.map_size_y) ny = 2 if((x == nx) && (y == ny)) return //we're not flying off anywhere @@ -154,6 +156,8 @@ var/global/list/overmap_unknown_ids = list() if(can_burn()) last_burn = world.time var/delta_v = get_delta_v() / KM_OVERMAP_RATE + if(delta_v == 0) + return var/partial_power = Clamp(actual_accel_limit / delta_v, 0, 1) var/acceleration = min(get_delta_v(TRUE, partial_power) / KM_OVERMAP_RATE, actual_accel_limit) if(direction & EAST) From 689123d34f75d80556faa20c35b3324d99969253 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 17 Jul 2022 00:51:10 +0000 Subject: [PATCH 0211/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index ca0f0a031d5..78a1e1ff1f8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -155,12 +155,6 @@

keIgaras updated:

  • new icons for vents and scrubbers
- -

15 May 2022

-

tag if you want to specify another name or several people. --> updated:

-
    -
  • Upward pointing cable stubs now give proper feedback, and install properly when clicked on with a cable coil in hands. You used to need to click on the turf instead before, which was a bit confusing.
  • -
From fa3b8b3d78a37e6a68846c7d543f71b2818112dc Mon Sep 17 00:00:00 2001 From: jade-lavenza Date: Mon, 18 Jul 2022 19:20:04 -0500 Subject: [PATCH 0212/1518] Apply changes from code review --- code/controllers/subsystems/garbage.dm | 2 +- code/modules/multiz/map_data.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm index 7c84589cbb0..e0f95be34a9 100644 --- a/code/controllers/subsystems/garbage.dm +++ b/code/controllers/subsystems/garbage.dm @@ -396,7 +396,7 @@ SUBSYSTEM_DEF(garbage) user_find_references() /datum/proc/user_find_references() - if(alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No")) == "No") + if(alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "No", "Yes")) == "No") return find_references() diff --git a/code/modules/multiz/map_data.dm b/code/modules/multiz/map_data.dm index 2e666971a7b..96be35b3f33 100644 --- a/code/modules/multiz/map_data.dm +++ b/code/modules/multiz/map_data.dm @@ -7,7 +7,7 @@ var/turf/edge_type ///< What the map edge should be formed with. (null = world.turf) VAR_PROTECTED_UT/UT_turf_exceptions_by_door_type // An associate list of door types/list of allowed turfs -z + // If the height is more than 1, we mark all contained levels as connected. // This is in New because it is an auxiliary effect specifically needed pre-init. /obj/abstract/map_data/New(turf/loc, _height) From 4c6b733f8a2da2c14fc4988b803709bdf27f8597 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Wed, 20 Jul 2022 00:47:27 +0000 Subject: [PATCH 0213/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 78a1e1ff1f8..6082a7cea2e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -149,12 +149,6 @@

MistakeNot4892 updated:

  • Inflatables are now craftable.
- -

18 May 2022

-

keIgaras updated:

-
    -
  • new icons for vents and scrubbers
  • -
From 1f580ef285c02631aa5c822a3ffb47b46599c4ba Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 24 Jul 2022 00:54:05 +0000 Subject: [PATCH 0214/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 6082a7cea2e..6f166982efc 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -143,12 +143,6 @@

quardbreak updated:

  • Progress bars use gradient function for transit animation now.
  • Failure animation for progress bars has been removed.
  • - -

    22 May 2022

    -

    MistakeNot4892 updated:

    -
      -
    • Inflatables are now craftable.
    • -
    From 85ac390fc4263078c679db25d8eaf0f426b892f3 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Sun, 24 Jul 2022 08:44:56 -0400 Subject: [PATCH 0215/1518] Add pen tool archetype (#2495) * Added pen tool archetype This is an abstraction over pens. So you can have things that are considered pens with various typing. I've had to add some new things to the tool archetype to handle them however. * Added non-generic tool property handling to the tool extension. So that tool specific things, such as color, pen type and etc can be added without cluttering the tool_extension. * Added pen flags and cut down on the number of boolean vars on pens. * Rewrote how pen works to work with the tool_archetype system, and properly update their tool_extension when needed. * Added /datum/extension/labels/single * Added a single label extension variant to the labels extension, so things that can only allow a single label can enforce it easily. * Added a RemoveAllLabels() proc on labels for convenience. * Replaced type checks with new IS_PEN macro * Adapted some of the implementations to use the tool properties system, and properly abstract things out when possible. * Several minor misc changes and logic fix. * Renamed set_ink_color to set_medium_color * Now generates pen descriptions * All pen descriptions are automatically generated when their color is set now. * misc fixes. * Added pen quality to the pen type and gave various qualities * Fixed pen removal/insertion interactions * Made the labeler not toggle open body bags * Cleaned up the bodybag box definition * Fix infinite use pens not working * Fix writing on newspapers * Fix writing on the crematorium Unsure why its a thing though. Seems pretty pointless. * Made it only use a single label. * Update crematorium.dm * Made pen bitflags start at bit 0 * extra comments * Used canphysicallyinteract for doorframes * Fixed duplicate material defines in clipboards * Reworked clipboard * Added a paper limit, uses a lazy list to manage papers now since otherwise it would just constantly iterate over contents and type cast stuff to make a list of papers. Main downside is having to use a list, instead of a single var, but its a lot easier to manage. * Cleaned up definition. * QoL changes to how the clipboard gets the user's pen. I can get it from the clipboard's pen storage itself. And it doesn't have to be in the active hand anymore. * Successful label extension interactions now return TRUE * Simplified greatly pen use on morgue * Hand labeller now communicates the result of AttachLabel * Fixed typo in multi pen description. * tool_properties are now lazy * Check after closing input if user still able to interact * morgue and crematorium now use labeler only * Using the pen to put a label on them was very non-standard. So just removed the interaction, and now rely on the hand labeler for labeling it. * Use ADD_ARTICLE for the pen descriptions * Got rid of the duplicate crap from the merge * Reduce redundant calls to get_tool_property * applied some more requested changes * Applied requested changes --- code/__defines/paperwork.dm | 5 + code/__defines/tools.dm | 14 +- code/datums/extensions/label.dm | 16 +- code/game/machinery/newscaster.dm | 27 +- code/game/machinery/portable_turret.dm | 17 +- code/game/machinery/washing_machine.dm | 2 +- code/game/objects/items/bodybag.dm | 65 ++-- code/game/objects/items/books/_book.dm | 21 +- code/game/objects/items/books/skill_book.dm | 2 +- code/game/objects/items/crayons.dm | 119 -------- code/game/objects/items/devices/flashlight.dm | 4 + .../objects/items/devices/taperecorder.dm | 2 +- code/game/objects/items/robot/robot_frame.dm | 2 +- code/game/objects/items/weapons/cards_ids.dm | 2 +- .../items/weapons/implants/implantcase.dm | 2 +- .../objects/items/weapons/storage/fancy.dm | 2 +- code/game/objects/structures/bookcase.dm | 4 +- code/game/objects/structures/crematorium.dm | 21 +- code/game/objects/structures/door_assembly.dm | 11 +- code/game/objects/structures/morgue.dm | 21 +- code/game/objects/structures/pit.dm | 13 +- code/game/objects/structures/skele_stand.dm | 2 +- code/modules/crafting/_crafting_holder.dm | 2 +- code/modules/games/cards.dm | 4 +- .../goals/definitions/department_clerical.dm | 2 +- .../mob/living/silicon/robot/robot_items.dm | 12 +- .../computers/modular_computer/interaction.dm | 4 +- code/modules/paperwork/clipboard.dm | 284 ++++++++++-------- code/modules/paperwork/folders.dm | 2 +- code/modules/paperwork/handlabeler.dm | 2 +- code/modules/paperwork/paper.dm | 31 +- code/modules/paperwork/paper_bundle.dm | 2 +- code/modules/paperwork/paper_sticky.dm | 2 +- code/modules/paperwork/pen/chameleon_pen.dm | 44 +-- code/modules/paperwork/pen/crayon.dm | 150 +++++++-- code/modules/paperwork/pen/fancy.dm | 28 +- code/modules/paperwork/pen/multi_pen.dm | 35 ++- code/modules/paperwork/pen/pen.dm | 114 ++++--- code/modules/paperwork/pen/reagent_pen.dm | 8 +- code/modules/paperwork/pen/retractable_pen.dm | 29 +- code/modules/paperwork/photography.dm | 2 +- code/modules/persistence/noticeboards.dm | 4 +- code/modules/reagents/reagent_containers.dm | 2 +- .../reagents/reagent_containers/condiment.dm | 2 +- .../reagents/reagent_containers/food/eggs.dm | 13 +- .../food/sliceable/pizza.dm | 2 +- code/modules/recycling/sortingmachinery.dm | 4 +- code/modules/tools/tool_archetype.dm | 1 + .../tools/tool_archetype_definition_pen.dm | 54 ++++ code/modules/tools/tool_extension.dm | 27 +- code/modules/tools/tool_item.dm | 12 +- .../finds/find_types/fossils.dm | 2 +- nebula.dme | 3 +- 53 files changed, 706 insertions(+), 551 deletions(-) create mode 100644 code/__defines/paperwork.dm delete mode 100644 code/game/objects/items/crayons.dm create mode 100644 code/modules/tools/tool_archetype_definition_pen.dm diff --git a/code/__defines/paperwork.dm b/code/__defines/paperwork.dm new file mode 100644 index 00000000000..5447f6e192d --- /dev/null +++ b/code/__defines/paperwork.dm @@ -0,0 +1,5 @@ +#define PEN_FLAG_ACTIVE BITFLAG(0) //If the pen is expanded and ready to write +#define PEN_FLAG_TOGGLEABLE BITFLAG(1) //If the pen can have its head retracted and extended +#define PEN_FLAG_FANCY BITFLAG(2) //If the pen is a fancy pen, mainly decides the font used +#define PEN_FLAG_CRAYON BITFLAG(3) //If the pen is a crayon, mainly decides the font used +#define PEN_FLAG_DEL_EMPTY BITFLAG(4) //If the pen is deleted when its use count reaches 0 diff --git a/code/__defines/tools.dm b/code/__defines/tools.dm index ee7d5c59976..d0afd961cbc 100644 --- a/code/__defines/tools.dm +++ b/code/__defines/tools.dm @@ -8,6 +8,7 @@ #define TOOL_HATCHET /decl/tool_archetype/hatchet #define TOOL_WRENCH /decl/tool_archetype/wrench #define TOOL_SHOVEL /decl/tool_archetype/shovel +#define TOOL_PEN /decl/tool_archetype/pen // Surgical tools. #define TOOL_SCALPEL /decl/tool_archetype/scalpel @@ -46,6 +47,7 @@ #define IS_CROWBAR(A) IS_TOOL(A, TOOL_CROWBAR) #define IS_HATCHET(A) IS_TOOL(A, TOOL_HATCHET) #define IS_SHOVEL(A) IS_TOOL(A, TOOL_SHOVEL) +#define IS_PEN(A) IS_TOOL(A, TOOL_PEN) // Structure interaction flags #define TOOL_INTERACTION_ANCHOR BITFLAG(0) @@ -59,4 +61,14 @@ #define TOOL_CODEX_WIRECUTTERS "wirecutters (tool)" #define TOOL_CODEX_WELDER "welder (tool)" #define TOOL_CODEX_CROWBAR "crowbar (tool)" -#define TOOL_CODEX_MULTITOOL "multitool (tool)" \ No newline at end of file +#define TOOL_CODEX_MULTITOOL "multitool (tool)" + +// Tool properties for tool specific stuff +#define TOOL_PROP_COLOR_NAME "color_name" //Property containing a color name for some tools. Namely the pen tool. +#define TOOL_PROP_COLOR "color" //Property for specifying a color, for something like a pen. +#define TOOL_PROP_USES "uses_left" //Property for things that have a fixed amount of uses. -1 is unlimited. + +//Pen specific stuff +#define TOOL_PROP_PEN_FLAG "pen_flag" //Property for pens to specify additional properties about themselves +#define TOOL_PROP_PEN_SIG "signature" //Property for pens specifically. Returns a stored forged signature if there's one. +#define TOOL_PROP_PEN_SHADE_COLOR "shade_color" //Property for pens returns the shade color if applicable diff --git a/code/datums/extensions/label.dm b/code/datums/extensions/label.dm index 7a20ab70138..e4e20c05717 100644 --- a/code/datums/extensions/label.dm +++ b/code/datums/extensions/label.dm @@ -26,6 +26,7 @@ var/old_name = atom_holder.name atom_holder.name = "[atom_holder.name] ([label])" events_repository.raise_event(/decl/observ/name_set, src, old_name, atom_holder.name) + return TRUE /datum/extension/labels/proc/RemoveLabel(var/mob/user, var/label) if(!(label in labels)) @@ -47,6 +48,13 @@ // We find and replace the first instance, since that's the one we removed from the list atom_holder.name = replacetext(atom_holder.name, full_label, "", index, index + length(full_label)) events_repository.raise_event(/decl/observ/name_set, src, old_name, atom_holder.name) + return TRUE + +/datum/extension/labels/proc/RemoveAllLabels() + . = TRUE + for(var/lbl in labels) + if(!RemoveLabel(null, lbl)) + . = FALSE // We may have to do something more complex here // in case something appends strings to something that's labelled rather than replace the name outright @@ -91,4 +99,10 @@ if(CanPhysicallyInteract(usr)) if(has_extension(src, /datum/extension/labels)) var/datum/extension/labels/L = get_extension(src, /datum/extension/labels) - L.RemoveLabel(usr, label) \ No newline at end of file + L.RemoveLabel(usr, label) + +//Single label allowed for this one +/datum/extension/labels/single/CanAttachLabel(user, label) + if(LAZYLEN(labels) >= 1) //Only allow a single label + return FALSE + . = ..() diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 77d6f2c9d8d..02e4552875c 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -868,21 +868,26 @@ var/global/list/allCasters = list() //Global list that will contain reference to /obj/item/newspaper/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/pen)) + if(IS_PEN(W)) if(src.scribble_page == src.curr_page) - to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?") + to_chat(user, SPAN_WARNING("There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?")) + return TRUE else - var/s = sanitize(input(user, "Write something", "Newspaper", "")) - s = user.handle_writing_literacy(user, sanitize(s)) - if (!s) + var/s = input(user, "Write something", "Newspaper") as null | message + if(!length(s)) return - if (!in_range(src, usr) && src.loc != usr) + if(!CanPhysicallyInteractWith(user, src)) + to_chat(user, SPAN_WARNING("You must stay close to \the [src]!")) return - src.scribble_page = src.curr_page - src.scribble = s - src.attack_self(user) - return - + if(W.do_tool_interaction(TOOL_PEN, user, src, 0, fuel_expenditure = 1) && !QDELETED(src)) //Make it instant, since handle_writing_literacy does the waiting + s = sanitize(s) + s = user.handle_writing_literacy(user, s) + src.scribble_page = src.curr_page + src.scribble = s + src.attack_self(user) + return TRUE + return + return ..() ////////////////////////////////////helper procs diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 705d52397b3..333b3773404 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -785,17 +785,20 @@ var/global/list/turret_icons build_step = 6 return - if(istype(I, /obj/item/pen)) //you can rename turrets like bots! + if(IS_PEN(I)) //you can rename turrets like bots! var/t = sanitize_safe(input(user, "Enter new turret name", name, finish_name) as text, MAX_NAME_LEN) - if(!t) + if(!CanPhysicallyInteractWith(usr, src)) return - if(!in_range(src, usr) && loc != usr) - return - - finish_name = t + if(!length(t)) + finish_name = initial(finish_name) + to_chat(user, SPAN_NOTICE("You restore \the [src]'s default name.")) + return TRUE + if(I.do_tool_interaction(TOOL_PEN, user, src, 2 SECOND, fuel_expenditure = 1) && !QDELETED(src)) + finish_name = t + return TRUE return - ..() + return ..() /obj/machinery/porta_turret_construct/attack_hand(mob/user) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 07c1a3c3ccf..27012e817c6 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -118,7 +118,7 @@ /obj/machinery/washing_machine/attackby(obj/item/W, mob/user) if(!(state & WASHER_STATE_CLOSED)) - if(!crayon && istype(W,/obj/item/pen/crayon)) + if(!crayon && IS_PEN(W)) if(!user.unEquip(W, src)) return crayon = W diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 0358da67f59..d6d90f7f400 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -12,22 +12,13 @@ R.add_fingerprint(user) qdel(src) - /obj/item/storage/box/bodybags - name = "body bags" - desc = "This box contains body bags." + name = "body bags" + desc = "This box contains body bags." icon_state = "bodybags" - -/obj/item/storage/box/bodybags/Initialize() - . = ..() - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - new /obj/item/bodybag(src) - + startswith = list( + /obj/item/bodybag = 7, + ) /obj/structure/closet/body_bag name = "body bag" @@ -37,33 +28,17 @@ open_sound = 'sound/items/zip.ogg' close_sound = 'sound/items/zip.ogg' var/item_path = /obj/item/bodybag - density = 0 + density = FALSE storage_capacity = (MOB_SIZE_MEDIUM * 2) - 1 - var/contains_body = 0 - var/has_label = FALSE + var/contains_body = FALSE + +/obj/structure/closet/body_bag/Initialize() + . = ..() + set_extension(src, /datum/extension/labels/single) //Set the label extension to a single allowed label -/obj/structure/closet/body_bag/attackby(var/obj/item/W, mob/user) - if (istype(W, /obj/item/pen)) - var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text - if (user.get_active_hand() != W) - return - if (!in_range(src, user) && src.loc != user) - return - t = sanitize_safe(t, MAX_NAME_LEN) - if (t) - src.SetName("body bag - ") - src.name += t - has_label = TRUE - else - src.SetName("body bag") - src.update_icon() - return - else if(IS_WIRECUTTER(W)) - src.SetName("body bag") - has_label = FALSE - to_chat(user, "You cut the tag off \the [src].") - src.update_icon() - return +/obj/structure/closet/body_bag/SetName(new_name) + . = ..() + update_icon() //Since adding a label updates the name, this handles updating the label overlay /obj/structure/closet/body_bag/on_update_icon() if(opened) @@ -72,9 +47,15 @@ icon_state = "closed_unlocked" ..() - if(has_label) + var/datum/extension/labels/lbls = get_extension(src, /datum/extension/labels) + if(LAZYLEN(lbls?.labels)) add_overlay("bodybag_label") +/obj/structure/closet/body_bag/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/hand_labeler)) + return //Prevent the labeler from opening the bag when trying to apply a label + . = ..() + /obj/structure/closet/body_bag/store_mobs(var/stored_units) contains_body = ..() return contains_body @@ -82,8 +63,8 @@ /obj/structure/closet/body_bag/close() if(..()) set_density(0) - return 1 - return 0 + return TRUE + return FALSE /obj/structure/closet/body_bag/proc/fold(var/user) if(!(ishuman(user) || isrobot(user))) return 0 diff --git a/code/game/objects/items/books/_book.dm b/code/game/objects/items/books/_book.dm index b9d346461bf..440f9f60560 100644 --- a/code/game/objects/items/books/_book.dm +++ b/code/game/objects/items/books/_book.dm @@ -10,7 +10,7 @@ matter = list(/decl/material/solid/wood = MATTER_AMOUNT_REINFORCEMENT) var/dat // Actual page content - var/pencode_dat // Cache pencode if input, so it can be edited later. + var/pencode_dat // Cache pencode if input, so it can be edited later. var/author // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned var/unique = 0 // 0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified var/title // The real name of the book. @@ -68,7 +68,7 @@ else to_chat(user, "There's already something in [title]!") return - if(istype(W, /obj/item/pen)) + if(IS_PEN(W)) if(unique) to_chat(user, "These pages don't seem to take the ink well. Looks like you can't modify it.") return @@ -133,9 +133,14 @@ /obj/item/book/proc/formatpencode(var/mob/user, var/t, var/obj/item/pen/P) . = t if(findtext(t, "\[sign\]")) - . = replacetext(t, "\[sign\]", "[P ? P.get_signature(user) : "Anonymous"]") + var/decl/tool_archetype/pen/parch = GET_DECL(TOOL_PEN) + var/signature = parch.get_signature(user, P) + . = replacetext(t, "\[sign\]", "[signature]") + + var/pen_flag = P.get_tool_property(TOOL_PEN, TOOL_PROP_PEN_FLAG) + var/pen_color = P.get_tool_property(TOOL_PEN, TOOL_PROP_COLOR) if(P) - if(P.iscrayon) + if(pen_flag & PEN_FLAG_CRAYON) . = replacetext(t, "\[*\]", "") . = replacetext(t, "\[hr\]", "") . = replacetext(t, "\[small\]", "") @@ -147,11 +152,11 @@ . = replacetext(t, "\[row\]", "") . = replacetext(t, "\[cell\]", "") . = replacetext(t, "\[logo\]", "") - . = "[.]" - else if(P.isfancy) - . = "[.]" + . = "[.]" + else if(pen_flag & PEN_FLAG_FANCY) + . = "[.]" else - . = "[.]" + . = "[.]" else . = "[.]" . = pencode2html(.) diff --git a/code/game/objects/items/books/skill_book.dm b/code/game/objects/items/books/skill_book.dm index 4923de11526..abbf48d781e 100644 --- a/code/game/objects/items/books/skill_book.dm +++ b/code/game/objects/items/books/skill_book.dm @@ -751,7 +751,7 @@ MEDICAL icon_state = "tb_white_question" /obj/item/book/skill/custom/attackby(obj/item/pen, mob/user) - if(istype(pen, /obj/item/pen)) + if(IS_PEN(pen)) if(!user.skill_check(SKILL_LITERACY, SKILL_BASIC)) to_chat(user, SPAN_WARNING("You can't even read, yet you want to write a whole educational textbook?")) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm deleted file mode 100644 index 32c8ca6be31..00000000000 --- a/code/game/objects/items/crayons.dm +++ /dev/null @@ -1,119 +0,0 @@ -/obj/item/pen/crayon/red - icon_state = "crayonred" - colour = "#da0000" - shadeColour = "#810c0c" - colourName = "red" - color_description = "red crayon" - -/obj/item/pen/crayon/orange - icon_state = "crayonorange" - colour = "#ff9300" - shadeColour = "#a55403" - colourName = "orange" - color_description = "orange crayon" - -/obj/item/pen/crayon/yellow - icon_state = "crayonyellow" - colour = "#fff200" - shadeColour = "#886422" - colourName = "yellow" - color_description = "yellow crayon" - -/obj/item/pen/crayon/green - icon_state = "crayongreen" - colour = "#a8e61d" - shadeColour = "#61840f" - colourName = "green" - color_description = "green crayon" - -/obj/item/pen/crayon/blue - icon_state = "crayonblue" - colour = "#00b7ef" - shadeColour = "#0082a8" - colourName = "blue" - color_description = "blue crayon" - -/obj/item/pen/crayon/purple - icon_state = "crayonpurple" - colour = "#da00ff" - shadeColour = "#810cff" - colourName = "purple" - color_description = "purple crayon" - -/obj/item/pen/crayon/random/Initialize() - ..() - var/crayon_type = pick(subtypesof(/obj/item/pen/crayon) - /obj/item/pen/crayon/random) - new crayon_type(loc) - return INITIALIZE_HINT_QDEL - -/obj/item/pen/crayon/mime - icon_state = "crayonmime" - desc = "A very sad-looking crayon." - colour = "#ffffff" - shadeColour = "#000000" - colourName = "mime" - color_description = "white crayon" - uses = 0 - -/obj/item/pen/crayon/mime/attack_self(mob/user) //inversion - if(colour != "#ffffff" && shadeColour != "#000000") - colour = "#ffffff" - shadeColour = "#000000" - to_chat(user, "You will now draw in white and black with this crayon.") - else - colour = "#000000" - shadeColour = "#ffffff" - to_chat(user, "You will now draw in black and white with this crayon.") - return - -/obj/item/pen/crayon/rainbow - icon_state = "crayonrainbow" - colour = "#fff000" - shadeColour = "#000fff" - colourName = "rainbow" - color_description = "rainbow crayon" - uses = 0 - -/obj/item/pen/crayon/rainbow/attack_self(mob/user) - colour = input(user, "Please select the main colour.", "Crayon colour") as color - shadeColour = input(user, "Please select the shade colour.", "Crayon colour") as color - return - -/obj/item/pen/crayon/afterattack(atom/target, mob/user, proximity) - if(!proximity) return - if(istype(target,/turf/simulated/floor)) - var/drawtype = input("Choose what you'd like to draw.", "Crayon scribbles") in list("graffiti","rune","letter","arrow") - switch(drawtype) - if("letter") - drawtype = input("Choose the letter.", "Crayon scribbles") in list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z") - to_chat(user, "You start drawing a letter on the [target.name].") - if("graffiti") - to_chat(user, "You start drawing graffiti on the [target.name].") - if("rune") - to_chat(user, "You start drawing a rune on the [target.name].") - if("arrow") - drawtype = input("Choose the arrow.", "Crayon scribbles") in list("left", "right", "up", "down") - to_chat(user, "You start drawing an arrow on the [target.name].") - if(instant || do_after(user, 50)) - new /obj/effect/decal/cleanable/crayon(target,colour,shadeColour,drawtype) - to_chat(user, "You finish drawing.") - target.add_fingerprint(user) // Adds their fingerprints to the floor the crayon is drawn on. - if(uses) - uses-- - if(!uses) - to_chat(user, "You used up your crayon!") - qdel(src) - return - -/obj/item/pen/crayon/attack(mob/living/carbon/M, mob/user) - if(istype(M) && M == user) - to_chat(M, "You take a bite of the crayon and swallow it.") - M.adjust_nutrition(1) - M.reagents.add_reagent(/decl/material/liquid/pigment,min(5,uses)/3) - if(uses) - uses -= 5 - if(uses <= 0) - to_chat(M, "You ate your crayon!") - qdel(src) - else - ..() diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index b767b97bc67..689ebef69e8 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -187,6 +187,10 @@ flashlight_range = 2 light_wedge = LIGHT_OMNI +/obj/item/flashlight/pen/Initialize() + set_extension(src, /datum/extension/tool, list(TOOL_PEN = TOOL_QUALITY_DEFAULT), list(TOOL_PEN = list(TOOL_PROP_COLOR = "black", TOOL_PROP_COLOR_NAME = "black"))) + . = ..() + /obj/item/flashlight/maglight name = "maglight" desc = "A very, very heavy duty flashlight." diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index f9ce7525f1a..34d783a481f 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -450,7 +450,7 @@ to_chat(user, "You wound the tape back in.") fix() return - else if(istype(I, /obj/item/pen)) + else if(IS_PEN(I)) if(loc == user) var/new_name = input(user, "What would you like to label the tape?", "Tape labeling") as null|text if(isnull(new_name)) return diff --git a/code/game/objects/items/robot/robot_frame.dm b/code/game/objects/items/robot/robot_frame.dm index febf331f94d..d20bfece890 100644 --- a/code/game/objects/items/robot/robot_frame.dm +++ b/code/game/objects/items/robot/robot_frame.dm @@ -137,7 +137,7 @@ O.Namepick() qdel(src) - else if(istype(W, /obj/item/pen)) + else if(IS_PEN(W)) var/t = sanitize_safe(input(user, "Enter new robot name", src.name, src.created_name), MAX_NAME_LEN) if(t && (in_range(src, user) || loc == user)) created_name = t diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 7a7557b975a..799e184ac30 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -36,7 +36,7 @@ to_chat(user, "It has a blank space for a signature.") /obj/item/card/union/attackby(var/obj/item/thing, var/mob/user) - if(istype(thing, /obj/item/pen)) + if(IS_PEN(thing)) if(signed_by) to_chat(user, SPAN_WARNING("\The [src] has already been signed.")) else diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index 964674d2738..8a73009016d 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -40,7 +40,7 @@ return /obj/item/implantcase/attackby(obj/item/I, mob/user) - if (istype(I, /obj/item/pen)) + if (IS_PEN(I)) var/t = input(user, "What would you like the label to be?", src.name, null) if (user.get_active_hand() != I) return diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index e4aeab96c8b..6c6ae10c4b3 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -98,7 +98,7 @@ overlays = list() //resets list overlays += image(icon,"crayonbox") for(var/obj/item/pen/crayon/crayon in contents) - overlays += image(icon,crayon.colourName) + overlays += image(icon,crayon.stroke_colour_name) //////////// //CIG PACK// diff --git a/code/game/objects/structures/bookcase.dm b/code/game/objects/structures/bookcase.dm index 9dbacb5b045..8ccb753035c 100644 --- a/code/game/objects/structures/bookcase.dm +++ b/code/game/objects/structures/bookcase.dm @@ -28,12 +28,12 @@ var/global/list/station_bookcases = list() b.dropInto(loc) . = ..() -/obj/structure/bookcase/attackby(obj/O, mob/user) +/obj/structure/bookcase/attackby(obj/item/O, mob/user) . = ..() if(!.) if(istype(O, /obj/item/book) && user.unEquip(O, src)) update_icon() - else if(istype(O, /obj/item/pen)) + else if(IS_PEN(O)) var/newname = sanitize_safe(input("What would you like to title this bookshelf?"), MAX_NAME_LEN) if(!newname) return diff --git a/code/game/objects/structures/crematorium.dm b/code/game/objects/structures/crematorium.dm index 1ea52f85486..cd593f72a12 100644 --- a/code/game/objects/structures/crematorium.dm +++ b/code/game/objects/structures/crematorium.dm @@ -14,10 +14,14 @@ var/id_tag +/obj/structure/crematorium/get_mechanics_info() + return "[..()]
    Can be labeled once with a hand labeler." + /obj/structure/crematorium/Initialize(ml, _mat, _reinf_mat) . = ..() connected_tray = new /obj/structure/crematorium_tray(src) connected_tray.connected_crematorium = src + get_or_create_extension(src, /datum/extension/labels/single) /obj/structure/crematorium/Destroy() if(!QDELETED(connected_tray)) @@ -90,23 +94,6 @@ if(Adjacent(user)) return attack_hand(user) -/obj/structure/crematorium/attackby(P, mob/user) - if(istype(P, /obj/item/pen)) - var/new_label = sanitize_safe(input(user, "What would you like the label to be?", capitalize(name), null) as text|null, MAX_NAME_LEN) - - if((!Adjacent(user) || loc == user)) - return - - if(has_extension(src, /datum/extension/labels)) - var/datum/extension/labels/L = get_extension(src, /datum/extension/labels) - if(!L.CanAttachLabel(user, new_label)) - return - - attach_label(user, P, new_label) - return - else - return ..() - /obj/structure/crematorium/relaymove(mob/user) if(user.incapacitated() || locked) return diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index dcddb44a9d6..73c027d0d20 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -125,12 +125,15 @@ /obj/structure/door_assembly/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/pen)) + if(IS_PEN(W)) var/t = sanitize_safe(input(user, "Enter the name for the door.", src.name, src.created_name), MAX_NAME_LEN) - if(!t) return - if(!in_range(src, usr) && src.loc != usr) return + if(!length(t)) + return + if(!CanPhysicallyInteractWith(user, src)) + to_chat(user, SPAN_WARNING("You must stay close to \the [src]!")) + return created_name = t - return + return TRUE if(IS_WELDER(W) && (glass == 1 || !anchored)) var/obj/item/weldingtool/WT = W diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 32954e5304d..225d5231475 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -10,10 +10,14 @@ var/obj/structure/morgue_tray/connected_tray +/obj/structure/morgue/get_mechanics_info() + return "[..()]
    Can be labeled once with a hand labeler." + /obj/structure/morgue/Initialize(ml, _mat, _reinf_mat) . = ..() connected_tray = new /obj/structure/morgue_tray(src) connected_tray.connected_morgue = src + get_or_create_extension(src, /datum/extension/labels/single) /obj/structure/morgue/Destroy() if(!QDELETED(connected_tray)) @@ -80,23 +84,6 @@ if(Adjacent(user)) return attack_hand(user) -/obj/structure/morgue/attackby(P, mob/user) - if(istype(P, /obj/item/pen)) - var/new_label = sanitize_safe(input(user, "What would you like the label to be?", capitalize(name), null) as text|null, MAX_NAME_LEN) - - if((!Adjacent(user) || loc == user)) - return - - if(has_extension(src, /datum/extension/labels)) - var/datum/extension/labels/L = get_extension(src, /datum/extension/labels) - if(!L.CanAttachLabel(user, new_label)) - return - - attach_label(user, P, new_label) - return - else - return ..() - /obj/structure/morgue/relaymove(mob/user) if(user.incapacitated()) return diff --git a/code/game/objects/structures/pit.dm b/code/game/objects/structures/pit.dm index 94b8d7a56cb..c4aa53f548d 100644 --- a/code/game/objects/structures/pit.dm +++ b/code/game/objects/structures/pit.dm @@ -19,7 +19,7 @@ else to_chat(user, SPAN_NOTICE("You stop shoveling.")) return TRUE - + if (!open && istype(W, /obj/item/stack/material) && W.material?.type == /decl/material/solid/wood) if(locate(/obj/structure/gravemarker) in src.loc) to_chat(user, SPAN_WARNING("There's already a grave marker here.")) @@ -64,7 +64,7 @@ for(var/atom/movable/A in T) if(!A.anchored && A != user && A.simulated) A.forceMove(src) - + update_icon() /obj/structure/pit/return_air() @@ -163,7 +163,7 @@ pixel_y = 8 anchored = TRUE material = /decl/material/solid/wood - w_class = ITEM_SIZE_NORMAL + w_class = ITEM_SIZE_NORMAL var/message = "Unknown." /obj/structure/gravemarker/examine(mob/user) @@ -175,9 +175,12 @@ if(W.do_tool_interaction(TOOL_HATCHET, user, src, 3 SECONDS, "hacking away at", "hacking at")) physically_destroyed(FALSE) return TRUE - if(istype(W,/obj/item/pen)) + if(IS_PEN(W)) var/msg = sanitize(input(user, "What should it say?", "Grave marker", message) as text|null) - if(msg) + if(!CanPhysicallyInteract(user)) + to_chat(user, SPAN_WARNING("You must stay close to \the [src]!")) + return + if(msg && W.do_tool_interaction(TOOL_PEN, user, src, 1 SECOND, fuel_expenditure = 1)) message = msg return TRUE . = ..() diff --git a/code/game/objects/structures/skele_stand.dm b/code/game/objects/structures/skele_stand.dm index d8e5ed6e0c6..b792e82a3e4 100644 --- a/code/game/objects/structures/skele_stand.dm +++ b/code/game/objects/structures/skele_stand.dm @@ -54,7 +54,7 @@ to_chat(user,"[gender == MALE ? "He" : "She"] is wearing [english_list(swagnames)].") /obj/structure/skele_stand/attackby(obj/item/W, mob/user) - if(istype(W,/obj/item/pen)) + if(IS_PEN(W)) var/nuname = sanitize(input(user,"What do you want to name this skeleton as?","Skeleton Christening",name) as text|null) if(nuname && CanPhysicallyInteract(user)) SetName(nuname) diff --git a/code/modules/crafting/_crafting_holder.dm b/code/modules/crafting/_crafting_holder.dm index 5af8fd51747..954afe2d52c 100644 --- a/code/modules/crafting/_crafting_holder.dm +++ b/code/modules/crafting/_crafting_holder.dm @@ -44,7 +44,7 @@ /obj/item/crafting_holder/attackby(var/obj/item/W, var/mob/user) - if(istype(W, /obj/item/pen)) + if(IS_PEN(W)) var/new_label = sanitize_safe(input(user, "What do you wish to label this assembly?", "Assembly Labelling", label_name), MAX_NAME_LEN) if(new_label && !user.incapacitated() && W.loc == user && user.Adjacent(src) && !QDELETED(src)) to_chat(user, SPAN_NOTICE("You label \the [src] with '[new_label]'.")) diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index f0748a194a1..46b5c5d77c0 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -234,7 +234,7 @@ var/global/list/card_decks = list() H.throw_at(get_step(target, ismob(target) ? target.dir : target), 10, 1,user) -/obj/item/hand/attackby(obj/O, mob/user) +/obj/item/hand/attackby(obj/item/O, mob/user) if(istype(O,/obj/item/hand)) var/obj/item/hand/H = O @@ -246,7 +246,7 @@ var/global/list/card_decks = list() H.name = "hand of [(H.cards.len)] card\s" return TRUE - if(length(cards) == 1 && istype(O, /obj/item/pen)) + if(length(cards) == 1 && IS_PEN(O)) var/datum/playingcard/P = cards[1] if(lowertext(P.name) != "blank card") to_chat(user, SPAN_WARNING("You cannot write on that card.")) diff --git a/code/modules/goals/definitions/department_clerical.dm b/code/modules/goals/definitions/department_clerical.dm index 70c0df1aa59..95bb7e09846 100644 --- a/code/modules/goals/definitions/department_clerical.dm +++ b/code/modules/goals/definitions/department_clerical.dm @@ -127,7 +127,7 @@ to_chat(user, SPAN_NOTICE("It has been signed by: [english_list(has_signed)].")) /obj/item/paperwork/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/pen)) + if(IS_PEN(W)) if(user.real_name in has_signed) to_chat(user, SPAN_WARNING("You have already signed \the [src].")) return diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 0b7e1599bf4..d690a24f568 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -174,14 +174,17 @@ // Allows service droids to rename paper items. /obj/item/pen/robopen - desc = "A black ink printing attachment with a paper naming mode." - name = "Printing Pen" + name = "printing pen" var/mode = 1 +/obj/item/pen/robopen/make_pen_description() + desc = "\A [stroke_colour_name] [medium_name] printing attachment with a paper naming mode." + /obj/item/pen/robopen/attack_self(mob/user) var/choice = input("Would you like to change colour or mode?") as null|anything in list("Colour","Mode") - if(!choice) return + if(!choice) + return playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) @@ -189,7 +192,8 @@ if("Colour") var/newcolour = input("Which colour would you like to use?") as null|anything in list("black","blue","red","green","yellow") - if(newcolour) colour = newcolour + if(newcolour) + set_medium_color(newcolour, newcolour) if("Mode") if (mode == 1) diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm index 4e9b7b76b6e..e04fafc0fd9 100644 --- a/code/modules/modular_computers/computers/modular_computer/interaction.dm +++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm @@ -46,7 +46,7 @@ to_chat(usr, "You can't reach it.") return - if(istype(stored_pen)) + if(IS_PEN(stored_pen)) to_chat(usr, "You remove [stored_pen] from [src].") usr.put_in_hands(stored_pen) // Silicons will drop it anyway. stored_pen = null @@ -86,7 +86,7 @@ update_verbs() return - if(istype(W, /obj/item/pen) && stores_pen) + if(IS_PEN(W) && (W.w_class <= ITEM_SIZE_TINY) && stores_pen) if(istype(stored_pen)) to_chat(user, "There is already a pen in [src].") return diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index e80b9f36cde..2ec550f4fa9 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -1,28 +1,30 @@ /obj/item/clipboard - name = "clipboard" - desc = "It's a board with a clip used to organise papers." - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "clipboard" - item_state = "clipboard" - throwforce = 0 - w_class = ITEM_SIZE_SMALL - throw_speed = 3 - throw_range = 10 - slot_flags = SLOT_LOWER_BODY + name = "clipboard" + desc = "It's a board with a clip used to organise papers." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "clipboard" + item_state = "clipboard" + throwforce = 0 + w_class = ITEM_SIZE_SMALL + throw_speed = 3 + throw_range = 10 + slot_flags = SLOT_LOWER_BODY applies_material_name = FALSE - material = /decl/material/solid/wood - drop_sound = 'sound/foley/tooldrop5.ogg' - pickup_sound = 'sound/foley/paperpickup2.ogg' + material = /decl/material/solid/wood + drop_sound = 'sound/foley/tooldrop5.ogg' + pickup_sound = 'sound/foley/paperpickup2.ogg' - var/obj/item/pen/haspen //The stored pen. - var/obj/item/toppaper //The topmost piece of paper. + var/obj/item/stored_pen //The stored pen. + var/list/papers + var/tmp/max_papers = 50 /obj/item/clipboard/Initialize() . = ..() update_icon() - if(material) - desc = initial(desc) - desc += " It's made of [material.use_name]." + +/obj/item/clipboard/Destroy() + QDEL_NULL_LIST(papers) + return ..() /obj/item/clipboard/handle_mouse_drop(atom/over, mob/user) if(ishuman(user) && istype(over, /obj/screen/inventory)) @@ -33,156 +35,182 @@ return TRUE . = ..() +/obj/item/clipboard/examine(mob/user, distance, infix, suffix) + . = ..() + if(stored_pen) + to_chat(user, "It's holding \a [stored_pen].") + if(!LAZYLEN(papers)) + to_chat(user, "It contains [length(papers)] / [max_papers] paper\s.") + else + to_chat(user, "It has room for [max_papers] paper\s.") + +/obj/item/clipboard/proc/top_paper() + return LAZYACCESS(papers, 1) + +/obj/item/clipboard/proc/push_paper(var/obj/item/P) + LAZYINSERT(papers, P, 1) + +/obj/item/clipboard/proc/pop_paper() + . = top_paper() + LAZYREMOVE(papers, 1) + /obj/item/clipboard/on_update_icon() ..() - if(toppaper) - overlays += overlay_image(toppaper.icon, toppaper.icon_state, flags=RESET_COLOR) - overlays += toppaper.overlays - if(haspen) + var/obj/item/top_paper = top_paper() + if(top_paper) + overlays += overlay_image(top_paper.icon, top_paper.icon_state, flags=RESET_COLOR) + overlays += top_paper.overlays + if(stored_pen) overlays += overlay_image(icon, "clipboard_pen", flags=RESET_COLOR) overlays += overlay_image(icon, "clipboard_over", flags=RESET_COLOR) return /obj/item/clipboard/attackby(obj/item/W, mob/user) - + var/obj/item/top_paper = top_paper() if(istype(W, /obj/item/paper) || istype(W, /obj/item/photo)) if(!user.unEquip(W, src)) return - if(istype(W, /obj/item/paper)) - toppaper = W - to_chat(user, "You clip the [W] onto \the [src].") + push_paper(W) + to_chat(user, SPAN_NOTICE("You clip the [W] onto \the [src].")) update_icon() + return TRUE - else if(istype(toppaper) && istype(W, /obj/item/pen)) - toppaper.attackby(W, usr) + else if(top_paper) + top_paper.attackby(W, user) update_icon() + return TRUE - return + return ..() /obj/item/clipboard/attack_self(mob/user) + if(CanPhysicallyInteractWith(user, src)) + interact(user) + return TRUE + +/obj/item/clipboard/interact(mob/user) var/dat = "Clipboard" - if(haspen) + if(stored_pen) dat += "
    Remove Pen

    " else dat += "Add Pen

    " - //The topmost paper. I don't think there's any way to organise contents in byond, so this is what we're stuck with. -Pete - if(toppaper) - var/obj/item/paper/P = toppaper - dat += "Write Remove Rename - [P.name]

    " - - for(var/obj/item/paper/P in src) - if(P==toppaper) - continue - dat += "Remove Rename - [P.name]
    " - for(var/obj/item/photo/Ph in src) - dat += "Remove Rename - [Ph.name]
    " + for(var/i = 1 to length(papers)) + var/obj/item/P = papers[i] + dat += "[P.name] -
    " + if(i == 1) + dat += "Write " + dat += "Remove Rename

    " show_browser(user, dat, "window=clipboard") onclose(user, "clipboard") add_fingerprint(usr) return -/obj/item/clipboard/Topic(href, href_list) - ..() - if((usr.stat || usr.restrained())) - return - - if(src.loc == usr) - - if(href_list["pen"]) - if(istype(haspen) && (haspen.loc == src)) - usr.put_in_hands_or_store_or_drop(haspen) - haspen = null - - else if(href_list["addpen"]) - if(!haspen) - var/obj/item/pen/W = usr.get_active_hand() - if(istype(W, /obj/item/pen)) - if(!usr.unEquip(W, src)) - return - haspen = W - to_chat(usr, "You slot the pen into \the [src].") - - else if(href_list["write"]) - var/obj/item/P = locate(href_list["write"]) - - if(P && (P.loc == src) && istype(P, /obj/item/paper) && (P == toppaper) ) - - var/obj/item/I = usr.get_active_hand() - - if(istype(I, /obj/item/pen)) - - P.attackby(I, usr) - - else if(href_list["remove"]) - var/obj/item/P = locate(href_list["remove"]) - - if(P && (P.loc == src) && (istype(P, /obj/item/paper) || istype(P, /obj/item/photo)) ) - usr.put_in_hands_or_store_or_drop(P) - if(P == toppaper) - toppaper = null - var/obj/item/paper/newtop = locate(/obj/item/paper) in src - if(newtop && (newtop != P)) - toppaper = newtop - else - toppaper = null - - else if(href_list["rename"]) - var/obj/item/O = locate(href_list["rename"]) - - if(O && (O.loc == src)) - if(istype(O, /obj/item/paper)) - var/obj/item/paper/to_rename = O - to_rename.rename() - - else if(istype(O, /obj/item/photo)) - var/obj/item/photo/to_rename = O - to_rename.rename() - - else if(href_list["read"]) - var/obj/item/paper/P = locate(href_list["read"]) - - if(P && (P.loc == src) && istype(P, /obj/item/paper) ) - - if(!(istype(usr, /mob/living/carbon/human) || isghost(usr) || istype(usr, /mob/living/silicon))) - show_browser(usr, "[P.name][stars(P.info)][P.stamps]", "window=[P.name]") - onclose(usr, "[P.name]") - else - show_browser(usr, "[P.name][P.info][P.stamps]", "window=[P.name]") - onclose(usr, "[P.name]") - - else if(href_list["look"]) - var/obj/item/photo/P = locate(href_list["look"]) - if(P && (P.loc == src) && istype(P, /obj/item/photo) ) - P.show(usr) - - else if(href_list["top"]) // currently unused - var/obj/item/P = locate(href_list["top"]) - if(P && (P.loc == src) && istype(P, /obj/item/paper) ) - toppaper = P - to_chat(usr, "You move [P.name] to the top.") - - //Update everything - attack_self(usr) +/**Tries to find a pen in the user's held items. */ +/obj/item/clipboard/proc/get_user_pen(var/mob/user) + var/obj/item/I = user.get_active_hand() + if(I != src && IS_PEN(I)) + return I + for(I in user.get_held_items()) //Its pretty likely the current held thing is the clipdboard + if(IS_PEN(I)) + return I //In that case pick the first pen item we're holding + +/obj/item/clipboard/proc/add_pen(var/obj/item/I, var/mob/user) + if(!stored_pen && I.w_class <= ITEM_SIZE_TINY && IS_PEN(I) && user.unEquip(I, src)) + stored_pen = I + to_chat(user, SPAN_NOTICE("You slot \the [I] into \the [src].")) + return TRUE + else if(stored_pen) + to_chat(user, SPAN_WARNING("There is already \a [stored_pen] in \the [src].")) + else if(I.w_class > ITEM_SIZE_TINY) + to_chat(user, SPAN_WARNING("\The [I] is too big to fit in \the [src].")) + +/obj/item/clipboard/proc/remove_pen(var/mob/user) + if(stored_pen && user.put_in_hands(stored_pen)) + to_chat(user, SPAN_NOTICE("You pull your trusty [stored_pen] from your [src].")) + . = stored_pen + stored_pen = null + return . + else if(!stored_pen) + to_chat(user, SPAN_WARNING("There is no pen in \the [src].")) + else + to_chat(user, SPAN_WARNING("Your hands are full.")) + +/obj/item/clipboard/OnTopic(mob/user, href_list, datum/topic_state/state) + . = ..() + var/obj/item/tpaper = top_paper() + + if(href_list["pen"] && remove_pen(user)) + . = TOPIC_HANDLED | TOPIC_REFRESH + + else if(href_list["addpen"] && add_pen(get_user_pen(user), user)) + . = TOPIC_HANDLED | TOPIC_REFRESH + + else if(href_list["write"]) + if(tpaper) + var/obj/item/I = get_user_pen(user) + //We can also use the stored pen if we have one and a free hand + if(!I && IS_PEN(stored_pen)) + I = remove_pen(user) + else if(!I) + to_chat(user, SPAN_WARNING("You don't have a pen!")) + + if(I) + tpaper.attackby(I, user) + . = TOPIC_HANDLED | TOPIC_REFRESH + else + . = TOPIC_NOACTION + + else if(href_list["remove"]) + var/obj/item/P = locate(href_list["remove"]) + if(P && user.put_in_hands(P)) + papers.Remove(P) + . = TOPIC_HANDLED | TOPIC_REFRESH + + else if(href_list["rename"]) + var/obj/item/O = locate(href_list["rename"]) + if(istype(O, /obj/item/paper)) + var/obj/item/paper/to_rename = O + to_rename.rename() + . = TOPIC_HANDLED | TOPIC_REFRESH + + else if(istype(O, /obj/item/photo)) + var/obj/item/photo/to_rename = O + to_rename.rename() + . = TOPIC_HANDLED | TOPIC_REFRESH + + else + . = TOPIC_NOACTION + + else if(href_list["examine"]) + var/obj/item/P = locate(href_list["examine"]) + + if(istype(P, /obj/item/paper)) + var/obj/item/paper/PP = P + PP.show_content(user) + . = TOPIC_HANDLED + + else if(istype(P, /obj/item/photo)) + var/obj/item/photo/PP = P + PP.show(user) + . = TOPIC_HANDLED + + //Update everything + if(. & TOPIC_REFRESH) + attack_self(user) update_icon() - return /obj/item/clipboard/ebony material = /decl/material/solid/wood/ebony /obj/item/clipboard/steel material = /decl/material/solid/metal/steel - material = /decl/material/solid/metal/steel /obj/item/clipboard/aluminium material = /decl/material/solid/metal/aluminium - material = /decl/material/solid/metal/aluminium /obj/item/clipboard/glass material = /decl/material/solid/glass - material = /decl/material/solid/glass /obj/item/clipboard/plastic material = /decl/material/solid/plastic - material = /decl/material/solid/plastic \ No newline at end of file diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index aa0c0e51a54..b796549371a 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -35,7 +35,7 @@ return to_chat(user, "You put the [W] into \the [src].") update_icon() - else if(istype(W, /obj/item/pen)) + else if(IS_PEN(W)) var/n_name = sanitize_safe(input(usr, "What would you like to label the folder?", "Folder Labelling", null) as text, MAX_NAME_LEN) if((loc == usr && usr.stat == 0)) SetName("folder[(n_name ? text("- '[n_name]'") : null)]") diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 6210655fa26..160fe4068e9 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -48,7 +48,7 @@ if(!simulated) return var/datum/extension/labels/L = get_or_create_extension(src, /datum/extension/labels) - L.AttachLabel(user, label_text) + return L.AttachLabel(user, label_text) /obj/item/hand_labeler/attack_self(mob/user) mode = !mode diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index de0e0114ed4..c3eed3edf98 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -212,8 +212,9 @@ update_icon() /obj/item/paper/proc/get_signature(var/obj/item/pen/P, mob/user) - if(P && istype(P, /obj/item/pen)) - return P.get_signature(user) + if(P && IS_PEN(P)) + var/decl/tool_archetype/pen/parch = GET_DECL(TOOL_PEN) + return parch.get_signature(user, P) return (user && user.real_name) ? user.real_name : "Anonymous" /obj/item/paper/proc/parsepencode(t, obj/item/pen/P, mob/user, iscrayon, isfancy) @@ -236,12 +237,13 @@ t = replacetext(t, "\[cell\]", "") t = replacetext(t, "\[logo\]", "") + var/pen_color = P? P.get_tool_property(TOOL_PEN, TOOL_PROP_COLOR) : "black" if(iscrayon) - t = "[t]" + t = "[t]" else if(isfancy) - t = "[t]" + t = "[t]" else - t = "[t]" + t = "[t]" t = pencode2html(t) @@ -296,7 +298,7 @@ var/obj/item/I = usr.get_active_hand() // Check to see if he still got that darn pen, also check what type of pen var/iscrayon = 0 var/isfancy = 0 - if(!istype(I, /obj/item/pen)) + if(!IS_PEN(I)) var/obj/item/rig/r = usr.get_equipped_item(slot_back_str) if(istype(r)) var/obj/item/rig_module/device/pen/m = locate(/obj/item/rig_module/device/pen) in r.installed_modules @@ -307,15 +309,12 @@ else return - var/obj/item/pen/P = I - if(!P.active) - P.toggle() - - if(P.iscrayon) - iscrayon = TRUE - - if(P.isfancy) - isfancy = TRUE + var/pen_flags = I.get_tool_property(TOOL_PEN, TOOL_PROP_PEN_FLAG) + if(!(pen_flags & PEN_FLAG_ACTIVE)) + var/decl/tool_archetype/pen/parch = GET_DECL(TOOL_PEN) + parch.toggle_active(usr, I) + iscrayon = pen_flags & PEN_FLAG_CRAYON + isfancy = pen_flags & PEN_FLAG_FANCY var/t = sanitize(input("Enter what you want to write:", "Write", null, null) as message, free_space, extra = 0, trim = 0) @@ -393,7 +392,7 @@ B.pages.Add(P) B.update_icon() - else if(istype(P, /obj/item/pen)) + else if(IS_PEN(P)) if(icon_state == "scrap") to_chat(usr, "\The [src] is too crumpled to write on.") return diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index e27719a8d35..e42f79b22d4 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -48,7 +48,7 @@ else if(istype(W, /obj/item/ducttape)) return 0 - if(istype(W, /obj/item/pen)) + if(IS_PEN(W)) show_browser(user, "", "window=[name]") //Closes the dialog var/obj/P = pages[page] P.attackby(W, user) diff --git a/code/modules/paperwork/paper_sticky.dm b/code/modules/paperwork/paper_sticky.dm index ea745dc6064..a4b8c19311e 100644 --- a/code/modules/paperwork/paper_sticky.dm +++ b/code/modules/paperwork/paper_sticky.dm @@ -32,7 +32,7 @@ icon_state = "[icon_state]_writing" /obj/item/sticky_pad/attackby(var/obj/item/thing, var/mob/user) - if(istype(thing, /obj/item/pen)) + if(IS_PEN(thing)) if(jobban_isbanned(user, "Graffiti")) to_chat(user, SPAN_WARNING("You are banned from leaving persistent information across rounds.")) diff --git a/code/modules/paperwork/pen/chameleon_pen.dm b/code/modules/paperwork/pen/chameleon_pen.dm index c773da9b4b0..3bd6e1cbd44 100644 --- a/code/modules/paperwork/pen/chameleon_pen.dm +++ b/code/modules/paperwork/pen/chameleon_pen.dm @@ -1,5 +1,6 @@ -/obj/item/pen/chameleon - var/signature = "" +/obj/item/pen/chameleon/Initialize(ml, material_key) + . = ..() + set_tool_property(TOOL_PEN, TOOL_PROP_PEN_SIG, "Anonymous") //Always default to anonymous for this pen, since it should never uses the user's real_name /obj/item/pen/chameleon/attack_self(mob/user) /* @@ -13,13 +14,8 @@ if(new_signature) signature = new_signature */ - signature = sanitize(input("Enter new signature. Leave blank for 'Anonymous'", "New Signature", signature)) - -/obj/item/pen/proc/get_signature(var/mob/user) - return (user && user.real_name) ? user.real_name : "Anonymous" - -/obj/item/pen/chameleon/get_signature(var/mob/user) - return signature ? signature : "Anonymous" + var/signature = sanitize(input("Enter new signature. Leave blank for 'Anonymous'", "New Signature", get_tool_property(TOOL_PEN, TOOL_PROP_PEN_SIG))) + set_tool_property(TOOL_PEN, TOOL_PROP_PEN_SIG, signature ? signature : "Anonymous") /obj/item/pen/chameleon/verb/set_colour() set name = "Change Pen Colour" @@ -31,30 +27,22 @@ if(selected_type) switch(selected_type) if("Yellow") - colour = COLOR_YELLOW - color_description = "yellow ink" + set_medium_color(COLOR_YELLOW, "yellow") if("Green") - colour = COLOR_LIME - color_description = "green ink" + set_medium_color(COLOR_LIME, "green") if("Pink") - colour = COLOR_PINK - color_description = "pink ink" + set_medium_color(COLOR_PINK, "pink") if("Blue") - colour = COLOR_BLUE - color_description = "blue ink" + set_medium_color(COLOR_BLUE, "blue") if("Orange") - colour = COLOR_ORANGE - color_description = "orange ink" + set_medium_color(COLOR_ORANGE, "orange") if("Cyan") - colour = COLOR_CYAN - color_description = "cyan ink" + set_medium_color(COLOR_CYAN, "cyan") if("Red") - colour = COLOR_RED - color_description = "red ink" + set_medium_color(COLOR_RED, "red") if("Invisible") - colour = COLOR_WHITE - color_description = "transluscent ink" + set_medium_color(COLOR_WHITE, "transluscent") else - colour = COLOR_BLACK - color_description = "black ink" - to_chat(usr, "You select the [lowertext(selected_type)] ink container.") \ No newline at end of file + set_medium_color(COLOR_BLACK, "black") + + to_chat(usr, SPAN_INFO("You select the [lowertext(selected_type)] [medium_name] container.")) \ No newline at end of file diff --git a/code/modules/paperwork/pen/crayon.dm b/code/modules/paperwork/pen/crayon.dm index c70a5bc3876..ba04f67cc31 100644 --- a/code/modules/paperwork/pen/crayon.dm +++ b/code/modules/paperwork/pen/crayon.dm @@ -1,19 +1,135 @@ /obj/item/pen/crayon - name = "crayon" - desc = "A colourful crayon. Please refrain from eating it or putting it in your nose." - icon = 'icons/obj/items/crayons.dmi' - icon_state = "crayonred" - w_class = ITEM_SIZE_TINY - attack_verb = list("attacked", "coloured") - colour = "#ff0000" //RGB - color_description = "red crayon" - iscrayon = TRUE - - var/shadeColour = "#220000" //RGB - var/uses = 30 //0 for unlimited uses - var/instant = 0 - var/colourName = "red" //for updateIcon purposes - -/obj/item/pen/crayon/Initialize() - name = "[colourName] crayon" + name = "crayon" + icon = 'icons/obj/items/crayons.dmi' + icon_state = "crayonred" + w_class = ITEM_SIZE_TINY + attack_verb = list("attacked", "coloured", "crayon'd") + stroke_colour = "#ff0000" //RGB + stroke_colour_name = "red" + medium_name = "crayon" + pen_flag = PEN_FLAG_ACTIVE | PEN_FLAG_CRAYON | PEN_FLAG_DEL_EMPTY + pen_quality = TOOL_QUALITY_BAD //Writing with those things is awkward + max_uses = 30 + var/shade_colour = "#220000" //RGB + +/obj/item/pen/crayon/make_pen_description() + desc = "A colourful [stroke_colour_name] [istype(material)?"[material.name] ":null][medium_name]. Please refrain from eating it or putting it in your nose." + +/obj/item/pen/crayon/set_medium_color(_color, _color_name, var/_shade_colour) + . = ..(_color, _color_name) + shade_colour = _shade_colour + set_tool_property(TOOL_PEN, TOOL_PROP_PEN_SHADE_COLOR, shade_colour) + +/obj/item/pen/crayon/afterattack(turf/target, mob/user, proximity) + if(!proximity) + return + + if(istype(target) && target.is_floor()) + var/drawtype = input("Choose what you'd like to draw.", "Crayon scribbles") in list("graffiti","rune","letter","arrow") + var/draw_message = "drawing" + switch(drawtype) + if("letter") + drawtype = input("Choose the letter.", "Crayon scribbles") in list(global.alphabet) + draw_message = "drawing a letter" + if("graffiti") + draw_message = "drawing graffiti" + if("rune") + draw_message = "drawing a rune" + if("arrow") + drawtype = input("Choose the arrow.", "Crayon scribbles") in list("left", "right", "up", "down") + draw_message = "drawing an arrow" + + if(do_tool_interaction(TOOL_PEN, user, target, 5 SECONDS, draw_message, "drawing on", fuel_expenditure = 1)) + new /obj/effect/decal/cleanable/crayon(target, stroke_colour, shade_colour, drawtype) + target.add_fingerprint(user) // Adds their fingerprints to the floor the crayon is drawn on. + return + +/obj/item/pen/crayon/attack(mob/living/M, mob/user) + if(istype(M) && M == user) + var/decl/tool_archetype/pen/parch = GET_DECL(TOOL_PEN) + playsound(src, 'sound/weapons/bite.ogg') + to_chat(M, SPAN_NOTICE("You take a bite of the crayon and swallow it.")) + M.adjust_nutrition(1) + var/uses = get_tool_property(TOOL_PEN, TOOL_PROP_USES) + M.reagents.add_reagent(/decl/material/liquid/pigment, min(5,uses)/3) + if(parch.decrement_uses(user, src, 5) <= 0) + to_chat(M, SPAN_WARNING("You ate your crayon!")) + return . = ..() + +/obj/item/pen/crayon/red + icon_state = "crayonred" + stroke_colour = "#da0000" + shade_colour = "#810c0c" + stroke_colour_name = "red" + +/obj/item/pen/crayon/orange + icon_state = "crayonorange" + stroke_colour = "#ff9300" + stroke_colour_name = "orange" + shade_colour = "#a55403" + +/obj/item/pen/crayon/yellow + icon_state = "crayonyellow" + stroke_colour = "#fff200" + shade_colour = "#886422" + stroke_colour_name = "yellow" + +/obj/item/pen/crayon/green + icon_state = "crayongreen" + stroke_colour = "#a8e61d" + shade_colour = "#61840f" + stroke_colour_name = "green" + +/obj/item/pen/crayon/blue + icon_state = "crayonblue" + stroke_colour = "#00b7ef" + shade_colour = "#0082a8" + stroke_colour_name = "blue" + +/obj/item/pen/crayon/purple + icon_state = "crayonpurple" + stroke_colour = "#da00ff" + shade_colour = "#810cff" + stroke_colour_name = "purple" + +/obj/item/pen/crayon/mime + icon_state = "crayonmime" + stroke_colour = "#ffffff" + shade_colour = "#000000" + stroke_colour_name = "mime" + max_uses = -1 //Infinite + +/obj/item/pen/crayon/mime/make_pen_description() + desc = "A very sad-looking crayon." + +/obj/item/pen/crayon/mime/attack_self(mob/user) //inversion + if(stroke_colour != "#ffffff" && shade_colour != "#000000") + set_medium_color("#ffffff", stroke_colour_name, "#000000") + to_chat(user, "You will now draw in white and black with this crayon.") + else + set_medium_color("#000000", stroke_colour_name, "#ffffff") + to_chat(user, "You will now draw in black and white with this crayon.") + return + +/obj/item/pen/crayon/rainbow + icon_state = "crayonrainbow" + stroke_colour = "#fff000" + shade_colour = "#000fff" + stroke_colour_name = "rainbow" + max_uses = -1 + +/obj/item/pen/crayon/rainbow/make_pen_description() + desc = "A very colourful [istype(material)?"[material.name] ":null][medium_name]. Please refrain from eating it or putting it in your nose." + +/obj/item/pen/crayon/rainbow/attack_self(mob/user) + stroke_colour = input(user, "Please select the main colour.", "Crayon colour") as color + shade_colour = input(user, "Please select the shade colour.", "Crayon colour") as color + set_medium_color(stroke_colour, stroke_colour_name, shade_colour) + return + +/obj/item/pen/crayon/random/Initialize() + ..() + var/crayon_type = pick(subtypesof(/obj/item/pen/crayon) - /obj/item/pen/crayon/random) + new crayon_type(loc) + return INITIALIZE_HINT_QDEL diff --git a/code/modules/paperwork/pen/fancy.dm b/code/modules/paperwork/pen/fancy.dm index 8723b47e503..d57b4409ba3 100644 --- a/code/modules/paperwork/pen/fancy.dm +++ b/code/modules/paperwork/pen/fancy.dm @@ -1,14 +1,22 @@ /obj/item/pen/fancy - name = "fancy pen" - desc = "A high quality traditional fountain pen with an internal reservoir and an extra fine gold-platinum nib. Guaranteed never to leak." - icon = 'icons/obj/items/pens/pen_fancy.dmi' - throwforce = 1 //pointy - colour = "#1c1713" //dark ashy brownish - material = /decl/material/solid/metal/steel - isfancy = TRUE + name = "fountain pen" + icon = 'icons/obj/items/pens/pen_fancy.dmi' + sharp = 1 //pointy + stroke_colour = "#1c1713" //dark ashy brownish + stroke_colour_name = "dark ashy brownish" + material = /decl/material/solid/metal/steel + pen_flag = PEN_FLAG_ACTIVE | PEN_FLAG_FANCY + pen_quality = TOOL_QUALITY_GOOD + +/obj/item/pen/fancy/make_pen_description() + desc = "A high quality [istype(material)?"[material.name] ":null]traditional [stroke_colour_name] [medium_name] fountain pen with an internal reservoir and an extra fine gold-platinum nib. Guaranteed never to leak." /obj/item/pen/fancy/quill - name = "dire goose quill" + name = "dire goose quill" + icon = 'icons/obj/items/pens/pen_quill.dmi' + sharp = 0 + material = /decl/material/solid/skin/feathers + pen_quality = TOOL_QUALITY_BEST + +/obj/item/pen/fancy/quill/make_pen_description() desc = "A quill fashioned from a feather of the dire goose makes an excellent writing instrument, as well as a valuable trophy." - matter = null - icon = 'icons/obj/items/pens/pen_quill.dmi' diff --git a/code/modules/paperwork/pen/multi_pen.dm b/code/modules/paperwork/pen/multi_pen.dm index 8a64bc13861..f2c7cb636e6 100644 --- a/code/modules/paperwork/pen/multi_pen.dm +++ b/code/modules/paperwork/pen/multi_pen.dm @@ -1,20 +1,31 @@ /obj/item/pen/multi - name = "multicoloured pen" - desc = "It's a pen with multiple colors of ink!" - var/selectedColor = 1 - var/colors = list("black","blue","red","green") - var/color_descriptions = list("black ink", "blue ink", "red ink", "green ink") - var/color_icons = list( + name = "multicoloured pen" + desc = "It's a pen with multiple colors of ink!" + pen_quality = TOOL_QUALITY_MEDIOCRE + var/colour_idx = 1 + var/stroke_colours = list("black", "blue", "red", "green") + var/stroke_colour_names = list("black", "blue", "red", "green") + var/colour_icons = list( 'icons/obj/items/pens/pen.dmi', 'icons/obj/items/pens/pen_blue.dmi', 'icons/obj/items/pens/pen_red.dmi', 'icons/obj/items/pens/pen_green.dmi', ) +/obj/item/pen/multi/Initialize(ml, material_key) + . = ..() + change_colour(colour_idx) + +/obj/item/pen/multi/make_pen_description() + desc = "It's [istype(material)?"[ADD_ARTICLE(material.name)]":"a"] pen with multiple colors of ink! It's currently set to [stroke_colour_name] [medium_name]." + +/obj/item/pen/multi/proc/change_colour(var/new_idx) + colour_idx = new_idx + if(colour_idx > length(stroke_colours)) + colour_idx = 1 + icon = colour_icons[colour_idx] + set_medium_color(stroke_colours[colour_idx], stroke_colour_names[colour_idx]) + /obj/item/pen/multi/attack_self(mob/user) - if(++selectedColor > length(colors)) - selectedColor = 1 - colour = colors[selectedColor] - color_description = color_descriptions[selectedColor] - icon = color_icons[selectedColor] - to_chat(user, "Changed color to '[colour].'") + change_colour((++colour_idx)) + to_chat(user, SPAN_NOTICE("Changed color to '[stroke_colour_name] [medium_name].'")) diff --git a/code/modules/paperwork/pen/pen.dm b/code/modules/paperwork/pen/pen.dm index ff280211223..0085a6b9a4f 100644 --- a/code/modules/paperwork/pen/pen.dm +++ b/code/modules/paperwork/pen/pen.dm @@ -1,49 +1,35 @@ /obj/item/pen - desc = "It's a normal black ink pen." - name = "pen" - icon = 'icons/obj/items/pens/pen.dmi' - icon_state = ICON_STATE_WORLD - slot_flags = SLOT_LOWER_BODY | SLOT_EARS - throwforce = 0 - w_class = ITEM_SIZE_TINY - throw_speed = 7 - throw_range = 15 - material = /decl/material/solid/plastic - - var/colour = "black" //what colour the ink is! - var/color_description = "black ink" - var/active = TRUE - var/iscrayon = FALSE - var/isfancy = FALSE + name = "pen" + desc = "" + icon = 'icons/obj/items/pens/pen.dmi' + icon_state = ICON_STATE_WORLD + slot_flags = SLOT_LOWER_BODY | SLOT_EARS + w_class = ITEM_SIZE_TINY + throwforce = 0 + throw_speed = 7 + throw_range = 15 + material = /decl/material/solid/plastic + var/pen_flag = PEN_FLAG_ACTIVE //Properties/state of the pen used. + var/stroke_colour = "black" //What colour the ink is! Can be hexadecimal colour or a colour name string. + var/stroke_colour_name = "black" //Human readable name of the stroke colour. Used in text strings, and to identify the nearest colour to the stroke colour. + var/medium_name = "ink" //Whatever the pen uses to leave its mark. Used in text strings. + var/max_uses = -1 //-1 for unlimited uses. + var/pen_quality = TOOL_QUALITY_DEFAULT //What will be set as tool quality for the pen /obj/item/pen/Initialize(ml, material_key) . = ..() - set_extension(src, /datum/extension/tool, list(TOOL_DRILL = TOOL_QUALITY_WORST)) - -/obj/item/pen/blue - name = "blue pen" - desc = "It's a normal blue ink pen." - icon = 'icons/obj/items/pens/pen_blue.dmi' - colour = "blue" - color_description = "blue ink" - -/obj/item/pen/red - name = "red pen" - desc = "It's a normal red ink pen." - icon = 'icons/obj/items/pens/pen_red.dmi' - colour = "red" - color_description = "red ink" + set_extension(src, /datum/extension/tool, + list( + TOOL_DRILL = TOOL_QUALITY_WORST, + TOOL_PEN = pen_quality), -/obj/item/pen/green - name = "green pen" - desc = "It's a normal green ink pen." - icon = 'icons/obj/items/pens/pen_green.dmi' - colour = "green" - -/obj/item/pen/invisible - desc = "It's an invisble pen marker." - colour = "white" - color_description = "transluscent ink" + list( + TOOL_PEN = list( + TOOL_PROP_COLOR_NAME = stroke_colour_name, + TOOL_PROP_COLOR = stroke_colour, + TOOL_PROP_PEN_FLAG = pen_flag, + TOOL_PROP_USES = max_uses))) + make_pen_description() /obj/item/pen/attack(atom/A, mob/user, target_zone) if(ismob(A)) @@ -52,13 +38,53 @@ var/mob/living/carbon/human/H = M var/obj/item/organ/external/head/head = H.get_organ(BP_HEAD, /obj/item/organ/external/head) if(istype(head)) - head.write_on(user, color_description) + head.write_on(user, "[stroke_colour_name] [medium_name]") else to_chat(user, SPAN_WARNING("You stab [M] with \the [src].")) admin_attack_log(user, M, "Stabbed using \a [src]", "Was stabbed with \a [src]", "used \a [src] to stab") + else if(istype(A, /obj/item/organ/external/head)) var/obj/item/organ/external/head/head = A - head.write_on(user, color_description) + head.write_on(user, "[stroke_colour_name] [medium_name]") /obj/item/pen/proc/toggle() - return \ No newline at end of file + if(pen_flag & PEN_FLAG_ACTIVE) + pen_flag &= ~PEN_FLAG_ACTIVE + else + pen_flag |= PEN_FLAG_ACTIVE + playsound(src, 'sound/items/penclick.ogg', 5, 0, -4) + set_tool_property(TOOL_PEN, TOOL_PROP_PEN_FLAG, pen_flag) + update_icon() + +/obj/item/pen/proc/set_medium_color(var/_color, var/_color_name) + stroke_colour = _color + stroke_colour_name = _color_name + set_tool_property(TOOL_PEN, TOOL_PROP_COLOR, stroke_colour) + set_tool_property(TOOL_PEN, TOOL_PROP_COLOR_NAME, stroke_colour_name) + make_pen_description() + +/obj/item/pen/proc/make_pen_description() + desc = "Its [ADD_ARTICLE(stroke_colour_name)] [medium_name] [istype(material)? material.name : ""] pen." + +/obj/item/pen/blue + name = "blue pen" + icon = 'icons/obj/items/pens/pen_blue.dmi' + stroke_colour = "blue" + stroke_colour_name = "blue" + +/obj/item/pen/red + name = "red pen" + icon = 'icons/obj/items/pens/pen_red.dmi' + stroke_colour = "red" + stroke_colour_name = "red" + +/obj/item/pen/green + name = "green pen" + icon = 'icons/obj/items/pens/pen_green.dmi' + stroke_colour = "green" + stroke_colour_name = "green" + +/obj/item/pen/invisible + name = "pen" + stroke_colour = "white" + stroke_colour_name = "transluscent" diff --git a/code/modules/paperwork/pen/reagent_pen.dm b/code/modules/paperwork/pen/reagent_pen.dm index a762e25f4e9..1a926d1e32f 100644 --- a/code/modules/paperwork/pen/reagent_pen.dm +++ b/code/modules/paperwork/pen/reagent_pen.dm @@ -1,6 +1,8 @@ /obj/item/pen/reagent - atom_flags = ATOM_FLAG_OPEN_CONTAINER + atom_flags = ATOM_FLAG_OPEN_CONTAINER origin_tech = "{'materials':2,'esoteric':5}" + sharp = 1 + pen_quality = TOOL_QUALITY_MEDIOCRE /obj/item/pen/reagent/Initialize() . = ..() @@ -32,9 +34,11 @@ * Sleepy Pens */ /obj/item/pen/reagent/sleepy - desc = "It's a black ink pen with a sharp point and a carefully engraved \"Waffle Co.\"." origin_tech = "{'materials':2,'esoteric':5}" +/obj/item/pen/reagent/sleepy/make_pen_description() + desc = "It's \a [stroke_colour_name] [medium_name] pen with a sharp point and a carefully engraved \"Waffle Co.\"." + /obj/item/pen/reagent/sleepy/Initialize() . = ..() reagents.add_reagent(/decl/material/liquid/paralytics, 15) diff --git a/code/modules/paperwork/pen/retractable_pen.dm b/code/modules/paperwork/pen/retractable_pen.dm index 9af09e7ff62..c96f0c08918 100644 --- a/code/modules/paperwork/pen/retractable_pen.dm +++ b/code/modules/paperwork/pen/retractable_pen.dm @@ -1,41 +1,36 @@ /obj/item/pen/retractable - desc = "It's a retractable pen." - active = FALSE - icon = 'icons/obj/items/pens/pen_retractable.dmi' + desc = "It's a retractable pen." + icon = 'icons/obj/items/pens/pen_retractable.dmi' + pen_flag = PEN_FLAG_TOGGLEABLE /obj/item/pen/retractable/blue - colour = "blue" - color_description = "blue ink" + stroke_colour = "blue" + stroke_colour_name = "blue" icon = 'icons/obj/items/pens/pen_retractable_blue.dmi' /obj/item/pen/retractable/red - colour = "red" - color_description = "red ink" + stroke_colour = "red" + stroke_colour_name = "red" icon = 'icons/obj/items/pens/pen_retractable_red.dmi' /obj/item/pen/retractable/green - colour = "green" - color_description = "green ink" + stroke_colour = "green" + stroke_colour_name = "green" icon = 'icons/obj/items/pens/pen_retractable_green.dmi' /obj/item/pen/retractable/Initialize() . = ..() - desc = "It's a retractable [color_description] pen." + desc = "It's a retractable [stroke_colour_name] [medium_name] pen." /obj/item/pen/retractable/on_update_icon() icon_state = get_world_inventory_state() - if(active) + if(pen_flag & PEN_FLAG_ACTIVE) icon_state = "[icon_state]-on" /obj/item/pen/retractable/attack(atom/A, mob/user, target_zone) - if(!active) + if(!(pen_flag & PEN_FLAG_ACTIVE)) toggle() ..() /obj/item/pen/retractable/attack_self(mob/user) toggle() - -/obj/item/pen/retractable/toggle() - active = !active - playsound(src, 'sound/items/penclick.ogg', 5, 0, -4) - update_icon() diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index efe347a7b6f..29e6bd4ff97 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -59,7 +59,7 @@ var/global/photo_count = 0 tiny.pixel_y = -32*(photo_size-1)/2 + 3 /obj/item/photo/attackby(obj/item/P, mob/user) - if(istype(P, /obj/item/pen)) + if(IS_PEN(P)) var/txt = sanitize(input(user, "What would you like to write on the back?", "Photo Writing", null) as text, 128) if(loc == user && user.stat == 0) scribble = txt diff --git a/code/modules/persistence/noticeboards.dm b/code/modules/persistence/noticeboards.dm index 6e70a082841..30ea6f1a5fa 100644 --- a/code/modules/persistence/noticeboards.dm +++ b/code/modules/persistence/noticeboards.dm @@ -152,8 +152,8 @@ var/obj/item/P = locate(href_list["write"]) if(!P) return - var/obj/item/pen/pen = locate() in user.get_held_items() - if(istype(pen)) + var/obj/item/pen = locate() in user.get_held_items() + if(IS_PEN(pen)) add_fingerprint(user) P.attackby(pen, user) else diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 5640675a4b0..0d883446f3e 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -59,7 +59,7 @@ return /obj/item/chems/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/pen) || istype(W, /obj/item/flashlight/pen)) + if(IS_PEN(W)) var/tmp_label = sanitize_safe(input(user, "Enter a label for [name]", "Label", label_text), MAX_NAME_LEN) if(length(tmp_label) > 10) to_chat(user, "The label can be at most 10 characters long.") diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index f9c10f374fb..0c3dcc5d983 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -32,7 +32,7 @@ ) /obj/item/chems/condiment/attackby(var/obj/item/W, var/mob/user) - if(istype(W, /obj/item/pen) || istype(W, /obj/item/flashlight/pen)) + if(IS_PEN(W)) var/tmp_label = sanitize_safe(input(user, "Enter a label for [name]", "Label", label_text), MAX_NAME_LEN) if(tmp_label == label_text) return diff --git a/code/modules/reagents/reagent_containers/food/eggs.dm b/code/modules/reagents/reagent_containers/food/eggs.dm index 89c984fc38f..85615507ace 100644 --- a/code/modules/reagents/reagent_containers/food/eggs.dm +++ b/code/modules/reagents/reagent_containers/food/eggs.dm @@ -32,18 +32,17 @@ qdel(src) /obj/item/chems/food/egg/attackby(obj/item/W, mob/user) - if(istype( W, /obj/item/pen/crayon )) - var/obj/item/pen/crayon/C = W - var/clr = C.colourName + if(IS_PEN(W)) + var/clr = W.get_tool_property(TOOL_PEN, TOOL_PROP_COLOR_NAME) if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow"))) - to_chat(usr, "The egg refuses to take on this color!") + to_chat(usr, SPAN_WARNING("The egg refuses to take on this color!")) return - to_chat(usr, "You color \the [src] [clr]") + to_chat(usr, SPAN_NOTICE("You color \the [src] [clr]")) icon_state = "egg-[clr]" - else - ..() + return TRUE + return ..() /obj/item/chems/food/egg/blue icon_state = "egg-blue" diff --git a/code/modules/reagents/reagent_containers/food/sliceable/pizza.dm b/code/modules/reagents/reagent_containers/food/sliceable/pizza.dm index 7a28c5db141..e6edbf09fbc 100644 --- a/code/modules/reagents/reagent_containers/food/sliceable/pizza.dm +++ b/code/modules/reagents/reagent_containers/food/sliceable/pizza.dm @@ -264,7 +264,7 @@ to_chat(user, "You try to push \the [I] through the lid but it doesn't work!") return - if( istype(I, /obj/item/pen/) ) + if(IS_PEN(I)) if( src.open ) return diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 51cfa750262..54580c1d7c9 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -41,7 +41,7 @@ else to_chat(user, "You need to set a destination first!") - else if(istype(W, /obj/item/pen)) + else if(IS_PEN(W)) switch(alert("What would you like to alter?",,"Title","Description", "Cancel")) if("Title") var/str = sanitize_safe(input(usr,"Label text?","Set label",""), MAX_NAME_LEN) @@ -166,7 +166,7 @@ else to_chat(user, "You need to set a destination first!") - else if(istype(W, /obj/item/pen)) + else if(IS_PEN(W)) switch(alert("What would you like to alter?",,"Title","Description", "Cancel")) if("Title") var/str = sanitize_safe(input(usr,"Label text?","Set label",""), MAX_NAME_LEN) diff --git a/code/modules/tools/tool_archetype.dm b/code/modules/tools/tool_archetype.dm index 0423676cc1e..bed1c7dd3a0 100644 --- a/code/modules/tools/tool_archetype.dm +++ b/code/modules/tools/tool_archetype.dm @@ -5,6 +5,7 @@ var/config_sound = 'sound/items/Ratchet.ogg' // Sound or list of sounds to play when this tool is selected as a variable tool head. var/codex_key var/use_message = "adjusting" + var/list/properties // A list of named tool specific properties this tool offers, and the default value of that property, if applicable. /decl/tool_archetype/proc/can_use_tool(var/obj/item/tool, var/expend_fuel = 0) return istype(tool) && tool.get_tool_quality(type) > 0 diff --git a/code/modules/tools/tool_archetype_definition_pen.dm b/code/modules/tools/tool_archetype_definition_pen.dm new file mode 100644 index 00000000000..25262b599aa --- /dev/null +++ b/code/modules/tools/tool_archetype_definition_pen.dm @@ -0,0 +1,54 @@ +/decl/tool_archetype/pen + name = "pen" + use_message = "writing" + use_sound = list('sound/effects/pen1.ogg','sound/effects/pen2.ogg') + properties = list(\ + TOOL_PROP_COLOR = "black", \ + TOOL_PROP_COLOR_NAME = "black", \ + TOOL_PROP_PEN_FLAG = 0, \ + TOOL_PROP_USES = -1, \ + TOOL_PROP_PEN_SIG = null,\ + TOOL_PROP_PEN_SHADE_COLOR = "black",\ + ) + +/**Returns the signature to use when signing with a pen. Meant to help deal with chameleon pens and regular pens. */ +/decl/tool_archetype/pen/proc/get_signature(var/mob/user, var/obj/item/tool) + . = tool.get_tool_property(TOOL_PEN, TOOL_PROP_PEN_SIG) + if(!.) + if(user?.real_name) + . = user.real_name + else + . = "Anonymous" + +/decl/tool_archetype/pen/proc/decrement_uses(var/mob/user, var/obj/item/tool, var/decrement = 1) + . = tool.get_tool_property(TOOL_PEN, TOOL_PROP_USES) + if(. < 0) + return TRUE + . -= decrement + tool.set_tool_property(TOOL_PEN, TOOL_PROP_USES, max(0, .)) //Prevent negatives and turning the pen into an infinite uses pen + if(. <= 0 && (tool.get_tool_property(TOOL_PEN, TOOL_PROP_PEN_FLAG) & PEN_FLAG_DEL_EMPTY)) + qdel(tool) + +/**Toggles the active/inactive state of some pens */ +/decl/tool_archetype/pen/proc/toggle_active(var/mob/user, var/obj/item/pen/tool) + //only a single type of pen can toggle + if(istype(tool, /obj/item/pen)) + tool.toggle() + +/decl/tool_archetype/pen/can_use_tool(obj/item/tool, expend_fuel = 1) + var/uses = tool.get_tool_property(TOOL_PEN, TOOL_PROP_USES) + return ..() && ((uses < 0) || (uses - expend_fuel) >= 0) + +/decl/tool_archetype/pen/handle_pre_interaction(mob/user, obj/item/tool, expend_fuel = 1) + var/uses_left = tool.get_tool_property(TOOL_PEN, TOOL_PROP_USES) + if(uses_left < 0) + return TOOL_USE_SUCCESS //Infinite + if(uses_left == 0) + to_chat(user, SPAN_WARNING("\The [tool] is spent.")) + return TOOL_USE_FAILURE + return TOOL_USE_SUCCESS + +/decl/tool_archetype/pen/handle_post_interaction(mob/user, obj/item/tool, expend_fuel = 1) + if(decrement_uses(user, tool, expend_fuel) <= 0) + to_chat(user, SPAN_WARNING("You used up your [tool]!")) + return TOOL_USE_SUCCESS \ No newline at end of file diff --git a/code/modules/tools/tool_extension.dm b/code/modules/tools/tool_extension.dm index 75697d83f2e..5b5c20996dd 100644 --- a/code/modules/tools/tool_extension.dm +++ b/code/modules/tools/tool_extension.dm @@ -1,12 +1,16 @@ /datum/extension/tool expected_type = /obj/item base_type = /datum/extension/tool - var/list/tool_values // Delay multipliers/general tool quality indicators, lower is better but 0 or lower means it isn't valid as a tool. - var/list/tool_use_sounds // Associative list of tool to sound/list of sounds used to override the archetype config sounds. + var/list/tool_values // Delay multipliers/general tool quality indicators, lower is better but 0 or lower means it isn't valid as a tool. + var/list/tool_use_sounds // Associative list of tool to sound/list of sounds used to override the archetype config sounds. + var/list/tool_properties // Associative list of tool archetype to a list of properties and their values for that archetype. -/datum/extension/tool/New(datum/holder, list/_tool_values) +/datum/extension/tool/New(datum/holder, list/_tool_values, list/_tool_properties) ..() tool_values = _tool_values + for(var/atype in _tool_properties) + var/list/cur_props = LAZYACCESS(tool_properties, atype)? tool_properties[atype] + _tool_properties[atype] : _tool_properties[atype] + LAZYSET(tool_properties, atype, cur_props) /datum/extension/tool/proc/set_sound_overrides(list/_tool_use_sounds) @@ -31,6 +35,23 @@ /datum/extension/tool/proc/get_tool_quality(var/archetype) return LAZYACCESS(tool_values, archetype) +/**Return the value of the property specified for the given tool archetype. */ +/datum/extension/tool/proc/get_tool_property(var/archetype, var/property) + var/list/props = LAZYACCESS(tool_properties, archetype) + //If we don't override, check the datum's default values + if(!LAZYLEN(props)) + var/decl/tool_archetype/T = GET_DECL(archetype) + props = T.properties + return LAZYACCESS(props, property) + +/**Set the given tool property for the given tool archetype */ +/datum/extension/tool/proc/set_tool_property(var/archetype, var/property, var/value) + var/list/props = LAZYACCESS(tool_properties, archetype) + if(!props) + LAZYSET(tool_properties, archetype, list()) //Init the properties override list + props = tool_properties[archetype] + LAZYSET(props, property, value) + /datum/extension/tool/proc/handle_physical_manipulation(var/mob/user) return FALSE diff --git a/code/modules/tools/tool_item.dm b/code/modules/tools/tool_item.dm index 44f28ecd909..4091fc364ef 100644 --- a/code/modules/tools/tool_item.dm +++ b/code/modules/tools/tool_item.dm @@ -6,6 +6,16 @@ var/datum/extension/tool/tool = get_extension(src, /datum/extension/tool) . = tool?.get_tool_speed(archetype) +/**Returns the property's value for a givent archetype. */ +/obj/item/proc/get_tool_property(var/archetype, var/property) + var/datum/extension/tool/tool = get_extension(src, /datum/extension/tool) + . = tool?.get_tool_property(archetype, property) + +/**Set the property for the given tool archetype to the specified value. */ +/obj/item/proc/set_tool_property(var/archetype, var/property, var/value) + var/datum/extension/tool/tool = get_extension(src, /datum/extension/tool) + . = tool?.set_tool_property(archetype, property, value) + /obj/item/proc/do_tool_interaction(var/archetype, var/mob/user, var/atom/target, var/delay = (1 SECOND), var/start_message, var/success_message, var/failure_message, var/fuel_expenditure = 0, var/check_skill = SKILL_CONSTRUCTION, var/check_skill_threshold, var/check_skill_prob = 50) if(get_tool_quality(archetype) <= 0) @@ -20,7 +30,7 @@ if(. == TOOL_USE_SUCCESS) if(success_message) user.visible_message( - SPAN_NOTICE("\The [user] finishes [success_message] \the [target] with \the [src]."), + SPAN_NOTICE("\The [user] finishes [success_message] \the [target] with \the [src]."), SPAN_NOTICE("You finish [success_message] \the [target] with \the [src].") ) return TRUE diff --git a/code/modules/xenoarcheaology/finds/find_types/fossils.dm b/code/modules/xenoarcheaology/finds/find_types/fossils.dm index 499c97299d0..87d34f129ef 100644 --- a/code/modules/xenoarcheaology/finds/find_types/fossils.dm +++ b/code/modules/xenoarcheaology/finds/find_types/fossils.dm @@ -92,7 +92,7 @@ set_density(1) else to_chat(user, SPAN_NOTICE("\The [src] is already complete.")) - else if(istype(W,/obj/item/pen)) + else if(IS_PEN(W)) plaque_contents = sanitize(input("What would you like to write on the plaque:","Skeleton plaque","")) user.visible_message("[user] writes something on the base of [src].","You relabel the plaque on the base of [src].") else diff --git a/nebula.dme b/nebula.dme index b51b50439f1..c791a0d1f70 100644 --- a/nebula.dme +++ b/nebula.dme @@ -67,6 +67,7 @@ #include "code\__defines\movement.dm" #include "code\__defines\organs.dm" #include "code\__defines\overmap.dm" +#include "code\__defines\paperwork.dm" #include "code\__defines\power.dm" #include "code\__defines\proc_presets.dm" #include "code\__defines\qdel.dm" @@ -932,7 +933,6 @@ #include "code\game\objects\items\buttons.dm" #include "code\game\objects\items\christmas.dm" #include "code\game\objects\items\contraband.dm" -#include "code\game\objects\items\crayons.dm" #include "code\game\objects\items\cryobag.dm" #include "code\game\objects\items\documents.dm" #include "code\game\objects\items\dog_tags.dm" @@ -3271,6 +3271,7 @@ #include "code\modules\synthesized_instruments\real_instruments\Violin\violin.dm" #include "code\modules\tools\_tool_defines.dm" #include "code\modules\tools\tool_archetype.dm" +#include "code\modules\tools\tool_archetype_definition_pen.dm" #include "code\modules\tools\tool_archetype_definitions.dm" #include "code\modules\tools\tool_archetype_definitions_surgery.dm" #include "code\modules\tools\tool_archetype_definitions_welder.dm" From 623aea37a40301ba73f4569be8122b808ddc650e Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 24 Jul 2022 22:45:38 +1000 Subject: [PATCH 0216/1518] Automatic changelog generation for PR #2495 [ci skip] --- html/changelogs/AutoChangeLog-pr-2495.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2495.yml diff --git a/html/changelogs/AutoChangeLog-pr-2495.yml b/html/changelogs/AutoChangeLog-pr-2495.yml new file mode 100644 index 00000000000..e019957731e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2495.yml @@ -0,0 +1,4 @@ +author: "tag if you want to specify another name or several people. -->\r" +delete-after: true +changes: + - tweak: More things are now considered pens. Like the flashlight pen. From 5ce0e1043dae47008757df50141d38937d6fa24e Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 25 Jul 2022 00:50:04 +0000 Subject: [PATCH 0217/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-2495.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2495.yml diff --git a/html/changelog.html b/html/changelog.html index 6f166982efc..6bc201078ef 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
    +

    25 July 2022

    +

    tag if you want to specify another name or several people. --> updated:

    +
      +
    • More things are now considered pens. Like the flashlight pen.
    • +
    +

    01 July 2022

    tag if you want to specify another name or several people. --> updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 36d73e6a5ee..59e7f7062de 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14233,3 +14233,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2022-07-01: "tag if you want to specify another name or several people. -->\r": - tweak: Construction skill will now speed up some tool interactions. +2022-07-25: + "tag if you want to specify another name or several people. -->\r": + - tweak: More things are now considered pens. Like the flashlight pen. diff --git a/html/changelogs/AutoChangeLog-pr-2495.yml b/html/changelogs/AutoChangeLog-pr-2495.yml deleted file mode 100644 index e019957731e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2495.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "tag if you want to specify another name or several people. -->\r" -delete-after: true -changes: - - tweak: More things are now considered pens. Like the flashlight pen. From af4ea176f9af908b755bafb35f880ff693060242 Mon Sep 17 00:00:00 2001 From: jade-lavenza Date: Sun, 24 Jul 2022 00:32:02 -0500 Subject: [PATCH 0218/1518] Readd fabricator design cache queueing --- .../subsystems/initialization/fabrication.dm | 10 +++++++++- code/modules/fabrication/_fabricator.dm | 7 +++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystems/initialization/fabrication.dm b/code/controllers/subsystems/initialization/fabrication.dm index 4e926800079..dc3f8a995a9 100644 --- a/code/controllers/subsystems/initialization/fabrication.dm +++ b/code/controllers/subsystems/initialization/fabrication.dm @@ -11,7 +11,7 @@ SUBSYSTEM_DEF(fabrication) var/list/recipes_by_product_type = list() var/list/fields_by_id = list() - // Fabricators who want their initial recipies + // Weakrefs to fabricators who want their initial recipies var/list/fabricators_to_init = list() // These should be removed after rewriting crafting to respect init order. var/list/crafting_recipes_to_init = list() @@ -41,6 +41,11 @@ SUBSYSTEM_DEF(fabrication) if(ispath(handler.begins_with_object_type)) LAZYDISTINCTADD(crafting_procedures_by_type[handler.begins_with_object_type], handler) + for(var/weakref/weak_fab in fabricators_to_init) + var/obj/machinery/fabricator/fab = weak_fab.resolve() + fab?.refresh_design_cache() + fabricators_to_init.Cut() + for(var/datum/stack_recipe/recipe in crafting_recipes_to_init) recipe.InitializeMaterials() crafting_recipes_to_init.Cut() @@ -101,3 +106,6 @@ SUBSYSTEM_DEF(fabrication) return H else qdel(H) + +/datum/controller/subsystem/fabrication/proc/queue_design_cache_refresh(var/obj/machinery/fabricator/fab) + fabricators_to_init |= weakref(fab) \ No newline at end of file diff --git a/code/modules/fabrication/_fabricator.dm b/code/modules/fabrication/_fabricator.dm index ce155885253..486f4b1d48b 100644 --- a/code/modules/fabrication/_fabricator.dm +++ b/code/modules/fabrication/_fabricator.dm @@ -67,7 +67,7 @@ var/ui_expand_queue = FALSE var/ui_expand_resources = FALSE var/ui_expand_config = FALSE - var/ui_nb_categories = 1 //Cached amount of categories in loaded designs. Used to decide if we display the category filter or not + var/ui_nb_categories = 1 //Cached amount of categories in loaded designs. Used to decide if we display the category filter or not /obj/machinery/fabricator/Destroy() QDEL_NULL(currently_building) @@ -112,7 +112,10 @@ if(prefilled) fill_to_capacity() - refresh_design_cache() + if(SSfabrication.post_recipe_init) + refresh_design_cache() + else + SSfabrication.queue_design_cache_refresh(src) /obj/machinery/fabricator/modify_mapped_vars(map_hash) ..() From d48c7061df1f9831dc3c19563ab34d593ed31d29 Mon Sep 17 00:00:00 2001 From: jade-lavenza Date: Mon, 25 Jul 2022 16:32:27 -0500 Subject: [PATCH 0219/1518] Remove _UT var protection defines --- code/__defines/spaceman_dmm.dm | 11 ----------- code/datums/graph/graph.dm | 13 +++++++++++-- code/modules/multiz/map_data.dm | 8 +++++++- code/unit_tests/graph_tests.dm | 16 +++++++++------- code/unit_tests/map_tests.dm | 5 +++-- 5 files changed, 30 insertions(+), 23 deletions(-) diff --git a/code/__defines/spaceman_dmm.dm b/code/__defines/spaceman_dmm.dm index d59a3b5717a..fd14916edc8 100644 --- a/code/__defines/spaceman_dmm.dm +++ b/code/__defines/spaceman_dmm.dm @@ -28,15 +28,4 @@ #define VAR_FINAL var #define VAR_PRIVATE var #define VAR_PROTECTED var -#endif - -// Workarounds to allow unit tests to introspect on variables that shouldn't be accessed in production. -#ifdef UNIT_TEST - #define VAR_FINAL_UT var - #define VAR_PRIVATE_UT var - #define VAR_PROTECTED_UT var -#else - #define VAR_FINAL_UT VAR_FINAL - #define VAR_PRIVATE_UT VAR_PRIVATE - #define VAR_PROTECTED_UT VAR_PROTECTED #endif \ No newline at end of file diff --git a/code/datums/graph/graph.dm b/code/datums/graph/graph.dm index 2c00adaad3c..fe3d9262afb 100644 --- a/code/datums/graph/graph.dm +++ b/code/datums/graph/graph.dm @@ -1,11 +1,20 @@ /datum/graph - VAR_PRIVATE_UT/list/nodes - VAR_PRIVATE_UT/list/edges + VAR_PRIVATE/list/nodes + VAR_PRIVATE/list/edges VAR_PRIVATE/list/pending_connections VAR_PRIVATE/list/pending_disconnections VAR_PRIVATE/list/pending_movements +#ifdef UNIT_TEST +// For unit tests only. DO NOT use in production. +/datum/graph/proc/get_nodes() + return nodes + +/datum/graph/proc/get_edges() + return edges +#endif + /datum/graph/New(var/list/nodes, var/list/edges, var/previous_owner = null) if(!length(nodes)) CRASH("Invalid list of nodes: [log_info_line(nodes)]") diff --git a/code/modules/multiz/map_data.dm b/code/modules/multiz/map_data.dm index 96be35b3f33..e346064c4c8 100644 --- a/code/modules/multiz/map_data.dm +++ b/code/modules/multiz/map_data.dm @@ -6,7 +6,13 @@ var/height = 1 ///< The number of Z-Levels in the map. var/turf/edge_type ///< What the map edge should be formed with. (null = world.turf) - VAR_PROTECTED_UT/UT_turf_exceptions_by_door_type // An associate list of door types/list of allowed turfs + VAR_PROTECTED/UT_turf_exceptions_by_door_type // An associate list of door types/list of allowed turfs + +#ifdef UNIT_TEST +// Do not use this in production; for unit tests ONLY. +/obj/abstract/map_data/proc/get_UT_turf_exceptions_by_door_type() + return UT_turf_exceptions_by_door_type +#endif // If the height is more than 1, we mark all contained levels as connected. // This is in New because it is an auxiliary effect specifically needed pre-init. diff --git a/code/unit_tests/graph_tests.dm b/code/unit_tests/graph_tests.dm index 78b0850ec1e..a072661b0ca 100644 --- a/code/unit_tests/graph_tests.dm +++ b/code/unit_tests/graph_tests.dm @@ -573,18 +573,20 @@ /datum/graph_expectation/proc/CheckExpectations(var/datum/graph/graph) . = list() - if(length(expected_nodes ^ (graph.nodes || list()))) - . += "Expected the following nodes [log_info_line(expected_nodes)], was [log_info_line(graph.nodes)]" - if(length(expected_edges ^ (graph.edges || list()))) - . += "Expected the following edges [log_info_line(expected_edges)], was [log_info_line(graph.edges)]" - - for(var/datum/node/N in graph.nodes) + var/graph_nodes = graph.get_nodes() + var/graph_edges = graph.get_edges() + if(length(expected_nodes ^ (graph_nodes || list()))) + . += "Expected the following nodes [log_info_line(expected_nodes)], was [log_info_line(graph_nodes)]" + if(length(expected_edges ^ (graph_edges || list()))) + . += "Expected the following edges [log_info_line(expected_edges)], was [log_info_line(graph_edges)]" + + for(var/datum/node/N in graph_nodes) if(N.graph != graph) . += "[log_info_line(N)]: Expected the following graph [log_info_line(graph)], was [N.graph]" for(var/node in expected_edges) var/expected_connections = expected_edges[node] - var/actual_connections = graph.edges[node] + var/actual_connections = graph_edges[node] if(length(expected_connections ^ actual_connections)) . += "[log_info_line(node)]: Expected the following connections [log_info_line(expected_connections)], was [log_info_line(actual_connections)]" diff --git a/code/unit_tests/map_tests.dm b/code/unit_tests/map_tests.dm index 1044acb294b..0cd1a953812 100644 --- a/code/unit_tests/map_tests.dm +++ b/code/unit_tests/map_tests.dm @@ -815,8 +815,9 @@ else var/list/turf_exceptions var/obj/abstract/map_data/MD = get_map_data(D.loc.z) - if(MD?.UT_turf_exceptions_by_door_type) - turf_exceptions = MD.UT_turf_exceptions_by_door_type[D.type] + var/list/map_exceptions = MD.get_UT_turf_exceptions_by_door_type() + if(map_exceptions) + turf_exceptions = map_exceptions[D.type] var/is_bad_door = FALSE for(var/turf/T in D.locs) From 8505e8ef3bc1a8dce72729415899435ff8ec68a0 Mon Sep 17 00:00:00 2001 From: jade-lavenza Date: Mon, 25 Jul 2022 16:33:02 -0500 Subject: [PATCH 0220/1518] Revert "Gate all unit tests behind #ifdef UNIT_TEST" This reverts commit 3b778df0538bd8a8bb6c52c94c3282919abd78bf. --- code/unit_tests/_includes.dm | 44 ------------------------ maps/tradeship/tradeship_unit_testing.dm | 2 -- mods/species/vox/datum/unit_testing.dm | 5 +-- nebula.dme | 44 ++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 50 deletions(-) diff --git a/code/unit_tests/_includes.dm b/code/unit_tests/_includes.dm index 6f93cf908bc..90eee568946 100644 --- a/code/unit_tests/_includes.dm +++ b/code/unit_tests/_includes.dm @@ -3,56 +3,12 @@ #include "~unit_test_procs.dm" #include "~unit_test_subsystems.dm" #include "~unit_test_types.dm" - #include "alt_appearances_test.dm" - #include "area_tests.dm" - #include "aspects.dm" - #include "atmospherics_tests.dm" - #include "cargo_tests.dm" - #include "chemistry_tests.dm" - #include "closets.dm" - #include "clothing.dm" - #include "codex.dm" - #include "culture.dm" - #include "decls.dm" - #include "economics.dm" - #include "equipment_tests.dm" #include "extension_tests.dm" - #include "food_tests.dm" - #include "foundation_tests.dm" - #include "fusion_plants.dm" - #include "graph_tests.dm" - #include "icon_tests.dm" - #include "integrated_circuits.dm" - #include "job_tests.dm" - #include "json.dm" #include "loadout_tests.dm" - #include "machine_tests.dm" - #include "map_tests.dm" - #include "materials.dm" - #include "mob_tests.dm" - #include "movement_tests.dm" - #include "music_test.dm" #include "observation_tests.dm" - #include "organ_tests.dm" #include "override_tests.dm" - #include "power_tests.dm" #include "proximity_tests.dm" #include "secrets.dm" - #include "security_state.dm" - #include "seed_tests.dm" - #include "shuttle_tests.dm" - #include "special_roles.dm" - #include "submaps.dm" - #include "subsystem_tests.dm" - #include "surgery.dm" - #include "test_obj.dm" - #include "time_tests.dm" #include "trait_tests.dm" - #include "unique_tests.dm" - #include "unit_test.dm" - #include "uplink_tests.dm" - #include "view_variables_test.dm" #include "virtual_mob_tests.dm" - #include "zas_tests.dm" - #include "~helpers.dm" #endif diff --git a/maps/tradeship/tradeship_unit_testing.dm b/maps/tradeship/tradeship_unit_testing.dm index 8d1bb25e32f..5fc81b0f665 100644 --- a/maps/tradeship/tradeship_unit_testing.dm +++ b/maps/tradeship/tradeship_unit_testing.dm @@ -1,7 +1,5 @@ -#ifdef UNIT_TEST /datum/unit_test/station_wires_shall_be_connected exceptions = list(list(48, 54, 3, EAST)) -#endif /datum/map/tradeship // Unit test exemptions diff --git a/mods/species/vox/datum/unit_testing.dm b/mods/species/vox/datum/unit_testing.dm index 9815b61ae07..e719622568b 100644 --- a/mods/species/vox/datum/unit_testing.dm +++ b/mods/species/vox/datum/unit_testing.dm @@ -1,4 +1,3 @@ -#ifdef UNIT_TEST #ifndef IMMUNE #define IMMUNE 3 #endif @@ -31,6 +30,4 @@ /datum/unit_test/mob_damage/vox/halloss name = "MOB: Vox Halloss Damage Check" - damagetype = PAIN - -#endif \ No newline at end of file + damagetype = PAIN \ No newline at end of file diff --git a/nebula.dme b/nebula.dme index c791a0d1f70..2adaae47325 100644 --- a/nebula.dme +++ b/nebula.dme @@ -3397,6 +3397,50 @@ #include "code\procs\radio.dm" #include "code\unit_tests\_defines.dm" #include "code\unit_tests\_includes.dm" +#include "code\unit_tests\alt_appearances_test.dm" +#include "code\unit_tests\area_tests.dm" +#include "code\unit_tests\aspects.dm" +#include "code\unit_tests\atmospherics_tests.dm" +#include "code\unit_tests\cargo_tests.dm" +#include "code\unit_tests\chemistry_tests.dm" +#include "code\unit_tests\closets.dm" +#include "code\unit_tests\clothing.dm" +#include "code\unit_tests\codex.dm" +#include "code\unit_tests\culture.dm" +#include "code\unit_tests\decls.dm" +#include "code\unit_tests\economics.dm" +#include "code\unit_tests\equipment_tests.dm" +#include "code\unit_tests\food_tests.dm" +#include "code\unit_tests\foundation_tests.dm" +#include "code\unit_tests\fusion_plants.dm" +#include "code\unit_tests\graph_tests.dm" +#include "code\unit_tests\icon_tests.dm" +#include "code\unit_tests\integrated_circuits.dm" +#include "code\unit_tests\job_tests.dm" +#include "code\unit_tests\json.dm" +#include "code\unit_tests\machine_tests.dm" +#include "code\unit_tests\map_tests.dm" +#include "code\unit_tests\materials.dm" +#include "code\unit_tests\mob_tests.dm" +#include "code\unit_tests\movement_tests.dm" +#include "code\unit_tests\music_test.dm" +#include "code\unit_tests\organ_tests.dm" +#include "code\unit_tests\power_tests.dm" +#include "code\unit_tests\security_state.dm" +#include "code\unit_tests\seed_tests.dm" +#include "code\unit_tests\shuttle_tests.dm" +#include "code\unit_tests\special_roles.dm" +#include "code\unit_tests\submaps.dm" +#include "code\unit_tests\subsystem_tests.dm" +#include "code\unit_tests\surgery.dm" +#include "code\unit_tests\test_obj.dm" +#include "code\unit_tests\time_tests.dm" +#include "code\unit_tests\unique_tests.dm" +#include "code\unit_tests\unit_test.dm" +#include "code\unit_tests\uplink_tests.dm" +#include "code\unit_tests\view_variables_test.dm" +#include "code\unit_tests\zas_tests.dm" +#include "code\unit_tests\~helpers.dm" #include "interface\interface.dm" #include "interface\skin.dmf" #include "maps\_map_include.dm" From 50f42656ee397f4dfe95566a55c90beaa69e3f11 Mon Sep 17 00:00:00 2001 From: jade-lavenza Date: Mon, 25 Jul 2022 16:39:54 -0500 Subject: [PATCH 0221/1518] Add #else clauses to UT getters --- code/datums/graph/graph.dm | 6 ++++++ code/modules/multiz/map_data.dm | 3 +++ code/unit_tests/graph_tests.dm | 10 ++++++---- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/code/datums/graph/graph.dm b/code/datums/graph/graph.dm index fe3d9262afb..1f886972e9b 100644 --- a/code/datums/graph/graph.dm +++ b/code/datums/graph/graph.dm @@ -13,6 +13,12 @@ /datum/graph/proc/get_edges() return edges +#else +/datum/graph/proc/get_nodes() + CRASH("graph.get_nodes() called in production code!") + +/datum/graph/proc/get_edges() + CRASH("graph.get_edges() called in production code!") #endif /datum/graph/New(var/list/nodes, var/list/edges, var/previous_owner = null) diff --git a/code/modules/multiz/map_data.dm b/code/modules/multiz/map_data.dm index e346064c4c8..796b5b6e52b 100644 --- a/code/modules/multiz/map_data.dm +++ b/code/modules/multiz/map_data.dm @@ -12,6 +12,9 @@ // Do not use this in production; for unit tests ONLY. /obj/abstract/map_data/proc/get_UT_turf_exceptions_by_door_type() return UT_turf_exceptions_by_door_type +#else +/obj/abstract/map_data/proc/get_UT_turf_exceptions_by_door_type() + CRASH("map_data.get_UT_turf_exceptions_by_door_type() called in production code!") #endif // If the height is more than 1, we mark all contained levels as connected. diff --git a/code/unit_tests/graph_tests.dm b/code/unit_tests/graph_tests.dm index a072661b0ca..38794fa40b6 100644 --- a/code/unit_tests/graph_tests.dm +++ b/code/unit_tests/graph_tests.dm @@ -364,10 +364,12 @@ var/edge_issues = 0 - var/edgesA = G.edges[hostA.node] - var/edgesB = G.edges[hostB.node] - var/edgesC = G.edges[hostC.node] - var/edgesD = G.edges[hostD.node] + var/G_edges = G.get_edges() + + var/edgesA = G_edges[hostA.node] + var/edgesB = G_edges[hostB.node] + var/edgesC = G_edges[hostC.node] + var/edgesD = G_edges[hostD.node] if(length(edgesA) != 1 || !(hostB.node in edgesA)) edge_issues++ log_bad("Invalid edges - Host A: [log_info_line(edgesA)]") From 258410b483187ebd8e7ea866e771cb731cac79f0 Mon Sep 17 00:00:00 2001 From: jade-lavenza Date: Mon, 25 Jul 2022 17:19:36 -0500 Subject: [PATCH 0222/1518] Replace UT-specific getters --- code/datums/graph/graph.dm | 15 ------ code/unit_tests/graph_tests.dm | 94 ++++++++++++++++++---------------- code/unit_tests/map_tests.dm | 8 +-- 3 files changed, 54 insertions(+), 63 deletions(-) diff --git a/code/datums/graph/graph.dm b/code/datums/graph/graph.dm index 1f886972e9b..249f513e419 100644 --- a/code/datums/graph/graph.dm +++ b/code/datums/graph/graph.dm @@ -6,21 +6,6 @@ VAR_PRIVATE/list/pending_disconnections VAR_PRIVATE/list/pending_movements -#ifdef UNIT_TEST -// For unit tests only. DO NOT use in production. -/datum/graph/proc/get_nodes() - return nodes - -/datum/graph/proc/get_edges() - return edges -#else -/datum/graph/proc/get_nodes() - CRASH("graph.get_nodes() called in production code!") - -/datum/graph/proc/get_edges() - CRASH("graph.get_edges() called in production code!") -#endif - /datum/graph/New(var/list/nodes, var/list/edges, var/previous_owner = null) if(!length(nodes)) CRASH("Invalid list of nodes: [log_info_line(nodes)]") diff --git a/code/unit_tests/graph_tests.dm b/code/unit_tests/graph_tests.dm index 38794fa40b6..bb9a2860eae 100644 --- a/code/unit_tests/graph_tests.dm +++ b/code/unit_tests/graph_tests.dm @@ -346,6 +346,24 @@ return TRUE +/datum/graph/proc/find_edge_issues(var/atom/movable/graph_test/hostA, var/atom/movable/graph_test/hostB, var/atom/movable/graph_test/hostC, var/atom/movable/graph_test/hostD) + var/list/edge_issues + + var/edgesA = edges[hostA.node] + var/edgesB = edges[hostB.node] + var/edgesC = edges[hostC.node] + var/edgesD = edges[hostD.node] + if(length(edgesA) != 1 || !(hostB.node in edgesA)) + LAZYADD(edge_issues, "Invalid edges - Host A: [log_info_line(edgesA)]") + if(length(edgesB) != 2 || !(hostA.node in edgesB) || !(hostC.node in edgesB)) + LAZYADD(edge_issues, "Invalid edges - Host B: [log_info_line(edgesB)]") + if(length(edgesC) != 2 || !(hostB.node in edgesC) || !(hostD.node in edgesC)) + LAZYADD(edge_issues, "Invalid edges - Host C: [log_info_line(edgesC)]") + if(length(edgesD) != 1 || !(hostC.node in edgesD)) + LAZYADD(edge_issues, "Invalid edges - Host D: [log_info_line(edgesD)]") + + return edge_issues + /datum/unit_test/graph_test/move/check_result() if(!ReadyToCheckExpectations()) return FALSE @@ -362,28 +380,12 @@ log_bad(log_info_line(hostD.node.graph)) return TRUE - var/edge_issues = 0 - - var/G_edges = G.get_edges() - - var/edgesA = G_edges[hostA.node] - var/edgesB = G_edges[hostB.node] - var/edgesC = G_edges[hostC.node] - var/edgesD = G_edges[hostD.node] - if(length(edgesA) != 1 || !(hostB.node in edgesA)) - edge_issues++ - log_bad("Invalid edges - Host A: [log_info_line(edgesA)]") - if(length(edgesB) != 2 || !(hostA.node in edgesB) || !(hostC.node in edgesB)) - edge_issues++ - log_bad("Invalid edges - Host B: [log_info_line(edgesB)]") - if(length(edgesC) != 2 || !(hostB.node in edgesC) || !(hostD.node in edgesC)) - edge_issues++ - log_bad("Invalid edges - Host C: [log_info_line(edgesC)]") - if(length(edgesD) != 1 || !(hostC.node in edgesD)) - edge_issues++ - log_bad("Invalid edges - Host D: [log_info_line(edgesD)]") - - if(edge_issues) + var/list/edge_issues = G.find_edge_issues(hostA, hostB, hostC, hostD) + + for(var/issue in edge_issues) + log_bad(issue) + + if(LAZYLEN(edge_issues)) fail("Invalid edges") return TRUE @@ -531,12 +533,11 @@ else if(length(split_expectations)) var/list/unexpected_subgraphs = list() var/list/split_expectations_copy = split_expectations.Copy() - for(var/subgraph in subgraphs) + for(var/datum/graph/subgraph in subgraphs) var/expectations_fulfilled = FALSE - for(var/split_expectation in split_expectations_copy) - var/datum/graph_expectation/GE = split_expectation - if(!length(GE.CheckExpectations(subgraph))) - split_expectations_copy -= GE + for(var/datum/graph_expectation/split_expectation in split_expectations_copy) + if(!length(subgraph.DoCheckExpectations(split_expectation))) + split_expectations_copy -= split_expectation expectations_fulfilled = TRUE break if(!expectations_fulfilled) @@ -554,7 +555,7 @@ /datum/graph/testing/proc/CheckExpectations() if(on_check_expectations) - issues += on_check_expectations.CheckExpectations(src) + issues += DoCheckExpectations(on_check_expectations) if(length(split_expectations) && !on_split_was_called) issues += "Had split expectations but OnSplit was not called" if(!length(split_expectations) && on_split_was_called) @@ -573,26 +574,31 @@ src.expected_nodes = expected_nodes || list() src.expected_edges = expected_edges || list() -/datum/graph_expectation/proc/CheckExpectations(var/datum/graph/graph) +// Stub for subtype-specific functionality for DoCheckExpectations. +// Should not access graph.nodes or graph.edges. +/datum/graph_expectation/proc/OnCheckExpectations(var/datum/graph/graph) + return list() + +/datum/graph/proc/DoCheckExpectations(var/datum/graph_expectation/expectation) . = list() - var/graph_nodes = graph.get_nodes() - var/graph_edges = graph.get_edges() - if(length(expected_nodes ^ (graph_nodes || list()))) - . += "Expected the following nodes [log_info_line(expected_nodes)], was [log_info_line(graph_nodes)]" - if(length(expected_edges ^ (graph_edges || list()))) - . += "Expected the following edges [log_info_line(expected_edges)], was [log_info_line(graph_edges)]" - - for(var/datum/node/N in graph_nodes) - if(N.graph != graph) - . += "[log_info_line(N)]: Expected the following graph [log_info_line(graph)], was [N.graph]" - - for(var/node in expected_edges) - var/expected_connections = expected_edges[node] - var/actual_connections = graph_edges[node] + if(length(expectation.expected_nodes ^ (nodes || list()))) + . += "Expected the following nodes [log_info_line(expectation.expected_nodes)], was [log_info_line(nodes)]" + if(length(expectation.expected_edges ^ (edges || list()))) + . += "Expected the following edges [log_info_line(expectation.expected_edges)], was [log_info_line(edges)]" + + for(var/datum/node/N in nodes) + if(N.graph != src) + . += "[log_info_line(N)]: Expected the following graph [log_info_line(src)], was [N.graph]" + + for(var/node in expectation.expected_edges) + var/expected_connections = expectation.expected_edges[node] + var/actual_connections = edges[node] if(length(expected_connections ^ actual_connections)) . += "[log_info_line(node)]: Expected the following connections [log_info_line(expected_connections)], was [log_info_line(actual_connections)]" -/datum/graph_expectation/deleted/CheckExpectations(var/datum/graph/graph) + . += expectation.OnCheckExpectations() + +/datum/graph_expectation/deleted/OnCheckExpectations(var/datum/graph/graph) . = ..() if(!QDELETED(graph)) . += "Expected graph to be deleted, was not" diff --git a/code/unit_tests/map_tests.dm b/code/unit_tests/map_tests.dm index 0cd1a953812..f1f3602bda3 100644 --- a/code/unit_tests/map_tests.dm +++ b/code/unit_tests/map_tests.dm @@ -804,6 +804,9 @@ /datum/unit_test/doors_shall_be_on_appropriate_turfs name = "MAP: Doors shall be on appropriate turfs" +/obj/abstract/map_data/proc/get_door_turf_exceptions(var/obj/machinery/door/D) + return LAZYACCESS(UT_turf_exceptions_by_door_type, D.type) + /datum/unit_test/doors_shall_be_on_appropriate_turfs/start_test() var/bad_doors = 0 for(var/obj/machinery/door/D in SSmachines.machinery) @@ -813,11 +816,8 @@ bad_doors++ log_bad("Invalid door turf: [log_info_line(D.loc)]]") else - var/list/turf_exceptions var/obj/abstract/map_data/MD = get_map_data(D.loc.z) - var/list/map_exceptions = MD.get_UT_turf_exceptions_by_door_type() - if(map_exceptions) - turf_exceptions = map_exceptions[D.type] + var/list/turf_exceptions = MD?.get_door_turf_exceptions(D) var/is_bad_door = FALSE for(var/turf/T in D.locs) From bc3e87a1e33cd0b520fdbe5b2c111c94b9516ddf Mon Sep 17 00:00:00 2001 From: jade-lavenza Date: Tue, 26 Jul 2022 18:06:43 -0500 Subject: [PATCH 0223/1518] Fix changelogs (again) --- html/changelogs/.all_changelog.yml | 102 ++++++++++++++--------------- tools/changelog/generate_cl.py | 2 +- 2 files changed, 52 insertions(+), 52 deletions(-) diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 59e7f7062de..9fc0a5c3634 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14185,54 +14185,54 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. MistakeNot4892: - tweak: Ported Skrell from Stella and added to the Bay alien roster. 2022-06-03: - tag if you want to specify another name or several people. -->: - - tweak: Airlock components panel now opens with wrench -2022-06-04: - tag if you want to specify another name or several people. -->: - - tweak: Removes HULK, FAT and LASER mutations. -2022-06-05: - tag if you want to specify another name or several people. -->: - - bugfix: Fixed the TEG icon - - maptweak: Added SM to engineering - - maptweak: Removed 2 of 3 solars -2022-06-06: - MistakeNot4892: - - tweak: Tajaran icon has been updated with new work from Azlan. - tag if you want to specify another name or several people. -->: - - soundadd: Added sound for some tool interactions with the axes and hatchets. - - tweak: Config `expanded_alt_interactions` allows for various generic actions (look, - grab, drop, rotate) to show up when alt-clicking. - - soundadd: Changed the handling sounds for several material stacks to something - more fitting. -2022-06-10: - tag if you want to specify another name or several people. -->: - - bugfix: Fixed how some tool interactions wouldn't play tool sounds. -2022-06-15: - "tag if you want to specify another name or several people. -->\r": - - tweak: Generic plants can now be cut. Trees can be chopped down with an axe. - - soundadd: Added several sound effects when dealing with generic plants. -2022-06-16: - "tag if you want to specify another name or several people. -->\r": - - maptweak: Randomised Ministation Asteroid Field -2022-06-20: - ? '' - : - tweak: GPS units now provide a visual compass to track each other. -2022-06-22: - ? '' - : - tweak: Network machinery now has lower tech requirements across the board. - - tweak: Network broadcasters now have their signal strength scale with the rating - of installed microlasers. - - rscadd: Computer networks are now able to communicate over PLEXUS. - - rscadd: Adds PLEXUS uplinks, machinery which allows devices to connect to PLEXUS - in conjunction with a PLEXUS repeater. - - tweak: Network signal simulation has been adjusted slightly. Connection strengths - should be comparable with old setups. -2022-06-25: - ? '' - : - tweak: Species previews are no longer naked. -2022-07-01: - "tag if you want to specify another name or several people. -->\r": - - tweak: Construction skill will now speed up some tool interactions. -2022-07-25: - "tag if you want to specify another name or several people. -->\r": - - tweak: More things are now considered pens. Like the flashlight pen. + SolatK: + - tweak: Airlock components panel now opens with wrench + 2022-06-04: + MistakeNot4892: + - tweak: Removes HULK, FAT and LASER mutations. + 2022-06-05: + gyurka66: + - bugfix: Fixed the TEG icon + - maptweak: Added SM to engineering + - maptweak: Removed 2 of 3 solars + 2022-06-06: + MistakeNot4892: + - tweak: Tajaran icon has been updated with new work from Azlan. + PsyCommando: + - soundadd: Added sound for some tool interactions with the axes and hatchets. + - tweak: Config `expanded_alt_interactions` allows for various generic actions (look, + grab, drop, rotate) to show up when alt-clicking. + - soundadd: Changed the handling sounds for several material stacks to something + more fitting. + 2022-06-10: + PsyCommando: + - bugfix: Fixed how some tool interactions wouldn't play tool sounds. + 2022-06-15: + PsyCommando: + - tweak: Generic plants can now be cut. Trees can be chopped down with an axe. + - soundadd: Added several sound effects when dealing with generic plants. + 2022-06-16: + gyurka66: + - maptweak: Randomised Ministation Asteroid Field + 2022-06-20: + MistakeNot4892: + - tweak: GPS units now provide a visual compass to track each other. + 2022-06-22: + NataKilar: + - tweak: Network machinery now has lower tech requirements across the board. + - tweak: Network broadcasters now have their signal strength scale with the rating + of installed microlasers. + - rscadd: Computer networks are now able to communicate over PLEXUS. + - rscadd: Adds PLEXUS uplinks, machinery which allows devices to connect to PLEXUS + in conjunction with a PLEXUS repeater. + - tweak: Network signal simulation has been adjusted slightly. Connection strengths + should be comparable with old setups. + 2022-06-25: + MistakeNot4892: + - tweak: Species previews are no longer naked. + 2022-07-01: + MistakeNot4892: + - tweak: Construction skill will now speed up some tool interactions. + 2022-07-25: + PsyCommando: + - tweak: More things are now considered pens. Like the flashlight pen. diff --git a/tools/changelog/generate_cl.py b/tools/changelog/generate_cl.py index 2588286e3a8..e080f37b2ae 100644 --- a/tools/changelog/generate_cl.py +++ b/tools/changelog/generate_cl.py @@ -28,7 +28,7 @@ from ruamel import yaml from github import Github, InputGitAuthor -CL_BODY = re.compile(r"(:cl:|🆑)(.+)?\r?\n((.|\n|\r)+?)\r?\n\/(:cl:|🆑)", re.MULTILINE) +CL_BODY = re.compile(r"(:cl:|🆑)([^\r\n]+)?\r?\n([\s\S]+?)\r?\n\/(:cl:|🆑)", re.MULTILINE) CL_SPLIT = re.compile(r"(^\w+):\s+(\w.+)", re.MULTILINE) git_email = os.getenv("GIT_EMAIL") From 5d67f1ffffe6c47f01da1bb45876cf1760a168a5 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Thu, 28 Jul 2022 00:51:59 +0000 Subject: [PATCH 0224/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 87 +- html/changelogs/.all_changelog.yml | 14238 +-------------------------- 2 files changed, 10 insertions(+), 14315 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 6bc201078ef..4ba0814c33b 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,102 +53,23 @@

      25 July 2022

      -

      tag if you want to specify another name or several people. --> updated:

      -
        -
      • More things are now considered pens. Like the flashlight pen.
      • -
      - -

      01 July 2022

      -

      tag if you want to specify another name or several people. --> updated:

      -
        -
      • Construction skill will now speed up some tool interactions.
      • -
      - -

      25 June 2022

      -

      updated:

      -
        -
      • Species previews are no longer naked.
      • -
      - -

      22 June 2022

      -

      updated:

      -
        -
      • Network machinery now has lower tech requirements across the board.
      • -
      • Network broadcasters now have their signal strength scale with the rating of installed microlasers.
      • -
      • Computer networks are now able to communicate over PLEXUS.
      • -
      • Adds PLEXUS uplinks, machinery which allows devices to connect to PLEXUS in conjunction with a PLEXUS repeater.
      • -
      • Network signal simulation has been adjusted slightly. Connection strengths should be comparable with old setups.
      • -
      - -

      20 June 2022

      updated:

      • GPS units now provide a visual compass to track each other.
      - -

      16 June 2022

      -

      tag if you want to specify another name or several people. --> updated:

      -
        -
      • Randomised Ministation Asteroid Field
      • -
      - -

      15 June 2022

      -

      tag if you want to specify another name or several people. --> updated:

      -
        -
      • Generic plants can now be cut. Trees can be chopped down with an axe.
      • -
      • Added several sound effects when dealing with generic plants.
      • -
      - -

      10 June 2022

      -

      tag if you want to specify another name or several people. --> updated:

      -
        -
      • Fixed how some tool interactions wouldn't play tool sounds.
      • -
      - -

      06 June 2022

      -

      MistakeNot4892 updated:

      -
        -
      • Tajaran icon has been updated with new work from Azlan.
      • -
      -

      tag if you want to specify another name or several people. --> updated:

      -
        -
      • Added sound for some tool interactions with the axes and hatchets.
      • -
      • Config `expanded_alt_interactions` allows for various generic actions (look, grab, drop, rotate) to show up when alt-clicking.
      • -
      • Changed the handling sounds for several material stacks to something more fitting.
      • -
      - -

      05 June 2022

      -

      tag if you want to specify another name or several people. --> updated:

      -
        -
      • Fixed the TEG icon
      • -
      • Added SM to engineering
      • -
      • Removed 2 of 3 solars
      • -
      - -

      04 June 2022

      -

      tag if you want to specify another name or several people. --> updated:

      -
        -
      • Removes HULK, FAT and LASER mutations.
      • -
      - -

      03 June 2022

      -

      tag if you want to specify another name or several people. --> updated:

      -
        -
      • Airlock components panel now opens with wrench
      • -
      - -

      30 May 2022

      MistakeNot4892 updated:

      • Ported Skrell from Stella and added to the Bay alien roster.
      - -

      26 May 2022

      quardbreak updated:

      • Progress bars use gradient function for transit animation now.
      • Failure animation for progress bars has been removed.
      +

      tag if you want to specify another name or several people. --> updated:

      +
        +
      • Airlock components panel now opens with wrench
      • +
      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 9fc0a5c3634..d851883ee91 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -1,14238 +1,12 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. --- -2013-01-07: - Cael_Aislinn: - - tgs: Updated server to tgstation r5200 (November 26th, 2012), see https://code.google.com/p/tgstation13/source/list - for tg's changelog. - Chinsky: - - rscadd: 'Implants: Explosvie implant, exploding when victim hears the codephrase - you set.' - - rscadd: 'Implants: Compressed Matter implat, scan item (making it disappear), - inject yourself and recall that item on will!' - - rscadd: Implant removal surgery, with !!FUN!! results if you mess up it. - - rscadd: Coats now have pockets again. - - rscadd: Bash people on tabetops. an windows, or with stools. Grab people to bash - them on tables or windows (better grab for better hit on windows). Drag stool - sprite on you to pick it up, click on it in hand to make it usual stool again. - - rscadd: Surgical caps, and new sprites for bloodbags and fixovein. - - rscadd: Now some surgery steps will bloody your hands, Full-body blood coat in - case youy mess up spectacualry. - - rscadd: Ported some crates (Art, Surgery, Sterile equiplemnt). - - tweak: Changed contraband crates. Posters moved to Art Crate, cigs and lipstick - ot party crate. Now contraband crate has illegal booze and illicit drugs. - - bugfix: Finally got evac party lights - - bugfix: Now disfigurment,now it WILL happen when damage is bad enough. - - experiment: Now if you speak in depressurized area (less than 10 kPa) only people - next to you can hear you. Radios still work though. -2013-01-13: - Chinsky: - - tweak: If you get enough (6) blood drips on one tile, it'll turn into a blood - puddle. Should make bleeding out more visible. - - tweak: Security belt now able to hold taser, baton and tape roll. - - tweak: Added alternative security uniform to Security wardrobes. - - rscadd: 'Ported Urist cult runes. Down with the crayon drawings! Example: http://dl.dropbox.com/u/26846767/images/SS13/255_symbols.PNG' - - bugfix: Engineering tape now require engineer OR atmos access instead of both. - - rscadd: Implants now will react to EMP, possibly in !!FUN!! ways - GauHelldragon: - - rscadd: Servicebots now have RoboTray and Printing Pen. Robotray can be used to - pick up and drop food/drinks. Printing pen can alternate between writing mode - and rename paper mode by clicking it. - - rscadd: Farmbots. A new type of robot that weeds, waters and fertilizes. Use robot - arm on water tank. Then use plant analyzer, mini-hoe, bucket and finally proximity - sensor. - - rscadd: Chefs can clang their serving trays with a rolling pin. Just like a riot - shield! -2013-01-21: - Cael_Aislinn: - - bugfix: Satchels and ore boxes can now hold strange rocks. - - rscadd: Closets and crates can now be built out of 5 and 10 plasteel respectively. - - rscadd: Observers can become mice once more. -2013-01-23: - Cael_Aislinn: - - tgs: Updated server to tgstation r5200 (November 26th, 2012), see https://code.google.com/p/tgstation13/source/list - for tg's changelog. -2013-01-31: - CIB: - - bugfix: Chilis and cold chilis no longer kill in small amounts - - bugfix: Chloral now again needs around 5 units to start killing somebody -2013-02-13: - Erthilo: - - bugfix: Fixed SSD (logged-out) players not staying asleep. - - bugfix: Fixed set-pose verb and mice emotes having extra periods. - - bugfix: Fixed virus crate not appearing and breaking supply shuttle. - - bugfix: Fixed newcaster photos not being censored. -2013-02-14: - CIB: - - rscadd: Medical side-effects(patients are going to come back for secondary treatment) - - rscadd: NT loyalty setting(affects command reports and gives antags hints who - might collaborate with them) - - tweak: Simple animal balance fixes(They're slower now) - CaelAislinn: - - rscadd: Re-added old ion storm laws, re-added grid check event. - - rscadd: Added Rogue Drone and Vermin Infestation random events. - - rscadd: Added/fixed space vines random event. - - tweak: Updates to the virus events. - - tweak: Spider infestation and alien infestation events turned off by default. - - tweak: Soghun, taj and skrell all have unique language text colours. - - tweak: Moderators will no longer be listed in adminwho, instead use modwho. - Gamerofthegame: - - rscadd: Miscellaneous mapfixes. -2013-02-18: - Cael Aislinn: - - rscadd: Security bots will now target hostile mobs, and vice versa. - - tweak: Carp should actually emigrate now, instead of just immigrating then squatting - around the outer hull. - - tweak: Admins and moderators have been split up into separate 'who' verbs (adminwho - and modwho respectively). -2013-02-20: - Chinsky: - - rscadd: 'Added new surgery: putting items inside people. After you use retractor - to keep incision open, just click with any item to put it inside. But be wary, - if you try to fit something too big, you might rip the veins. To remove items, - use implant removal surgery.' - - rscadd: Crowbar can be used as alternative to retractor. - - rscadd: Can now unload guns by clicking them in hand. - - tweak: Fixed distance calculation in bullet missing chance computation, it was - always assuming 1 or 0 tiles. Now distace REALLY matters when you shoot. - - rscadd: To add more FUN to previous thing, bullets missed to not disappear but - keep going until they hit something else. - - bugfix: Compressed Matter and Explosive implants spawn properly now. - - tweak: 'Tweaks to medical effects: removed itch caused by bandages. Chemical effects - now have non-100 chance of appearing, the stronger medicine, the more probality - it''ll have side effects.' -2013-02-22: - Chinsky: - - tweak: Change to body cavity surgery. Can only put items in chest, groind and - head. Max size for item - 3 (chest), 2 (groin), 1 (head). For chest surgery - ribs should be bent open, (lung surgery until second scalpel step). Surgery - step needs preparation step, with drill. After that you can place item inside, - or seal it with cautery to do other step instead. -2013-02-23: - Cael Aislinn: - - wip: RUST machinery components should now be researchable (with high requirements) - and orderable through QM (with high cost). - - wip: Shield machinery should now be researchable (with high requirements) and - orderable through QM (with high cost). This one is reportedly buggy. - - tweak: Rogue vending machines should revert back to normal at the end of the event. - - rscadd: New Unathi hair styles. -2013-02-25: - Cael Aislinn: - - rscadd: As well as building hull shield generators, normal shield gens can now - be built (see http://baystation12.net/forums/viewtopic.php?f=1&t;=6993). - - rscadd: 'New random events: multiple new system wide-events have been have been - added to the newscaster feeds, some not quite as respectable as others.' - - rscadd: 'New random event: some lucky winners will win the TC Daily Grand Slam - Lotto, while others may be the target of malicious hackers.' -2013-02-27: - Gamerofthegame: - - rscadd: Added the (base gear) ERT preset for the debug command. - - rscadd: Map fixes, Virology hole fixed. Atmospheric fixes for mining and, to a - less extent, the science outpost. (No, not cycling airlocks) - - rscadd: Fiddled with the ERT set up location on Centcom. Radmins will now have - a even easier time equiping a team of any real pratical size, especially coupled - with the above debug command. -2013-03-05: - CIB: - - rscadd: Added internal organs. They're currently all located in the chest. Use - advanced scanner to detect damage. Use the same surgery as for ruptured lungs - to fix them. - Cael Aislinn: - - soundadd: Set roundstart music to randomly choose between space.ogg and traitor.ogg - (see http://baystation12.net/forums/viewtopic.php?f=5&t;=6972) - - experiment: All RUST components except for TEGs (which generate the power) are - now obtainable ingame, bored engineers should get hold of them and setup an - experimental reactor for testing purposes. -2013-03-06: - Cael Aislinn: - - rscadd: Type 1 thermoelectric generators and the associated binary circulators - are now moveable (wrench to secure/unsecure) and orderable via Quartermaster. - - wip: code/maps/rust_test.dmm contains an example setup for a functional RUST reactor. - Maximum output is in the range of 12 to 20MW (12 to 20 million watts). - - bugfix: Removed double announcement for gridchecks, reduced duration of gridchecks. - RavingManiac: - - rscadd: You can now stab people with syringes using the "harm" intent. This destroys - the syringe and transfers a random percentage of its contents into the target. - Armor has a 50% chance of blocking the syringe. -2013-03-09: - Cael Aislinn: - - rscadd: "Beekeeping is now possible. Construct an apiary of out wood and embed\ - \ it into a hydroponics tray, then get a queen bee and bottle of BeezEez from\ - \ cargo bay. \n\t\tHives produce honey and honeycomb, but be wary if the bees\ - \ start swarming." -2013-03-11: - CIB: - - rscadd: Cloning now requires you to put slabs of meat into the cloning pod to - replenish biomass. - Cael Aislinn: - - wip: The xenoarchaeology update is here. This includes a major content overhaul - and a bunch of new features for xenoarchaeology. - - tweak: Digsites (strange rock deposits) are now much more nuanced and interesting, - and a huge number of minor (non-artifact) finds have been added. - - rscadd: Excavation is now a complex process that involves digging into the rock - to the right depth. - - rscadd: Chemical analysis is required for safe excavation of the digsites, in - order to determine how best to extract the finds. - - bugfix: Anomalous artifacts have been overhauled and many longstanding bugs with - existing effects have been fixed - the anomaly utiliser should now work much - more often. - - rscadd: Numerous new artifact effects have been added and some new artifact types - can be dug up from the asteroid. - - rscadd: New tools and equipment have been added, including normal and spaceworthy - versions of the anomaly suits, excavation tools and other neat gadgets. - - rscadd: Five books have been written by subject matter experts from around the - galaxy to help the crew of the Exodus come to grips with this exacting new science - (over 3000 words of tutorials!). - Chinsky: - - rscadd: Sec HUDs now can see short versions of sec records.on examine. Med HUDs - do same for medical records, and can set medical status of patient. - - rscadd: Damage to the head can now cause brain damage. -2013-03-14: - Spamcat: - - rscadd: Figured I should make one of these. Syringestabbing now produces a broken - syringe complete with fingerprints of attacker and blood of a victim, so dispose - your evidence carefully. Maximum transfer amount per stab is lowered to 10. -2013-03-15: - Cael_Aislinn: - - rscadd: Mapped a compact research base on the mining asteroid, with multiple labs - and testing rooms. It's reachable through a new (old) shuttle dock that leaves - from the research wing on the main station. -2013-03-26: - Spamcat: - - bugfix: Chemmaster now puts pills in pill bottles (if one is inserted). - - tweak: Stabbing someone with a syringe now deals 3 damage instead of 7 because - 7 is like, a crowbar punch. - - bugfix: Lizards can now join mid-round again. - - rscadd: Chemicals in bloodstream will transfer with blood now, so don't get drunk - before your blood donation. Viruses and antibodies transfer through blood too. - - bugfix: Virology is working again. -2013-03-27: - Asanadas: - - tweak: The Null Rod has recovered its de-culting ability, for balance reasons. - Metagaming with it is a big no-no! - - rscadd: Holy Water as a liquid is able to de-cult. Less effective, but less bloody. - May be changed over the course of time for balance. -2013-04-04: - SkyMarshal: - - bugfix: Fixed ZAS - - bugfix: Fixed Fire - Spamcat: - - bugfix: Blood type is now saved in character creation menu, no need to edit it - manually every round. -2013-04-09: - SkyMarshal: - - bugfix: Fire Issues (Firedoors, Flamethrowers, Incendiary Grenades) fixed. - - bugfix: Fixed a bad line of code that was preventing autoignition of flammable - gas mixes. - - bugfix: Volatile fuel is burned up after a point. - - rscdel: Partial-tile firedoors removed. This is due to ZAS breaking when interacting - with them. -2013-04-11: - SkyMarshal: - - experiment: Fire has been reworked. - - experiment: In-game variable editor is both readded and expanded with fire controlling - capability. -2013-04-17: - SkyMarshal: - - experiment: ZAS is now more deadly, as per decision by administrative team. May - be tweaked, but currently AIRFLOW is the biggest griefer. - - experiment: World startup optimized, many functions now delayed until a player - joins the server. (Reduces server boot time significantly) - - tweak: Zones will now equalize air more rapidly. - - bugfix: ZAS now respects active magboots when airflow occurs. - - bugfix: Airflow will no longer throw you into doors and open them. - - bugfix: Race condition in zone construction has been fixed, so zones connect properly - at round start. - - bugfix: Plasma effects readded. - - bugfix: Fixed runtime involving away mission. -2013-04-24: - Jediluke69: - - rscadd: Added 5 new drinks (Kira Special, Lemonade, Brown Star, Milkshakes, Rewriter) - - tweak: Nanopaste now heals about half of what it used to - - tweak: Ballistic crates should now come with shotguns loaded with actual shells - no more beanbags - - bugfix: Iced tea no longer makes a glass of .what? - NerdyBoy1104: - - rscadd: 'New Botany additions: Rice and Plastellium. New sheet material: Plastic.' - - rscadd: Plastellium is refined into plastic by first grinding the produce to get - plasticide. 20 plasticide + 10 polytrinic acid makes 10 sheets of plastic which - can be used to make crates, forks, spoons, knives, ashtrays or plastic bags - from. - - rscadd: Rice seeds grows into rice stalks that you grind to get rice. 10 Rice - + 5 Water makes boiled rice, 10 rice + 5 milk makes rice pudding, 10 rice + - 5 universal enzyme (in beaker) makes Sake. - faux: - - imageadd: Mixed Wardrobe Closet now has colored shoes and plaid skirts. - - imageadd: Dress uniforms added to the Captain, RD, and HoP wardrobe closets. A - uniform jacket has also been added to the Captain's closet. HoS' hat has been - re-added to their closet. I do not love the CMO and CE enough to give them anything. - - imageadd: Atheletic closet now has five different swimsuits *for the ladies* in - them. If you are a guy, be prepared to be yelled at if you run around like a - moron in one of these. Same goes for ladies who run around in shorts with their - titties swaying in the space winds. - - imageadd: A set of dispatcher uniforms will spawn in the security closet. These - are for playtesting the dispatcher role. - - imageadd: New suit spawns in the laundry room. It's for geezer's only. You're - welcome, Book. - - imageadd: Nurse outfit variant, orderly uniform, and first responder jacket will - now spawn in the medical wardrobe closet. - - imageadd: 'A white wedding dress will spawn in the chaplain''s closet. There are - also several dresses currently only adminspawnable. Admins: Look either under - "bride" or "dress." The bride one leads to the colored wedding dresses, and - there are some other kinds of dresses under dress.' - - tweak: No more luchador masks or boxing gloves or boxing ring. You guys have a - swimming pool now, dip in and enjoy it. - - tweak: he meeting hall has been replaced with an awkwardly placed security office - meant for prisoner processing. - - tweak: Added a couple more welding goggles to engineering since you guys liked - those a lot. - - imageadd: Flasks spawn behind the bar. Only three. Don't fight over them. I don't - know how to add them to the bar vending machine otherwise I would have done - that instead. Detective, you have your own flask in your office, it's underneath - the cigarettes on your desk. - - tweak: Added two canes to the medical storage, for people who have leg injuries - and can't walk good and stuff. I do not want to see doctors pretending to be - House. These are for patients. Do not make me delete this addition and declare - you guys not being able to have nice things. - - tweak: Secondary entance to EVA now directly leads into the medbay hardsuit section. - Sorry for any inconviences this will cause. The CMO can now fetch the hardsuits - whenever they want. - - tweak: Secondary security hardsuit has been added to the armory. Security members - please stop stealing engineer's hardsuits when you guys want to pair up for - space travel. - - tweak: Firelocks have been moved around in the main hallways to form really ghetto - versions of airlocks. - - tweak: Violin spawns in theatre storage now. I didn't put the piano there though, - that was someone else. - - tweak: Psych office in medbay has been made better looking. -2013-05-14: - Cael_Aislinn: - - experiment: Depth scanners can now be used to determine what material archaeological - deposits are made of, meaning lab analysis is no longer required. - - tweak: Some useability issues with xenoarchaeology tools have been resolved, and - the transit pods cycle automatically now. -2013-05-15: - Spamcat: - - rscadd: Added telescopic batons - to HoS's and captain's lockers. These are quite robust and easily concealable. -2013-05-21: - SkyMarshal: - - experiment: ZAS will now speed air movement into/out of a zone when unsimulated - tiles (e.g. space) are involved, in relation to the number of tiles. - - experiment: Portable Canisters will now automatically connect to any portable - connecter beneath them on map load. - - bugfix: Bug involving mis-mapped disposal junction fixed - - bugfix: Air alarms now work for atmos techs (whoops!) - - bugfix: The Master Controller now properly stops atmos when it runtimes. - - bugfix: Backpacks can no longer be contaminated - - tweak: ZAS no longer logs air statistics. - - tweak: ZAS now rebuilds as soon as it detects a semi-complex change in geometry. (It - was doing this already, but in a convoluted way which was actually less efficient) - - tweak: General code cleanup/commenting of ZAS - - tweak: Jungle now initializes after the random Z-level loads and atmos initializes. -2013-05-25: - Erthilo: - - bugfix: Fixes alien races appearing an unknown when speaking their language. - - bugfix: Fixes alien races losing their language when cloned. - - bugfix: Fixes UI getting randomly reset when trying to change it in Genetics Scanners. -2013-05-26: - Chinsky: - - rscadd: Tentacles! Now clone damage will make you horribly malformed like examine - text says. - Meyar: - - rscadd: The syndicate shuttle now has a cycling airlock during Nuke rounds. - - rscadd: Restored the ability for the syndicate Agent ID to change the name on - the card (reforge it) more than once. - - rscadd: ERT Radio now functional again. - - rscadd: 'Research blast doors now actually lock down the entirety of station-side - Research. ' - - rscadd: 'Added lock down buttons to the wardens office. ' - - rscadd: 'The randomized barsign has made a return. ' - - rscadd: Syndicate Agent ID's external airlock access restored. - VitrescentTortoise: - - rscadd: Added a third option for not getting any job preferences. It allows you - to return to the lobby instead of joining. -2013-05-28: - Erthilo: - - bugfix: Fixes everyone being able to understand alien languages. HERE IS YOUR - TOWER OF BABEL - VitrescentTortoise: - - bugfix: Wizard's forcewall now works. -2013-05-30: - Segrain: - - bugfix: Meteor showers actually spawn meteors now. - - tweak: Engineering tape fits into toolbelt and can be placed on doors. - - rscadd: Pill bottles can hold paper. - Spamcat: - - tweak: Pill bottle capacity increased to 14 items. - - bugfix: Fixed Lamarr (it now spawns properly) - proliberate: - - rscadd: Station time is now displayed in the status tab for new players and AIs. -2013-05-31: - Segrain: - - bugfix: Portable canisters now properly connect to ports beneath them on map load. - - bugfix: Fixed unfastening gas meters. -2013-06-01: - Chinsky: - - rscadd: Bloody footprints! Now stepping in the puddle will dirty your shoes/feet - and make you leave bloody footprints for a bit. - - rscadd: Blood now dries up after some time. Puddles take ~30 minutes, small things - 5 minutes. - - bugfix: Untreated wounds now heal. No more toe stubs spamming you with pain messages - for the rest of the shift. - - experiment: On the other side, everything is healed slowly. Maximum you cna squeeze - out of first aid is 0.5 health per tick per organ. Lying down makes it faster - too, by 1.5x factor. - - rscadd: Lids! Click beaker/bottle in hand to put them on/off. Prevent spilling - - rscadd: Added 'hailer' to security lockers. If used in hand, says "Halt! Security!". - For those who can't run and type. -2013-06-05: - Chinsky: - - rscadd: Load bearing equipment - webbings and vests for engineers and sec. Attach - to jumpsuit, use 'Look in storage' verb (object tab) to open. - Segrain: - - rscadd: Exosuits now can open firelocks by walking into them. -2013-06-06: - Asanadas: - - rscadd: Added a whimsical suit to the head of personnel's secret clothing locker. - Meyar: - - bugfix: Disposal's mail routing fixed. Missing pipes replaced. - - bugfix: 'Chemistry is once again a part of the disposals delivery circuit. ' - - bugfix: Added missing sorting junctions to Security and HoS office. - - bugfix: Fixed a duplicate sorting junction. -2013-06-09: - Segrain: - - bugfix: Emagged supply console can order SpecOp crates again. -2013-06-11: - Meyar: - - bugfix: Fixes a security door with a firedoor ontop of it. - - bugfix: Fixed a typo relating to the admin Select Equipment Verb. (It's RESPONSE - team not RESCUE team) - - rscadd: ERT are now automated, from their spawn to their shuttle. Admin intervention - no longer required! (Getting to the mechs still requires admin permission generally) - - rscadd: Added flashlights to compensate for the weakened PDA lights - - tweak: 'ERT Uniforms updated to be in line with Centcom uniforms. No more turtlenecks, - no sir. ' -2013-06-12: - Zuhayr: - - rscadd: Added pneumatic cannon and harpoons. - - experiment: Added embedded projectiles. Bullets and thrown weapons may stick in - targets. Throwing them by hand won't make them stick, firing them from a cannon - might. Implant removal surgery will get rid of shrapnel and stuck items. -2013-06-13: - Kilakk: - - rscadd: Added the Xenobiologist job. Has access to the research hallway and to - xenobiology. - - rscdel: Removed Xenobiology access from Scientists. - - rscdel: Removed the Xenobiologist alternate title from Scientists. - - rscadd: Added "Xenoarchaeology" to the RD, Scientists, and to the ID computer. - - tweak: Changed the Research Outpost doors to use "Xenoarchaeology" access. -2013-06-18: - Segrain: - - bugfix: Fixed some bugs in windoor construction. - - tweak: Secure windoors are made with rods again. - - rscadd: Windoors drop their electronics when broken. Emagged windoors can have - theirs removed by crowbar. - - rscadd: Airlock electronics can be configured to make door open for any single - access on it instead of all of them. - - rscadd: Cyborgs can preview their icons before choosing. -2013-06-21: - Jupotter: - - bugfix: Fix the robotiscist preview in the char setupe screen -2013-06-22: - Cael_Aislinn: - - tweak: The xenoarchaeology depth scanner will now tell you what energy field is - required to safely extract a find. - - tweak: Excavation picks will now dig faster, and xenoarchaeology as a whole should - be easier to do. -2013-06-23: - Segrain: - - rscadd: Airlocks of various models can be constructed again. - faux: - - experiment: There has been a complete medbay renovation spearheaded by Vetinarix. - http://baystation12.net/forums/viewtopic.php?f=20&t;=7847 <-- Please - put any commentary good or bad, here. - - tweak: Some maintenance doors within RnD and Medbay have had their accesses changed. - Maintenance doors in the joint areas (leading to the research shuttle, virology, - and xenobiology) are now zero access. Which means anyone in those joints can - enter the maintenance tunnels. This was done to add additional evacuation locations - during radiation storms. Additional maintenance doors were added to the tunnels - in these areas to prevent docs and scientists from running about. - - tweak: Starboard emergency storage isn't gone now, it's simply located in the - escape wing. - - experiment: An engineering training room has been added to engineering. This location - was previously where surgery was located. If you are new to engineering or need - to brush up on your skills, please use this area for testing. -2013-06-26: - Segrain: - - bugfix: Autopsy scanner properly displays time of wound infliction and death. - - bugfix: Autopsy scanner properly displays wounds by projectile weapons. - Whitellama: - - bugfix: One-antag rounds (like wizard/ninja) no longer end automatically upon - death - - wip: Space ninja has been implemented as a voteable gamemode - - rscadd: Space ninja spawn landmarks have been implemented (but not yet placed - on the map), still spawn at carps-pawns instead. (The code will warn you about - this and ask you to report it, it's a known issue.) - - rscadd: Five new space ninja directives have been added, old directives have been - reworded to be less harsh - - wip: Space ninjas have been given their own list as antagonists, and are no longer - bundled up with traitors - - bugfix: Space ninjas with a "steal a functional AI" objective will now succeed - by downloading one into their suits - - tweak: Space ninja suits' exploding on death has been nerfed, so as not to cause - breaches - - rscadd: A few space ninja titles/names have been added and removed to be slightly - more believable - - bugfix: The antagonist selector no longer chooses jobbanned players when it runs - out of willing options -2013-06-27: - Segrain: - - bugfix: ID cards properly setup bloodtype, DNA and fingerprints again. -2013-06-28: - Segrain: - - rscadd: AIs are now able to examine what they see. -2013-07-03: - Segrain: - - rscadd: Security and medical cyborgs can use their HUDs to access records. -2013-07-05: - Spamcat: - - rscadd: Pulse! Humans now have hearbeat rate, which can be measured by right-clicking - someone - Check pulse or by health analyzer. Medical machinery also has heartbeat - monitors. Certain meds and conditions can influence it. -2013-07-06: - Chinsky: - - rscadd: Humans now can be infected with more than one virus at once. - - rscadd: All analyzed viruses are put into virus DB. You can view it and edit their - name and description on medical record consoles. - - tweak: 'Only known viruses (ones in DB) will be detected by the machinery and - HUDs. ' - - rscadd: Viruses cause fever, body temperature rising the more stage is. - - bugfix: Humans' body temperature does not drift towards room one unless there's - big difference in them. - - tweak: Virus incubators now can transmit viuses from dishes to blood sample. - - rscadd: New machine - centrifuge. It can isolate antibodies or viruses (spawning - virus dish) from a blood sample in vials. Accepts vials only. - - rscadd: Fancy vial boxes in virology, one of them is locked by ID with MD access. - - tweak: Engineered viruses are now ariborne too. -2013-07-11: - Chinsky: - - rscadd: Gun delays. All guns now have delays between shots. Most have less than - second, lasercannons and pulse rifles have around 2 seconds delay. Automatics - have zero, click-speed. -2013-07-26: - Kilakk: - - bugfix: Brig cell timers will no longer start counting down automatically. - - tweak: Separated the actual countdown timer from the timer controls. Pressing - "Set" while the timer is counting down will reset the countdown timer to the - time selected. -2013-07-28: - Segrain: - - rscadd: Camera console circuits can be adjusted for different networks. - - rscadd: Nuclear operatives and ERT members have built-in cameras in their helmets. - Activate helmet to initialize it. -2013-07-30: - Erthilo: - - bugfix: EFTPOS and ATM machines should now connect to databases. - - bugfix: Gravitational Catapults can now be removed from mechs. - - bugfix: Ghost manifest rune paper naming now works correctly. - - bugfix: Fix for newscaster special characters. Still not recommended. - Kilakk: - - rscadd: Added colored department radio channels. -2013-08-01: - Asanadas: - - tweak: The Null Rod has recovered its de-culting ability, for balance reasons. - Metagaming with it is a big no-no! - - rscadd: Holy Water as a liquid is able to de-cult. Less effective, but less bloody. - May be changed over the course of time for balance. - CIB: - - bugfix: Chilis and cold chilis no longer kill in small amounts - - bugfix: Chloral now again needs around 5 units to start killing somebody - Cael Aislinn: - - rscadd: Security bots will now target hostile mobs, and vice versa. - - tweak: Carp should actually emigrate now, instead of just immigrating then squatting - around the outer hull. - - tweak: Admins and moderators have been split up into separate 'who' verbs (adminwho - and modwho respectively). - CaelAislinn: - - rscadd: Re-added old ion storm laws, re-added grid check event. - - rscadd: Added Rogue Drone and Vermin Infestation random events. - - rscadd: Added/fixed space vines random event. - - tweak: Updates to the virus events. - - tweak: Spider infestation and alien infestation events turned off by default. - - tweak: Soghun, taj and skrell all have unique language text colours. - - tweak: Moderators will no longer be listed in adminwho, instead use modwho. - Cael_Aislinn: - - tgs: Updated server to tgstation r5200 (November 26th, 2012), see https://code.google.com/p/tgstation13/source/list - for tg's changelog. - Chinsky: - - rscadd: 'Old new medical features:' - - rscadd: Autoinjectors! They come preloaded with 5u of inapro, can be used instantly, - and are one-use. You can replace chems inside using a syringe. Box of them is - added to Medicine closet and medical supplies crate. - - rscadd: Splints! Target broken liimb and click on person to apply. Can be taken - off in inventory menu, like handcuffs. Splinted limbs have less negative effects. - - rscadd: Advanced medikit! Red and mean, all doctors spawn with one. Contains better - stuff - advanced versions of bandaids and aloe heal 12 damage on the first use. - - tweak: Wounds with damage above 50 won't heal by themselves even if bandaged/salved. - Would have to seek advanced medical attention for those. - Erthilo: - - bugfix: Fixed SSD (logged-out) players not staying asleep. - - bugfix: Fixed set-pose verb and mice emotes having extra periods. - - bugfix: Fixed virus crate not appearing and breaking supply shuttle. - - bugfix: Fixed newcaster photos not being censored. - Gamerofthegame: - - rscadd: Miscellaneous mapfixes. - GauHelldragon: - - rscadd: Servicebots now have RoboTray and Printing Pen. Robotray can be used to - pick up and drop food/drinks. Printing pen can alternate between writing mode - and rename paper mode by clicking it. - - rscadd: Farmbots. A new type of robot that weeds, waters and fertilizes. Use robot - arm on water tank. Then use plant analyzer, mini-hoe, bucket and finally proximity - sensor. - - rscadd: Chefs can clang their serving trays with a rolling pin. Just like a riot - shield! - Jediluke69: - - rscadd: Added 5 new drinks (Kira Special, Lemonade, Brown Star, Milkshakes, Rewriter) - - tweak: Nanopaste now heals about half of what it used to - - tweak: Ballistic crates should now come with shotguns loaded with actual shells - no more beanbags - - bugfix: Iced tea no longer makes a glass of .what? - Jupotter: - - bugfix: Fix the robotiscist preview in the char setupe screen - Kilakk: - - rscadd: Added the Xenobiologist job. Has access to the research hallway and to - xenobiology. - - rscdel: Removed Xenobiology access from Scientists. - - rscdel: Removed the Xenobiologist alternate title from Scientists. - - rscadd: Added "Xenoarchaeology" to the RD, Scientists, and to the ID computer. - - tweak: Changed the Research Outpost doors to use "Xenoarchaeology" access. - Meyar: - - rscadd: The syndicate shuttle now has a cycling airlock during Nuke rounds. - - rscadd: Restored the ability for the syndicate Agent ID to change the name on - the card (reforge it) more than once. - - rscadd: ERT Radio now functional again. - - rscadd: 'Research blast doors now actually lock down the entirety of station-side - Research. ' - - rscadd: 'Added lock down buttons to the wardens office. ' - - rscadd: 'The randomized barsign has made a return. ' - - rscadd: Syndicate Agent ID's external airlock access restored. - NerdyBoy1104: - - rscadd: 'New Botany additions: Rice and Plastellium. New sheet material: Plastic.' - - rscadd: Plastellium is refined into plastic by first grinding the produce to get - plasticide. 20 plasticide + 10 polytrinic acid makes 10 sheets of plastic which - can be used to make crates, forks, spoons, knives, ashtrays or plastic bags - from. - - rscadd: Rice seeds grows into rice stalks that you grind to get rice. 10 Rice - + 5 Water makes boiled rice, 10 rice + 5 milk makes rice pudding, 10 rice + - 5 universal enzyme (in beaker) makes Sake. - RavingManiac: - - rscadd: You can now stab people with syringes using the "harm" intent. This destroys - the syringe and transfers a random percentage of its contents into the target. - Armor has a 50% chance of blocking the syringe. - Segrain: - - bugfix: Meteor showers actually spawn meteors now. - - tweak: Engineering tape fits into toolbelt and can be placed on doors. - - rscadd: Pill bottles can hold paper. - SkyMarshal: - - bugfix: Fixed ZAS - - bugfix: Fixed Fire - Spamcat: - - rscadd: Figured I should make one of these. Syringestabbing now produces a broken - syringe complete with fingerprints of attacker and blood of a victim, so dispose - your evidence carefully. Maximum transfer amount per stab is lowered to 10. - VitrescentTortoise: - - rscadd: Added a third option for not getting any job preferences. It allows you - to return to the lobby instead of joining. - Whitellama: - - bugfix: One-antag rounds (like wizard/ninja) no longer end automatically upon - death - - wip: Space ninja has been implemented as a voteable gamemode - - rscadd: Space ninja spawn landmarks have been implemented (but not yet placed - on the map), still spawn at carps-pawns instead. (The code will warn you about - this and ask you to report it, it's a known issue.) - - rscadd: Five new space ninja directives have been added, old directives have been - reworded to be less harsh - - wip: Space ninjas have been given their own list as antagonists, and are no longer - bundled up with traitors - - bugfix: Space ninjas with a "steal a functional AI" objective will now succeed - by downloading one into their suits - - tweak: Space ninja suits' exploding on death has been nerfed, so as not to cause - breaches - - rscadd: A few space ninja titles/names have been added and removed to be slightly - more believable - - bugfix: The antagonist selector no longer chooses jobbanned players when it runs - out of willing options - Zuhayr: - - rscadd: Added pneumatic cannon and harpoons. - - experiment: Added embedded projectiles. Bullets and thrown weapons may stick in - targets. Throwing them by hand won't make them stick, firing them from a cannon - might. Implant removal surgery will get rid of shrapnel and stuck items. - faux: - - imageadd: Mixed Wardrobe Closet now has colored shoes and plaid skirts. - - imageadd: Dress uniforms added to the Captain, RD, and HoP wardrobe closets. A - uniform jacket has also been added to the Captain's closet. HoS' hat has been - re-added to their closet. I do not love the CMO and CE enough to give them anything. - - imageadd: Atheletic closet now has five different swimsuits *for the ladies* in - them. If you are a guy, be prepared to be yelled at if you run around like a - moron in one of these. Same goes for ladies who run around in shorts with their - titties swaying in the space winds. - - imageadd: A set of dispatcher uniforms will spawn in the security closet. These - are for playtesting the dispatcher role. - - imageadd: New suit spawns in the laundry room. It's for geezer's only. You're - welcome, Book. - - imageadd: Nurse outfit variant, orderly uniform, and first responder jacket will - now spawn in the medical wardrobe closet. - - imageadd: 'A white wedding dress will spawn in the chaplain''s closet. There are - also several dresses currently only adminspawnable. Admins: Look either under - "bride" or "dress." The bride one leads to the colored wedding dresses, and - there are some other kinds of dresses under dress.' - - tweak: No more luchador masks or boxing gloves or boxing ring. You guys have a - swimming pool now, dip in and enjoy it. - - tweak: he meeting hall has been replaced with an awkwardly placed security office - meant for prisoner processing. - - tweak: Added a couple more welding goggles to engineering since you guys liked - those a lot. - - imageadd: Flasks spawn behind the bar. Only three. Don't fight over them. I don't - know how to add them to the bar vending machine otherwise I would have done - that instead. Detective, you have your own flask in your office, it's underneath - the cigarettes on your desk. - - tweak: Added two canes to the medical storage, for people who have leg injuries - and can't walk good and stuff. I do not want to see doctors pretending to be - House. These are for patients. Do not make me delete this addition and declare - you guys not being able to have nice things. - - tweak: Secondary entance to EVA now directly leads into the medbay hardsuit section. - Sorry for any inconviences this will cause. The CMO can now fetch the hardsuits - whenever they want. - - tweak: Secondary security hardsuit has been added to the armory. Security members - please stop stealing engineer's hardsuits when you guys want to pair up for - space travel. - - tweak: Firelocks have been moved around in the main hallways to form really ghetto - versions of airlocks. - - tweak: Violin spawns in theatre storage now. I didn't put the piano there though, - that was someone else. - - tweak: Psych office in medbay has been made better looking. - proliberate: - - rscadd: Station time is now displayed in the status tab for new players and AIs. -2013-08-04: - Chinsky: - - rscadd: Health HUD indicator replaced with Pain indicator. Now health indicator - shows pain level instead of actual vitals level. Some types of damage contribute - more to pain, some less, usually feeling worse than they really are. -2013-08-08: - Erthilo: - - bugfix: Raise Dead rune now properly heals and revives dead corpse. - - bugfix: Admin-only rejuvenate verb now heals all organs, limbs, and diseases. - - bugfix: Cyborg sprites now correctly reset with reset boards. This means cyborg - appearances can now be changed without admin intervention. -2013-09-18: - Kilakk: - - rscadd: Fax machines! The Captain and IA agents can use the fax machine to send - properly formatted messages to Central Command. - - imageadd: Gave the fax machine a fancy animated sprite. Thanks Cajoes! -2013-09-24: - Snapshot: - - rscdel: Removed hidden vote counts. - - rscdel: Removed hiding of vote results. - - rscdel: Removed OOC muting during votes. - - rscadd: Crew transfers are no longer callable during Red and Delta alert. - - wip: Started work on Auto transfer framework. -2013-10-06: - Chinsky: - - rscadd: Return of dreaded side effects. They now manifest well after their cause - disappears, so curing them should be possible without them reappearing immediately. - They also lost last stage damaging effects. -2013-10-29: - Cael_Aislinn: - - rscadd: Xenoarchaeology's chemical analysis and six analysis machines are gone, - replaced by a single one which can be beaten in a minigame. - - rscadd: Sneaky traitors will find new challenges to overcome at the research outpost, - but may also find new opportunities (transit tubes can now be traversed). - - rscadd: Finding active alien machinery should now be made significantly easier - with the Alden-Saraspova counter. -2013-11-01: - Various: - - rscadd: Autovoting, Get off the station when your 15 hour workweek is done, thanks - unions! - - rscadd: Some beach props that Chinsky finds useless. - - wip: Updated NanoUI - - rscadd: Dialysis while in sleepers - removes reagents from mobs, like the chemist, - toss him in there! - - tweak: Pipe Dispensers can now be ordered by Cargo - - rscadd: Fancy G-G-G-G-Ghosts! -2013-11-23: - Ccomp5950: - - bugfix: Players are now no longer able to commit suicide with a lasertag gun, - and will feel silly for doing so. - - bugfix: Ghosts hit with the cult book shall now actually become visible. - - bugfix: The powercells spawned with Exosuits will now properly be named to not - confuse bearded roboticists. - - bugfix: Blindfolded players will now no longer require eye surgery to repair their - sight, removing the blindfold will be sufficient. - - rscadd: Atmospheric Technicians will now have access to Exterior airlocks. -2013-11-24: - Yinadele: - - experiment: Supermatter engine added! Please treat your new engine gently, and - report any strangeness! - - tweak: Rebalanced events so people don't explode into appendicitis or have their - organs constantly explode. - - rscadd: Vending machines have had bottled water, iced tea, and grape soda added. - - rscadd: Head reattachment surgery added! Sew heads back on proper rather than - monkey madness. - - rscadd: Pain crit rebalanced - Added aim variance depending on pain levels, nerfed - blackscreen severely. - - rscadd: 'Cyborg alt titles: Robot, and Android added! These will make you spawn - as a posibrained robot. Please enjoy!' - - bugfix: Fixed the sprite on the modified welding goggles, added a pair to the - CE's office where they'll be used. - - bugfix: Fixed atmos computers- They are once again responsive! - - tweak: Added in functionality proper for explosive implants- You can now set their - level of detonation, and their effects are more responsively concrete depending - on setting. - - rscadd: Hemostats re-added to autolathe! - - rscadd: Added two manuals on atmosia and EVA, by MagmaRam! Found in engineering - and the engineering bookcase. - - bugfix: Fixed areas in medbay to have fully functional APC sectors. - - rscadd: Girders are now lasable. - - experiment: Please wait warmly, new features planned for next merge! -2013-12-01: - 'Various Developers banged their keyboards together:': - - rscadd: New Engine, the supermatter, figure out what a cooling loop is, or don't - and blow up engineering! - - rscadd: Each department will have it's own fax, make a copy of your butt and fax - it to the admins! - - rscadd: Booze and soda dispensers, they are like chemmasters, only with booze - and soda! - - rscadd: Bluespace and Cryostasis beakers, how do they work? Fuggin bluespace - how do they work? - - rscadd: You can now shove things into vending machines, impress your friends on - how things magically disappear out of your hands into the machine! - - rscadd: Robots and Androids (And gynoids too!) can now use custom job titles - - bugfix: Various bugfixes -2013-12-18: - RavingManiac: - - rscadd: Mousetraps can now be "hidden" through the right-click menu. This makes - them go under tables, clutter and the like. The filthy rodents will never see - it coming! - - tweak: Monkeys will no longer move randomly while being pulled. -2014-01-01: - Various: - - rscadd: AntagHUD and MedicalHUD for ghosts, see who the baddies are, check for - new configuration options. - - rscadd: Ghosts will now have bold text if they are in the same room as the person - making conversations easier to follow. - - rscadd: New hairstyles! Now you can use something other then hotpink floor length - braid. - - wip: DNA rework, tell us how you were cloned and became albino! - - rscadd: Dirty floors, so now you know exactly how lazy the janitors are! - - rscadd: A new UI system, feel free to color it yourself, don't set it to completely - clear or you will have a bad time. - - rscadd: Cryogenic storage, for all your SSD needs. - - rscadd: New hardsuits for those syndicate tajaran -2014-02-01: - Various: - - rscadd: NanoUI for PDA - - rscadd: Write in blood while a ghost in cult rounds with enough cultists - - rscadd: Cookies, absurd sandwiches, and even cookable dioanae nymphs! - - rscadd: A bunch of new guns and other weapons - - rscadd: Species specific blood -2014-02-19: - Aryn: - - experiment: New air model. Nothing should change to a great degree, but temperature - flow might be affected due to closed connections not sticking around. -2014-03-01: - Various: - - rscadd: Paint Mixing, red and blue makes purple! - - rscadd: New posters to tell you to respect those darned cat people - - rscadd: NanoUI for APC's, Canisters, Tank Transfer Valves and the heaters / coolers - - tweak: PDA bombs are now less annoying, and won't always blow up / cause internal - bleeding - - tweak: Blob made less deadly - - rscadd: Objectiveless Antags now a configuration option, choose your own adventure! - - wip: Engineering redesign, now with better monitoring of the explodium supermatter! - - rscadd: Security EOD - - rscadd: New playable race, IPC's, go beep boop boop all over the station! - - rscadd: Gamemode autovoting, now players don't have to call for gamemode votes, - it's automatic! -2014-03-05: - RavingManiac: - - rscadd: Smartfridges added to the bar, chemistry and virology. No more clutter! - - rscadd: A certain musical instrument has returned to the bar. - - rscadd: There is now a ten second delay between ingesting a pill/donut/milkshake - and regretting it. -2014-03-10: - Chinsky: - - rscadd: Viruses now affect certain range of species, different for each virus - - tweak: Spaceacilline now prevents infection, and has a small chance to cure viruses - at Stage 1. It does not give them antibodies though, so they can get sick again! - - tweak: Biosuits and spacesuits now offer more protection against viruses. Full - biosuit competely prevents airborne infection, when coupled with gloves they - both protect quite well from contact ones - - rscadd: Sneezing now spreads viruses in front of mob. Sometimes he gets a warning - beforehand though -2014-03-30: - RavingManiac: - - rscadd: Inflatable walls and doors added. Useful for sealing off hull breaches, - but easily punctured by sharp objects and Tajarans. -2014-04-06: - RavingManiac: - - tweak: Tape recorders and station-bounced radios now work inside containers and - closets. -2014-04-11: - Jarcolr: - - rscadd: You can now flip coins like a D2 - - tweak: Miscellaneous cargo crates got a tiny buff, Standard Costume crate is now - Costume Crate - - tweak: Grammar patch,telekinesis/amputated arm exploit fixes,more in the future - - tweak: Grille kicking now does less damage - - tweak: TELESCOPIC baton no longer knocks anybody down,still got a lot of force - though - - tweak: Other small-ish changes and fixes that aren't worth mentioning -2014-04-25: - Various: - - rscadd: Overhauled saycode, you can now use languages over the radio. - - rscadd: Chamelon items beyond just the suit. - - rscadd: NanoUI Virology - - rscadd: 3D Sounds - - rscadd: AI Channel color for when they want to be all sneaky - - rscadd: New inflatable walls and airlocks for your breach sealing pleasure. - - rscadd: Carbon Copy papers, so you can subject everyone to your authority and - paperwork, but mainly paperwork - - rscadd: Undershirts and rolling down jumpsuits - - rscadd: Insta-hit tasers, can be shot through glass as well. - - rscadd: Changeling balances, an emphasis put more on stealth. - - rscdel: Genetics disabled - - rscdel: Telescience removed, might be added again when we come up with a less - math headache enducing version of it. - - bugfix: Bugfixes galore! -2014-04-29: - HarpyEagle: - - rscadd: Webbing vest storage can now be accessed by clicking on the item in inventory - - rscadd: Holsters can be accessed by clicking on them in inventory - - rscadd: Webbings and other suit attachments are now visible on the icon in inventory - - tweak: Removing jumpsuits now requires drag and drop to prevent accidental undressing - - rscadd: Added an action icon for magboots that can be used to toggle them similar - to flashlights - - rscadd: Fuel tanks now spill fuel when wrenched open -2014-05-03: - Cael_Aislinn: - - rscadd: "Coming out of nowhere the past few months, the Garland Corporation has\ - \ made headlines with a new prehistoric theme park delighting travellers with\ - \ species thought extinct. Now available for research stations everywhere is\ - \ the technology that made it all possible! Features include:
      \n\t\t\t-\ - \ 13 discoverable prehistoric species to clone from fossils (including 5 brand\ - \ new ones).
      \n\t\t\t- 11 discoverable prehistoric plants to clone from fossils\ - \ (including 9 brand new ones).
      \n\t\t\t- New minigame that involves correctly\ - \ ordering the genomes inside each genetic sequence to unlock an animal/plant.
      \n\ - \t\t\t- Some prehistoric animals and plants may seem strangely familiar... while\ - \ others may bring more than the erstwhile scientist bargains for.
      \n




      " -2014-05-06: - Hubble: - - rscadd: Clip papers together by hitting a paper with a paper or photo - - imageadd: Adds icons for copied stamps -2014-05-16: - HarpyEagle: - - rscadd: Silicon mob types (AI, cyborgs, PAI) can now speak certain species languages - depending on type and module - - rscadd: Languages can now be whispered when using the language code with either - the whisper verb or the whisper speech code -2014-05-23: - Hubble: - - rscadd: Personal lockers are now resettable - - rscadd: Take off people's accessories or change their sensors in the drag and - drop-interface - - rscadd: Merge paper bundles by hitting one with another - - tweak: Line breaks in Security, Medical and Employment Records - - tweak: Record printouts will have names on it - - tweak: Set other people's internals in belt and suit storage slots - - bugfix: No longer changing suit sensors while cuffed - - bugfix: No longer emptying other people's pockets when they are not full yet -2014-05-28: - Chinsky: - - rscadd: Adds few new paperBBcode tags, to make up for HTML removal. - - rscadd: '[logo] tag draws NT logo image (one from wiki).' - - rscadd: '[table] [/table] tags mark borders of tables. [grid] [/grid] are borderless - tables, useful of making layouts. Inside tables following tags are used: [row] - marks beginning of new table row, [cell] - beginning of new table cell.' -2014-05-31: - Jarcolr: - - rscadd: 21 New cargo crates, go check them out! - - rscadd: Peanuts have now been added, food items are now being developed. - - rscadd: 2 new cargo groups, Miscellaneous and Supply. - - rscadd: Sugarcane seeds can now be gotten from the seed dispenser. - - rscadd: 5 new satchels when selecting "satchel" for RD, scientist, botanist, virologist, - geneticist (disabled) and chemist. - - rscadd: Clicking on a player with a paper/book when you have the eyes selected - shows them the book/paper forcefully. -2014-06-03: - Hubblenaut: - - rscadd: Added wheelchairs - - tweak: Replaced stool in Medical Examination with wheelchair - - tweak: Using a fire-extinguisher to propel you on a chair can have consequences - (drive into walls and people, do it!) -2014-06-13: - HarpyEagle: - - rscadd: Added docking ports for shuttles - - rscadd: Shuttle airlocks will automatically open and close, preventing people - from being sucked into space by because someone on another z-level called a - shuttle - - rscadd: Some docking ports can also double as airlocks - - rscadd: Docking ports can be overriden to prevent any automatic action. Shuttles - will wait for players to open/close doors manually - - rscadd: Shuttles can be forced launched, which will make them not wait for airlocks - to be properly closed -2014-06-15: - HarpyEagle: - - bugfix: Fixed wound autohealing regardless of damage amount. The appropriate wound - will now be assigned correctly based on damage amount and type - - bugfix: Fixed several other bugs related wounds that resulted in damage magically - disappearing - - bugfix: Fixed various sharp objects not being counted as sharp, bullets in particular - - bugfix: Fixed armour providing more protection from bullets than it was supposed - to -2014-06-19: - Chinsky: - - rscadd: Adds guest terminals on the map. These wall terminals let anyone issue - temporary IDs. Only access that issuer has can be granted, and maximum time - pass can be issued for is 20 minutes. All operations are logged in terminals. -2014-06-20: - Cael_Aislinn: - - rscadd: 'New discoverable items added to xenoarchaeology, and new features for - some existing ones. Artifact harvesters can now harvest the secondary effect - of artifacts as well as the primary one.
      - -
      ' - - tweak: 'Artifact utilisers should be much nicer/easier to use now.
      - -
    • Alden-Saraspova counters and talking items should work properly - now.
      - -
    • - -
      ' -2014-07-01: - Various: - - experiment: Hardsuit breaching. - - experiment: Rewritten fire. - - experiment: Supermatter now glows and sucks things into it as it approaches criticality. - - rscadd: Station Vox (Vox pariahs) are now available. - - rscadd: Wheelchairs. - - rscadd: Cargo Trains. - - rscadd: Hardsuit cycler machinery. - - rscadd: Rewritten lighting (coloured lights!) - - rscadd: New Mining machinery and rewritten smelting. - - rscadd: Rewritten autolathe - - rscadd: Mutiny mode. - - rscadd: NanoUI airlock and docking controllers. - - rscadd: Completely rewritten shuttle code. - - rscadd: 'Derelict Z-level replacement: construction site.' - - rscadd: Computer3 laptops. - - rscadd: Constructable SMES units. - - rscadd: Omni-directional atmos machinery. - - rscadd: Climbable tables and crates. - - rscadd: Xenoflora added to Science. - - rscadd: Utensils can be used to eat food. - - rscadd: Decks of cards are now around the station. - - rscadd: Service robots can speak languages. - - wip: Xenoarch updates and fixes. - - tweak: Rewritten species-specific gear icon handling. - - tweak: Cats and borers can be picked up. - - tweak: Botanist renamed to Gardener. - - tweak: Hydroponics merged with the Kitchen. - - tweak: Latejoin spawn points (Arrivals, Cryostorage, Gateway). - - rscadd: Escape pods only launch automatically during emergency evacuations - - rscadd: Escape pods can be made to launch during regular crew transfers using - the control panel inside the pod, or by emagging the panel outside the pod - - rscadd: When swiped or emagged, the crew transfer shuttle can be delayed in addition - to being launched early -2014-07-06: - HarpyEagle: - - rscadd: Re-enabled and rewrote the wound infection system - - rscadd: Infections can be prevented by properly bandaging and salving wounds - - rscadd: Infections are cured by spaceacillin -2014-07-20: - PsiOmegaDelta: - - rscadd: AI can now store up to five camera locations and return to them when desired. - - rscadd: AI can now alt+left click turfs in camera view to list and interact with - the objects. - - rscadd: AI can now ctrl+click turret controls to enable/disable turrets. - - rscadd: AI can now alt+click turret controls to toggle stun/lethal mode. - - rscadd: AI can now select which channel to state laws on. -2014-07-26: - Whitellama: - - rscadd: Added dynamic flavour text. - - bugfix: Fixed bug with suit fibers and fingerprints. -2014-07-31: - HarpyEagle: - - tweak: Stun batons now work like tasers and deal agony instead of stun - - rscadd: Being hit in the hands with a stun weapon will cause whatever is being - held to be dropped - - tweak: Handcuffs now require an aggressive grab to be used -2014-08-02: - Whitellama: - - bugfix: Arcane tomes can now be stored on bookshelves. - - bugfix: Dionaea players no longer crash on death, and now become nymphs properly. -2014-08-05: - HarpyEagle: - - tweak: Atmos Rewrite. Many atmos devices now use power according to their load - and gas physics - - rscadd: Pressure regulator device. Replaces the passive gate and can regulate - input or output pressure - - rscadd: Gas heaters and gas coolers are now constructable and can be upgraded - with parts from research - - bugfix: Fixes recharger and cell charger power draw. Rechargers draw 15 kW, wall - chargers draw 25 kW, and heavy-duty cell chargers draw 40 kW. Cyborg charging - stations draw 75 kW. - - bugfix: Laptops, and various other machines, now draw more reasonable amounts - of power - - bugfix: Machines will periodically update their powered status if moved from a - powered to an unpowered area and vice versa -2014-08-27: - Whitellama: - - bugfix: Made destination taggers more intuitive so you know when you've tagged - something - - rscadd: Ported package label and tag sprites - - rscadd: Ported using a pen on a package to give it a title, or to write a note - - rscadd: Donut boxes and egg boxes can be constructed out of cardboard -2014-08-31: - Whitellama: - - bugfix: Matches and candles can be used to burn papers, too. - - bugfix: Observers have a bit more time (20 seconds, instead of 7.5) before the - Diona join prompt disappears. -2014-09-05: - RavingManiac: - - experiment: 'NewPipe implemented: Supply and scrubber pipes can be run in parallel - without connecting to each other.' - - rscadd: Supply pipes will only connect to supply pipes, vents and Universal Pipe - Adapters(UPAs). - - rscadd: Scrubber pipes will only connect to scrubber pipes, scrubbers and UPAs. - - rscadd: UPAs will connect to regular, scrubber and supply pipes. -2014-09-20: - HarpyEagle: - - bugfix: Fixes evidence bags and boxes eating each other. Evidence bags now store - items by dragging the bag onto the item to be stored. -2014-09-28: - Gamerofthegame: - - rscadd: Hoverpods fully supported, currently orderable from cargo. Two slots, - three cargo, space flight and a working mech for all other intents and purposes. - - rscadd: Added the Rigged laser and Passenger Compartment equipment. The rigged - laser is a weapon for working exosuits - just a ordinary laser, but with triple - the cool down and rather power inefficient. The passenger compartment allows - other people to board and hitch a ride on the mech - such as in fire rescue - or for space flight. - Zuhayr: - - rscadd: Organs can now be removed and transplanted. - - tweak: Brain surgery is now the same as chest surgery regarding the steps leading - up to it. - - tweak: Appendix and kidney now share the groin and removing the first will prevent - appendicitis. - - tweak: Lots of backend surgery/organ stuff, see the PR if you need to know. -2014-10-01: - RavingManiac: - - rscadd: Zooming with the sniper rifle now adds a view offset in the direction - you are facing. - - rscadd: Added binoculars - functionally similar to sniper scope. Adminspawn-only - for now. - - rscadd: Bottles from chemistry now, like beakers, use chemical overlays instead - of fixed sprites. - - rscadd: Being in space while not magbooted to something will cause your sprite - to bob up and down. - Zuhayr: - - rscadd: Added species organ checks to several areas (phoron burn, welder burn, - appendicitis, vox cortical stacks, flashes). - - rscadd: Added VV option to add or remove organs. - - rscadd: Added simple bioprinter (adminspawn). - - rscadd: Added smashing/slashing behavior from xenos to some unarmed attacks. - - rscadd: Added some new state icons for diona nymphs. - - rscadd: Added borer husk functionality (cortical borers can turn dead humans into - zombies). - - rscadd: Added tackle verb. - - rscadd: Added NO_SLIP. - - rscadd: Added species-specific orans to Dionaea, new Xenomorphs and vox. - - rscadd: Added colour and species to blood data. - - rscadd: Added lethal consequences to missing your heart. - - rscdel: Removed robot_talk_understand and alien_talk_understand. - - rscdel: Removed attack_alien() and several flavours of is_alien() procs. - - rscdel: Removed /mob/living/carbon/alien/humanoid. - - rscdel: Removed alien_hud(). - - rscdel: Removed IS_SLOW, NEEDS_LIGHT and RAD_ABSORB. - - rscdel: Renamed is_larva() to is_alien(). - - tweak: Refactored a ton of files, either condensing or expanding them, or moving - them to new directories. - - tweak: Refactored some attack vars from simple_animal to mob/living level. - - tweak: Refactored internal organs to /mob/living/carbon level. - - tweak: Refactored rad and light absorbtion to organ level. - - tweak: Refactored brains to /obj/item/organ/brain. - - tweak: Refactored a lot of blood splattering to use blood_splatter() proc. - - tweak: Refactored broadcast languages (changeling and alien hiveminds, drone and - binary chat) to actual languages. - - tweak: Refactored xenomorph abilities to work for humans. - - tweak: Refactored xenomorphs into human species. - - tweak: Rewrote larva_hud() and human_hud(). The latter now takes data from the - species datum. - - tweak: Rewrote diona nymphs as descendents of /mob/living/carbon/alien. - - tweak: Rewrote xenolarva as descendents of /mob/living/carbon/alien. - - tweak: Rewrote /mob/living/carbon/alien. - - tweak: Moved alcohol and toxin processing to the liver. - - tweak: Moved drone light proc to robot level, added integrated_light_power and - local_transmit vars to robots. - - tweak: Moved human brainloss onto the brain organ. - - tweak: Shuffled around and collapsed several redundant procs down to carbon level - (hide, ventcrawl, Bump). - - tweak: Fixed species swaps from NO_BLOOD to those with blood killing the subject - instantly. -2014-11-01: - PsiOmegaDelta: - - bugfix: Adds the last missing step to deconstruct fire alarms. Apply wirecutters. - - rscadd: There's a "new" mining outpost nearby the Research outpost. - - rscadd: Manifest ghosts now have spookier names. - - rscadd: Adds a gas monitor computer for the toxin mixing chamber. - - rscadd: AI can now change the display of individual AI status screens. - - rscadd: More ion laws.. - - rscadd: All turrets have been replaced with portable variants. Potential targets - can be configured on a per turret basis. - - bugfix: Improved crew monitor map positioning. - - rscadd: Can now order plastic, body-, and statis bags from cargo - - rscadd: PDAs now receive newscasts. - - rscadd: (De)constructable emergency shutters. - - rscadd: Borgs can now select to simply state their laws or select a radio channel, - same as the AI. -2014-11-04: - TwistedAkai: - - rscadd: Almost any window which has been fully unsecured can now be dismantled - with a wrench. -2014-11-08: - PsiOmegaDelta: - - rscadd: Service personnel now have their own frequency to communicate over. Use - "say :v". - - rscadd: The AI can now has proper quick access to its private channel. Use "say - :o". - - rscadd: Newscasters supports photo captions. Simply pen one on the attached photo. - - rscadd: Once made visible by a cultist ghosts can toggle visiblity at will. - - rscadd: Detonating cyborgs using the cyborg monitor console now notifies the master - AI, if any. - - rscadd: More machinery, such as APCs, air alarms, etc., now support attaching - signalers to the wires. - - tweak: Random event overhaul. Admins may wish check the verb "Event Manager Panel". -2014-11-22: - Zuhayr: - - rscadd: Added the /obj/item/rig class - back-mounted deployable hardsuits. - - rscadd: Replaced existing hardsuits with 'voidsuits', functionally identical. - - rscdel: Removed the mounted device and helmet/boot procs from voidsuits. - - tweak: Refactored a shit-ton of ninja code into the new rig class. - - wip: This is more than likely going to take a lot of balancing to get into a good - place. -2015-01-09: - Zuhayr: - - tweak: Voice changers no longer use ID cards. They have Toggle and Set Voice verbs - on the actual mask object now. - - rscadd: Readded moonwalking. Alt-dir to face new dir, or Face-Direction verb to - face current dir. -2015-02-04: - RavingManiac: - - rscadd: Holodeck is now bigger and better, with toggleable gravity and a new courtroom - setting - TwistedAkai: - - bugfix: Purple Combs should now be visible and have their proper icon -2015-02-12: - Daranz: - - rscadd: Vending machines now use NanoUI and accept cash. The vendor account can - now be suspended to disable all sales in all machines on station. -2015-02-16: - RavingManiac: - - rscadd: Say hello to the new Thermoelectric Supermatter Engine. Read the operating - manual to get started. -2015-02-18: - PsiOmegaDelta: - - rscadd: Synths now have timestamped radio and chat messages. - - rscadd: New and updated uplink items. - - rscadd: Multiple AIs can now share the same holopad. - - rscadd: The AI now has built-in consoles, accessible from the subsystem tab. -2015-02-24: - Zuhayr: - - experiment: Major changes to the kitchen and hydroponics mechanics. Review the - detailed changelog here, -2015-04-07: - RavingManiac: - - tweak: You can now pay vending machines and EFTPOS scanners without removing your - ID from your PDA or wallet. Clicking on the vending machine with your ID/PDA/wallet/cash - also brings up the menu now instead of attacking the vending machine. -2015-04-18: - PsiOmegaDelta: - - rscadd: Added a changelog editing system that should cause fewer conflicts and - more accurate timestamps. -2015-04-23: - Dennok: - - rscadd: Added an automatic pipelayer. - - rscadd: Added an automatic cablelayer. - PsiOmegaDelta: - - bugfix: Shower curtains no longer lose their default color upon being washed. - - bugfix: Emergency shutters can again be examined, and from the proper distance. - - bugfix: The virus event will now only infect mobs on the station, currently controlled - by player that has been active in the last 5 minutes. - - bugfix: Laptops now use the proper proc for checking camera status. - - rscadd: Makes it possible to eject PDA cartridges using a verb. - - rscadd: Makes it possible to shake tables with one's bare hands to stop climbers. - - bugfix: Added a mass driver door in disposals to prevent trash from floating out - into space before proper ejection. - - rscadd: Rig/Hardsuit module tab - Less informative than the NanoUI hardsuit interface - but allows quicker access to the various rig modules. - - rscadd: Silicons with the medical augmentation sensors enabled now also see alive/dead - status if sensors are set accordingly. - - rscadd: Emergency shutters opened by silicons are now treated as having been forced - open by a crowbar. - - rscadd: An active AI chassis can now be pushed, just as an empty chassis can be. - - rscadd: The AI can now use the crew monitor console to track crew members with - full sensors enabled. - - rscadd: The AI now has a shortcut to track people holding up messages to cameras. - - rscadd: The AI now has a shortcut to track people sending PDA messages. - - rscadd: Multiple AIs can now share the same holopad. - - rscadd: Admin ghosts can now transfer other ghosts into mobs by drag-clicking. - - rscadd: Ghosts can now toggle seeing darkness and other ghosts separately. - - rscadd: Moving while dead now auto-ghosts you. - - rscadd: 'Two new random events: Space dust and gravitation failure.' - - rscadd: Upgraded wizard spell interface and new spells. - - rscadd: More uplink items. - - rscadd: Uplink items now have rudimentary descriptions. - Yoshax: - - tweak: Adjusts fruits and other stuff to have a minmum of 10 units of juice and - stuff. -2015-04-24: - Dennok: - - bugfix: Fixes overmap ship speed calculations. - - rscadd: Adds overmap ship rotation. - - rscadd: Added a floorlayer. -2015-04-28: - Jarcolr: - - rscadd: Added 9 new bar sign designs/sprites. - Kelenius: - - rscadd: 'Good news to the roboticists! The long waited firmware update for the - bots has arrived. You can expect the following changes:' - - rscadd: Medbots have improved the disease detection algorithms. - - rscadd: Floorbot firmware has been bugtested. In particular, they will no longer - get stuck near the windows, hopelessly trying to fix the floor under the glass. - - rscadd: Floorbots have also received an internal low-power metal synthesizer. - They will use it to make their own tiles. Slowly. - - rscadd: Following the complains from humanitarian organizations regarding securitron - brutality, stength of their stunners has been toned down. They will also politely - demand that you get on the floor before arresting you. Except for the taser-mounted - guys, they will still tase you down. - - rscadd: Other minor fixes. - - rscdel: 'The lasertag bots are now forbidden to build and use following the incident - #1526672. Please don''t let it happen again.' - - rscadd: The farmbot design has been finished! Made from a watertank, robot arm, - plant analyzer, bucket, minihoe and a proximity sensor, these small (not really) - bots will be a useful companion to any gardener and/or xenobotanist. - - tweak: 'Spider learning alert: they have learned to recognize the bots and will - mercilessly attack them.' - - rscadd: An experimental CPU upgrade would theoretically allow any of the bots - to function with the same intelligence capacity as the maintenance drones. We - still have no idea what causes it to boot up. Science! - - rscadd: 'INCOMING TRANSMISSION: Greetings to agents, pirates, operatives, and - anyone who otherwise uses our equipment. Following the NT update of bot firmware, - we have updated the cryptographic sequencer''s hacking routines as well. The - medbots you emag will not poison you anymore, the clanbots won''t clean after - themselves immediately, and floorbots... wear a space suit. Oh, and it works - on the new farmbots, too.' - PsiOmegaDelta: - - rscadd: Beware. Airlocks can now crush more things than just mobs. - - rscadd: AIs now have a personal atmospherics control subsystem. - - rscadd: Some borg modules now have additional subsystems. - - tweak: Improves borg module handling. - - tweak: Secure airlocks now buzz when access is denied. - - tweak: The mental health office door now requires psychiatrist access, and the - related button now opens/closes the door instead of bolting. - - soundadd: Restores an old soundtrack 'Thunderdome.ogg'. - - rscadd: Some holodeck programs now have custom ambience tracks. - RavingManiac: - - rscadd: The phoron research lab has been renovated to include a heat-exchange - system, a gas mixer/filter and a waste gas disposal pump. - - tweak: Candles now burn for about 30 mintutes. - Yoshax: - - tweak: Adds items to the orderable antag surgical kit so its actually useful for - surgery. - - tweak: Adjusts custom loadout costs to be more standardised and balances. Purely - cosmetic items, shoes, hats, and all things that do not provide a straight advtange - (sterile mask, or pAI, protection from viruses and possible door hacking or - records access, respectively), each cost 1 point, items that provide an advantage - like those just mentioned, or provide armor or storage cost 2 points. - - rscadd: Adds practice rounds, both .45 for Sec and Detective's guns, also 9mm - top mounted for the Saber, and for the Bulldog. - - rscadd: Adds the .45 and 9mm practice rounds to the armory. - - rscadd: Adds all the practice rounds to the autolathe. - - tweak: Adds r_walls to the back of the firing range, leaves the sides normal. - - bugfix: Fixes HoS' office door to not be CMO locked. -2015-04-29: - Daranz: - - rscadd: Paper bundles can now have papers inserted at arbitrary points. This can - be done by clicking the previous/next page links with a sheet of paper in hand. - HarpyEagle: - - rscadd: 'Added new fire modes to various guns: c20r, STS-35, WT-550, Z8, L6 SAW, - and double barreled shotgun. The firing modes work the same way as the egun; - click on the weapon with it in your active hand to cycle between modes. Unloading - these weapons now requires that you click on them with an empty hand.' - PsiOmegaDelta: - - rscadd: Portable atmospheric pumps and scrubbers now use NanoUI. - - rscadd: Two new events which will cause damage to APCs or cameras when triggered. -2015-04-30: - Yoshax: - - rscadd: Adds more items to custom loadout, including a number of dressy suits - and some other things. -2015-05-02: - HarpyEagle: - - bugfix: Neck-grabbing someone now stuns them properly. - PsiOmegaDelta: - - tweak: The spider infestation event now makes an announcement much sooner. - - rscadd: Admins can now toggle OOC/LOOC separately. - - tweak: Mice are now numbered to aid admins. - Yoshax: - - rscadd: Adds an option and verb to the AI to send emergency messages to Central, - functions same as comms console option. - - tweak: Changes comms console to only have one level of ID require, meaning all - heads of staff have what was captain access, allowing them to change alert, - send emergency messages and make announcements. - - rscadd: Adds an emergency bluespace relay machine which is mapped into teletcomms, - this machine takes emergency messages and sends them to central, if one does - not exist on any Z, you cannot send any emergency messages. - - rscadd: Adds an emergency bluespace relay assembly kit orderable from cargo for - when the ones on telecomms are destroyed. Assembly is required. - - rscadd: Adds the emergency bluespace relay circuitboard to be researchable and - printable in R&D, with sufficient tech levels. -2015-05-05: - PsiOmegaDelta: - - tweak: Grilles no longer return too many rods when destroyed (using means other - than wirecutters). - RavingManiac: - - tweak: Intent menu now appears while zooming with a sniper rifle. -2015-05-06: - PsiOmegaDelta: - - rscadd: Examining a pen or crayon now lists the available special commands in - the examine tab. -2015-05-07: - HarpyEagle: - - rscadd: Breaking out of lockers now has sound and animation. - PsiOmegaDelta: - - bugfix: The cloning computer can again successfully locate nearby cloning vats - and DNA scanners at round start. - - rscadd: Security equipment now treats individuals with CentCom ids with the greatest - respect. - - maptweak: Adds stretches of power cable around the construction outpost, ensuring - one does not have to climb over machines to being laying cables. - RavingManiac: - - rscadd: Muzzle-flash lighting effect for guns - - rscadd: Energy guns now display shots remaining on examine -2015-05-09: - Yoshax: - - rscadd: Maps in the top mounted 9mm practice rounds, .45 practice rounds, and - practice shotgun shells into the armory. -2015-05-10: - GinjaNinja32: - - rscadd: Acting jobs on the manifest will now sort with their non-acting counterparts. - All assignments beginning with the word 'acting', 'temporary', or 'interim' - will do this. - Yoshax: - - tweak: Removes sleepy chems from being cloned, adds a consistent period of 30 - tick sleep. -2015-05-11: - Mloc: - - experiment: Rewritten lighting system. - - rscadd: Better coloured lights. - - rscadd: Animated transitions. - PsiOmegaDelta: - - bugfix: As an observer, using antagHUD should now always restrict you from respawning - without admin intervention. - Techhead: - - rscadd: Voidsuits can have tanks inserted into the storage slot. - - rscadd: Voidsuits display helpful information on their contents on examine. - - rscadd: Magboots can be equipped over other shoes. Except other magboots. -2015-05-12: - Dennok: - - imageadd: New buildmode icons made by BartNixon. - HarpyEagle: - - rscadd: Masks and helmets that cover the face block feeding food, drinks, and - pills. - MrSnapwalk: - - imageadd: Added seven new AI core displays. - - tweak: Changed the pAI sprite and added several new expressions. - PsiOmegaDelta: - - rscadd: The space vine event now comes with a station announcement. -2015-05-14: - PsiOmegaDelta: - - maptweak: Should now be more evident that the brig disposal chute sends its goods - to the common brig area. - - bugfix: Cells now drain when using more charge than what is available. - - tweak: The rig stealth module now requires as much power to run as the energy - blade module. - Techhead: - - rscadd: Vox will spawn with emergency nitrogen tanks in their survival boxes. - - rscadd: Diona will spawn with an emergency flare instead of a survival box. - - rscdel: Engineers no longer spawn with extended-capacity oxygen tanks. - - bugfix: Vox spawning without backpacks will have their nitrogen tank equipped - to their back. - - tweak: The Bartender's spare beanbag shells have been moved into bar backroom - with the shotgun. - - bugfix: Portable air pumps now fill based on external/airtank pressure when pumping - in. -2015-05-16: - GinjaNinja32: - - rscadd: Rewrote tables. To construct a table, use steel to make a table frame, - then plate the frame with a material such as steel, gold, wood, etc. Hold a - stack in your hand and drag it to the table to reinforce it. To deconstruct - a table, use a screwdriver to remove the reinforcements (if present), then a - wrench to remove the plating, and a wrench again to dismantle the frame. Use - a welder to repair any damage. Use a carpet tile on a table to add felt, and - a crowbar to remove it. - HarpyEagle: - - rscadd: Adds tail animations for tajaran and unathi. Animations are controlled - using emotes. -2015-05-17: - PsiOmegaDelta: - - bugfix: Teleporter artifacts should no longer teleport mobs inside objects. -2015-05-18: - Hubblenaut: - - rscadd: Adds a light for available backup power on airlocks. - Kelenius: - - tweak: 'There has been a big update to the reagent system. A full-ish changelog - can be found here: http://pastebin.com/imHXTRHz. In particular:' - - tweak: Reagents now differentiate between being ingested (food, pills, smoke), - injected (syringes, IV drips), and put on the skin (sprays, beaker splashing). - - tweak: Injecting food and drinks will cause bad effects. - - tweak: Healing reagents, generally speaking, have stronger effects when injected. - - tweak: Toxins now work slower and deal more damage. Seek medical help! - - tweak: Alcohol robustness has been lowered. - - tweak: Acid will no longer melt large numbers of items at once. - - tweak: Synaptizine is no longer hilariously deadly. - Loganbacca: - - tweak: Changed MULE destination selection to be list based. - PsiOmegaDelta: - - tweak: Destroying a camera by brute force now has a chance to break the wiring - within. - - rscadd: Turf are now processed. This, for example, causes radioactive walls to - regularly irradiate nearby mobs. - - bugfix: Welders should now always update their icon and inhand states properly. -2015-05-22: - Ccomp5950: - - bugfix: Beepsky no longer kills goats. - - tweak: Goats will move towards vines that are 4 spaces away now instead of 1 - - bugfix: Goats will eat the spawning plants for vines as well as the vines themselves. - Chinsky: - - rscadd: Ghetto diagnosis. Grab patient, aim at bodypart you want to check, click - on them with help intent. This will tell you about their wounds, fractures and - other oddities (toxins/oxygen) for that bodypart. - - rscadd: Fractures are visible on very damaged limbs. Dislocations are always visible. - Surgery incisions now visible too. - - rscadd: Stethoscopes actually make sense now. They care for heart/lungs status - when reporting pulse and respiration now. - HarpyEagle: - - rscadd: Re-implemented fuel fires. Tweaked fire behaviour overall. - Yoshax: - - tweak: Bear traps now do damage when stood on, enough to break bones! Bear traps - can now affect any limb of a person who is on the ground, including head! Bear - traps are no longer legcuffs and instead embed in the limb they attack. - - tweak: Bear traps now take several seconds to deploy and cannot be picked up when - armed, they must be disarmed by clicking on them. They also cannot be moved - then they are deployed. - Zuhayr: - - rscadd: Massive material refactor. Walls, beds, chairs, stools, tables, ashtrays, - knives, baseball bats, axes, simple doors, barricades, so on. - - rscadd: Tables are now built via steel then another sheet on the resulting frame. - They can then be reinforced by dragging a stack of sheets onto the table. - - rscadd: Walls are built with steel for girders, then right-click the girder and - select the reinforce verb while holding a stack, then click the girders with - a final sheet. - - rscadd: Various things can be built with various sheet types. Experiment! Just - keep in mind that uranium is now radioactive and phoron is now flammable. -2015-05-26: - Atlantis: - - rscadd: NanoUI for Robotics Control Console - - rscadd: NanoUI for Supermatter Crystal - AI/Robot only, purely informational - Chinsky: - - rscadd: Meat limbs now can be attached. Use limb on missing area, then hemostat - to finalize it. - - rscadd: Limbs from other races can be now attached. They'll cause rejection, but - it can be kept at bay with spaceacilline to some point. Species special attack - is carried over too, i.e. you can clawn people if you sew a cathand to yourself. - - rscadd: Limbs that are left in open will rot in ~7 minutes. Use freezers or cryobags - to stop it. You can still attach them, but you wish you couldn't. - PsiOmegaDelta: - - tweak: Both the pulse taker and target must now remain still for the duration - of the check or it will fail. - RavingManiac: - - rscadd: Tape recorders now record hearable emotes and action messages (e.g. gunshots). - - bugfix: You can now see actions from inside mechs and closets. - Techhead: - - rscadd: Removed gaseous reagents from the chemistry system and replaced with real-world - organic chemistry precursors. - - rscadd: Hydrogen has been replaced with hydrazine, a highly toxic, flammable liquid. - - rscadd: Oxygen has been replaced with acetone, a mildly toxic liquid. Ethanol's - ink-sovlent capabilities have been copied to it. - - rscadd: Chlorine has been replaced with hydrochloric acid. It is a stronger acid - than sulphuric but less toxic. - - tweak: Nitrogen has been replaced with ammonia. Ammonia now acts as a Dexalin-equivalent - for Vox. - - tweak: Flourine has also been replaced with hydrazine in its one recipe. Flourosurficant - has been renamed azosurficant. - - tweak: Being splashed with liquid Phoron will burn eyes and contaminate clothes - like being exposed to Phoron gas. - Zuhayr: - - rscadd: Added a ghost requisition system for posibrains and living plants. - - rscadd: Added attack_ghost() to hydro trays and posibrains to allow ghosts to - enter them. - - rscadd: Prosthetic limbs are now only repairable with welders/cable coils if they - have suffered below 30 combined damage. - - rscadd: 'Surgery steps that cause no pain and have no failure wounding have been - added: screwdriver for ''incision'', crowbar to open, multitool to ''decouple'' - a prosthetic organ. Hemostat is still used to take an organ out.' - - rscadd: Using a welder or a cable coil as a surgical tool after opening a maintenance - hatch will repair damage beyond the 30 damage cap. In other words, severe damage - to robolimbs requires expert repair from someone else. - - rscdel: Eye and brain surgery were removed; they predate the current organ system - and are redundant. - - rscadd: IPC are now simply full prosthetic bodies using a specific manufacturer - (Morpheus Cyberkinetics). - - rscadd: IPC can 'recharge' in a cyborg station to regain nutriment. They no longer - interface with APCs. - - rscadd: NO_BLOOD flag now bypasses ingested and blood reagent processing. - - rscadd: NO_SCAN now bypasses mutagen reagent effects. - - rscadd: Cyborg analyzers now show damage to prosthetic limbs and organs on humans. - - tweak: Prosthetic EMP damage was reduced. - - tweak: Several organ files were split up/moved around. -2015-05-27: - PsiOmegaDelta: - - tweak: The inactive check process now respects client holder status and can be - configured how long clients may remain inactive before being kicked. - Zuhayr: - - rscadd: Unfolded pAIs can now be scooped up and worn as hats. - - tweak: Scoop-up behavior is now standardized to selecting help intent and dragging - their icon onto yours. -2015-05-30: - Atlantis: - - rscadd: Malfunction Overhaul - Whole gamemode was completely reworked from scratch. - Most old abilities have been removed and quite a lot of new abilities was added. - AI also has to hack APCs to unlock higher tier abilities faster, instead of - having access to them from the round start. Most forced things, such as, shuttle - recalling were removed and are instead controlled by the AI. Code is fully modular - allowing for future modifications. - HarpyEagle: - - bugfix: Fixes Engineer ERT gloves not being insulated. - - tweak: IV stands are no longer bullet shields. They also allow mice, drones, pAIs - et al to pass though. - Kelenius: - - tweak: AI now hears LOOC both around its eye and its core, and speaks in LOOC - around its eye. Keep in mind that you won't hear and won't be heard if there - is a wall between your eye and the target. - PsiOmegaDelta: - - rscadd: You can now review the server revision date and hash by using the 'Show - Server Revision' verb in the OOC category. -2015-06-02: - Techhead: - - rscadd: Re-adds extended capacity emergency oxygen tanks to relevant jobs. -2015-06-04: - PsiOmegaDelta: - - rscadd: AI eyes can now be found in the observer follow list. - - rscadd: Synths can now review all law modules that can be found on the station - from their law manager. - - rscadd: Synths can state these laws if desired, however this is strongly discouraged - unless subverted/malfunctioning. - - bugfix: Astral projecting mobs, such as wizards or cultists, may no longer respawn - as something else while their body lives. - Techhead: - - rscadd: Prison break event has been expanded to include Virology or Xenobiology - - rscadd: Prison break event will warn Enginering and the AI beforehand so they - can take preventive measures. - - bugfix: Disabling area power will now prevent doors from opening during the event -2015-06-05: - PsiOmegaDelta: - - bugfix: Split stacks no longer lose their coloring. - - tweak: Can no longer merge cables of different colors. - - tweak: Blobs and simple mobs now attack all external organs instead of a subset. - The overall damage remains the same but the number of fractures caused will, - in general, be fewer. - - rscadd: Spider nurses now have a chance of injecting their victims with spider - eggs which eventually hatch. If the limb is removed from the host, the host - dies, or the spiderling has matured sufficiently it will crawl out into freedom. - Medical scanners will pick upp eggs and spiderlings as foreign bodies. - Yoshax: - - tweak: Makes hyposprays start empty instead of filled with Tricord. - - tweak: Makes the special wizard projectile staffs, Animate, Change, Focus and - any future ones only usable by wizards. Also makes it so only wizards can use - spellbooks and teleportation scrolls. -2015-06-08: - PsiOmegaDelta: - - rscadd: The AI chassis now glows, with the color depending on the currently selected - display. -2015-06-09: - PsiOmegaDelta: - - rscadd: Ports /tg/'s meteor event. Meteors now appear to be more accurate, come - in a greater variety, and may drop ores on their final destruction. -2015-06-16: - Chinsky: - - rscadd: 'Updated penlights to be more of use in diagnostics, they now show following - conditions:' - - rscadd: Eye damage - - rscadd: Blurry eyes (overall slower reaction) - - rscadd: Brain damage (one eye reacts slower) - - rscadd: Opiates use (pinpoint pupils) - - rscadd: Drugs use (dilated pupils) - PsiOmegaDelta: - - rscadd: Observers can now follow both the AI and its eye upon speech. - - rscadd: Observers can now follow both observers and their body, if they ever had - one, upon speech. - - rscadd: Observers can now follow hivemind speakers if the speaker is not using - an alias or antagHUD is enabled. - - rscadd: Turret controls now glow, with the color depending on the current mode. - Techhead: - - rscadd: Converted Request Console interface into NanoUI. -2015-06-19: - HarpyEagle: - - bugfix: Prevents being on fire from merely warming mobs up slightly in some cases. - Mob fires also burn hotter. - - rscadd: Matches can now be used to light things adjacent to you when thrown. - - tweak: Made the effects of having a damaged robotic leg more prominent. - - bugfix: Robot limbs no longer cause pain messages. A reminder that you can still - check their status with 'Help Intent' -> 'Click Self'. - - tweak: Knifing damage scales with weapon force and throat protection. Helmets - only provide throat protection if they are air tight. Trying to cut someone's - throat with wirecutters and/or while wearing an armoured sealed helmet will - require several attempts before the victim passes out. - - tweak: Knifing switches on harm intent, in case you just wanted to beat on the - victim for some reason. - - bugfix: Prevents knifing bots or silicons. -2015-06-22: - PsiOmegaDelta: - - tweak: The traitor uplink no longer displays all items in a long list, instead - has categories which when accessed shows the relevant items. -2015-06-24: - HarpyEagle: - - bugfix: Fixed Tajaran name generation producing names without a space between - first and last. - - wip: Adds docking to the mercenary shuttle. Works similarly to other shuttles, - except docking and undocking is manually initiated and not automatic. A system - to approve or deny dock requests still to be implemented. - - rscadd: Toolboxes can now hold larger items, such as stacks of metal or power - cells, at the cost of having less space for other things. - - tweak: Gloves/shoes can now be worn even if you have one hand/foot missing. The - other one still has to be present, of course. The items still drop when you - first lose the hand/foot. - - tweak: Budget insulated gloves are somewhat less useless. On average, they will - stop half the damage from getting shocked, and the worst case insulation is - not as bad as it used to be. Budget gloves that are as good as regular insulated - gloves are still as rare as they were before though. - - tweak: PTR bullets are now hitscan, to make them somewhat better for actual sniping. - - maptweak: The telecoms server room now has an actual cycling airlock into it. - - tweak: Non-vital body parts will no longer take further damage above a certain - amount, and will inflict paincrit effects instead. On most humaniods the head, - chest, and groin are vital. - - rscadd: 'Engineers now spawn with industrial workboots (credit: ChessPiece/Bishop).' - - bugfix: Damaged robotic legs now more likely to have an effect. - - bugfix: Fixed bug preventing internal organs from taking damage in some cases. - - maptweak: New flavours of tables around the station. Engineering starts with more - plastic. - - bugfix: Fixed worn items not appearing in some cases. Most notably crossbows and - certain guns when worn on the back. As a side effect, laundry machines no longer - transform items. - - bugfix: Crit oxyloss now runs in game time instead of real time. So if lag is - slowing your movement the same slowdown applies to the dying person you're trying - to reach. - - rscadd: Breathmasks can now be adjusted by clicking on them in your hand, in addition - to the verb. - - rscadd: Wearing a space helmet or similar face-covering gear now prevents eating - and force-feeding food, drink, and pills. - - rscadd: Phoron in air ignites above it's flashpoint temperature and a certain - (very small) minimum concentration. Environments that have oxygen and are hot - enough, and have phoron but not enough concentration to burn will produce flareouts, - which are mostly a visual effect. - - rscadd: Adds animation when making unarmed attacks or attacking with melee weapons, - to help make it clearer who is attacking. - - soundadd: Opening an unpowered door now has an appropriate sound. - - rscadd: Ingesting diseased blood may contract the disease. -2015-06-26: {} -2015-06-30: - PsiOmegaDelta: - - maptweak: Non-general areas on Crescent are now protected by blast doors to enforce - area restrictions. Admins can operate these from the central checkpoint. -2015-07-04: - PsiOmegaDelta: - - tweak: Portable turrets now only blocks movement while deployed. - - tweak: Portable turrets are no longer invincible while undeployed, however they - have increased damage resistance in this state. - - bugfix: Crescent portable turrets should no longer act up during attempts to (un)wrench - and alter their settings. -2015-07-06: - GinjaNinja32: - - rscadd: '''Provisional'' is now also a valid temporary position prefix for manifest - sorting.' -2015-07-10: - Zuhayr: - - rscadd: Ninja now spawns on a little pod on Z2 and can teleport to the main level. -2015-07-11: - HarpyEagle: - - imageadd: Added inhand sprites for flashes, flashbangs, emp and other grenades. - Loganbacca: - - bugfix: Turrets no longer burn holes through the AI. - - tweak: Projectiles now have a chance of hitting mobs riding cargo trains. - - bugfix: Fixed visual bugs with projectile effects. -2015-07-14: - HarpyEagle: - - bugfix: Fixes wrong information being reported when analyzing locked abandoned - crates with a multitool. - PsiOmegaDelta: - - tweak: Ninjas can no longer teleport unto turfs that contain solid objects. - - tweak: Wizards can no longer etheral jaunt unto turfs that contain solid objects. -2015-07-27: - Kelenius: - - tweak: Borg shaker now works similarly to hypospray. It generates reagents that - can be poured into glasses. - - bugfix: Therefore, they can no longer duplicate rare reagents such as phoron. -2015-07-29: - Karolis2011: - - rscadd: Made tagger and sorting pipes dispensible. - - bugfix: Unwelding and welding sorting/tagger pipes, no longer delete data about - them. -2015-07-31: - HarpyEagle: - - bugfix: Fixed projectiles being able to hit people in body parts that they don't - have. This will also mean that the less limbs someone has the less effective - they will be as a body shield. -2015-08-11: - PsiOmegaDelta: - - experiment: 0.1.19 is live. - - tweak: Crew monitors now update every 5th second instead of every other. Reduces - lag and gives antags a larger window of opportunity to disable suit sensors - if they have to harm someone. -2015-08-13: - GinjaNinja32: - - rscadd: Changed language selection to allow multiple language selections, changed - humans/unathi/tajarans/skrell to not automatically gain their racial language, - instead adding it to the selectable languages for that species. Old slots will - warn when loaded that the languages may not be what you expect. - Orelbon: - - rscadd: Changed the HoP's suit to more bibrant colors and hopefully you will like - it. -2015-08-14: - HarpyEagle: - - spellcheck: Renames many guns to follow a consistent naming style. Updated and - changed gun description text to be more lore-friendly. - - rscadd: Throwing a booze bottle at something nearby while on harm intent causes - it to smash, splashing it's contents over whatever it hits. - - rscadd: Rags can now be wrung out over a container or the floor, emptying it's - contents into the container or splashing them on the floor. - - rscadd: Rags can now be soaked using the large water and fuel tanks instead of - just beakers. - - rscadd: Rags soaked in welding fuel can be lit on fire. - - rscadd: Rags can now be stuffed into booze bottles. When the bottle smashes, the - stuffed rag is dropped onto the ground. - - bugfix: Fixed eggs having a ridiculously large chemical volume. - - rscadd: T-Ray scanner effects are now only visible to the person holding the scanner. - - rscadd: Traitors can now purchase the C-20r and the STS-35 for telecrystals. - PsiOmegaDelta: - - tweak: The amount you start with in your station account is now affected by species, - rank, and NT's stance towards you. - TheWelp: - - rscadd: Bookcases are now movable/buildable/destroyable. - - rscadd: Paper can now be crumpled by using in-hand while on hurt intent. - - rscadd: Library Computer External Archive is now sortable. - Zuhayr: - - rscadd: Click a hat on a drone with help intent to equip it. Drag the drone onto - yourself with grab intent to remove it. -2015-08-15: - Kelenius: - - rscadd: Bees have been updated and are totally worth checking out (beekeeping - crate at cargo). - - rscdel: Sleeper consoles removed. All interaction is now done by clicking on the - sleeper itself. - - tweak: To put people into sleeper, you now have to click-drag people to it. Grabs - no longer work. To exit the sleeper, move. - - tweak: Sleeper now uses a NanoUI. -2015-08-16: - HarpyEagle: - - tweak: The unathi breacher is now only wearable by unathi. -2015-08-17: - PsiOmegaDelta: - - rscadd: Station time and duration now available in the Status tab. -2015-08-24: - HarpyEagle: - - tweak: Girders are now reinforced by using a screwdriver on the girder before - applying the material sheets. Use a screwdriver again instead to cancel reinforcing. - - bugfix: Mechanical traps no longer spawn in the janitor's locker. - - rscadd: Mechanical traps can now be printed with a hacked autolathe. - - rscadd: Adds armour penetration mechanic for projectiles and melee weapons. - - rscadd: Laser carbines, LWAP, and shotgun now have a small amount of armour penetration, - ballistic rifles (not SMGs) have moderate amounts, laser cannon has high armour - penetration, and the PTR mostly ignores body armour. - - tweak: 'Shotgun slugs and Z8/STS damage has been lowered slightly to accomodate - for their higher penetration. In general ballistics deal less damage but have - higher penetration than comparable laser weapons. Notable exception: X-Ray lasers - have had their damage lowered slightly but gain very high armour penetration.' - - rscadd: Energy swords now have very high armour penetration. Ninja blades do less - damage but ignore armour completely. - Kelenius: - - experiment: Click cooldowns have been removed on pretty much everything that isn't - an attack. - PsiOmegaDelta: - - rscadd: Adds the option to set the icon size to 48x48, found under the Icons menu, - along with 32x32, 64x64, and stretch to fit. - - tweak: Active AI cores now provides coverage on the AI camera network. Does not - utilize actual cameras, thus will not show up on security consoles. - - rscadd: The Dinnerware vending machine now offer both utensil knives and spoons - without first having to hack them. - - rscadd: Synths now have id cards with access levels which is checked when operating - most station equipment. - - rscadd: Station synthetics still have full station access but can no longer interact - with syndicate equipment, and syndicate borgs now start with only syndicate - access. - - rscadd: Syndicate borgs can copy the access from other cards by utilizing their - own id card module, similar to how syndicate ids work. - - rscadd: When examined up close id cards now offer a more detailed view. - - rscadd: Agent ids now offer much greater customization, allowing changing name, - age, DNA, toggling of AI tracking termination (using the electronic warfware - option), and more. - - rscadd: As AI tracking can now be enabled/disabled at will AI players should not - feel the need to hesitate before informing relevant crew members when camera - tracking is explicitly terminated. - - rscadd: Uplink menu now more organized and with new categories. - - rscadd: Now possible to cause falsified ion storm announcements. - - rscadd: Now possible to cause falsified radiation storm announcements, with expected - maintenance access changes. - - rscadd: Now possible for mercenaries to create falsified Central Command Update - messages. - - rscadd: Now possible for mercenaries to create falsified crew arrival messages - and records. - RavingManiac: - - tweak: Sound environments tweaked to feel more claustrophobic - - rscadd: Being drugged, hallucinating, dizzy, or in low-pressure or vacuum will - alter sounds you hear - - rscadd: Sound environment in holodeck will change to reflect the loaded program - Vivalas: - - rscadd: A new uplink item has been added! A briefcase full 'o thalla can now be - bought by traitors for bribes and such! - Zuhayr: - - rscadd: Pariahs are now a subspecies of Vox with less atmos/cold protection, a - useless brain, and lower health. - - rscadd: Leap now only gives a passive grab and has a shorter range. It also stuns - Pariahs longer than it does their target. - - tweak: Rewrote tiling. White floors, dark floors and freezer floors now have associated - tiles. - - tweak: Changed how decals work in the mapper. floor_decal is now used instead - of an icon in floors.dmi. - - tweak: The floor painter has been rewritten to use decals. Click it in-hand to - set direction and decal. - - tweak: Floor lights are now built from the autholathe, secured with a screwdriver, - activated by clicking them with an empty hand, and repaired with a welding torch. - - rscadd: Unathi now have minor slowdown and 20% brute resist. - - rscadd: Tajarans now have lower bonus speed and a flat 15% malus to brute and - burn. - - rscadd: Vox can now eat monkeys and small animals. - - rscadd: Tajarans can now eat small animals. - - rscadd: Unarmed attack damage has been lowered across the board. -2015-09-02: - Atlantis: - - rscadd: Converted phoron glass to borosilicate glass, adjusted heat resistances - accordingly, got rid of copypaste fire code. Fire resistance is now handled - by variables so completely fireproof windows are possible with varedit. - - rscadd: Windows take fire damage when heat exceeds 100C regular windows, 750C - reinforced regular, 2000C borosilicate and 4000C reinforced borosilicate. For - comparsions, reinforced walls begin taking damage around 6000. - Hubblenaut: - - rscadd: Adds glass bottles for Cola, Space Up and Space Mountain Wind to Booze-O-Mat. - - tweak: Some bar drink recipes have been amended to easily sum to 30 units for - drinking glasses. - - tweak: Vendors now have a product receptor for accepting goods. Opening the maintenance - painel is no longer required. - - tweak: Wrenching a vending machine is no longer a silent action. - - tweak: 'Stepup: Item placement on 4x4 grids seemed to work great. Now we''ll try - 8x8.' - Kelenius: - - tweak: Mechfab can now be upgraded using RPED, and now uses NanoUI. - Matthew951: - - rscadd: Added Vincent Volaju's hair. - - rscadd: Added Vincent Volaju's beard. - Zuhayr: - - rscadd: Added the ability for AIs in hardsuits to control suit modules and movement - with a dead or unconcious wearer. - - rscadd: Added ballistic supply drop pods. - - rscadd: Added diona gestalt random map template. - - tweak: Swapped the singularity beacon out for a hacked supply beacon. -2015-09-05: - Chinsky: - - rscadd: Made capguns into proper guns code-wise. It means you can now take people - hostage with them, stick in your mouth, and all other things you can do with - real guns but probably shouldn't. - - rscadd: Russian roulette! Fun for whole sec team! Unload some shells from revolver, - spin the cylinder(verb) and you're good to go! - HarpyEagle: - - rscadd: Shields no longer block attacks from directly behind the player. - - rscadd: Riot shields no longer stop bullets or beams (except for beanbags and - rubber bullets), however they are now more effective at blocking melee attacks - and thrown objects. - - rscadd: Energy shields block melee attacks as effectively as riot shields do. - Their ability to block projectiles is largely unchanged. - - tweak: Melee weapons now only block melee attacks. - - experiment: Two handed weapons have a small chance of blocking melee attacks when - wielded in two hands. - - rscadd: Sound and visual effects when blocking attacks with an energy shield or - energy sword. - - bugfix: Fixed dead or unconscious people blocking stuff with shields. - PsiOmegaDelta: - - tweak: Cargo now sorts under its own department on station manifests. - - rscdel: Manual radio frequency changes can no longer go outside the standard frequency - span. - - rscadd: Users with sufficient access can instead select pre-defined channels outside - this span, such as department channels, when using intercoms. -2015-09-07: - GinjaNinja32: - - rscadd: Added an auto-hiss system for those who would prefer the game do their - sss or rrr for them. Activate via Toggle Auto-Hiss in the OOC tab. - - rscadd: Auto-hiss system in 'basic' mode will extend 's' for Unathi and 'r' for - Tajara. 'Full' mode adds 'x' to 'ks' for Unathi, and is identical to 'basic' - mode for Tajara. - PsiOmegaDelta: - - tweak: 'Changed the language prefix keys to the following: , # -' - - rscadd: Language prefix keys can be changed in the Character Setup. Changes are - currently not global, but per character. -2015-09-08: - Soadreqm: - - tweak: Increased changeling starting genetic points to 25. - Zuhayr: - - bugfix: Auto-traitor should now be fixed. - - bugfix: The Secret game mode should now be fixed. -2015-09-11: - HarpyEagle: - - tweak: Made flares brighter. - - rscadd: Coffee is now poisonous to tajaran, much like how animal protein is poisonous - to skrell. -2015-09-26: - PsiOmegaDelta: - - tweak: Meteor events now select a map edge to arrive from, with a probability - for each individual wave to come from either neighboring edge. Meteors will - never arrive from opposite the starting edge. -2015-10-10: - HarpyEagle: - - tweak: Rubber bullets and beanbags now are now resisted by melee armour. - - bugfix: Fixed a couple of bugs causing phoron gas fires to burn cooler and slower - than they were supposed to. - - bugfix: Merc bombs are now appropriately explosive again. Same goes for bombs - made by toxins. -2015-10-11: - HarpyEagle: - - tweak: Fabricated power cells start uncharged. - Hubblenaut: - - rscadd: Light replacers can be refilled by clicking on a storage item. - - tweak: Light replacers now hold up to 32 light bulbs. - - tweak: Light replacers can be obtained through janitorial supply crates. - - tweak: A sheet of glass fills the light replacer by 16 bulbs. -2015-10-14: - Hubblenaut: - - bugfix: Airlock backup power test light properly offline when backup power down. - - bugfix: Empty flavor texts no longer draw an empty line on examination. - - bugfix: Material stacks now properly merge upon creation. - - bugfix: Messages for adding to existing stack appear again. - PsiOmegaDelta: - - tweak: Blobs can now spawn anywhere in maintenance, rather than picking location - from a pre-determined list. - TheWelp: - - rscdel: Removed higher Secret player requirements. - Zuhayr: - - rscdel: Removed facehuggers, alien embryos, and embryo removal surgery. - - rscadd: Xenomorph Queens (or infested surgeons...) can now add a hive node to - a victim in order to slave them to the hive. - - tweak: Xenomorph brute/burn mods were tweaked to buff them significantly. - - tweak: Alien larvae now hatch from eggs when ghosts click on them. - - tweak: Alien larvae now gain progression towards adulthood from being inside a - human with blood, which they drink. - - tweak: Alien weeds now use the vine system. -2015-10-21: - Hubblenaut: - - tweak: Bruise packs are now applied per wound, not per limb. - - tweak: Bruise packs now use a delay depending on wound severity for applying. - - rscdel: Removed instant healing ability from advanced bruise packs and ointment. -2015-10-27: - HarpyEagle: - - bugfix: When affected by pepperspray, eye protection now prevents blindness and - face protection now prevents stun, instead of face protection doing both. -2015-11-02: - Hubblenaut: - - rscadd: Adds tape for atmospherics. - - tweak: Tape graphics and algorithm changes. Looks a lot more appealing now. - - tweak: Starting and ending tape on the same turf will connect it to all surrounding - walls/windows. - - tweak: Lifting a part of the tape will lift an entire tape section. - - tweak: Mobs on help intent do stop for tape. - - bugfix: Crumpled tape does not affect tape breaking behavior anymore. -2015-11-10: - Atlantis: - - rscadd: Expanded gridcheck random event. Affected devices now show error UI and - may be restarted manually before the event ends. All Z-levels are now affected - equally. - Datraen: - - tweak: Changes standard and specific plant traits, more diverse plants. - Sligneris: - - tweak: Modified the wording of NT Default's laws. -2015-11-16: - PsiOmegaDelta: - - rscadd: Added new verb, 'Character Setup' under the Preferences tab, to allow - modifying your character settings at any time. -2015-11-19: - PsiOmegaDelta: - - tweak: The round start and auto-antag spawners can now check if players have played - long enough to be eligable for selection. -2015-11-22: - PsiOmegaDelta: - - tweak: Engineering alarm consoles now display camera alerts. - - rscadd: Adds a hacking tool that for all intents and purposes acts and works like - a multitool until a screwdriver is applied. - - rscadd: Gives full control of airlocks after 20-40 seconds of hacking. - - rscadd: The last 6-8 hacked airlocks are always accessed instantly. - neersighted: - - bugfix: Laptop Vendors now accept ID Containers (PDA, Wallet, etc). - - bugfix: Personal Lockers now accept ID Containers (PDA, Wallet, etc). - - experiment: Add /tg/-like attack overlays. -2015-12-06: - Hubblenaut: - - bugfix: Welding a broken camera will use the correct icon. - - tweak: Camera assemblies remember their tag and network from previous usage. - - tweak: Mobs on help intent will not push others that aren't. - Loganbacca: - - rscadd: Added a backend (wireless) system for communication between machinery - and other devices. - Neerti: - - rscadd: The AI can now toggle whether its hologram will move towards the center - of its view using the 'Toggle Hologram Movement' verb. - PsiOmegaDelta: - - tweak: Helmet cameras are no longer enabled by clicking the helmet, instead there - is a 'Toggle Helmet Camera' verb. - Raptor1628: - - tweak: Armory layout changed, weapons returned to static amounts. - - rscadd: New security armor and helmet sprites added. - Zuhayr: - - tweak: 'Backend change: allowed accessories to be placed on any clothing item - with the appropriate variables set.' - - rscadd: Drones can now pull a variety of things (such as scrubbers). This came - with a pulling refactor so please report any strangeness with pulling in general. - - rscadd: Drones (and any mob that can be picked up) can be bashed against airlocks - and such to use their internal access, so long as the person using them does - not have an ID card equipped. - - tweak: Rewrote fireaxe cabinets. Click with a multitool to unlock or loc, click - with a hand to open or close, smash with anything that does damage, and drag - onto your icon to remove the fireaxe. -2015-12-13: - Atlantis: - - rscadd: Added Inflatables Dispenser(ID), an item that allows rapid deployment, - transport and removal of inflatables. - - rscadd: Engineering, Construction and Crisis modules are now outfitted with ID. - - rscadd: Three boxes in engineering have been replaced by three IDs. - - tweak: w_classes of inflatables readjusted. Boxes and IDs can be carried in backpack - now. Individual inflatables are small enough to fit in pocket. - PsiOmegaDelta: - - experiment: Adds a system to allow objects to implement custom multitool interactions - in a modular manner. - - rscadd: The AI can now toggle multitool mode on/off, using the new 'Toggle Multitool - Mode' verb. - - rscadd: Cloning vats can now be connected to a cloning console by using a multitool. - - rscadd: Station alert console circuits can now be altered using a multitool, changing - which alarm types are displayed. - - rscadd: Can now select the color of a cable coil using a multitool. - TheWelp: - - rscadd: Added boardgame item for use with table-top board games. - - rscadd: Added Actors Guild, an alternate spawn that allows players to control - actors. - - rscadd: Added differing card decks, including a Tarot deck and two trading card - games. - - rscadd: Remade /TG/Station's Orion Trail arcade machine with bay-specific modifications. -2015-12-20: - PsiOmegaDelta: - - rscadd: Can now use the Antag Uplink to buy a door hacking device with endless - uses and which leaves doors unharmed, but instead needs some time to do its - work. - Zuhayr: - - tweak: Aiming has been rewritten, keep an eye out for weird behavior. -2016-01-01: - Atlantis: - - rscdel: Removed old computer3 system, most noticeable due to removal of old laptops. - - rscadd: Adds brand new modular computer system that replaces computer3. These - computers may run programs from hard drive, and one device is not limited to - one program. - - rscadd: Modular computers can be assembled manually from components printed at - RnD (Consoles mainly), or purchased (from old laptop vending machines). - - rscadd: Adds NTNet, networking used by modular computers, including an administration - console, NTNet relays, and antag programs. - - rscadd: Adds small set of programs modular computers can run. More programs will - be added in the future. - - rscadd: Various small things added, such as, data crystals (USB flash drives), - NTNRC (messaging, IRC/forum style), file sending, etc. - PsiOmegaDelta: - - tweak: Resomi, and any other humanoid mobs, can now bump doors open despite their - size. - TheWelp: - - rscadd: Microwaves can now be unanchored with a crowbar. -2016-01-08: - Chinsky: - - bugfix: Can pick up monkeys / undress resomi now properly. HELP intent for scooping, - NON-HELP for undressing. - RavingManiac: - - rscadd: Storage in backpacks, boxes and other containers is now capacity-based. - Some containers like belts remain slot-based. -2016-01-13: - Datraen: - - bugfix: Objects can now be yanked out of synthetics. - Techhead: - - rscadd: 'Added a new random event: Shipping Error - A random crate is mistakenly - shipped to the station.' -2016-01-16: - Atlantiscze: - - rscadd: SMES units now try to balance their inputs and outputs. For outputs this - means two SMESes powering the same grid will share the load by percentage. For - inputs, all SMESes inputting from one power network will split the available - power by percentage. - - tweak: 'Some minor SMES configuration changes have been made: Atmospherics SMES - now starts configured to prevent power outages when people forget about it, - engine SMESes are now configured to input/output at full rate. These are only - defaults and may be changed ingame as usual.' - PsiOmegaDelta: - - rscadd: Uplink crystals can now be converted into physical form to allow transfer - between uplink devices. - - rscadd: Each mercenary now spawn with their own private uplink, with each indivual - uplink having the same number of telecrystals as the normal traitor uplink. -2016-01-20: - Atlantis: - - rscdel: Construction robot module removed - - rscadd: Engineering robot module now contains most tools of construction robot, - primarily plasteel. RCD is not included by default. - - rscadd: Engineering Robot RCD upgrade is now buildable. This upgrade unlocks robot's - RCD. It is fairly expensive, requiring small amount of gold and silver, as well - as phoron and steel to build. - - rscadd: Floodlight upgrade added. This upgrade doubles robot's light intensity - (it will be more or less same as actual floodlight), at the cost of higher power - usage. - - rscadd: You may now install matter bin into a cyborg in order to boost it's matter - synth's maximal capacity. Better matter bin adds more capacity - - tweak: Default capacity of matter synths for engineering module tweaked a little, - since prices of reinforced walls, etc. increased recently. Steel changed from - 40 to 60 sheets default, plasteel from 10 (Construction default) to 20. -2016-01-25: - Atlantis: - - tweak: Setup Supermatter admin button now uses map markers and supports all coolant - types. -2016-01-29: - Karolis2011: - - tweak: Improved modular computer performance - PsiOmegaDelta: - - experiment: We now support tg's online changelog auto-creation. See https://tgstation13.org/wiki/Guide_to_Changelogs#Online_auto-creation. - - rscadd: Can now click held mobs, such as Pun Pun, to view their inventory. -2016-02-01: - PsiOmegaDelta: - - bugfix: ED-209s, hostile mobs, and mecha weapons should again be able to fire - without issue. - - bugfix: Agent ids can now be assigned an owner even after having been dropped - on the floor. - - bugfix: Monkey cubes can now be expanded in sinks again. -2016-02-03: - PsiOmegaDelta: - - tweak: Antagonist and special role preferences have been overhauled. Please update - these specific character preferences as they have been reset. -2016-02-06: - PsiOmegaDelta: - - bugfix: Should again be possible to resist out of chairs, beds, and welded lockers. -2016-02-07: - PsiOmegaDelta: - - rscadd: More --fun-- ion laws added. - - rscadd: Showers now splash objects on their turf with water. - - tweak: Can now expand unwrapped monkey cubes using showers, sinks, or just about - any source that applies water. -2016-02-11: - PsiOmegaDelta: - - bugfix: Items dropped by mobs that are held by another mob should no longer be - lost. - - bugfix: Items dropped inside mechs should no longer be lost. - - tweak: Changes the way loadout is handled in the character setup. - - tweak: Can no longer see loadout items restricted to a race you're not whitelisted - for (hence why you may see empty categories). - Zuhayr: - - rscadd: Added functionality for two-handed guns; these guns will give an accuracy - penalty if fired without an empty offhand. - - rscadd: Unified two-handed melee weapons with the above; while the offhand is - empty, the weapon will count as wielded. - atlantiscze: - - rscadd: Players will now be warned when selected spawn point has dangerous atmosphere, - and will be able to abort spawning and spawn elsewhere - - tweak: Supermatter no longer pulls anchored objects. To compensate, pull radius - was increased. It is currently limited by range() proc to approximately 32 tiles. - - tweak: Supermatter delamination's explosion strength reduced slightly. This will - hopefully motivate players to actually attempt repairs as it will be possible - to complete them within 1-2 hours. - - tweak: Supermatter spends more time (30 seconds compared to 10 seconds) in pulling - mode before exploding during delamination. - - rscadd: Supermatter's UI now shows "Relative EER" (Energy Emission Ratio) value - which represents how energised the supermatter is. - chinsky: - - soundadd: Surgery operations now cause sounds. -2016-02-13: - Ccomp5950: - - bugfix: Fixes slimes not hearing people (Kudos Karolis2011) - Karolis2011: - - tweak: Changed Tajarian language name (from Siik'tajr to Siik'maas) - - tweak: Changed Resomi language name (from Resomi to Schechi) - - rscadd: Added Alden-Saraspova counter sprite, making it visable. - PsiOmegaDelta: - - rscadd: Adds a reconnect button to the file menu. - - rscadd: Ghosts can now follow any movable object. -2016-02-15: - Ccomp5950: - - bugfix: Mobs will now have the correct health indicator when they die. X_X - Neerti: - - rscadd: The examination tab now includes additional information about examined - clothing and armor. - - bugfix: EMP no longer hits twice on humans. - - tweak: EMP drains powercells using the cell's current charge, and not the cell's - maximum potential charge, to ensure two blasts do not completely disable a synthetic. - - tweak: EMP hitting a prosthetic limb or organ will now do less damage. - - tweak: EMP hitting a cyborg will no longer outright stun them. Instead, they - gain the 'confused' status for a few moments, making movement difficult. In - addition, their HUD gets staticy, and their modules are forced to be retracted. - - rscadd: Stasis bags will protect the occupant from the outside enviroment's atmosphere. - - rscadd: Stasis bags can be hit with a health analyzer to analyze the occupant. - PsiOmegaDelta: - - rscadd: Sharp objects now have a greater chance of causing bleeding. - - rscadd: Can now pour reagent containers down the sink. - - tweak: Wrapped parcels now take on the size of the wrapped object. - - tweak: Security vests now only protect the torso, arms and other limbs are fair - game. - - tweak: Alters Neerti's EMP changes. - - tweak: Borgs are again stunned by max severity EMPs. - - tweak: Cells now lose a minimum amount of charge based on EMP severity, ensuring - multiple blasts will still be able to drain a cell. - Zuhayr: - - rscadd: Small species now take smaller bites/gulps from food and drink. - - rscadd: Small species are now effected by alchol and toxins twice as much. - - rscadd: blood_volume is now a species-level var and Resomi have lowered blood - volume. - - rscadd: Hunger is a species var and Resomi get hungry faster. - - rscadd: Small mobs have a reduced climb delay. - - rscadd: Resomi gain more nutrition from meat. -2016-02-18: - Daranz: - - bugfix: HUD glitches with the plant bag and cigarette packets are now fixed. - Karolis2011: - - wip: New command and communications program for modular consoles and laptops. -2016-02-22: - Datraen: - - tweak: Fragmentation grenades are no longer launchable. -2016-02-25: - Nalarac: - - rscadd: The autolathe can now print welding goggles. - PsiOmegaDelta: - - spellcheck: Punching a mech should no longer expose you to typos. - Yoshax: - - bugfix: Can again remove linoleum tiles, now with a screwdriver. - - rscadd: Can now order linoleum tiles from cargo. - - bugfix: Tajara should now react appropriately to various chemical reagents, such - as coffee. -2016-02-26: - Crazylemon64: - - rscadd: Allows lighting of smokeables using burning people. - Kelenius: - - imageadd: Additional sprites for the drying racks. - Mark9013100: - - tweak: Evidence bag boxes storage increased. - - bugfix: Fixes the RIG grenade launcher icon. - PsiOmegaDelta: - - spellcheck: Changes instances of 'prothesis' to 'prosthesis'. - Snapshot: - - bugfix: Syndicate hardsuit helmet was invisible for humans when worn - - bugfix: Balances to IPC suit cooler battery usage. -2016-02-29: - MrSnapwalk: - - rscadd: 'Adds five new hairstyles: Short Bangs, Half-Shaved Emo, Long Hair Alt - 2, Bun, and Double-Bun.' - PsiOmegaDelta: - - rscadd: Can now order white, dark, and freezer floor tiles from cargo. -2016-03-01: - PsiOmegaDelta: - - tweak: Player preferences have been overhauled. Please update your preferences, - found at "Character Setup" > "Global" > "Preferences", as they have been reset. - TheWelp: - - bugfix: Board game now properly takes things out of your hand again. - - rscadd: Individual cards now set their name and description so they are no longer - just a playing card. - - rscadd: Adds space pike as a rare carp spawn. Pikes are bigger, meaner, and will - attack anything, including other fish. -2016-03-02: - redstryker: - - rscadd: Adds hijabs as a head and loadout item. -2016-03-04: - Datraen: - - rscadd: Adds a mech-mountable flare launcher. -2016-03-18: - Datraen: - - bugfix: Harmbaton no longer causes halloss while inactive. - Kelenius: - - bugfix: Potassium and nitroglycerin explosive grenades now work. - TheWelp: - - rscadd: Added ability for carbon mobs to taste. Sensitivity varies between species. -2016-03-27: - atlantiscze: - - rscadd: Adds a new "News Browser" modular computer program, that can be used to - download and view news from the NTNet. - - tweak: APCs now react to EMPs in a different way. EMPs will temporarily disable - the APC, in a same way gridcheck does. That allows the APC to be reset using - the button in UI. Duration of EMP timer is based on severity, and a little bit - of RNG (8 - 12 minutes on high strength EMP) - - tweak: APC power cells are now partially shielded from EMPs, resulting in lower - charge loss when the power cell is in APC. -2016-03-28: - Datraen: - - bugfix: Adds a check to prison breaks that makes sure the APC is on before continuing. - atlantiscze: - - rscadd: Cyborgs and the AI now show on the crew manifest. -2016-04-01: - TheWelp: - - rscadd: Off-station antagonists now each set a faction. Primarily used with Resomi - playing merc, heist, etc. - - rscadd: Reworked Wizard to have multiple types of spellbooks, each with their - own costs, artifacts, and unique spells. - - rscadd: Antagonist that wipe equipment now give emergency gear before equipping - anything. Primarily a fix for off-station Vox antags. - - rscadd: Wizard clothing check is now conscious of species slot restrictions. (E.G. - Diona can now cast w/o sandals) - - rscadd: Added a cast verb to the IC tab. Will let people macro spell casting or - quickly cast them via auto-complete. -2016-04-05: - PsiOmegaDelta: - - rscadd: Detectives and forensic personnel now join the station with their own - CSI kit. - - rscadd: The detective's cabinet now contains a CSI kit. - TheWelp: - - tweak: Cast verb now appears/disappears depending on whether you have spells or - not. - - tweak: Corrupt Form now has a longer duration (10 seconds -> 15) - - tweak: Wizard Mark is now a cleanable entity (so soap/space cleaner destroys it) - - tweak: Mark/Recall cooldown halved. (120 seconds -> 60 seconds) - - rscadd: Fixes mind's spell list so that cloning will now properly add all the - spells. You will also keep your spells between bodies. (E.G. You are borged, - you get to keep your spells) - - rscadd: Added verb to antagonists to recieve objectives. Located in the OOC tab - and gained whenever the person becomes an antagonist. - atlantiscze: - - rscadd: Modular computers may now be damaged by gunfire, EMPs and similar threats. - This includes the computer's chassis, and components. - - rscadd: Damaged components may be repaired using nanopaste or cable coil. Damaged - chassis can be repaired with welder. You can use multitool on a component to - get diagnostic report. - - tweak: NTNet speeds increased, with advanced network cards being buffed considerably. - - tweak: Data crystals may now be disconnected without a screwdriver, via the rightclick - menu. - - tweak: You can now load paper into the nano printer, by clicking it (or the computer - it is installed in) with paper pieces. - - tweak: 'Component weights re-adjusted. For now they will have weight depending - on what device are they intended for (tablet+: tiny, laptop+: small, console:normal)' - - tweak: Modular computers now glow when turned on. Tablet has equal light intensity - as PDA, while console is comparable to a light bulb. This light is not colored. -2016-04-06: - Arctic: - - rscadd: Added wall-mounted oxygen pumps which equip internals when used. -2016-04-09: - Kearel: - - tweak: Dough now also requires water to be made. - ParadoxonKomplikon: - - tweak: The exotic seeds crate is now access restricted to xenobiologists. - PsiOmegaDelta: - - rscadd: Bedsheets can now be worn as capes. -2016-04-11: - NullSnapshot: - - rscadd: Players who are active antags can now respond to AOOC. - - rscadd: Mods have been given access to AOOC. -2016-04-14: - Datraen: - - rscadd: Manually ports /tg/station's dark click code https://github.com/tgstation/-tg-station/pull/10272 - by Razharas. - - bugfix: Microwaves no longer try cooking their components while cooking. - HarpyEagle: - - tweak: Fire extinguishers now spray a lot more water, will hopefully put out people - on fire faster. - - tweak: Fire extinguishers now make the ground wet when you use them. - Hubblenaut/HarpyEagle: - - tweak: Confused movement is a little less random. It is now easier to get to where - you want to when confused, especially while walking. - - rscadd: People running into solid objects while confused can be knocked over. - Kearel: - - bugfix: Fixes armalis x shift, again. - - tweak: Adds spellbook descriptions in book of tomes. - - rscadd: Adds ability for bears to dance. The commands dance, boogy and boogie - all work. - - rscadd: Adds ability for commanded mob subtypes to listen to the terms everybody - and everyone. - PsiOmegaDelta: - - rscadd: Can now customize the color of select set of underwear, similar to some - loadout equipment. - - rscdel: Due to new underwear names some selections may have been unset. Double-check - your character setup settings. - TheWelp: - - rscadd: Ports more of TG's slimes. Includes Pyrite, Gold, Cerulean, Bluespace - and Sepia - Yoshax: - - rscadd: Can take filled lunchboxes using the character loadout. These have a food - item, a snack, and a drink, all configurable. - atlantiscze: - - tweak: RIGs driven by AIs inside IIS now use massively less power. In other words, - the AI can walk more than few tiles without fully draining the battery. -2016-04-15: - Datraen: - - rscadd: 'Added Three New Mixed Gamemodes: Lizard, Changeling + Wizard; Intrigue, - Traitors + Ninja; Visitors, Ninja + Wizard.' - - tweak: Created a variable for latespawning antagonist templates, for customization - of autospawning antagonists in mixed game modes. - - tweak: Removed JSON encoding of the PDA Manifest list. - HarpyEagle: - - tweak: Shotgun flare illumination now lasts longer, around 3-4 minutes. - - bugfix: Fixed attack animation playing when using flashes even if the flash was - not actually used due to being broken or recharging. - - bugfix: Fixed lightswitches layering over darkness. Now only the light layers - above shadow. Lightswitch illumination is now much more subtle. - Mark9013100: - - rscadd: Paramedics, Medical Doctors, and the Chief Medical Officer can select - white webbings from the custom loadout. - - rscadd: ' Can now order a wide assortment of job gear from cargo.' - Sabess: - - rscadd: Detectives can now reskin the vintage .45 pistol. -2016-04-17: - mkalash: - - tweak: 'New voting system allows players to chose three options: high, medium, - and low' - - rscadd: Players can set individual antag roles to 'never' and will not be selected - to antag by the game mode - - tweak: Players who do not vote for the game mode, but have not selected never, - are candidates - - rscadd: The game will try the top three voted game modes before forcing extended - without revote -2016-04-18: - HarpyEagle: - - bugfix: Fixes people not going unconscious when they should. - - tweak: Cigarette boxes/cigar cases/candleboxes can now hold any tiny item, such - as pens or dice. - - tweak: Box storage almost doubled, they can now again hold up to 7 small items, - they can no longer hold larger items. - - tweak: Backpack capacity is now 22, dufflebag capacity is now 32. - - bugfix: Dufflebags now properly apply slowdown when worn on the back. As before, - they do not apply slowdown when held in hands. - - imageadd: Fixed missing dufflebag back sprites, ported them from /tg/. - - bugfix: 'Excavation kit can no longer be folded into cardboard. ' - - bugfix: Unathi knife harness can now hold more types of knives. - - tweak: Vials are now tiny items. - PsiOmegaDelta: - - rscadd: Can now prefill the loadout flask and vacuum-flask with a relevant liquid - of your choice. - - tweak: Alters the available selection of genders for different species during - character setup. -2016-04-20: - HarpyEagle: - - bugfix: Examining objects/yourself no longer triggers the gun hostage/aiming system. - Neerti: - - tweak: The toggle to shoot if the target talks on the radio defaults to off. - - bugfix: The aim intent icon now updates when clicked. -2016-04-21: - atlantiscze: - - tweak: Being crushed by door will now push you out of the door, preventing door - crush spam. To compensate, damage caused by door crushing has been increased. -2016-04-23: - Irrationalist: - - bugfix: Fixed clothing (gloves and jumpsuits) hidden from description on examination, - but are still being displayed on character anyway. - PsiOmegaDelta: - - rscadd: The pAI Universal translation module now includes the language of the - Resomi, Schechi. -2016-04-24: - HarpyEagle: - - rscadd: Items can now be positioned on tables by clicking. -2016-04-26: - HarpyEagle: - - bugfix: Rewrote how the floating animation is updated, the animation now correctly - updates when leaving space, activating/deactivating magboots, and buckling/unbuckling. - - bugfix: Examining people in crit now again indicates that they are not breathing. - - bugfix: Fixed spears giving slashing cuts and not puncture wounds. - - bugfix: Fixed wounds not bleeding when they are supposed to. - atlantiscze: - - tweak: Reverts the reduction of backpack capacities introduced few days ago. -2016-04-30: - HarpyEagle: - - rscadd: Mercenaries can now purchase several types of frag grenades for TC. - - rscadd: Mercenaries can now purchase grenade launchers for TC, comes pre-loaded - with random grenades. - - rscadd: Many guns now have an accuracy and dispersion penalty for firing with - only one hand, that roughly corresponds to the size and weight of the gun. You - will see a message upon shooting with a compromised aim. The penalty is also - affected by rapid-fire modes in the case of bullet throwers. To fire two-handed - simply ensure that your other hand is empty and usable when shooting. - - tweak: Laser cannons now slightly increased shot capacity and have increased accuracy - (better for fighting at longer ranges), can no longer fit in backpacks. - - tweak: X-ray laser gun now fires at the same pace as the laser carbine, has the - same shot capacity, but does much more damage against armoured targets, and - is slightly easier to one-hand with. - - tweak: Shotgun flares now blind over a larger area and illuminate for longer. - - tweak: Z8 does slightly less damage, has a larger magazine size, and slightly - more armour piercing. - - bugfix: Shooting a shotgun stun shell now makes the appropriate sound. - PsiOmegaDelta: - - rscadd: Adds a cable painter for recoloring both coils and laid down cables. - - tweak: Pulling items now carries a slowdown penalty, based on weight or size. - atlantiscze: - - tweak: SMESes can now be damaged by gunfire/explosions/emitters, and repaired - by welding tool. SMES that is too damaged will explode with strength dependent - on remaining charge. Damage can be seen by examining the SMES. - - rscdel: Old cell rack PSUs have been removed (and replaced). - - rscadd: New cell rack PSUs have been added. Comes with set of simple sprites (I'm - horrible spriter!), a new nanoUI that shows status of each power cell, and support - for upgrades. Better capacitors increase charging/discharging rate, better matter - bin increases max amount of cells that can be held inside the PSU (3/6/9 cells). - PSUs do not allow precise setting of input/output levels. These new PSUs act - as bridge between power cells and cables, allowing you to charge/discharge the - cells into the grid. - mkalash: - - tweak: Add antagonist vote now works midround - - rscadd: Ghosts can join a pool to be selected for off-station antag roles by add - antag votes - - rscadd: Add antagonist option added to the crew transfer vote -2016-05-04: - Irrationalist: - - bugfix: Mercenary voidsuits no longer hide gloves - - tweak: Rigs now hide masks when sealed - TheWelp: - - tweak: Readds Pariah space resistance. Their health is instead lowered by 15 (80->65) - - bugfix: Pariah stink now respects environment and if the person is a robot. - - rscadd: Pariahs will now vomit uncontrollably on occassion. - - tweak: Budget gloves now fit Vox. - - rscadd: Adds Vox organs. Now are both blue and alien. - - bugfix: Pariah will no longer have superhuman tasting capabilities. - - tweak: Vox hair can now be colored. It could always be colored using the random - button in the character setup and honestly, it isn't lore breaking so I'll let - people choose it themselves. -2016-05-05: - Daranz: - - rscadd: Mice and other small critters can now be eaten from hand. As a member - of species eligible to eat mice, scoop a mouse and click on your character with - the hand holding the mouse. The old method of eating from grab remains available - both for unscoopable and scoopable creatures. -2016-05-06: - HarpyEagle: - - rscadd: Allows AI holograms to change facing by clicking much like other mobs. - - tweak: Armor now has a chance to either block an attack or absorb a fixed portion - of damage, instead of randomly blocking either nothing, half, or full damage. - - tweak: Armor protection against explosions is similarily less random now. - - tweak: Riot, ablative, and ballistic armor is less hyper-specialized. They provide - moderate protection against other damage types now, while their protection against - their main damage type is reduced but still very good. -2016-05-07: - PsiOmegaDelta: - - rscadd: Can now buy the camera MIU from the 'Devices and Tools' category. Gives - the user access to the station camera network on the current Z-level. - - rscadd: Activating an uplink telecrystal in hand now teleports you to a random - semi-near location. -2016-05-08: - PsiOmegaDelta: - - rscadd: The antag uplink now offers .45 ammunition. -2016-05-11: - PsiOmegaDelta: - - rscadd: The Cardborg costume now disguises you as a proper standard borg. This - only fools synthetics (until they examine you), to and all other lifeforms you - will remain your silly cardboard wearing self. - Based on RemieRichard's appearance - framework from /tg/ -2016-05-14: - HarpyEagle: - - rscadd: Items can now be placed in pockets using the strip UI. - - rscadd: Lit welders can now be placed in pockets. Having a lit welder in your - pocket sets you on fire. - Raptor1628: - - tweak: Replaced standard Space Suit, AMI Hardsuit, Excavation Suit, and Anomaly - Biosuit sprites. - - tweak: Restricts all station hardsuits to Humans with the exception of the CE's - suit, which fits everyone but vox and diona, and the Unathi Breacher, which - is for Unathi. - - rscadd: Adds alternate voidsuit types and more flavorful voidsuit descriptions. -2016-05-15: - HarpyEagle: - - bugfix: Fixed lungs not rupturing in space. -2016-05-17: - Techhead: - - rscadd: Stack items now take up storage space proportional to the size of the - stack. - - tweak: Materials, rods, and tiles have had their weight class and max stack size - adjusted. - - rscadd: Stacks now let you split them in any amount instead of one at a time. -2016-05-19: - Haswell: - - rscadd: Added suit cyclers in the engineering and research outposts. - - tweak: Reworded ERT light armors and helmets to asset protection theme. - - rscadd: Added new xenobiologist's locker in xenobotany storage and xenobiology - airlock, replaces botanist's lockers. - - rscadd: Added one biohazard closet to xenobotany storage. - - rscadd: Added scientist lockers and wardrobes to R&D and misc. research. - - rscadd: Added extra Emergency NanoMeds to research areas. - - rscadd: Added one science wardronbe to the research outpost locker room, replaced - stray scientist's locker with xenoarcheologist's locker. - - tweak: Scientist's locker can now be unlocked with either toxins storage or R&D - lab access. - - tweak: Removed toxins storage access from xenobiologists. - - tweak: Xenoarcheologist's locker now uses xenoarcheology access. - - maptweak: Toxins lab now uses toxins storage access instead of R&D access. - - maptweak: Adds xenobiology and toxins storage access to misc. research. - - maptweak: Tools from botanist's lockers in xenobotany storage are moved to the - crate sitting nearby. - - maptweak: Removed one biohazard closet in xenobiology airlock, remaining closet - now hold two sets of suits. - SilveryFerret: - - rscadd: Changes the Death Alarms from announcing over Common channel, to announcing - only over Medical and Security channels. - Yoshax: - - bugfix: Processing strata floor can now be pried up with a crowbar. - - bugfix: Blue carpet can now also be removed with a crowbar, and has had it's ability - to burn and have corners restored. - - rscadd: Added shotglasses. These can contain 10 units. They have their whole contents - swalloed in one gulp. They can be produced in the autolathe or found in the - booze vending machine in the bar. -2016-05-21: - Haswell: - - maptweak: Revamped kitchen and bar areas. - Irrationalist: - - tweak: Accessories are now more 'magic' and more pleasant for non-humans to use. - - tweak: Copied gas_mask to gas_alt in masks.dmi, gas masks should not be obscure - when worn by Resomi. - - imageadd: Added Resomi sprites for 'brown webbing vest', 'black webbing vest', - 'white webbing vest' and 'webbing'. - - imageadd: Added Resomi sprites for Head of Security's trenchcoat and coat, and - Warden's jacket. Including the grey version of the detective's leather coat. - - imageadd: Added Resomi sprites for old and new armour vests and webbing vests - ('suit'-slot ones) - - bugfix: Fixed breath mask lacking a state name when worn by Resomi. -2016-05-22: - Yoshax: - - rscadd: The antag uplink now offers regular discounts on randomly items. - atlantiscze: - - bugfix: Breaking a lot of lights at once will no longer cause massive lag spikes. - This also applies to other sources of sparks. - - tweak: Malf AI Electrical Pulse ability now has a 15s cooldown to prevent spam. - - tweak: Door crush damage reduced by 25% according to feedback. - - rscadd: 'Electrical Storm event overhauled. It now occurs in three severities - and simulates actual storm. A warning will be broadcasted shortly before it - begins, and once it''s over. Duration is severity-dependent. Possible effects - include: Broken lights (as it''s now), Hacked APCs (same as when emagged), or - outright broken APCs with more severe event variants. Each affected APC will - also shut down briefly, this causes station-wide power outages until the storm - passes. Stronger storms last for longer and affect more APCs at once.' -2016-05-24: - Haswell: - - rscadd: Added internal affairs closets, both secure and non-secure variants. - - maptweak: Revamped internal affairs and forensic offices. -2016-05-25: - Daranz: - - bugfix: Food slices spawned in lunchboxes can now be actually eaten. - Haswell: - - maptweak: Minor furniture adjustments to forensics, xenobiology and xenobotany - laboratories. - - rscadd: Added backpacks to xenoarcheology lockers. - - rscadd: Added clipboards to science lockers. - - rscadd: Added roleplay effects for nicotine. - - rscadd: Cigars and cigarettes now contain nicotine. -2016-05-29: - GinjaNinja32: - - rscadd: Rewrote drinking glasses. There are now eight types of glass, and drink - appearance is based on color and the type of glass you put it in. - - rscadd: There are now 'glass extras' you can add to drinks. Straws, drink sticks, - and fruit slices (yes, all of them) all work. You can add up to two extras per - glass. Add extras by clicking the glass with the extra, remove by clicking the - glass with an empty hand while it's in your other hand. - - rscadd: Adding 'fizzy' things (soda water, cola, etc) or ice to a drink will make - it be fizzy or have ice floating in it. - HarpyEagle: - - bugfix: Fixes disarm-attack dislocation chances being so low that you were very - likely to break the targeted limb before it would dislocate. - - bugfix: It is now possible to disarm-attack with stunbatons like with other melee - weapons. Note that this means that using a stunbaton on disarm intent will hurt - people. - - rscadd: Trying to move while being grabbed will now automatically resist. - - tweak: Small mobs are no longer able to pin larger mobs. - - tweak: Resisting a smaller mob's grab is more likely to be successful. - - bugfix: Fixed being able to climb onto a larger mob while restrained, weakened, - unconscious, or dead. - Haswell: - - rscadd: Added resomi science uniform to custom loadout, xenowear section. - Serithi: - - rscadd: Adds in lavender. - TheWelp: - - rscadd: Fully implements space-bikes. They are available to heist and mercenaries. - - tweak: Reworks the effect trail system (so we don't repeat the code over and over - again.) - - rscadd: Added a system to invest spell slots to get more back. You can invest - one spellslot at a time and you will recieve two back. Sacrificing specific - items/reagents onto the spellbook will shorten the time by ten minutes. Can - be done once per investment. - - tweak: Shapeshifting damage share now spreads out the damage to roughly ten damage - chunks. Makes it less of a limb-gibber. - - tweak: Baleful Polymorph buffs the shapeshiftee's health pool to fifty, so no - longer can you get insta-killed. - - tweak: Avian Form has been renamed to Polymorph (get it?) - - tweak: Polymorph no longer strips you when you transform. - - tweak: Polymorph and Baleful Polymorph no longer share damage. - - tweak: Armalis icons are properly centered, for real this time. - Yoshax: - - tweak: Adjusting your suit sensors now displays a message to other people in range - that you did so. In addition, seeing someone else adjust someone's suit sensors - no longer informs you to what level. -2016-05-31: - Cirra: - - tweak: Changed all dollar symbols to the Thaler symbol. - SinTwo: - - rscadd: 'Four new hairstyles added: Fringetail, Sleeze, Rows, Rows 2' - Yoshax: - - rscadd: Admins can now toggle being able to hear remote LOOC. -2016-06-01: - Hubblenaut: - - rscadd: Adds new hairstyle (Ponytail 5) - Raptor1628: - - rscadd: Updated torch Z levels, map defines, and added non-ship Zs. -2016-06-02: - Haswell: - - maptweak: Reworked one of the break rooms on the research outpost into a work - area. - - maptweak: Separated xenobiology biohazard shutters from the other research division - blast doors, added controls in both xenobiology access and RD's office. -2016-06-04: - Asanadas: - - bugfix: Nar-sie no longer causes FIX ME default turfs to display. - - tweak: Cult pylons now serve as decent light fixtures. - Cirra: - - bugfix: Cyborgs can no longer toggle their lights while dead. -2016-06-05: - Cirra: - - tweak: Adjusted the protolathe material cost of all modular computer components. -2016-06-07: - Cirra: - - tweak: Research grippers can now hold mech parts. - HarpyEagle: - - rscadd: Makes laser beams and muzzle flashes stand out in the dark. -2016-06-08: - Asanadas: - - rscadd: Placed cryo pods on the escape shuttle (3 for humans, 1 for robots). Take - care of SSD personnel! - Cirra: - - rscadd: IPCs can now use the *buzz, *beep and *ping emotes. - atlantiscze: - - rscadd: Added functioning tiny atmospherics to telecommunications. - - tweak: Various server rooms and telecommunications central compartment no longer - contain supercooled atmosphere. Instead they are cooled down to 10 celsius by - an air alarm, and have normal ventillation. This air alarm will trigger a warning - at 30C, and alarm at 40C, which is also the point at which machines begin taking - damage. -2016-06-09: - Aticius: - - rscdel: Removes resomi hallucinations due to loneliness. - HarpyEagle: - - tweak: Adjusted the storage size of various items. - - rscadd: 'Added a new storage item: large boxes.' - - tweak: Increased the shot capacity of energy crossbows to 8. - - tweak: Makes deadman switches hopefully more reliable. - - tweak: Inflatable barriers are studier and more resistant to puncture. - PsiOmegaDelta: - - tweak: A backpack is now required to diguise as a borg, along with the cardborg - parts. The chosen backpack decides which borg module you'll appear to be using. - Techhead: - - rscadd: 'New Random Event: Solar Storms. Similar to a radiation storm, but anywhere - inside the station is safe. Also boosts solar panel output significantly for - the duration.' - Yoshax: - - rscadd: Added towels to the loadout. These can be worn on the head, belt or outwear - slots. You can also whip people with them for a special message and sound! In - addition, using them in-hand will produce an emote where your towel yourself - off. - atlantiscze: - - tweak: The PDA messaging server now reboots automatically after a power outage. - This reboot takes about twenty seconds. - - tweak: Minor mapping changes to wiring and areas on the station. Brig has few - sub-areas to even out the load. Research Dock is now on the research subgrid. - Master grid has few extra power lines to make it a little bit more robust against - physical damage. -2016-06-12: - Ccomp5950: - - bugfix: Objects in bags and other containers (including your hands and pocket) - will now hear speach again. This impacts radios, explosive implants, and the - universal recorder. - HarpyEagle: - - tweak: Small mobs such as monkeys and resomi no longer gain the benefits of holding - large or bulky items in two hands. - SparklySheep: - - tweak: Move delay after clicking has been removed. - atlantiscze: - - tweak: Modular computer batteries are no longer fully charged when printed by - research. -2016-06-15: - Ccomp5950: - - rscadd: Turret controllers now alert admins and logs when enabled or disabled - as well as when set to stun or lethal. - HarpyEagle: - - soundadd: Adds new gunshot sounds for most bullet using guns. - - imageadd: Adds new bullet casing icons. All bullet casings now have distinct icon - states for spent and unspent casings. - - rscadd: Adds a new energy weapon, the x-ray laser carbine. The advanced energy - weapon crate now comes with two x-ray carbines and one x-ray pistol. - - bugfix: Fixed spear damage being set to a default value. - - tweak: Adjused spear damage, fixes steel spears now do somewhat less damage than - steel baseball bats, but are sharp. - - tweak: Steel fire axes now do somewhat less damage when wielded, unwieled damage - unaffected. - - tweak: Runtime can now become friends with anyone, regardless of their initial - job. - - bugfix: Beepsky and other securitrons now react quicker when attacked or their - perp tries to run, and move at closer to a running pace. Beepsky should no longer - be so easy to outrun. - PsiOmegaDelta: - - tweak: Vermin may now breed anywhere on the station but should also no longer - spawn inside areas such as the atmospheric tanks. -2016-06-17: - Asanadas: - - tweak: Changes to round-ending deathsquad and syndicate commando load-outs to - maximize speed and minimize drag. - - tweak: Upped the pulse rifle family's general capacity, for better asset protection. - HarpyEagle: - - bugfix: Fixed shuttles causing lighting to break and leave shadowy rectangles - behind. - - bugfix: Fixed shuttle corner appearance on the asteroid. - JerTheAce: - - rscadd: CentCom Fax, Admin Prayer, and CentCom emergency messages now prompt admins - with a pleasing sound effect. -2016-06-20: - PsiOmegaDelta: - - tweak: EMPs now randomly set suit sensors, with strength affecting the probability - of which mode is selected. - - rscadd: Because suit sensors can be affected externally a multitool can now be - used to (un)lock the controls, to for example allow re-adjusting prisoner uniforms. - - rscadd: Because suit sensors can be locked the antag uplink now offers tools and - services which are able to jam suit sensors in various ways. - - rscadd: Adds random events which will garble suit sensor data. -2016-06-22: - Asanadas: - - tweak: Wall mounted Nanomed dispensers no longer require access to use. - Ccomp5950: - - bugfix: IPCs and will no longer get genetic abilities from radstorms. Also Diona. - - bugfix: Lobby folks will no longer hear Hailers - TheWelp: - - rscadd: Adds support for projectile guns to jam. - - rscadd: Adds cheap/crappy gun variants. - Zuhayr: - - rscadd: Changed the vault nuke into a self-destruct terminal. -2016-06-24: - TheWelp: - - rscadd: Adds traders and a trader process. -2016-06-25: - JoeyJo0: - - rscadd: Fixed chargers not charging anything other than cells. -2016-06-28: - Cirra/: - - rscadd: Added a chemistry gripper for Crisis borgs. - HarpyEagle: - - rscadd: Adds applying pressure to body parts to reduce bleeding. With desired - body part selected, help-intent click yourself or get an aggressive grab, then - help-intent attack with the grab item. Each person should only be able to apply - pressure to one body part on one person at a time, so choose wisely. Applying - pressure will get blood on your hands. - - rscadd: Splints and hardsuits that support broken limbs will automatically apply - pressure. - - rscadd: Wounds that require treatment (e.g. bandage) to stop bleeding will be - bolded in the examine output. Wounds that will eventually stop bleeding on their - own are not bolded. - - tweak: Rigsuits now only support limbs when online. - Haswell: - - maptweak: Added NanoMed wall vendors in engineering, security, bridge, bar, arrivals - and escape hallways, replacing mapped in medkits and medical supplies. - - maptweak: Removed one security officer locker, added one cyborg recharging station - in its place. - - maptweak: Added lights in head of security's office. - - maptweak: Added supply ordering, supply control and arcade circuit boards to tech - storage. - - maptweak: Replaced out-of-place reinforced walls with normal walls. - PsiOmegaDelta: - - rscadd: MedHUD overlays now have more stages, both for 'normal' and critical stages - of injury, for improved quick-diagnosis. - TheWelp: - - rscadd: Adds support for map-specific jobs. - - rscadd: Adds torch specific jobs. - Zuhayr: - - rscadd: Ports/adapted several kitchen machines from Apollo Station. -2016-07-03: - Snapshot: - - rscadd: Added Neural Laces which are an intented optional config togglable replacement - to the cloning system. Neural laces are a mechanical backup of a character's - memories and personality that can be exchanged between bodies. - - rscadd: Added Neural Lace Surgery mechanic which works the same way as implant - surgery. - - rscadd: Added Neural Relacing Machine which will automate the procedure above - and can be constructed through R&D. - - tweak: Health Analyzers will show if a subject has a neural lace. - - rscadd: Neural laces can be implanted in someone without a neural lace with a - 30% chance of taking over their body - Zuhayr: - - rscadd: The health indicator on the player GUI will now show a more detailed breakdown - of damage to your body. - - rscadd: Added bioprinter to Genetics and prosthetic organ fab to Robotics. - redstryker: - - rscadd: Adds evening gloves to the loadout, with the ability to tweak their color. -2016-07-06: - Ccomp5950: - - bugfix: Cleanbots will no longer obsess over dirt under doors/lockers or other - areas they cannot access. - Hubblenaut: - - rscadd: Racks will automatically align their contents. - - tweak: Tables use an invisible 8x8 grid for item placement. - - tweak: Items spawning or placed in closets will not be pixelshifted. - - tweak: Certain items will now always be placed centered (This is mostly reserved - for items with sprites too big to be handy for grid placement). - - tweak: Flips rack icon to be consistent with other sprites. - - bugfix: Sets center_of_mass for tools and chemistry reagent containers. - PsiOmegaDelta: - - rscadd: Uplink services now all spawn a proper item which can be used to trigger - the relevant effect at a desired time, as opposed to it firing immediately. - - tweak: The jammer item has been moved into the 'Devices and Tools' category. - - tweak: The jammer services have been moved into the 'Services' category. - TheWelp: - - rscadd: Adds the item_worth var and get_worth proc to obj subtypes and mob/living -2016-07-08: - Asanadas: - - rscadd: Added two pairs of forensic gloves for detectives to use, ceasing their - self-incrimination. Replacements can be found in the cargo detective crates. - TheWelp: - - tweak: Rebalances leap to respect handcuffs, ability to walk, etc. - - tweak: Pariahs HP deficit has been removed (65->100), instead they are now more - vulnerable to all types of damage. - - rscadd: Adds missing hair color flag for regular Vox. Now you can have colorful - dyed Vox hair! Within reason. -2016-07-09: - HarpyEagle: - - rscadd: Severe enough burn damage now causes one-time blood loss due to blistering - and body fluid cook-off. - - rscadd: Armor that provides 'bio' protection will now protect against the effects - of slime feeding. Slimes can still glomp you, however, and are still dangerous - even if you are wearing biohazard suits. -2016-07-12: - atlantiscze: - - tweak: Random event probabilities have been changed a bit. This is mostly noticeable - with electrical storms, which should be less common now. - - tweak: Electrical storm now shuts down APCs for longer duration which is controlled - by event severity. APCs with critical flag are now affected too, but are only - shut down for a short time in comparison to others. - - tweak: EMPs are no longer one-hit kills for AIs - APCs with critical flag take - reduced damage from EMPs, and AI's power restoration routine now resets the - APC that may have been EMPed. - - tweak: AI's power usage has been overhauled. Under the hood changes should improve - reliability a bit and take more scenarios in consideration. The power restoration - routine now provides better feedback to the AI if it fails, such as, whether - the APC is broken or only discharged, etc. - - rscadd: AI now has a Shutdown verb that can be used to reduce it's power usage - five times. This disables AI's control, cameras, and most communications as - if it was without power. This verb acts as a toggle, so it can be used again - to turn yourself back on. - - rscadd: AI now has Toggle Power Override verb that can be used to disable power - saving mode when it loses APC power. This results in much faster discharge of - internal capacitor, but allows you to operate as if you were powered. Can be - toggled at any time. -2016-07-13: - HarpyEagle: - - tweak: Voidsuits and cyber suits are now more shock resistant, now roughly between - hardsuits and thick clothing. -2016-07-14: - atlantiscze: - - tweak: Shield generator configuration has been tweaked. Shield generators upkeep - power is reduced considerably (stationwide shield is approx. 1.1MW at full strength). - Shields still use a lot of power when regenerating. - - tweak: Shield capacitors now act as actual capacitors. Their power storage is - 2 GJ, and maximal input 4MW, as opposed to 8MJ/400kW it was now. - - tweak: Shield generator+capacitor UI now displays in kilowatts and megawatts instead - of watts where applicable. -2016-07-17: - TheWelp: - - tweak: Reduces fireloss cost of casting Dyrnwyn (30->10) - - tweak: Reduces investment time (30 minutes -> 15) - - tweak: Entangle is now a hand-spell. - - rscadd: Humans can now use the *vomit emote, which causes them to vomit. -2016-07-18: - PsiOmegaDelta: - - rscadd: The antag uplink now offers a shield disrupter in 'Devices and Tools' - category. Handy for when that hull shield gets in your way. - - rscadd: Once an emergency response team has been successfully dispatched, as opposed - to simply requested, the emergency shuttle cannot be called for 30 minutes. -2016-07-22: - Daranz: - - bugfix: FixOVeins can now be used for attaching robotic organs (such as neural - laces) in organic patients. Follow the same procedure as with normal organ transplant. - Rymdmannen: - - rscadd: Added department specific rubber stamps for cargo and warden. - - maptweak: Replaced 'small rubber stamp' with corresponding new ones in cargo area - and warden's office. - - maptweak: Placed a 'DENIED' stamp in captain's office. - - spellcheck: Renamed ''quartermaster's stamp'' to ''quartermaster's rubber stamp''. - Snapshot: - - rscadd: Moved airlock electronics, brig doors, portable canisters, and cargo computers - over to TGUI - - tweak: Cargo ordering computers have been completely reworked. Both the supply - and ordering computer have been merged into one which can be logged into or - out of by a crew member with cargo access. The computers will allow only one - computer to be logged in as a register at a time and orders cannot be placed - without a register active. - - tweak: The cargo ordering system has been tweaked to allow requests even when - there are not enough points available so that cargo can queue items into their - cart at their discretion. Items moved to the cart can be demoted back to requests - as well. - - rscadd: The cargo computer now allows crew members to print a receipt of their - requests for their onw use. - - soundadd: Added sounds for printing from the cargo computer for more ambient sounds. - - experiment: The cargo computer will quietly beep whenever a successful ui button - press is completed. This is an experimental test to see if more ambience can - be added without becoming too much of an annoyance. - atlantiscze: - - rscadd: Adds maintenance braces. These can be printed by research and used to - lock down an airlock. Braces can be removed with paired keycard or maintenance - jack tool (also available from research). Braces prevent the airlock from opening - via any means, and absorb a lot of damage until they break off, protecting the - airlock. -2016-07-23: - PsiOmegaDelta: - - tweak: Some antag uplink weapons now come with ammunition (and a container to - hold them) and their price and description has been updated accordingly. - - tweak: Buying random items from the antag uplink will no longer give you weapons - without relevant ammunition, or ammunition for weapons you may not have. -2016-07-25: - Superbee29: - - rscadd: Ghosts can now see the power in a cable when examining it. -2016-07-29: - Raptor1628: - - tweak: Replaced Tactical Armor sprites and stats. Overall less protective. - - rscadd: Adds new gas mask sprite. - - tweak: Adjusted helmet and armor values. Helmets match their armors a bit more, - but are usually more protective. - - tweak: Adjusts armored vests for the torch and splits ballistic/ablative armor - into vest and full-body versions. - atlantiscze: - - tweak: Add Antagonist vote can no longer be freely called by players. It can still - be called by admins, or as an alternative to crew transfer. - - tweak: Add Antagonist is no longer an alternative to crew transfer during Extended - gamemode. The intention is to keep that gamemode antagonist-free, as it was - originally intended. - - rscadd: Players in the lobby will now see which antagonist types were added to - the game. This is displayed below the gamemode's name in the Lobby tab. -2016-08-01: - HarpyEagle: - - rscadd: Emagged and traitor synths can no longer be locked down, except by physically - cutting the lockdown wire (merely pulsing will not work). - TheWelp: - - rscadd: Certain races can now swallow objects whole by using the disarm intent - and aiming at their mouth. - - rscadd: Vomitting now shoves out all the things in your stomach. - - rscadd: Adds support for projectile vomitting being an ability of a species. -2016-08-02: - Haswell: - - rscadd: Modules installed within a hardsuit will now be listed when examining - the hardsuit control module while being held or worn, if the maintenance panel - is open. - Minijar: - - rscadd: Upgrades anomaly isolation to be able to contain pretty much any dangerous - anomalies with boroscillate windows and blast doors. - PsiOmegaDelta: - - rscadd: Ion storms now also affect unslaved borgs, but not drones. - Zuhayr: - - rscadd: Prevented xenomorphs from taking shrapnel or breaking limbs. Buffed non-queen - xeno weed health regen. Remember to rest to not take a heal penalty. - - rscadd: Prevented weeds from entangling species with the NO_SLIP flag. -2016-08-06: - Zuhayr: - - rscadd: Added status display icons for green, blue and delta alerts. - - rscadd: Status displays now have coloured lights for alert icons. - Zuhayr, GinjaNinja32, and Snapshot: - - rscadd: Implemented full body prosthetics. Full Body prosthetics (FBPs) allow - replacement of the entire body with cyborg components and replacement of internal - organs with synethic or assisted counterparts. Players can create a FBP character - by selecting full body in the limbs section of character preferences. - - rscadd: FBPs gain the benefits of a stronger body and no longer requiring breathing, - but are prone to overheating much like IPCs and can take pressure damage in - space. If you play an FBP, be sure to wear a suit and cooler! - - rscadd: IPC monitor screens are now a seperate object in the loadout menu. IPCs - can select a variety of other heads from other prosthetic manufacturing companies - to change their head and body appearance. - - imageadd: IPC monitor screens have an object sprite that's synced to their mob - sprite. - - tweak: Rebalanced IPC brute and burn modifiers due to the introduction of FBPs. - These settings may be tweaked again in the future after gameplay has been conducted. -2016-08-07: - Asanadas: - - bugfix: 'Brings an end to the deadly feud between two of the Exodus''s mascots: - Pun pun, and Officer Beepsky.' -2016-08-08: - Haswell: - - tweak: Emitters can now be locked using IDs with engine room access while it's - on or off. - Techhead: - - rscadd: Ghosts can flicker lights when the round is spooky enough. -2016-08-11: - Haswell: - - tweak: Engi-Vend and Robco Tool Maker machines can now be used by atmospheric - technicians. -2016-08-15: - Asanadas: - - rscadd: Neural laces can now be destructed and created in a proper research lab. - PsiOmegaDelta: - - rscadd: Invented supermatter grenades and made them available to certain sets - of antags. - - rscadd: The antag uplink now allows you to also buy x1 grenades, in addition to - the x5 sets, with some markup. - TheWelp: - - rscadd: Adds ability for merchants to fast buy via cash using a banking system. - - rscadd: Adds ability for players to sell things to merchants. They will only take - things they like. -2016-08-18: - Haswell: - - tweak: The autopilot on the escape shuttle can no longer be overridden during - crew transfers while on blue alert or lower. It can only be overridden during - an evacuation, or during an alert level higher than blue. - Karolis2011: - - rscadd: Added whole map capture tool, only accessable by admins. -2016-08-22: - Asanadas: - - rscadd: The Exodus robotics lab has a newly installed Robotech deluxe (we found - it out in the shed). Also, a new light switch. -2016-08-26: - Asanadas: - - rscadd: Dug out an old engineering vending machine and added it to the engineering - workshop. - Soadreqm: - - rscadd: Made tape recorders use removable 10-minute cassettes instead of 60-minute - internal storage. - TheWelp: - - rscadd: Adds four new traders, a robot trader, a pet trader, a replica trader, - and a prank trader. - - rscadd: Adds unique items (and a bot) for the traders to sell. - - rscadd: Adds missing item worth values to the list. - - tweak: Unique NPCs now stay around for twice as long. - - tweak: Tweaks Hostile mob AI, so that if they have no faction at all, they will - target nobody. - - tweak: Spawner grenade can now set variables (using a list) upon spawning whatever - it spawns. -2016-08-28: - PsiOmegaDelta: - - tweak: Telecrystal amount increased from 25 too 100 with uplink costs adjusted - accordingly, all to allow even more price differentiation. - - tweak: A five pack of grenades is now 20% cheaper than buying them one at a time. - atlantiscze: - - tweak: Power cell no longer use magical charge units. Instead they are rated in - WattHours. For example, a cell with rating of 1000 will be capable of providing - 1000 watts for one hour. (or 2000 watts for half a hour, etc.) - - tweak: In general this means that a power cell with rating of 1000 will hold MUCH - more energy than it held before. To balance this out, power cell capacities - have been reduced considerably. When these two changes add up the cells last - for approximately same time as they used to. - - tweak: As part of this change, higher grade power cells have became a bit more - rare. Research can still fabricate them in bulk, but they are much rarer from - random spawns, and no longer available from vending machines. Vending machines - provide standard cells instead. EngiVend can be hacked to provide few high capacity - ones. - - tweak: Vending machines no longer shoot objects at people when malfunctioning. - They merely shudder and dump the item on the ground. This should make the random - event a little bit less annoying. - - tweak: Space heater's default temperature setting is now 20C (changed from 50C), - which is the default station temperature. It can still be changed via the UI - when the panel is open. -2016-08-29: - Zuhayr: - - rscadd: Added /vg/ direct-action ventcrawling. You will now crawl through the - actual pipe network, a step at a time. Have fun. -2016-08-30: - Haswell: - - rscdel: Atmospheric technician is now unavailable for general play. - - rscadd: Alt title 'Atmospheric Technician' is now added to engineers. - - tweak: Engineers now have all the accesses atmospheric technicians previously - held. - - tweak: Tweaked job selection screen to properly indicate which jobs aren't available - to play as. - Kelenius: - - tweak: Cultists don't need to research words anymore. - - tweak: Astral journey's damage over time lowered to sane levels. - - tweak: Changeling revive, when the timer is up, will now give you a verb that - revives you, allowing you to choose when to get up, instead of doing it immediately. - - tweak: Changelings will always get DNA, species, and languages together, be it - via absorbtion, DNA sting, or hive channel. - - tweak: Changeling transform and change species was merged. - - tweak: Changelings no longer display gender in changeling chat. -2016-09-02: - Techhead: - - rscadd: Medical splints can now also be applied to hands and feet (in addition - to arms and legs). - - rscadd: For those that miss the old functionality, ghetto splints have been added. - These can be crafted with a roll of tape and a metal rod and can only splint - arms and legs. - atlantiscze: - - tweak: Converts few other things over to work with the recent CELLRATE change. - This fixes various issues where battery life of some things (drills, etc.) was - very short, while some other things had power cells with very large capacities. - - tweak: Hardsuits and Mechas now use energy in joules rather than Wh (this fixes - Ninja suit, among others). Various exosuit tools now have rebalanced power usage. - Energy based exosuit weapons use energy on per-shot basis, ballistic weapons - use single massive spike when fabricating a new magazine. - - tweak: Minor power-related changes to exosuit modules. Energy cost of some offensive - modules increased a bit. - - tweak: Added short cooldown for teleporter module to prevent spamming. - - tweak: Added power usage to various industrial/science modules (anomaly scanner, - various drills, etc.). - - tweak: Increased mounted RCD power usage by a lot (matter fabrication is very - power demanding process). - - tweak: Powersink module is limited to 120kW transfer rate, and is slower (30kW) - when used on APCs with enabled interface lock. Furthermore, when draining from - APC it first tries to take energy from the grid, before resorting to taking - it from the cell. - - bugfix: APCs drained by a ninja no longer get stuck on 0% charge, and instead - recharge themselves as usual. - - rscadd: Repair capability of upgraded cyborg rechargers now also works on IPCs - and FBPs. - - tweak: If the cyborg recharger is upgraded enough, it will be capable of rebooting - (and eventually repairing) destroyed modules, for some extra power. -2016-09-03: - Haswell: - - rscadd: Added a fashion vending machine in the locker room for snowflake loadout - items. - - rscadd: Added more SMES coils and circuitboard to supply packs. - - tweak: Adjusted price of SMES coil. - Superbee29: - - bugfix: Changeling transformation (of itself and others via sting) no longer causes - organ rejection. - - bugfix: IPCs can no longer be stung by changelings. -2016-09-07: - Chinsky: - - rscadd: Added a hawaii shirt to loadout accessories. Can be attached to clothing - like suit jackets etc. Can also be found in mixed wardrobes. - Cirra: - - rscadd: Spiderlings now have a unique sprite specific to the type of giant spider - they will become. - Kelenius: - - rscadd: Ninjas now have access to a PDA that has an empty uplink (for exploitable - information). -2016-09-09: - Daranz: - - tweak: If you crack open an amputated limb and later reattach it, you will now - have to cauterize it after reattachment. - Haswell: - - tweak: Reduced wallet capacity, added more items that can fit in wallets. -2016-09-10: - Cirra: - - rscadd: Resomi now process reagents twice as fast. - - tweak: Moved all Resomi organs to the chest, apart from the brain and eyes. - Kelenius: - - rscadd: Xenoarcheology code has been partially redone. - - tweak: Pick set will now sort the picks inside it. - - tweak: Removed useless random numbers from GPS coordinates in various places. - I'm sure we have not lost the arcane knowledge of rounding 500 years into the - future. - - tweak: Picks renamed to show their excavation depths. - - tweak: Suspension generator's power use lowered. - - tweak: Suspension generator's different field types removed. By the way, remember - that they can suspend any item and even mobs. - - tweak: Archeology belts and pick sets can now hold small pickaxes. Pick sets still - only have 7 slots. Brushes fit on your ears. - - tweak: Empty rock drop rate reduced. - - tweak: Empty rock renamed from 'rock' to 'small rock' so you can tell if you are - clicking on a turf or an item when hovering over it. - - tweak: Empty boulder spawn rate reduced. - - tweak: Tape measuring is a bit faster. - - tweak: Scanner now shows the lowest and the highest depth of the find (highest - is depth + clearance) for easier calculations. Ideally, you need to hit exactly - the lowest spot. Less ideally, hit anywhere between higest and lowest. Hit below - lowest and you have a chance to break the find. - - tweak: You can now use a brush to clear strange rocks. Welder uses less fuel for - that than before. - - tweak: Anomaly analyser's report made a bit easier to read. - - tweak: Anomaly locater will now also locate normal finds. - - bugfix: Gas masks will now correctly spawn as archeological finds. - - bugfix: Digsites will now properly contain several (4-12) turfs in a 5x5 radius. - Be careful when digging near your finds. - - bugfix: Suspension generator will now correctly turn off (qdel issue). - - bugfix: Archeology overlays won't disappear when the icon is updated (e.g. when - mining next to it). - - bugfix: Archeology overlays won't overlap each other and will properly disappear - when you mine out a find. - - bugfix: Some spawning oddities were fixed. - - bugfix: Checks for whether you get a strange rock or a clean item were fixed (previously - it always gave you clean item where it should have been rolling a random number). - - bugfix: Can no longer get rid of any item by putting it into evidence bag and - bag into core sampler. - - bugfix: CO2 generator effect now has a type. - - bugfix: Phoron generator effect will now always generate phoron, not sometimes - phoron and sometimes oxygen. - - tweak: You can now lit smokables with cigarettes and cigars. - - tweak: You can now explode welder tanks with all flame sources (cigarettes, lighters, - candles, igniters, etc). - PsiOmegaDelta: - - tweak: The impaired Resomi vision is now represented by the oxygen overlay rather - than the welding overlay. - - tweak: Vision impairment from wearing a welding mask now stacks with nearsightedness - due to now being two separate effects. - - tweak: Species and individual specific nearsightedness now stacks, i.e. a nearsighted - Resomi won't be aided at all to the same degree by the standard prescription - glasses as other species would be. - - tweak: Glasses can now have varying degrees of prescription. -2016-09-11: - PsiOmegaDelta: - - rscadd: Equipment that doesn't check a specific id card for access now checks - the collective access of all id cards in both hands and the id slot. Among other - things such equipment includes doors. -2016-09-14: - Cirra: - - bugfix: Nurse spiders should now correctly have a chance to implant eggs on attack. - Zuhayr: - - tweak: Ninja cloak now only renders you invisible to the player; right-click will - show you, and your inhands will still render. -2016-09-15: - Cirra: - - rscadd: Service grippers can now hold straws and sticks. - Haswell: - - rscadd: Added coin mint to the mining outpost. - - rscadd: Borosilicate (phoron) glass can now be made with the mineral processor. - atlantiscze: - - rscadd: Created new AI restorer program, by default available on research consoles. - Also added a new hardware piece that acts as connection between intellicard - and a computer (laptop and console only). The new program allows AI restoration, - as well as simple law modifications. It can also be used to purge malfunctioning - AI's laws correctly. This program can only work on intellicarded AIs, that are - placed in the computer itself. The program can be run/used by anyone, but requires - head of staff level access to download from NTNet. - - rscdel: Removed old AI integrity restorer console -2016-09-16: - atlantiscze: - - rscadd: Added camera monitoring program to modular computers, that can be run - on consoles, laptops and tablets. Most mapped in consoles come with this program - preinstalled. - - tweak: Due to removal of old consoles (telescreens were part of these consoles), - entertainment monitors were replaced with civilian modular console where applicable. - This console can be used to access the entertainment channels. - - rscdel: Removed old camera consoles, including circuit boards and other related - things. -2016-09-17: - Chinsky: - - rscadd: Some suit jackets and hawaii shirts can be toggled between buttoned/open - states with a verb. - Zuhayr: - - rscadd: Added a reset slot button to chargen. -2016-09-18: - PsiOmegaDelta: - - rscadd: All staff should now be able to access the Secrets menu. Each category - handles its own permission checks.. - - rscadd: Administrators and moderators can now review admin PMs and attack logs - from the Secrets menu, see the new Investigation category. -2016-09-19: - PsiOmegaDelta: - - rscadd: Ghosts now have a 'Teleport to Coordinate' verb. -2016-09-21: - Chinsky: - - rscadd: Ghosts AND AI eyes can travel zlevels again with Move Upwards/Down verbs. - - rscadd: Humans can too, with either working jetpack or wearing magboots and near - a wall (climbing). Don't try in gravity-working areas though, you'll still drop. - Haswell: - - maptweak: Readded missing blast shutters on mercenary shuttle and Skipjack. - - maptweak: Removed random steel floor tiles. - - maptweak: Added random coin spawns. - PsiOmegaDelta: - - maptweak: There are now more rechargers placed around the station. - - maptweak: Added fire fighting equipment in the library and port research maintenance - areas. - - maptweak: The engineering washroom now has two entrances. - atlantiscze: - - tweak: Vastly increases amount of water held in fire extinguishers and water tanks. -2016-09-23: - PsiOmegaDelta: - - rscadd: The antag uplink now offers energy guns in the 'Highly Visible and Dangerous - Weapons' category. - Szunti: - - bugfix: Acids, plant-b-gone etc. kill weeds instead of growing them. Sugar grows - them instead of killing. -2016-09-25: - Chinsky: - - rscadd: Can now pick color of labcoat in loadout menu, replacing separate preset - colored coats. My condolences to those who had preset ones. - Haswell: - - maptweak: Added lots of random spawns in maintenance, replacing most old mapped - in items. -2016-09-26: - atlantiscze: - - tweak: Malfunctioning AI ability Basic Encryption Hack now lists station APCs - first. Off-station APCs (that do not contribute to CPU generation) are appended - to the bottom of the list. - - rscdel: Airlock brace keycards have been removed. - - tweak: Airlock braces when held inhand can be accessed and configured as an airlock - electronics circuit board. Instead of brace keycards they can now be unlocked - by swiping an ID with configured access (or by using maintenance jack). Configuring - the brace has no access requirement, but it can't be configured when installed - on an airlock. -2016-09-30: - Kasuobes: - - rscdel: Removed IR emitters until they are fixed and don't kill servers. -2016-10-03: - Asanadas: - - bugfix: In-game record editing (security and medical) will now respect the same - character limits as it does in the character-setup panel. No more accidentally - massacring those long records! - Haswell: - - rscadd: Added station date to status tab. -2016-10-06: - Chinsky: - - rscadd: Can now use chopped off arms/hands to leave fingerprints on things. Keep - it in your active hand, and its fingerpints will be used. - Datraen: - - tweak: Skrell are now more resistant to various chemicals, more susceptible to - pepperspray. - Haswell: - - tweak: Drone laws have been revised to exclude non-interaction clauses to promote - RP, but retains non-interference intent. Treat and respect them as actual players. - - tweak: Reworded corporate law skill to cover broader areas. Includes SolGov law - and general legal knowledge. - Inforsaken: - - rscadd: Radio Distortion is now linear and uses more than just the * character. - PsiOmegaDelta: - - tweak: If playing a hidden game mode, i.e. Secret, staff now see the actual game - mode in the Lobby. - Raptor1628: - - rscadd: Added a lot of items to the random maintenance spawns. - - tweak: Reduces metagame potential in the money briefcase description. -2016-10-08: - Ferracio: - - rscadd: Name and species can now be selected for newly-constructed FBPs. - - tweak: Removed 'system instability' readout from robot analyzer due to the targets - being immune to 'system instability'. - - rscadd: Added ability to create full-body prosthetics by adding a robot head to - a robot torso. - - tweak: Robotic heads and torsos can now be manufactured with brands. - Konater: - - imageadd: Added some hairstyles for Resomii that n00b created. - TheGreyWolf: - - rscadd: Added Sign language, which can be selected from character setup. - blazerules: - - imageadd: Added a new Emo hair style, one that doesn't cover the eyes. -2016-10-10: - Levyafan: - - rscadd: Added research tape to excavation closets and xenoarchaeology lockers. - - rscadd: Added optical meson scanners to miner lockers. - - rscdel: Removes optical material scanners from miner lockers. Those were useless - anyway. - - maptweak: Mapped in a second suspension generator, some racks, and a rag to the - research outpost. - - maptweak: Mapped in a soft drinks vendomat and a coffee vendomat to the mining - outpost. - PsiOmegaDelta: - - tweak: Objects are now layered using both planes and layers. Visual layering issues - are expected, please report them except if you're running a client older than - 510 in which case you have to update first. - - tweak: The 'Show Server Revision' verb should now be more copy-paste friendly, - in terms of adding the info to issue tickets, and now also includes the major - client version. -2016-10-13: - Hugo14453: - - rscadd: Added golden soap. - Lorwp: - - maptweak: Fixed Firing Range Camera from being named 'Medical Station'. Changed - Cameras in firing range to 'East' and 'West' Respectively -2016-10-16: - Asanadas: - - rscadd: The Mental Health office has been slightly renovated! Psychiatrists and - the other jobs who reside in the Mental Health office of the Medical Bay will - find more pills readily available in their closet, and a few tidier paperwork - items within easier reach. - - maptweak: The Head of Security and Warden lockers now spawn with a generic NT - helmet. - - tweak: The Head of Security's dermal implant now has the same armor values as - a generic NT helmet. - LorenLuke: - - rscadd: Added a toggle to the ninja's self-destruct. Default starting is 'off'. - - tweak: Adds a delay and visible messages (and now a blinking effect!) after the - self destruct is activated. - PsiOmegaDelta: - - rscadd: Staff with sufficient rights can now edit global variables using the 'View - Global Variables' verb. - TheGreyWolf: - - rscadd: Added the tacticool turtleneck to the custom loadout. -2016-10-18: - Mo_Bros: - - imageadd: Adds new icon for compressed gas warning signs. -2016-10-21: - Broseph Stylin: - - rscadd: Added HUD aviators to the loadout. They're restricted to security, and - can toggle between HUD and flash protection modes, but won't offer both at once. - Chinsky: - - rscadd: Added floating camera thing for Journalists, in the library office nook. - It acts like a portable security camera on Thunderdome network. Can also send - audio on Entertainment radio channel. -2016-10-23: - Broseph Stylin: - - rscadd: 'Added a few new items to the loadout: Various ties, a black vest, stethoscope - (medical only), a black suit jacket, three hazard vests, and a cigar case.' - Chinsky: - - rscadd: Added hotkeys for target zone selection. Ctrl+Numpad[number] or just Numpad[number] - in hotkey mode. Make sure to have NumLock enabled. Numpad8 is head-eyes-mouth - (it cycles through those), 4-5-6 are right arm/hand-chest-left arm/hand (cycles - again), 1-2-3 are right leg/foot-groin-left leg/foot(you know the drill) - Ithalan: - - bugfix: Added missing anomaly scanner pad to research outpost's cell A. - - maptweak: Added a health analyzer to the research outpost lab so researcher can - monitor their test subject monkeys. - - maptweak: Removed an oddly placed lightbulb on the exterior surface near the research - outpost. -2016-10-29: - Lorwp: - - maptweak: Added Emergency Wall Mounted Oxygen Tanks to Most suitable External - Airlocks. You can breathe from them using a Mask Attached to them. - Mark9013100: - - rscadd: Gives the Science, Night Vision, Tactical, and Material Goggles action - buttons. -2016-11-01: - Broseph Stylin: - - rscadd: Prescription medical and security HUDs have been added to the loadout. - PsiOmegaDelta: - - tweak: Mercenaries now begin with proper boots, gloves, and belts. -2016-11-02: - Broseph Stylin: - - rscadd: Added a few dresses to the loadout. - Mark9013100: - - rscadd: Adds black softcaps. Can be found in black wardrobes and custom loadout. -2016-11-03: - Broseph Stylin: - - tweak: Most loadout items with multiple variants can now be found under lists - in their respective categories. This change WILL mess up your saved loadouts, - so be sure to redo them. - Siegdermaus: - - imageadd: Adds a new icon for turret and blast area caution signs. -2016-11-04: - ColaFiend: - - rscadd: Added new welding masks available in the gear loadout for engineers and - roboticists. -2016-11-06: - Asanadas: - - tweak: Added a moderate delay to the opening and closing of robotic maintenance - hatches. No more quickscope-cellsniping. - - bugfix: Can no longer run away from a robot while removing its MMI and allow the - process to succeed. - - bugfix: Fixed a one-pixel mistake in one of the robotic maintenance step images. - Broseph Stylin: - - tweak: Most loadout items with multiple variants can now be found under lists - in their respective categories. This change WILL mess up your saved loadouts, - so be sure to redo them. - Datraen: - - tweak: Skrell now have mild darksight. - - tweak: Skrell now prefer slightly warmer temperatures. -2016-11-08: - atlantiscze: - - tweak: Blobs are now considerably more resistant to energetic weapons, be it handheld - lasers, energy guns, or even emitters. An emitter is still useful to suppress - the blob a bit, but one emitter shouldn't be capable of outright killing the - blob. - - rscadd: Blob has a relatively small chance to grow secondary cores. These cores - are considerably weaker, have lower health, but still help spread the blob a - bit more. - - tweak: Emitter power usage increased (30kW to 100kW). While it is still possible - to run one with PACMAN, you have to keep it on overload. - - tweak: Reinforced walls are now considerably more resistant against projectiles - of all kinds, be it emitters, handheld weaponry, or anything else. Regular walls - are unaffected. An emitter is still useful if you need to burn through one, - but expect to wait - it needs over fifty pulses for a plasteel reinforced wall. - - tweak: Details on the above. Reinforcement is calculated from the material that - is used to reinforce the girders when building the wall. Weak materials such - as wood have 0% reduction in taken damage. Most basic materials have 50% or - so. Steel is decent material with 80% reduction. Plasteel is very good with - 90%, and titanium is the best with approx. 92% reduction (though it has lower - overall health) - - rscdel: Removed bubble shield generators, hull shield generators and shield capacitors. - Also removed shield disrupter. - - rscadd: Added a replacement advanced shield generator, that has a combined function - of a capacitor, and both shield generators (hull shielding is toggleable). This - shield generator must be built and once constructed is immobile (but can be - deconstructed again). These generators are fully configurable, have better hull - shielding that doesn't block shuttles, mass drivers and others, and have different - energy system. Damage will drain the shield's energy directly. - - rscadd: Added Shield Diffusers. Two variants exist - floor mounted and handheld. - The handheld variant can be purchased from traitor uplink, and runs on an internal - cell. The floor mounted variant layers under floor tiles and is APC powered. - These diffusers dissipate shields in adjacent tiles (+ shaped pattern). The - generator can be set to try to counter these, in which case each diffuser causes - major EM strain on the shield. - - maptweak: Added two shield generator circuit boards and two shield diffuser circuit - boards into tech storage. -2016-11-09: - Irrationalist: - - bugfix: Unathi and Tajara can now spawn and show preview with gloves included - in outfit of [HIGH] selected job - - tweak: '/obj/item/clothing/gloves has new proc: cut_fingertops - for easier adminbus' - atlantiscze: - - rscdel: It is no longer possible to ventcrawl through scrubbers. -2016-11-14: - Datraen: - - tweak: Removes a large portion of camera bloat. - TheGreyWolf: - - rscadd: Adds sweaters in all the rainbow's colors and more to the custom loadout. - Zuhayr: - - rscadd: Restored scrubber crawling, made them weldable. -2016-11-16: - Legius: - - bugfix: Made the holdout pistol not turn invisible when unloaded with a silencer - attached. -2016-11-17: - Legius: - - maptweak: Added a airlock access button to the exterior of the Dormitory airlock. - - maptweak: Moved the meter covering the second radiator pump so it no longer covers - the pump. -2016-11-18: - Datraen: - - tweak: Global announcer now has access to engineering channel. - - tweak: Supermatter now uses the global announcer. - - bugfix: Supermatter now sends out integrity alerts. - Legius: - - bugfix: The cryotubes on the shuttle and at centcomm are no longer death traps. -2016-11-22: - Broseph Stylin: - - tweak: Waistcoats and suspenders are now accessories and no longer suit items. - Their loadout entries have been changed as well. - PsiOmegaDelta: - - rscadd: There is now a character preference, Ghost Follow Links, to toggle between - short and long follow links. - atlantiscze: - - rscadd: The AI can now speak most languages that are available to station races. -2016-11-28: - Finalsong1: - - tweak: Changes the Vat-Grown Human economic modifier from 5 to 10. - Haswell: - - maptweak: Adjusted armory layout and inventory. - Irrationalist: - - bugfix: Fixed stun-batons being unuseable by synthetics due to hitcost increasing - each (de)activation - - bugfix: Fixed stun-batons not properly updating their icons - Kelenius: - - bugfix: Ghosts can now hear whispers. - - bugfix: Ghosts can now hear people who are EVA. - Runa Dacino: - - rscadd: Made Resomi security smocks available for detectives. - TheGreyWolf: - - rscadd: Added department ponchos to the custom loadout. - - rscadd: Added department and normal winter coats to the custom loadout. - - rscadd: Added a colorable scarf to the custom loadout. - - rscadd: Added lockets to the custom loadout. - - rscadd: added the formal outfit to the custom loadout. -2016-11-30: - Finalsong1: - - tweak: Changed the armor values for specialist vests, reinforcing that they're - designed to be used against that specific damage type. - - rscadd: Added the ability to order a practice laser carbine crate from cargo. - LorenLuke: - - rscdel: Got rid of the awful singletank code. - - rscadd: 'Created new singletank construction and disassembly code (see below): - Single Tank devices must be wired before having assemblies attached.' - - tweak: Single tank devices are single use only with their igniters. The igniters - create a small bit of heat to get fuel to its burn temperature (126C). - - tweak: Added relief valve to air tanks. They now trigger leak logic at over 173C - or leak pressure. Can be welded shut to prevent leakage. - - tweak: Single Tank devices must be wired before having assemblies attached. - - tweak: Air from rupturing/exploding tanks now merged into environment instead - of deleted. - - tweak: Explosion radii based on pressure, gas amount, and volume of rupturing - vessel. - - bugfix: Assemblies can now be used when attached. - PsiOmegaDelta: - - rscadd: 'New Ion law: Lawbound Synths may now have to communicate with the crew - in a random language other than Galactic Common.' - Zuhayr: - - tweak: The gibber is now called a meat grinder, since that's what it is. - - tweak: Eating a human organ or limb is now done in the exact same manner as any - other food. If you try to eat a limb, though, it will not be usable in a transplant, - for obvious reasons. - - tweak: Human organs now fit into the reagent grinder. -2016-12-03: - ForFoxSake: - - bugfix: Fixed a possible href exploit allowing any living player to speak any - language. - - bugfix: Organic beings can no longer speak Encoded Audio Language, although they - can still understand it just fine. - - tweak: Positronic brains can now speak Encoded Audio Language. - - tweak: Station manufactured Full Body Prosthetics can now speak Encoded Audio - Language. - Haswell: - - tweak: Renamed advanced voidsuit to advanced engineering hardsuit. - - tweak: Advanced engineering hardsuit now comes with in-built magboots and insulated - gauntlets that also fit Tajara and Unathi. - - tweak: Added more things that fit on the EVA hardsuit and advanced engineering - hardsuit's chestpiece. - Lorwp: - - tweak: Replaced Shoes in Engineering and Atmospherics Wardrobes with Workboots - Meyar: - - rscadd: The loadout limit has been upped to 10 from 5. - TheGreyWolf: - - rscadd: Added ability for cargo to order a firefighter closet under the engineering - tab. - - rscadd: Added Siik'Tajr as a native Tajaran sign language. - - rscadd: Towels are now in the athletic lockers in the fitness room by the holodeck. - Zuhayr: - - tweak: Ported Prometheans from Polaris, replacing slime people. - - tweak: Added water reagent interactions for Prometheans equivalent to acid. -2016-12-05: - FTangSteve: - - wip: RootSpeak is now split into a local and a global variant. For now the global - acts as a hivemind. - - bugfix: Diona nymphs now can only speak the local variant of rootspeak - Nero-07: - - rscadd: Changed the default option from 'Get random job' to 'Return to lobby' - if your preferred job is already taken. Should only affect new characters - Runa-Dacino: - - rscadd: Added ability to build press cameras to roboticist - atlantiscze: - - rscadd: 'Adds a new modular computer program: Classic Arcade, which is a computer - variant of the arcade machine, minus the prizes.' -2016-12-08: - Chinsky: - - tweak: Mecha sleepers do not KO victimes anymore. - - tweak: You can leave mecha sleepers like normal ones, by walking out. - Cirra: - - rscadd: Lawed synthetics (Borgs + AI) can now understand but not speak sign language. - Datraen: - - tweak: False walls no longer vent up and down. - FTangSteve: - - bugfix: Creatures without eyes can no longer be flashed. - Finalsong1: - - rscadd: Added a few more leather items to the botany biogenerator. - - rscadd: Replaces mead's sugar requirement with honey. Adds the ability to make - rum with mead's old recipe. - - rscadd: Surgical aprons are now available from the loadout. - Haswell: - - rscadd: Added a chemical hair remover. Also works on feathers, horns, anything - keratin-based. - Kel: - - tweak: Blobs can't spawn new blob cores within 2 tiles of an existing one. - - tweak: Secondary blob cores now look different. - - tweak: Removes message for attacking the blob to cut down on spam. - - tweak: Adds attack animation for attacking the blob. - Kelenius: - - tweak: Slimes will always imprint on those who feed them to avoid long streaks - of bad luck. - - tweak: 'RNG removed from the feeding: slimes now always get 20 nutrition per 5 - clone damage.' - - tweak: Slime nutrition drain reduced. - - tweak: Added a small delay between the slime latch and the first damage dealt. - - tweak: Changed how slimes react to damage. Slimes that are attacked with something - will sometimes be shaken off their victims (chance is force * 5 - anything with - force or 20 or above is a guaranteed shake-off). - - tweak: Disarming a slime or wrestling them off now has a chance to disorient them - for a moment. Throwing them off with a weapon doesn't do that. - - tweak: Water will make slimes lose their target, stop feeding, and will disorient - them for a moment on the first application (they will not be stunlocked and - repeated applications have no effect). - - tweak: Slimes now twice as weak to water - PLEASE remember that spraying them - more than once is a waste, the water is already on them and killing them. - - bugfix: Fixed a bug where slime's nutrition was always maxed out when they fed, - causing them to evolve and split instantly. - - bugfix: Slimes now guaranteed to have unique numbers. - - bugfix: Fixed an issue with monkey cubes not deleting in sinks. - - bugfix: Fixed a bug where a slime's location sometimes wouldn't update while they - were feeding. - PsiOmegaDelta: - - maptweak: Adds a new maintenance tunnel network below the station. It can be accessed - by one of 4 elevators and various ladders, assuming one has the access to enter - maintenance in the first case. - - maptweak: Atmospherics has been moved down to this maintenance level. - Runa-Dacino: - - rscadd: Added rolling pin and knife to service/butler borg modules. - - rscadd: Added ability to use the All-in-One grinder(Chemistry, Kitchen, etc.) - to cyborg/android/robot. - TheGreyWolf: - - tweak: Changed Resomii minimum age to 15 years old. - atlantiscze: - - rscadd: SPACE Magazine - Issue 5 is now available in the news browser program - - rscadd: To reduce clutter, the news program now hides older news articles. They - can be shown by toggling a button. - - tweak: News articles now use better data compression, therefore the files are - about 50% smaller. -2016-12-09: - Asanadas: - - rscadd: Surgery cyborgs get an update! Now with tramadol synthesizers, an upgraded - scalpel, a special organ manipulator, and a roller bed module. - - rscadd: Research cyborgs now possess an upgraded laser scalpel. - - rscdel: Surgery cyborgs no longer have a mini fire extinguisher. - - tweak: Cryo tubes, the genetic DNA scanner, and the advanced body scanner now - (also) operate with mouse-drop, instead of grab-put only. Useful for cyborgs. - - bugfix: The infamous sleeper mystery buckle bug has been fixed as a result. - Mark9013100: - - tweak: Gives rainbow gloves unique mob sprites. Credit to ChangelingRain. - PsiOmegaDelta: - - experiment: Sounds are now heard from 14 tiles away by default, rather than 21. - If the station becomes too quiet this can be adjusted. - - soundadd: New sounds added for when electrifying the door or rising and dropping - bolts. Requires adjacency to hear but ensures some foreplanning is needed to - remain stealthy. - - soundadd: The airlock close sound is now different from the airlock open sound. - - soundadd: Changes the airlock-blocked sound and reduces the range at which it's - heard. - sabiram: - - tweak: Fixed errant pixels in black jumpskirt icon, and genericizes description. - - rscadd: Added color selectable jumpskirts, available in loadout. -2016-12-11: - Kelenius: - - tweak: Health scanners now show radiation. - Techhead: - - tweak: The occupants of bodybags can now be scanned without opening them using - health scanners, similar to cryobags. -2016-12-13: - SiegDerMaus: - - rscadd: Added the ability to craft zip guns in game. Zip guns will also have their - own sprites and won't have to borrow the sawn off shotgun's anymore. - TheGreyWolf: - - rscadd: Added the ability for organ printers to also print out limbs. - sabiram: - - tweak: Adjusted crew manifest; shaft miners are now in the Cargo department, Quartermaster - and Cargo Techs are no longer in the civilian department. - - rscadd: Added color selectable hoodies to the loadout menu. - - bugfix: Fixes the sheet snatcher not collecting items on click. -2016-12-15: - Legius: - - bugfix: Shields produced by anomalies are now visible again and use the new shield - graphics. - Nero-07: - - rscadd: The cargo console now keeps track of how many points you earn during the - round and can print an overview showing what you did to get them. - TheGreyWolf: - - rscadd: Added new prosthetics sized for Resomi. -2016-12-26: - Cirra: - - rscadd: Added a preset combat cyborg which admins can spawn. - LorenLuke: - - bugfix: Keeps people from just using 'resist' to escape from nets instantly. - - tweak: Makes resist time random between 5 and 9 seconds to exit net. - - tweak: Sets net fabricator cooldown to 10 seconds (greater than max net resist - time). - - rscadd: Makes nets fade away even if not resisted out of after 15 processing_objects - ticks. - - tweak: Makes it so that netted people cannot use items (and shoot/baton you while - 'restrained' by the net) until freed. - PsiOmegaDelta: - - rscadd: Resetting a character slot now requires confirmation. - - rscadd: Character saves are now per map. - SiegDerMaus: - - rscadd: Adds a new non-lethal weapon. For now, it will remain adminspawn only - for testing, it may be mapped into the armoury later. - TheGreyWolf: - - rscadd: Mousetraps are now orderable from cargo. -2016-12-29: - Chinsky: - - rscadd: Added some hints for filthy civilian scum. Gosh, some people - - rscadd: You can click on [WRONG BRANCH KIDDO] type messages to get info on what - branch/rank is right for this job. - - rscadd: All open jobslots can be seen again in latejoin, but if you try to pick - one with wrong branchrank, you get message about it with hints. - Cirra: - - rscadd: Added a unified radiation system. Radiation is lessened by obstacles, - and distance. - - rscadd: Added a geiger counter for measuring radiation levels, which can be found - in certain vending machines and radiation closets. - Kelenius: - - bugfix: Monkey cubes won't hang the server for a second or so each. Now it's only - about 0.2 seconds each. - Legius: - - maptweak: Added missing emergency shutters to command section. - Meyar: - - experiment: Removes cloning boards from being player accessible without admin - intervention. - Nero-07: - - rscadd: Ported the defibrillator from tg. - PsiOmegaDelta: - - rscadd: Ghosts are now able to follow a much wider variety of things, not merely - mobs, and the entries are a bit more detailed. Inspired by a similar implementation - by Kelenius. - atlantiscze: - - rscadd: Show server revision verb now also lists which map is being used. - - rscadd: Skill descriptions in character setup now contain more detailed information - on differences between varying skill levels. - - tweak: Command, Cooking and Botany skills are now secondary. Engines skill is - no longer secondary. Existing character setups shouldn't be affected, but it - is still advised to check that your skills are set correctly. - - tweak: The skills in character setup have been reordered a bit. -2016-12-31: - HarpyEagle: - - bugfix: Doors leading to open elevator shafts now require a little more effort - to open. - Kelenius: - - rscadd: Station dwellers have re-discovered the ancient art of spraying contents - of fire extinguishers directly at people, instead of floors around them. You - need to be at help intent and click the mob with the extinguisher to do it; - other intents still make you attack. - Loneguyfly: - - rscadd: Changes Taj blood to be visually distinctive from human blood. - Nero07: - - rscadd: Added a program to modular computers, that can be used to create/edit/delete - digital warrants. Also added a mobile device named 'holowarrant', that can be - used to sync up with the central warrant list and display these warrants in - the field. - Ravenxales: - - rscadd: Add toggleable safety for compressed matter implant, to prevent inadvertant - usage and facilitate storage. - - bugfix: Fix compressed matter implants that are placed in storage from destroying - the storage with itself inside. - Redstryker: - - rscadd: Adds a blue resprited version of Latex gloves called Nitrile gloves. They - can be found in the sterile glove box and on the loadout. - - rscadd: 'Added three different hairstyles: Undercut, Coffee House Cut, and Parted - Fade' - sabiram: - - rscadd: Added hotkeys for moving up and down z-levels. The hotkey for moving upwards - is ,(COMMA), and the hotkey for moving downwards is .(FULL STOP) -2017-01-04: - Cirra: - - rscadd: Re-enabled the radiation storm event - - rscadd: Radiation collectors now work with general radiation, as well as singulo-specific - pulses. - - rscadd: The engineering module now has a geiger counter. - - bugfix: Humanoid mobs will no longer ignore radiation levels below 5Bq. - - bugfix: Blast doors now properly block radiation. - HarpyEagle: - - tweak: Burn damage causes by lasers results in less blood loss. - - tweak: Laser protection offered by many types of armour given a modest boost, - bringing laser protection up to match bullet protection in most cases. - - rscadd: Laser beams have a chance of dealing internal organ damage much like brute - damage. - Kelenius: - - experiment: Bot AI has been overhauled, hopefully for the better. - - experiment: Navigation beacon (and, therefore, patrol) code has been changed; - please report any issues with bot patrolling. - - tweak: Mulebots can't be hacked for speed anymore. They move at moderate speed. - Safeties can still be disabled. - - tweak: Floorbots don't try to fix space anymore; instead they will remove broken - tiles. They can be configured to cover platings, too. - - tweak: A farmbot has been added to the garden, and a floorbot to engineering storage. - Loneguyfly: - - rscdel: Removes the silence and paralyze effects from deathsting. The ability - will now only cause jittering and an injection of lexorin. - LorenLuke: - - bugfix: Can now throw held people again. - - rscadd: Clicking a grab while in help intent downgrades the grab a step. - Minijar: - - rscadd: Changes the colour of unathi blood. - Redstryker: - - rscadd: Added a colorable hair bow to the loadout. - - rscadd: 'Added three facial hairstyles to be used for Humans: Mutton Chops, Mutton - Chops and Moustache, and Walrus Moustache.' - - tweak: Made all of the medical bags have blue crosses on them instead of green - crosses. - - rscadd: Added messenger bags variants for all of the jobs. They can be selected - from the character setup. - - rscadd: 'Added four colorable underclothes: long john tops and bottoms, tube top, - and long undershirts.' - Runa-Dacino: - - tweak: Changed stack recipes to spawn product in hands when possible, otherwise - spawn on the ground.. - - rscadd: Enables the text replacer that makes verbs such as *aflap use visible - gender for all *verbs instead of using 'its.' - - bugfix: Fixes preset emotes to write himself and herself instead of heself and - sheself. - Techhead: - - rscadd: Brings back the evil to evil vending machines. However, their throwing - arms aren't as good as they used to be, so if you don't walk up to them, you - should be fine. - TheGreyWolf: - - rscadd: Upped the damage from 5 to 10 brute possible per limb when falling down - a z-level. -2017-01-06: - Hubblenaut: - - tweak: Hydroponics vendor and biogenerator offer full bottles of fertilizer. Prices - and amount available adjusted to accomodate. - Redstryker: - - tweak: Changed the sprites of the biosuits to have gloves and boots. Gives them - the appropriate inventory flags to cover gloves and shoes. - - rscadd: Added toeless workboots. Added them to the loadout. - - rscadd: Added athletic shoes. Added them to the loadout with the ability to color - them. - - rscadd: 'Added the following hoodies to the loadout: NanoTrasen, Space Mountain - Wind, Mariner University, and Ceti Techical Institute.' - - tweak: Changed the 'Mars University Lunchbox' to the 'Mariner University Lunchbox'. - - tweak: Gave boots and gloves to the normal and Resomi variation of the radsuits. - Runa-Dacino: - - bugfix: Fixes pain messages giving errors saying emote 'me' doesn't exist - - tweak: Changed generic 'their' to use visible gender for aforementioned pain messages. - Soadreqm: - - rscadd: Alter procedure for dismantling broken, bolted doors - - rscadd: Made the fire axe more robust against doors. - Zuhayr: - - rscadd: Added a constructable improvised coilgun and two adminspawn railguns. - Credit goes to Siegdermaus for the icons and the commission. No, I'm not going - to tell you how to build it - that's the fun. -2017-01-08: - Cirra: - - tweak: Changed the radiation storm event's end message to indicate that radiation - will take time to decay. - Redstryker: - - soundadd: Added four sounds that are randomly played when bones break. - - rscadd: Added a hanging skeleton model as a furniture item for all your spooky - needs. - sabiram: - - rscadd: The Chief Medical Officer now has maintenance access on the Exodus. -2017-01-11: - Chinsky: - - rscdel: Removes Pun Pun's naked ass. Little pervert was wearing assless jeans - under that hawaii shirt the whole time, fixes them to cover the buttbits properly. - - rscdel: Removed hallucination part of SM delamination event. - Cirra: - - imageadd: Added a new set of PDA sprites. - Hubblenaut: - - tweak: Doubles power for rechargers and wall rechargers. - - tweak: Raises power for cell rechargers from 40 kW to 60 kW. They will still recharge - quickest. - Kelenius: - - tweak: Brand intelligence event now tells you the name of the original machine. - Original machine will now swear more often to make it easier to find. The event - also ends (fixing all machines) when the original machine's shooting is disabled, - not only when its speaker is off. - - rscadd: A customizable tablet has been added to loadout - remember that better - parts use more power. - Lorwp: - - rscdel: Removed Stunbatons from Medbay - - maptweak: Reorganized the Paramedic's Station - Minijar: - - rscadd: Adds Uzi, Deagle, .38 revolver,Combat shotgun and a sawnoff shotgun to - the uplink. As well as appropropriate ammo. - - rscadd: Adds all of the above ammo types to the autolathe. - Nero07: - - rscadd: Dead people now keep processing reagents for 15 seconds after they died - Redstryker: - - rscadd: Added colorable flats to the loadout. - - tweak: Adds defined role variables to the Torch loadout in order to reduce clutter. - - tweak: Fixes the dark red jumpsuit to reflect it actually having a belt on. - TheGreyWolf: - - rscadd: Restricted Resomi prosthetics to limbs only. No more Resomi FBP. - - rscadd: Changed the resomi white smock to instead be colorable. - Zuhayr: - - tweak: The limb damage indicator on the HUD now uses local limb pain, not traumatic - shock. - - tweak: custom_pain() (used in surgery, moving bones, etc, to make a pain message) - now increases pain on the limb calling it. In other words, non-anesthetised - surgical pain now has a purpose other than giant red text. - chinsky: - - experiment: SM delamination no longer causes hallucinations, but has bigger explosion. -2017-01-16: - Hubblenaut: - - tweak: Can now click on turfs with trash bags and similar to quick-gather everything - on it. No longer pixelhunting for cigarettes and bullets. - - bugfix: Buckets and other reagent holders will no longer simply be put into the - janitorial cart's trash bag. - Kelenius: - - rscdel: Resomi FBP construction made physically impossible, STOP MAKING THEM. - Same for Diona and IPCs. - Ravenxales: - - bugfix: Allow protected roles (heads, IAA, etc.) to be converted to faction antags - (cult and rev) mid-round - - bugfix: Make implants work properly again (can configure triggers, etc.). - - bugfix: Made turbolift doors more robust. Small mobs will be displaced, large - mobs will make the lift give up and reopen. - RedStryker: - - bugfix: Added the skeleton stand file to the Baystation12.dme. - Redstryker: - - rscadd: The sterile mask can now be toggled down and up like breath masks. - - tweak: Refactored the pull down mask verb and proc. - TheGreyWolf: - - rscadd: Made Resomi sprites for the scarf. - - rscadd: Fixed so people can once more have mechanican eyes and heart. - atlantiscze: - - tweak: All modular computers now support a tesla link, allowing them to run off - an APC. This includes tablets. - - tweak: Both tablet presets from custom loadout now have a tesla link by default. - - bugfix: Tesla link now also works for laptops when they are closed. - - tweak: Size of tesla link and intellicard slot reduced, which means they can now - actually fit into tablets. -2017-01-18: - Finalsong1: - - rscadd: Adds a piloting skill. - Haswell: - - tweak: Clicking on worn or held boots containing a concealed blade will now draw - the blade out directly, similar to gun holsters. - - tweak: Masks that can be pulled up/down now have action buttons for toggling. - Kelenius: - - bugfix: Fixed issues where you were unable to turn the bots on and off when you - should have been. Farmbot specifically. - - tweak: Synthetics can always control all bot settings. - - tweak: Synthetics and anyone who opens the bot's panel (screwdriver) can toggle - bot safeties, giving it a 'temporal' emag effect that can be fixed in the same - way. Emags break them permanently, but this is obvious when the panel is open. - RedStryker: - - rscadd: Added glowsticks in green, blue, red, orange, and yellow. Work similar - to flares, but burn twice as long and half as bright. Can be found in the YouTool, - party equipment, and random drops. - - soundadd: Added sounds that play when the cheap lighter is turned on and when - the Zippo is lit and turned off. - - bugfix: Changed the name of the long john shirt icon_state so that it can actually - be used. - TheGreyWolf: - - rscadd: Added a new coat to the custom loadout for Resomii. -2017-01-19: - Chinsky: - - bugfix: When reattaching limb, hemostat finish step is REQUIRED now. On the other - hand, limbs are now properly reattached without leaving cut-away status forever. - - tweak: For bone gel steps you can use duct tape now. Screwdrivers aren't used - anymore. Also reworded messages there to be less awkward. - Hubblenaut: - - rscadd: Added icons for the energy gun's shock firemode - - bugfix: Fixes items appearing in the wrong hand. - Ithalan: - - bugfix: Fixed spawning of wrong version of the medical hardsuit in medical. - RedStryker: - - rscadd: 'Added track pants and track jackets in the following colors: white, green, - red, and blue. Added a track jacket for the normal track pants. Added the jackets - to the loadout.' - Redstryker: - - rscadd: Added flannels. It is on the loadout with the color selection datum. It - can have its sleeves rolled up, be buttoned, or be tucked in and any combination - thereof. - - rscadd: Added high tops. Added them to the loadout. -2017-01-21: - Hubblenaut: - - tweak: Floor painting reappears when putting on new plating. - Kelenius: - - rscadd: New cult gamemode is in. Refer to https://wiki.baystation12.net/Cultist - for the updated guide. - - rscadd: Added beekeeping equipment to garden. - - tweak: Open space in engineering is now covered with lattices. - - bugfix: Space vent in toxins is no longer blocked. - Redstryker: - - rscadd: Added cigarette packet 'microlore'. Background information that can be - found in the examine tab. - TheWelp: - - rscadd: Adds universal action HUD element. - - rscadd: Moves spells to new action HUD. - - rscdel: Removes mind transfer. -2017-01-24: - Kelenius: - - tweak: Ghosts can't use their abilities in holy places (non-defiled chapel or - anything touched by holy water) anymore. - - tweak: Confuse rune doesn't blind people, only blurries their vision. It still - stuns as before. - - tweak: It takes longer to unlock tear reality rune and ghost abilities. - - bugfix: Many cult-related bugfixes. - SiegDerMaus: - - rscadd: Added swords for Torch dress uniforms. - Yoshax: - - rscadd: Adds drop pouches that are functionally the same as the various types - of colored webbing, but look different. Are available in loadout and can be - found in webbing crates. -2017-01-28: - HarpyEagle: - - rscadd: Defibrillators will now notify when the patient cannot be revived due - to excessive blood loss. - Kelenius: - - rscadd: Can now configure headset by click-dragging it to screen, similarly to - PDA. - - bugfix: Alien suit sprites have been fixed, as were inhands. - RedStryker: - - rscadd: Added microlore to some soda/drink containers. -2017-02-01: - Ace McLazer: - - tweak: Updated generic colored poncho look, tweaked all to look more human-shaped. - Changed Resomi ponchos, too. - Cirra: - - rscadd: Added a new alloy, Osmium-Carbide Plasteel. It is physically weaker than - plasteel, but is more resistant to heat, and is made like plasteel but with - added osmium and extra carbon. - Haswell: - - maptweak: Reduced Torch map sizes from 255x255 to 200x200. Admin Z is now split - into two. Reduced world initialization time by about 2 minutes. - Hubblenaut: - - bugfix: Fixes mob icons not updating when blood is washed off. - Kelenius: - - tweak: Garden got most of their plants back. The only plants exclusive to xenobotany - now are ambrosia (blame chinsky), kudzu (too dangerous), plastellium (useless), - alien seeds, and randomly-generated ones. - - tweak: Seed storages now start with 30 of each seed type, not 2 or 3. - - rscadd: Xenobotany now starts with 30 of each type of alien seeds (previously - only available from fossils) and 10 random seeds. - PsiOmegaDelta: - - tweak: Climbing ladders now takes 2 seconds. As a side-effect climbing can now - also be aborted by moving away. - - tweak: Anyone near the destination ladder are now also made aware that someone - is (potentially) about to arrive. - SiegDerMaus: - - rscadd: Adds one new haircut, a chin-length bob. - Zuhayr: - - rscadd: Added haywire rounds for shotguns and some calibers of small arms. - - tweak: You now need to target head/eyes/mouth when trying to slit a throat. - - rscadd: Added tendons and tendon repair. Tendons can be severed by cutting brute - damage or via a grab (similar to cutting a throat) and if cut will render the - limb unusable. Hands, feet, arms and legs have tendons. - - rscadd: Added arteries, replacing the previous internal bleeding implementation. - Functionally identical to the internal bleeding of yesteryear including repair - surgery. - - tweak: As a result of the above, internal bleeding is now static per limb and - cannot be treated via bicaridine and inaprovaline overdose. - - tweak: It is no longer required that the skull and ribcage be opened to repair - internal bleeding or eye damage. A retracted incision is still required. - - rscadd: Adminhelps now have a TAKE button that allow an admin to claim it, and - inform the adminhelper that someone is on the case. - sabiram: - - tweak: Split the Command department on the Torch into Heads of Staff and Command - Support. - - tweak: Moves the Exodus cargo team to Supply, the bartender, gardener, chef and - janitor to Service, and Internal Affairs to Support. - - rscadd: Added the command, support, service and supply departments to the ID computer. - Added the support, service and service departments to the manifest. -2017-02-06: - Cirra: - - rscadd: Bluespace tiles created by the Supermatter Cascade will now spread between - z-levels. - Datraen: - - rscadd: Added a gene-specific mode for the Floral Somatoray. - - tweak: Plant controller now generates the mask/tag list used by the centrifuge, - rather than generating it on ui_interact. - Hubblenaut: - - bugfix: Forensic tools (and other items) will no longer be used when putting in - backpacks or on tables. - - tweak: Taking forensic samples will first take evidence, then leave your own fingerprints/fibers. - - rscadd: Added click-and-drag function to forensic tools to take evidence where - you previously couldn't. - - rscadd: Allows chest drawers to store forensic samples. - Kasuobes: - - tweak: Suit storage units now hold magboots and air tanks. - - tweak: Voidsuits can now toggle installed helmets via action button when worn. - Kelenius: - - rscadd: Fossil plants can now be fed to seed extractor to get one random seed. - - rscadd: Placed mining flags now have have a glowing fringe, visible in the dark. - - rscadd: Plush toys added to loadout. - - rscadd: Resomii 'nearsightedness' is now correctly prevented by equipment that - blocks bright lights, not prescription glasses, and goes away in the dark. - Lorwp: - - tweak: Change's Brig Officer's holobadge box to have Master At Arms Holobadges - - tweak: Allow Security Messenger Bags to be able to spawn in Security Lockers - - tweak: All Security have Work Gloves in their lockers now - PsiOmegaDelta: - - rscadd: Admins can now delete specific obj instances from the VV menu, not only - all of the same type. - - bugfix: Power monitors now list all powernet sensors belonging to the current - and connected Z-levels. - TheWelp: - - rscadd: Adds the Vox weapon the Slugsling - - bugfix: Fixes launchers not playing a sound on firing. - chinsky: - - bugfix: Fixes surgery openness stage not applying gory overlay. Gore is back. -2017-02-07: - Cirra: - - bugfix: Radiation from the Supermatter delaminating should now properly affect - all connected z-levels. -2017-02-10: - Asanadas: - - tweak: Scrubbers now scrub N2O and Phoron by default. - - maptweak: The corners of Escape Pods 3 and 4 should now no longer appear to lead - to space. - - tweak: Officer swords should now look good from all angles. - Haswell: - - tweak: Mop buckets and janitor carts can now be climbed over. - Nero07: - - rscadd: Added communications functionality to AI holopads. To use, stand on a - holopad and click it. Make a new holocall and select the target pad from the - list. The targetpad will light up, emit a sound and inform nearby players about - the incoming call. To pick it up, just click the pad. The caller is projected - above the holopad and can talk to/emote with all people in view of the holopad. - To end the call, step off the holopad. The call can also be ended from the other - side by clicking the active holopad. -2017-02-12: - Essbie: - - rscadd: 'Added new cocktail and recipe: Ship''s Surgeon.' - HarpyEagle: - - bugfix: Fixed bluespace jump lag. - - bugfix: Fixed latejoins during bluespace jump not being affected by it. - - bugfix: Fixed being able to enter/leave the vessel zlevels during bluespace jump. - - rscadd: Moving in straight lines during a bluspace jump is now more difficult. - - tweak: The amount of toxin damage gained from low blood levels is now limited - to around 18. - - bugfix: Various defibrillator fixes. - - bugfix: Difference between the two cult ghost whisper verbs should be clearer - now. - - bugfix: Meteors no longer destroy floors or anything else that doesn't block their - movement. - Haswell: - - tweak: Removed ghost verb from AI and pAI due to overlapping function with wipe - core and wipe software verbs. - Nero07: - - bugfix: Added a busy signal so you can't call already active holopads, which led - to message spam. - - bugfix: Makes holopads actually function and fixes a few runtimes associated with - them. - TheGreyWolf: - - tweak: Made it so only unbranded, NT and Resomi specific prosthetic brands can - be made during gameplay, chargen not changed. - Zuhayr: - - tweak: Bleed-out rate now depends on pulse rate and size of bleeding limb. - - tweak: This means that potassium chlorophoride, which stops the heart, and inaprovaline, - which now slows the heart, are both suitable for emergency treatment of bleeding. - - rscadd: Cautery surgery with no preceeding steps will now cauterize a cut artery - in a stump. - - tweak: Arterial bleeding and stumps are now more informative about where the bleed - is. - - tweak: Arterial sprays can now splatter/blind people and use the correct icons. -2017-02-14: - Haswell: - - rscadd: Added waist packs that can be worn around the waist or on the back. They - can be found in custom loadouts under utility. - atlantiscze: - - rscadd: Added modular telescreens - wall mounted modular computers that are comparable - to laptops in terms of hardware restrictions, and tablets in terms of software - restrictions. Few of those have been mapped in, more can be built. - - tweak: Large amount of under-the-hood improvements and tweaks. - sabiram: - - rscadd: Added subtypes of meat for cows, goats and chickens. They all act the - same way. - - rscadd: Added crates containing beef, goat meat, chicken meat, eggs, and milk. - - tweak: Increased the price of the livestock crates so that it is much more economical - to order the produce you want instead of a live animal. -2017-02-15: - RedStryker: - - bugfix: Allows department-specific messenger bags to be used. - lorwp: - - rscadd: PAI's can now speak EAL, if they have a Universal Translator' - sabiram: - - rscadd: Adds some new hairstyles. For the Torch, Short Hime and High and Tight - are approved for all Sol personnel; Grande Braid and Fringetail are approved - for the Expeditionary Corps only. All new styles are freely available to all - civilians. - - tweak: Adjusts luminosity on a few hairstyles to correct desaturated spots. -2017-02-18: - Haswell: - - rscadd: Added boxes of headsets to the Torch XO locker. - Lorwp: - - rscadd: Added Trendy messenger bags to all Job Lockers - sabiram: - - rscadd: Added modular laptops to the utility loadout menu. -2017-02-21: - Asanadas: - - bugfix: You now require an under-clothing (such as a jumpsuit) to wear things - on your belt. No more PDA in your boxer waistband. - - bugfix: Mushroom soup can now be made with a sane ingredient combination. - Chinsky: - - rscadd: Accounts with biggest profits or losses are now announced in round end - summary. Get dat greentext. - - tweak: Surgery changes. Cry, medical. - - rscadd: Self-surgery is legal now. It was possible via a bug, it's a feature now. - - rscadd: As a side effect, you don't have to lie down to be operated on. It is, - however, a very bad idea unless it's basic steps like incision etc. Success - chance will drop for delicate steps. - - rscadd: Instead of randomly doing nothing, rollerbeds / tables are factored into - surgery success chance calculation. - - rscadd: 'Said success chance: surgery steps now can fail even if you don''t move - / drop tools etc. Ideal scenario is ''sober surgeon not in pain operating on - another person who is lying on an optable''. Deviations from that add chance - of failure. Some steps are more robust, some are more delicate. As a rule of - a thumb, if you have to touch innards, that''s delicate. If you perform internal - organ surgery on yourself while sitting on a table piss drunk, nearly passing - out from pain and also being blind, it''s not going to go very smooth.' - - rscadd: Shock will advance fast when being surgery'd on, so take it slow or take - some pills. - Haswell: - - maptweak: Destroyed the cloning lab on Exodus and all technology related to it. - atlantiscze: - - rscadd: Added forced-shutdown verb to modular computers, reachable via rightclick - menu. This is equivalent of pressing the Shutdown button in the UI, and is mostly - intended to be used when UI bugs out and regular shutdown isn't available. - - rscadd: Added Supermatter Monitoring program, available on all devices. It provides - various information on the supermatter engine. It is fully variable, and capable - of working with multiple supermatter crystals at once (for those enterprising - engineers among you). - - rscadd: Among other information, the supermatter monitor program shows engine - core EPR value. This value is best kept between 1 and 2, and shows real amount - of coolant in the core (in standard canisters worth). Normal EPR with two canisters - in each loop is roughly 1.5 - - rscdel: Rightclick open/close laptop verb no longer exists for laptops. Use alt-click - instead. -2017-02-24: - Chinsky: - - rscadd: PI now spawns with a badge, Journalist with a camera. Also added tape - recorder to custom loadout. - Cirra: - - soundadd: Added several new sound effects. These include fire extinguisher cabinets, - internals activation, flashlight/flare activation, air alarm breach detection, - and more. - - soundadd: Added ambient sounds to Thermo-Electric Generators. - - bugfix: Braces can no longer be removed from an airlock by deconstructing the - airlock. - - bugfix: Pipes will now correctly burst if the internal pressure is too high. 0-16.9MPa - is safe, 17-20.9MPa has a chance of bursting, and 21MPa+ will burst instantly. - - maptweak: Osmium-Carbide Plasteel walls have been mapped into the incinerator. - It should now be safe to use the incinerator, as a result. - Crushtoe: - - imageadd: 'Two new pAI chassis types: The Mushroom and the Corgi Puppy. Finally, - we can have our pAIs join the Mushroom Plague.' - Haswell: - - tweak: Antag preferences now default to never instead of low. - Runa-Dacino: - - rscadd: Adds ability for the player to change the name and description of ninja - voidsuit to assist in ninja gimmicks - - rscdel: Removed references to the spider clan from ninja voidsuit. - TheWelp: - - rscadd: Adds a integrated circuit printer to the R&D lab. -2017-02-26: - Chinsky: - - tweak: Holowarrant projectors now autosync when clicked in hand instead of having - to use verb manually. - - tweak: You can swipe ID at the holowarrant to authorize it now. - Crushtoe: - - imageadd: New external airlock and mail sign sprites. - Datraen: - - bugfix: Language sanitation now checks for species second languages in addition - to whitelist status. - Haswell: - - rscadd: Added crossfire gamemode, mercenary + raiders. Requires 25 readied players - and at least 6 antags to start. - Hubblenaut: - - rscadd: Newschannels now show the number of times they have been viewed. - TheWelp: - - rscadd: Adds an advanced integrated circuit radio. Lets players send commands - and id_tags. -2017-02-28: - Haswell: - - rscadd: Added Siege gamemode, mercenary & revolution. Requires 20 readied players, - 5 antags. - - rscadd: Added Unity gamemode, revolution & wizard. Requires 15 readied players, - 5 antags. - - tweak: Made Conflux votable, cult & wizard. Requires 15 readied players, 5 antags. - - tweak: Made uprising votable, cult & revolution. Requires 20 readied players, - 6 antags. - - rscadd: Added small energy gun variant, small size with 4 shots and reduced lethal - damage. - - rscadd: Added gun cabinet variant with small energy guns. - Nero-07: - - bugfix: Fixed holopads and tested them a bit more extensively. Should work as - expected now. - Techhead: - - tweak: Torch medical has been reorganized, full changes follow. Check your job - settings on medical characters. - - tweak: Senior Physicians are now simply Physicians, and the job is limited to - officers. - - tweak: Physicians are now Corpsmen, with updated alt-titles, including the new - Medical Technician and Field Medic titles. - - rscadd: A unique outfit for Fleet Field Medics. - - tweak: Medical Assistants are now Medical Contractors, with two slots. Medical - Resident title is gone. - - rscdel: The dedicated Virologist slot is gone, now part of Medical Contractors. -2017-03-07: - Chinsky: - - bugfix: Fixes not being able to bring up undress menu on help intent. - - tweak: You scoop up resomi/monkeys/nymph on GRAB intent now, not help. Was annoying - in surgery etc. - - rscadd: Can now put accessories on people via strip menu. Click on the clothing - item with accessory in hand to attempt to. - - rscadd: Can now pick which accessory to remove in stirp menu. - - rscadd: Explosive implants now can be triggered by remote signaler signals. Change - frequency and code in implantpad that now comes in the box with implant. - - rscadd: Explosive implants now complain on radio when they are exposed in surgery - (after retractor step for skin/ribs). Can set message in implantpad. - - rscadd: Added thicc rig to merc base. It has bit more slowdown, but more armor - overall. - Haswell: - - tweak: Improved movement smoothness with /tg/ movement code. - - tweak: People now spawn with random hunger levels between hungry and satiated. - - tweak: Reduced amount of satiety from eating by 66%. - - tweak: Ghosting messages now show where the player is ghosting from. - Hubblenaut: - - rscadd: 'Adds new haircut: Ponytail 6.' - Techhead: - - rscadd: Added a black tie outfit to the uniform vendor for civilians. - - rscadd: You can now pin medals to your service and dress jackets. - - rscadd: As a bonus, you can also put armbands on labcoats. - TheWelp: - - bugfix: Fixes circuit printer being a computer recipe instead of a machine - - rscadd: Adds ability to deconstruct an assembly and gain a protolathe recipe for - it. - - bugfix: Fixes circuit printer not having a max cap on metal. - - bugfix: Fixes certain activators not being respected when there are multiple of - them. Fixes debugger not sending activator data. - - rscadd: Adds accelerometer circuit, which lets you detect motion (and how much). - - rscadd: Adds simple locomotion circuit, which uses activators alone to control - itself. - - rscadd: Adds ai-controlled circuit. Lets ai inside itself use arrow keys to activate - certain pins. - - rscadd: Adds tile sensor, which detects items/mobs on a tile when pulsed. - atlantiscze: - - experiment: Removed bunch of NarSie's summon effects. Should considerably help - performance. - - tweak: Cult walls now have non-reinforced type, that is used when cultifying non-reinforced - walls. - sabiram: - - rscadd: Standard and research magnetic grippers can now hold modular computer - hardware. - - rscadd: Research module robots now have access to wirecutters. - - rscadd: Replacement tubes for spotlight fixtures are now available in the autolathe - and in most light tube boxes. - - rscadd: Added a new black leather satchel to the backpack selection menu. -2017-03-12: - Asanadas: - - maptweak: The Morgue now has emergency shutters. Also, more emergency shutters - spread around the infirmary. - Chaoko99: - - imageadd: Added a unique sprite for anesthetic pumps. - Cirra: - - rscadd: Pipes with exposed ends (such as those that result from a pipe bursting) - will now leak their contents into the air. To stop a pipe from leaking, attach - an endcap to the end. - - rscadd: Added Stasis Clamps to engineering vending machines, devices which can - be attached to a pipe and turned on in order to halt the flow of gas through - that pipe. Useful for sealing off sections of pipe so you can make changes without - leaking. - - rscadd: Added and mapped in Automated Shutoff Valves, which will automatically - close if their internal pressure gets too low, to limit the damage caused by - main-loop leaks. Click on an AS Valve to reset it. - Datraen: - - rscdel: Removed the hunger section of movement code. - - tweak: Doubled the rate of nutrition degradation. - - tweak: Raised the starting nutrition values. - - tweak: Reset the rate of nutrition degradation to the default value. - Hubblenaut: - - rscadd: Adds alt-click shortcut for initiating test-fire. - - rscadd: Examining the teleporter console will reveal its current destination and - accuracy. - - tweak: Teleporter accuracy does no longer automatically reset after five minutes. - - tweak: Teleporter accuracy resets after locking in to a different destination. - sabiram: - - rscadd: You can now alt-click a PDA to remove an ID. -2017-03-14: - Haswell: - - rscadd: Added ion pistols, 8 shots no AOE, normal size, can be worn on belt and - holstered. - - rscadd: Added taser carbines, 10 shots, heavy taser and heavy shock beams, large - size, can be worn on belt and back. - - rscadd: Added stun rifles, 12 stun shots, huge size, can be worn on back. - - tweak: Reinvented pulse weaponry. They now function as burst fire laser weapons, - dealing less damage per shot but with higher damage potential than their laser - counterparts. Most effective at medium ranges against non-armored targets. - - rscadd: Added pulse rifles. 36 pulse shots, high damage. Huge size, can be worn - on back. - - rscadd: Added pulse carbines, 24 pulse shots, medium damage. Large size, can be - worn on back and belt. - - rscadd: Added pulse pistols, 21 pulse shots, low damage. Normal size, can be worn - on belt and holstered. - - maptweak: Adjusted security and emergency armory contents. Added more guns. - - tweak: Added pulse weapons to uplinks. - Unknown: - - bugfix: Stasis Clamps should now function correctly when placed next to a pump, - valve, or other pipe machinery. -2017-03-26: - Asanadas: - - tweak: Orange shoes (as well as jumpsuits of all kinds) no longer are capable - of doing damage. - - rscadd: 'Added new drug/medicine: Noexcutite. Useful to eliminate jitteriness - in patients. 1 Oxycodone, 1 Dylovene.' - Chaoko99: - - rscadd: Crisis borgs can now pick up pills. - - rscadd: Science borgs can now pick up tanks, tank transfer valves, and various - other assembly items. - - imageadd: Replaced the old [CAUTION] Canister with a cleaner sprite. - - imageadd: Added a hazard stripe overlay for people to add to new canister sprites - in DM. - - imageadd: Added new phoron sheet sprite. It is orange now. - - imageadd: Added a new icon state for the admin spawnable crystal. - - tweak: Most solid phoron and phoron-based objects are orange now. Please report - old pink/purple phoron sprites on the git repo, tag @chaoko99 in the description. - - tweak: Uncommented the phoron-based object flashing code. Phoron based objects - will now combust when on a turf over 200c. - Chinsky: - - tweak: Tabling is no longer instant. Wait till aggressive grab is done upgrading - before do it (whe blue thingie is done filling). - - rscadd: Can now click yourself with cig to take a drag on it. - Haswell: - - tweak: Renegade guns now all fit in backpacks, provided there's room in there. - - tweak: Duct tape now repairs supermatter. - - rscadd: Added flashdark device, basically a flashlight that cloaks you in darkness - instead of light. Available in uplinks. Pair with thermal scanners for fun. - Hubblenaut: - - bugfix: Fixes whitespace cropping when writing on paper or using the circuit debugger. - Ravenxales: - - tweak: Fix many strings to respect the Torch environment. - RedStryker: - - tweak: Added new lore-consistent clothing items for NanoTrasen personnel. - Techhead: - - rscadd: Moves Junior Enginner to a Crewman alt-title, accompanied by the new Junior - Corpsman. - - tweak: Increased Crewman slots by one and removed age restriction. - - rscadd: Gave Raiders their very own frequency. Hopefully, no more filthy mercs - listening in on your distinguished matters of commerce. - TheGreyWolf: - - rscadd: Added uniform, dress and formal uniform for Resomii from unused sprites. - memescope: - - tweak: Gave the Scientist, RD, Senior Researcher and Research Sssistant access - to formal clothing in the loadout. - - tweak: Divided pants into formal and casual pants and put them into different - selections in the loadout. - mkalash: - - rscadd: Admins can now globally and individually mute AOOC. - - rscadd: Added a stun revolver to the NT guard lockers. - - rscadd: The Torch will now receive a report at the beginning of the round listing - the current system, the next system, and any nearby planets. -2017-03-31: - Asanadas: - - tweak: The holodeck theater's clothings have been changed to holo-chameleon equipment. - Have fun with more dress-up options! - Cirra: - - maptweak: Removed the Pulse Rifle from the emergency armoury, and replace it with - a marksman energy rifle. - Datraen: - - bugfix: Updates mechs to be able to interact with ID cards in wallets. - Leshana: - - bugfix: Fix rooms holding pressure when exposed to space. - RedStryker: - - tweak: Added new lore-consistent PDA, Locker, and Action Figure sprites for NanoTrasen - items. - - rscdel: Removed science armband. - - tweak: Recolored research tape to white. - Sin2: - - tweak: Added new lore-consistent airlock sprites to Research. - Unknown: - - imageadd: Replaced the energy sword and double saber sprites with those from TG. - - imagedel: Removed the Sord and Sord inhands. -2017-04-01: - Haswell: - - rscadd: Added singularity grenades. Works just about as well as you imagine. -2017-04-06: - Broseph Stylin: - - rscadd: Added a colorable and a horrible bowtie to the loadout, available to all - non-military roles. Icons by LorenLuke, slightly altered. - - rscadd: Skirt versions of the dress uniforms are now available for all SCG branches - in the uniform dispenser. - - bugfix: Officer's variants of the dress uniform will now show up correctly in - the dispenser. - Chaoko99: - - imagedel: Removed unused reagent container sprites. - - tweak: Removed the toy sunflower, replaced with another flower that functions - identically, but can accept reagents other than water. - - spellcheck: Added punctuation to wizard spells, and adjusted some of the shouts - to something a human being could actually say consistantly. - CountAlex: - - tweak: Added deluxe version of electronic cigarette to loadout. - - rscadd: Added electronic cigarettes and replaceable cartridges to cigarette vendors. - Electronic cigarettes come in three options; the deluxe option will later be - added to loadout. -2017-04-10: - Asanadas: - - maptweak: Flipped beach in the holodeck so you don't have to walk through holowater - to get on the holosand. - - maptweak: Added a computer console to the Security equipment storage. Now Masters - At Arms can do their job a little better. - - experiment: A changeling's deathsting now gives a message to the surrounding area. - Cirra: - - tweak: Overmap-related consoles can now properly be repaired. - - tweak: Overmap event groups are now slightly more common, and slightly larger - in size. - - experiment: The Torch now uses the Overmap system. This involves a 'system map' - which can be flown around, with away sites scattered on the map. - - tweak: The flow of fuel through the HE pipes in the SM chamber can be controlled - via an adjustable pressure gate in the Engine Room. The higher the 'Target Pressure', - the faster the thrusters will regain fuel faster after a burn, and the lower - the SM's output. - - rscadd: Added a fuel tank port of atmospherics, and all the necessary piping for - overmap. - - rscadd: Converted the four thruster areas on the vessel into engine nacelles. - It is possible to switch between direct injection and combustion, via buttons - located in the engine monitoring room. Each mode has its own advantages and - disadvantages. - - rscadd: Modified the SolGov Pilot job, so they can properly pilot the Torch. - - rscadd: Added randomly placed events to the overmap. - - maptweak: The Calypso, Aquila and Guppy are now overmap-capable, and can travel - to away sites on the same overmap tile. - - maptweak: Added Helm and Engine control consoles to the bridge, and Engine controls - to engineering monitoring and the fuel bay. - Datraen: - - bugfix: Aliens can choose their corresponding xenowear once again. - Haswell: - - tweak: Lots of things are made climbable. - Pobiega: - - rscadd: Added fuel pipes, manifolds, caps, etc. - - rscadd: Made pipe dispensers dispense fuel pipes. - RedStryker: - - tweak: Separated the NT tunic into an accessory. There is a polo below the tunic. - That polo is on the loadout. - - tweak: Changed the color of the NT worksuit. - - rscadd: Added a NT executive suit for the NTL. Also in RD's locker. - - tweak: Changed many things in Research from purple to NT red. -2017-04-14: - Asanadas: - - tweak: Master At Arms gets an extra jobslot, bringing it up to 4 in total. - Pobiega: - - rscadd: Added new per-map admin fax destinations. - - rscadd: Admins can now pick between the NT and the solgov logo when sending adminfaxes. -2017-04-19: - Asanadas: - - tweak: Master At Arms badges are now available from the security vendor. - - rscdel: Staff of change has been removed from the wizard's arsenal. - - bugfix: Uniform Vendors should no longer break horribly when you hit them with - a PDA (or anything that isn't an ID). - Chaoko99: - - tweak: Buffed blob, it will now attempt to spread about 20% more often. Lowered - laser resistance of a blob to compensate. - - tweak: Blobs are now totally opaque. This can be countered with optical material - scanners. - - rscadd: 'Blobs can now trip camera alarms. Beware: You won''t be able to use cameras - to find them, if you are not quick!' - - rscdel: Removed slimes from the pet merchant's options. - Ithalan: - - tweak: Collected robotics and infirmary surgical tools into surgical kits - - tweak: Updated surgical kit sprite and description and upped capacity to 14 slots - to allow nanopaste and laser scalpels/IMS to be stored in it too. - Nero-07: - - tweak: Increases starting TC for antags to 130 (was 100). - Orelbon: - - soundadd: New sound plays when the emergency pods unlock. - - rscadd: Added New AI Status Display. - Unknown: - - tweak: Made the mech rechargers use an alpha layer instead of the default grey - tiles. -2017-04-24: - Chaoko99: - - rscadd: 'Added Level3.mod (AKA: title1.ogg), by VScratch? as lobby music.' - FTangSteve: - - rscadd: Adds two inflatable doors to every fire closet. - Orelbon: - - tweak: Glasses and goggles have updated sprites. - RedStryker: - - tweak: Recolored the kidneys and liver to look more realistic. - - imageadd: Added a stomach sprite for later use when stomachs are coded. - Sbotkin: - - rscadd: Added more cooling units for Engineering and Expedition Prep EVA. -2017-04-29: - Chaoko99: - - tweak: Made it slightly less infuriating to speedmix the allies cocktail. (Changed - recipe from vodka and martini (Gin and vermouth) to Vodka Martini and Martini. - - rscdel: Removed highlanders and all references to their antag type. - - tweak: Upped the cost of a flashdark in the uplink from 16 to 32. - Ithalan: - - rscadd: Detached organs now show if any attached child organs have decayed - - bugfix: Organs no longer decay under conditions where their parent organ isn't - decaying. - Orelbon: - - maptweak: Emergency armory has been revamped. - ProfligateShampoo: - - rscadd: Added the ability for characters with the Cook, Bartender or Passenger - (i.e. Botanist) job to select botanical gloves in their loadouts. - TheWelp: - - rscadd: Adds vox scrap armor, armor made from pieces of metal fused together. - - bugfix: Fixes equippable items ignoring inability to equip if warnings are disabled. - mkalash: - - tweak: Added distance to Sol to roundstart report, as well as replaced random - planets with actual overmap system info. -2017-05-02: - Chaoko99: - - imageadd: Made the Resomi sonar ping contrast a bit better to most sprites. - - tweak: Changed the defib failure messages. Now it is less likely to lie outright - to you, and medical will no longer need to know the ancient defib rituals. The - machine will tell them the fix instead. - - tweak: Defib units now start with an APC power cell (Down from advanced) for R&D - to replace as the round goes on. The APC cell will be able to shock the patient - five times before needing to recharge (Down from ten.) - - tweak: Halved the power consumption of the mobile suit sensor jammer. - Orelbon: - - bugfix: Cameras in emergency armory should have proper alarm links now. - - tweak: Evacuation sound should no longer give you tinnitus. - - tweak: Reduced the amount of guns in sidearm cabinets to 3 from 4. Reduced amount - of guns in personal sidearm cabinets to 4 from 6. - - rscadd: Added a combined arms cabinet with 3 energy guns and 2 personal. - - maptweak: Changes the sidearm cabinets in safe rooms to personal ones. Removes - sidearm cabinet in Brig Officer's office. Replaces sidearm cabinet in bridge - with a combined arms cabinet. - - rscadd: New sprites for Fire and Medical wall closets. - - bugfix: Fixes a bug that failed to update the medical wall locker sprite when - it got emmaged. - RedStryker: - - rscadd: Adds a lot of hairstyles. -2017-05-06: - Ornias1993: - - rscadd: Added anesthetics pump above main surgery operating table - - rscadd: Added Nanomed above health monitoring console - - rscadd: Added Medical intercom at the south-west corner beside general intercom - - rscdel: Removed Nanomed above Main surgery operating table - - rscdel: Removed medical intercom above ealth monitoring console -2017-05-07: - Ornias1993: - - tweak: Changed genetic damage scanner output to state genetic damage instead of - improper cloning -2017-05-09: - Asanadas: - - maptweak: Robotics control consoles have been added to the Bridge, and the Engineering - monitoring room. - - tweak: The Chief Engineer has robotics access. It's part of his job, you know. - Sbotkin: - - rscadd: Added a Military Police armband. -2017-05-13: - Asanadas: - - rscadd: Tajarans now have access to cultural veils. Tajarans will spawn with the - default, and job-specific veils with the proper HUD elements are available in - the loadout tab under Xenowear. - - rscadd: Added 5 new hairstyles to Tajarans. Ported from Polaris (ported from Aurora). - Chaoko99: - - rscadd: Added the large RCD cartridge to the autolathe. - - tweak: Halved RCD cartridge prices. - - rscdel: Removed a forced usage of passive wording in examine poses. ([Pronoun] - [Pose], instead of [Pronoun] is [Pose].) - Datraen: - - tweak: Ports soft lights featured in other servers. - Hubblenaut: - - bugfix: The hull wrap mode of the shield generator will now actually cover the - entire ship. - Orelbon: - - soundadd: Added new AI voice sounds. - - tweak: Lowered the volume on the AI voices. - Ornias1993: - - bugfix: Medical veil now selectable by medical contractor. - - bugfix: EAL, Sign language, and emotes will no longer use autohiss - - bugfix: Chapel Maintenance airlock, now needs maintenance access to open. - PsiOmegaDelta: - - rscadd: Can now set your desired FPS level under Character Setup > Global - RedStryker: - - tweak: Added the Science radio frequency to mining borgs. - TheWelp: - - rscadd: Lets AI controlled circuits to use the assembly's inputs via a verb. - - bugfix: Fixed AI controlled circuits not being moved correctly. -2017-05-18: - Chaoko99: - - rscadd: Made the engine input pumps more cryo-clamp-able. - - bugfix: Moved the maintainance deck saferoom APC. - Hubblenaut: - - tweak: Lubed floors can be cleaned with water. - - bugfix: Wet floors make a comeback after three months of stealthy disappearance. - Orelbon: - - rscadd: New sprites for the ion rifle. - - rscadd: New sprites for the stun carbine. - - bugfix: small eguns should now have the right sprites for east and west. - Ornias1993: - - bugfix: Oxygen_pump and Anestethic_pump, now correctly checks if the mask slot - is blocked - - rscdel: removed on click application to user of Oxygen_pump and Anestethic_pump - - tweak: Oxygen_pump now gives out Breathmasks instead of gasmasks - - tweak: anestethics_pump now gives out Medicalmasks instead of gasmasks - - bugfix: Maintenance hatch and replacing tanks works now on Oxygen_pump and Anestethics_pump - - tweak: removed organic requirement for removing the oxygentank of Oxygen_pump - and Anestethic_pump - - bugfix: UI of oxygen_pump and Anestethics_pump works now - - rscadd: AI can now click to open UI of oxygen_pump and Anestethics_pump - - rscadd: Added the Anestethics Mask for the Anestethics_pump - - rscadd: Added the Emergency Mask for the Oxygen_pump - - spellcheck: Fixed brusies typo on Torch Holodeck disclaimer - RedStryker: - - rscadd: Added boxes of armbands for emergencies to the heads of the Security, - Medical, and Engineering departments. - - tweak: Allowed a few more roles to use flats. - - rscadd: Added many new clothing items as accessories. - - tweak: Changed the color of the cheongsam to allow it to use the color gear tweak. -2017-05-20: - Chinsky: - - rscadd: All toys guns are now fitted with red bits on the barrel so you can visually - tell them apart! Very safe! Fun for whole family! - - rscadd: Can use wirecutters on toy revolvers to snip those off. It also changes - examine name to 'revolver' instead of 'toy gun'. In case you didn't know, those - are proper guns and you can hold people hostage with those. Just saying. Do - not try at home. - Cirra: - - tweak: Attempting to place an airlock brace without setting an access requirement - now informs you, and asks for confirmation. - Orelbon: - - rscadd: Added inhand sprite for stun rifle. - Ornias1993: - - bugfix: Everyone including military can now take sunglasses from loadout. -2017-05-23: - Asanadas: - - tweak: Maintenance Drones now require an account of age 3 days or greater. - Chinsky: - - tweak: Bunch of virus changes. Buckle up, kiddo. Praise Nurgle - - rscadd: Adds Space Cold event. Spawns a harmless virus that can be treated with - cold medicine. Unless you're irradiated and it mutates to kill everyone I guess. - - rscadd: Adds space cold medicine (dextra-something) to white first aid boxes. - Can also be made by mixing paracetamol+sugar. Eating it will stop weak viruses - symptoms from manifesting. - - rscadd: Humans now have crude immune system simulation. Keeping your immunity - high makes it easier to shrug off viruses, extremely low (15% and less) immunity - can get you random space cold-level infections. Get lemons for boosting it, - spaceacilin ruins it. It recovers to norm over time. - - tweak: Spaceacillin now ODs at 15u instead of 30u. - - tweak: Spaceacillin now metabolizes faster. It was 60+ minutes for 15u, 30 minutes - now. - - tweak: Spaceacillin boosts immune system effective rating. It acts as a multiplier - to natural one, from 1x at none in blood to 2x at OD threshold (15u), and you - can go higher if you don't mind ODing. Also if natural immunity is lower than - the boost, boost would just replace it. - - tweak: Spaceacillin has three stages now. Below 10 units it acts kinda like now, - blocking badness 2 virus effects. Virus would still progress though, but effects - won't fire. It's enough for any random event virus effects. - - tweak: Above 10 units it would completely stop progression of badness 2 viruses - and stop effects of badness 3 - which is usual stuff ou get from viro labs. - Again, clock will still be ticking. Also at this stage it starts lowering your - natural immunity value. - - tweak: And then, there's OD. OD stops badness 4 (e.g. Gibbingtons) from manifesting, - and stops ticking of lower viruses. It screws your immune system even stronger - too. - - tweak: It's also not 100% protecting you from infection now. 15u and above give - old 100% protection, scaling with lower value in blood. - - tweak: Some tweaks to virus annoyningness. Hard delay between firings (25-40 seconds - between message-only syndromes), emote syndromes (groaning, moaning, screaming) - are now single syndrome to make it rarer. Internals actually stopping you from - spreading viruses. No airborne viruses in vacuum. - - tweak: As an unrealated bonus, first aid (white and fire) boxes now have paracetamol - bottles because damn it's easier to score opiates than that. - - tweak: Oh also remember how when you graft yourself Tajaran arms it kills you? - Not when your immunity is floored. Just saying. - Orelbon: - - maptweak: Tech storage has been moved to deck two, where the abandoned officers - mess was located. The officers mess has been moved into the previous location - of tech storage. -2017-06-03: - Ace McLazer: - - rscadd: Added Towels to Sweatmax products. In all kinds of colors! Ported from - Polaris. - Albens: - - maptweak: Added a new Bridge - - rscadd: Added a Bridge Officer's locker, and 'Standard' Tablet/Laptop that spawns - on the Bridge. - Cirra: - - rscadd: As a failsafe, the maintenance hatch on a cyborg/android/robot will now - unlock upon death, allowing easier recovery of the brain inside. - Hubblenaut: - - rscadd: Added coffee pots and carafes, available in the dinnerware vending machine. - - tweak: Hot drinks now have vapor on them. - Orelbon: - - maptweak: Engineering locker room and storage have been tweaked. - SiegDerMaus: - - rscadd: Adds a new magnetic flechette weapon, available via uplink. - Sunsar: - - tweak: Made light bulbs a bit brighter. Engineering should be less of an eyestrain - now. - ZeroBits: - - rscadd: Added Barbecue Sauce as a Condiment. - - tweak: Changed the mailroom flaps to airtight flaps. - - rscadd: Added a second mop to custodials. - - rscadd: Added rings to the loadout selection. -2017-06-06: - Asanadas: - - rscadd: High jittery levels will now cause heart damage. - - rscadd: Individuals with robotic hearts will no longer suffer from jitters. - Ithalan: - - rscadd: Added turtleneck sweater as accessory. -2017-06-11: - Asanadas: - - rscadd: There's now a neat lore splash window which will spam all new accounts - under 7 days old. Read it! - Chaoko99: - - tweak: Made Digital Valves removable. - Hubblenaut: - - rscadd: Digital warrants can now be archived, so they don't have to be deleted. - - rscadd: Security gets automatically notified on new warrants through their HUDs. - - tweak: Improved the digital warrant interface. - Leshana: - - tweak: Optimized the unified radiation system. Made the radiation cutoff level - configurable. - - bugfix: Standing still won't save you from radiation storms. - Ravensdale - original work by anewbe: - - bugfix: Removed the exploit by which you could gain cargo points by ordering plastic - crates. - - rscadd: Upped cargo point gain by 50%. - Unknown: - - maptweak: Atmoshperics has been edited to make it easier to change and modify - pipes. - ZeroBits: - - rscadd: Added Independent Language. - - rscadd: Added signet rings, which act as stamps and rings, and can be personally - claimed by clicking them in-hand - - tweak: Rings are now compatible with the material system, and can be made via - sheets. - - bugfix: You can no longer clip rings like gloves, and all species except Diona - can wear them now. -2017-06-17: - Asanadas: - - bugfix: No longer will you be able to freely pass onto upright tables by moving - onto them from a tile which has a flipped table. - Chaoko99: - - rscadd: Added a mass-defile cultist rune. Buyer beware; it may kill you. - - rscadd: Cult tiles play a snazzy animation on creation. - - rscadd: The soulstone shard now notifies the player when it is full, asks if you - wish to release the spirit within. - - rscdel: Removed Manifests from the cultist repertoire. - - rscdel: Removed defile giving cultist levels. - - tweak: Changed the values for cultiness (The value which controls spell levels). - You will need to either recruit 10 cultists, or perform 10 sacrifices to unlock - Nar-Sie. - - tweak: Nerfed cultist robes. Buffed cultist voidsuits. The latter of which is - still impossible to obtain. - - bugfix: Made the restricted/protected/blacklisted roles for cultists torch-compatible. - - bugfix: Fixed construct and familiar spells. - - rscdel: Removed Vox Pariah. - Chinsky: - - rscadd: Can now rig assemblies/devices(e.g. radio signalers) to trigger when crate - is opened. Click wires on open crate, then click with assemblies. It would trigger - when opened next time. Use wirecutter to unrig. - - tweak: AI cores got new step in construction. You need to swipe an ID with Upload - access (or emag) to hook them into the systems. - - rscadd: Added rubber masks and suits to party crate. Dress up as war hero or SCG - secretary or a naked tajara like you always wanted. - - tweak: Made SHOCK mode on tasers literally useless, ruining security gameplay. - Does bit less burn damage, and much less straight up stun damage. Not 'better - tase mode' anymore. - - bugfix: Fixed their primary function actually never working. If you hit arm or - hand with the beam you can disarm someone (even diona, even robbit, pain reception - doesn't matter). If you hit leg, they might drop, higher chance for foot. - Hubblenaut: - - bugfix: Manifold pipes show up properly on t-ray scanners now. - - bugfix: Space lube now properly disappears. - - tweak: Can now put items in vendors by using click and drop, thus allowing screwdrivers, - multitools and similar. - - tweak: Space heaters will now first attempt to draw power from the local APC. - sabiram: - - rscadd: Research module robots now have access to a welding tool. -2017-06-19: - Chinsky: - - tweak: Speed now matters when flying into meteor field. Still - 25% the meteors, - below 0.3 - 60% of usual, normal otherwise until above 3 speed, where you start - getting double the fun. Also if ship is moving most meteors will fly in from - front and sides. - - tweak: Changes spess dust event. It used to be a single wave of quasi-meteors - that exploded for a bit before dying. There were no further waves until you - left and came back. Now waves keep coming ~twice a minute. Dust itself is now - a pile of micrometeors - basically space bullets. It wouldn't do a lot of damage - to the hull, but can break windows and makes EVA pretty damn dangerous. - - tweak: SCG had mastered the secret art of 'background check'. CO and XO are no - longer be eligible for roundstart antag roles on Torch. Can still be converted - in round - - bugfix: As a side effect, they aren't going to get rev'd anymore, that was a bug. - ZeroBits: - - rscadd: Added the ability to have multiple loadouts per character. - - rscadd: Added magic invisibility ring and reagent rings. - - tweak: Rings are now a child of clothing rather than gloves in order to appease - code gods. - - tweak: Gloves can now be worn over rings (much like magboots with shoes). - - rscadd: Added coffee cups to the loadout selection. - - rscadd: Added threebread, blueberries, pancakes, and two new flavors of ice-cream. -2017-06-30: - Chaoko99: - - tweak: Poppies now contain tramadol. - - bugfix: Fixed the phrasing in the set-pose verb. - Chinsky: - - rscadd: NT has sent some more testing supplies. Nothing to see really. RDs can - find details in a super secret folder in their office. Others - do no peek, - ok. - - tweak: Surgery now produces normal wounds instead of snowflake 'open incisions'. - Do not be alarmed, do not bandage those if you plan to continue surgery, clamp. - If incision was made with scalpel, you'll be able to cauterize it, healing a - lot of damage. - - tweak: Skull/ribs surgery changed, now you just need to use the saw to crack em. - Fractures count as being open too. Retractor steps for ribs etc are gone, use - normal bone repair surgery aferwards. - - tweak: Coincidently you can just rip them apart with cut wounds to get access - to innard surgery steps. It takes much more damage than surgical incisions though. - - tweak: Bones now fracture when damage is taken rather than from existing damage. - Meaning if you fix bones, they won't refracture immediately without taking damage. - - tweak: You don't need to crack open the bones to get shrapnel now. If you can - see it on examine, you can take it out with just a retracted incision. - - rscadd: Added new surgery step - disinfecting wounds. You can use sterilizine - or high proof booze, in spraybottles/droppers/bottles/glasses/buckets. Works - same as ointment. - ParadoxSpace: - - rscadd: Adds darksight to space adapted humans - Ravensdale: - - tweak: Cultists now speak in the cult tongue when activating runes instead of - their default language. Done in case a changeling cultist ever becomes a thing. - - rscdel: Removed special human kabobs and burgers. Lumping all items that are 'red - meat' together. - - tweak: Adjusted AI tracking verbs. AI will now have a more difficult time tracking - specific people depending on method and if person has their face concealed. - - tweak: To bring some consistency for the above, also adjusted how names appear - on mobs that have some sort of face covering or a face that is... not there. - Zucchinsky: - - rscadd: Beeg medical changes. Like holy crap. Get a crash course on https://wiki.baystation12.net/index.php?title=Zuhmed_Guide - - rscadd: Death now occurs when brain dies. Brain's health replaces overall 'health' - - rscadd: Death is now FINAL, baring relacing. Don't let that brain die. - - rscadd: Crit now exists as flatlining, the heart failure, or as fancily 'asystole'. - It happens when heart is damaged, not enough blood or oxygen in blood, or high - levels of shock. - - rscadd: In crit you do the usual gasping thing and take brain damage. USE CRP - or defib to revive em. If they die before you crack ribs, you hadn't tried hard - enough. - - rscadd: '''Toxins'' damage is now overall organ failure, basically sum of organ - damage. Poisons will try to destroy liver and kidney first, and will damage - the rest after those two are down. Some poisons go straight for vitals. Liver - will heal self until it''s too damaged.' - - rscadd: '''Suffocation'' damage is now used as modifier to your blood levels. - If you don''t get enough air, you get effects of low blood basically.' - - rscadd: Defibs now restart failed hearts instead of reviving dead. Also named - differently now. - - rscadd: Most scanner readouts are changed now. Instead of damage values they report - vitals (pulse/blood pressure/brain activity) and general state of damage. - - rscadd: A D R E N A L I N E. When you take a good chunk of damage at once (15 - or more in one hit) you generate bit of adrenaline reagent according to damage - taken. It acts like strong painkiller / pulse raiser for a tick or two, becoming - weaker after that. - - rscadd: FBPs and IPCs now have batteries in their chests. They have HYPERCELLS - and drain when they stand (unbuckled) or move around (double drain then). - - rscadd: Sleepers now have stomach pumps, same as filtering but for ingested stuff. - - rscadd: Cultists yo - sacrifice rune now works on someone in asystole rather than - full braindeath. Knives now count for all steps needed to cut out the heart, - and cult runes count as surgery spots. Just sayin'. - - rscadd: Bunch of chems is different now. First off, none 'reduce' toxins damage, - aside from peridaxon cause tht's organ damage now. - - rscadd: Peridaxon only treats brain damage if it's not too severe. Get Alkysine - otherwise. - - rscadd: Alkysine will only work if brain is fully oxygenated, so refill blood - and air first. - - rscadd: Dylovene removes toxic reagents from blood. - - rscadd: Dexlaine fools brain into thinking you got at least 50% of air you needed. - For Dex+ it's 80%. - - rscadd: Cryox/Clonex also have Dex/Dex+ effect respectively. - - rscadd: Inapro prevents suffocating while in asystole, slows pulse down (which - slows bleeding a bit) and has mild painkiller effect as it did. -2017-07-06: - Chaoko99: - - tweak: Added a full belt to engineering lockers. - - tweak: Removes all (direct) references to Metroids from our codebase. Not being - sued is nice. - - imageadd: Replaced our RPED sprite with /TG/'s, and added a little animation atop - that. - Chinsky: - - rscadd: Can now scoop corgis up, like cats or nymphs etc. - - rscdel: Can also use them instead of sausages in microwave to make hotdogs. Geddit, - hehehe hot dogs. Riot. - - tweak: GUPpy, Calypso and Aquila now can share destinations, as long as they can - fit. - - rscadd: Excavation prep closets now have BLUESPACE FLARES. You can activate those - in a nice open spot to create a new navpoints for shuttles (ones mentioned) - to go to. - - rscadd: Exploration shuttles (Calypso/Guppy/Aquila) now can share destinations - (with some other shuttles too). - Heptagon49: - - tweak: Replaced the synthetic lung sprites with something more realistic/futuristic. - - rscadd: Added artificial and assisted lungs to the loadout menu. - Hubblenaut: - - rscadd: Coffee cups are now available across the ship. - - tweak: Coffee cups now have reagent fill states. - - bugfix: Fixes glass of cup of tea. - thasc: - - bugfix: Ghosts can hear binary chatter again. -2017-07-09: - Chaoko99: - - tweak: Made it so a butterfly knife spawns in your hand instead of on the floor - when completed. - Chinsky: - - tweak: Bluespace jump effects have changed. Engineers found that some duct tape - got unstuck because of a WD40 leak, so they fixed it. Now you can't zoom through - the walls, and visibility is a bit better. You also don't get confused forever, - just for a minute or so. There are some... unforseen side effects, but they - seem harmless. A word from Chief Tech (before his disappearace) - KEEP IT REAL. - Hubblenaut: - - rscadd: Gives holowarrants their own handheld item. - - tweak: Holowarrants will now broadcast updates on warrants instead of security - HUDs. - - tweak: Authorizing a warrant using the holowarrant will now broadcast a message. - ParadoxSpace: - - rscadd: Unathi across the universe have been informed of new lore changes, and - can now be a maximum age of 260. - Ravensdale: - - bugfix: Exosuit/mecha pilots can once again operate airlocks from the safety of - the cockpit - mkalash: - - tweak: Replaced adminhelps with a ticket system. -2017-07-14: - Atlantiscze: - - tweak: Max pressure on omni filter/mixer output is now capped at approx. 7500kPa - - tweak: Atmospherics pressure tanks can now be set to output up to 15000kPa - Heptagon49: - - bugfix: Changes the recipes for Methylphenidate and Antidexafen so they no longer - overlap. Methyl now requires lithium instead of hydrazine, and antidexafen now - requires carbon instead of sugar. - - tweak: Lowered the max damage of internal organs, except for the brain and cortical - stack. - - tweak: Prosthetic internal organs are now stronger then regular organs. - - tweak: Kidneys are actually important now. You will slowly take toxin damage if - they are missing or busted, same as the liver. - - imageadd: Changed the sprites for the prosthetic liver and kidneys. - - rscadd: Prosthetic lungs half the toxin damage taken from breathing bad air. - - tweak: Made assisted organs slightly worse. - Hubblenaut: - - tweak: Air shutters will not be automatically opened by a clearing air alarm when - it would be dangerous to do. - ParadoxSpace: - - rscadd: Unathi across the galaxy have realised the implications of having tails, - and now use them to attack instead of their legs. - atlantiscze: - - rscadd: Can now order OCP and plasteel from cargo. Furthermore, 10 and 50 sheet - crates are available for some more expensive sheet types, with 50 sheet crates - being more cost efficient. - mkalash: - - tweak: Replaced tgui ticket panel with an autoupdating basic Topic() one - - rscadd: Added time stamps to messages on the ticket panel, and a measure of how - long an unanswered ticket has been open - - rscadd: Added a PM button to the ticket panel - - tweak: Adminhelping with an open ticket will either send another adminhelp to - the same ticket, or PM one of the assigned admins if there are any - - bugfix: No more sanitation weirdness in ticket panels - - tweak: A ticket is no longer created anyway if an admin cancels sending a PM to - someone who didn't have a ticket - - bugfix: Fixed admins being able to create tickets for logged out players - - bugfix: Fixed mods and trialmins being unable to use the ticket panel -2017-07-24: - Hubblenaut: - - tweak: If a cycling airlock is already near the target pressure, pressing the - buttons will toggle the doors instead of making it reenter the cycle process. - - bugfix: Fixes blood splatters reappearing when lifting or putting floor tiles - down. - PsiOmegaDelta: - - rscadd: Species may now be restricted from selecting certain branches, ranks, - and occupations as according to lore. - Ravensdale: - - maptweak: Changed the colours of the pipes in atmosia to follow older color 'codes. - SiegDerMaus: - - rscadd: Added uniforms for Miranians for future events.. - TheWelp: - - rscadd: Allows Vox to be used in character setup. They are still restricted rule-wise - as they were before. -2017-08-01: - Ace McLazer: - - rscadd: Added A grunt emote for the grumpy. - - tweak: Tweaks Medibot statement for accuracy. - - imageadd: Adds Renegade AntagHUD Icon. - - imageadd: Swaps Medical belt Icon to blue - Crushtoe: - - rscdel: Removed transformation sting. - FTangSteve: - - bugfix: Fixes dionaea jitter. - - bugfix: Fixes dionaea limb regen. - - rscadd: Adds species based footprints when barefoot. - - rscadd: Gives GAS the ability to move over gaps or stop fall damage based on air - pressure. - - bugfix: Fixes some bugs with the GAS cloaking and stance switching. - - bugfix: Fixes damage overflowing max limb damage being negated. - - tweak: Makes wounds on limbs more realistic by letting them overflow max damage. - - rscadd: Adds ability for limbs to be injured irreparably, requiring amputation - or removal. - Heptagon49: - - imageadd: Adds everyone's favorite hotdog-based meme to the AI icon list. Now - contains 2% real corgi flavor! - Hubblenaut: - - rscadd: Replaces flashlights in Security with maglights. - - tweak: Removes security HUD sunglasses from lockers and makes them available in - loadout instead. - - tweak: Personal lockers now display their owner's name in their name. - - rscdel: Removes the box of military police armbands from CoS' locker. - - rscdel: Removes the box of solgov police badges from the Brig Officer's locker. - - bugfix: Lockers reset all random pixelshifts of their contents. -2017-08-07: - Atlantiscze: - - rscadd: Added ability to ban devices from the NTNet network, through the administrative - utility program. - - rscadd: Security cyborgs now get access to warrant program - - rscadd: Engineering cyborgs now get access to supermatter monitor program - - rscadd: Mining cyborgs now get access to supply management program - - tweak: Holowarrant now checks for access when authorising, similar to how the - program does it. - - rscadd: 'Added new program to the modular computer framework: NTNet Access Decrypter. - This program is available for download on all emagged devices, but relies on - ID card slot hardware. When executed it slowly (takes about 3-6 minutes, depending - on the device''s CPU) hacks the network and when finished adds a random access - to the ID. ID must be kept inside the device while running. Can be repeatedly - used to get multiple accesses. Has chance of yielding access that''s already - present on the ID, and therefore will do nothing wasting some time.' - Broseph Stylin: - - rscadd: Added weight lifting machines and punching bags. They provide no mechanical - benefits, and will deplete your nutrition as they're used. The weight machine - has 3 setting which can be changed with a wrench. You must be on harm intent - to use the punching bags. - - maptweak: Remapped the Deck 3 abandoned office, near EVA Storage, into a gym. - Cirra: - - bugfix: Fixed an exploit which allowed for the creation of infinite metal, using - the circuit printer. - CrimsonShrike: - - rscadd: 'Added new accesory slot: insignia' - - rscadd: Allowed more accesories on dress and service jackets. - - rscadd: Security vests now come with stripes to hang badges and other similar - insignia accesories. - - rscadd: Detective coat has now a slot for the badge too. Gone are the days of - flashing suspects to show your identification - - rscadd: Colonial Marshals have now learned to keep their badges visible aswell. - - bugfix: Emaged light replacers will now properly place explosive lights. - Datraen: - - rscadd: Adds directional states for softlight overlays. - - bugfix: Fixes lights on rotated views. - FTangSteve: - - bugfix: Fixes bug that stopped wounds from healing. - - bugfix: Fixes bug that made brains not take damage from low blood unless they - already had damage. - - bugfix: Fixes bug that made moderate blood loss damage your brain until death. - - tweak: Makes the irreparable point twice the limb cutoff threshold instead of - equal to it. - - tweak: Prevents vital external organs from being irreparable, instead they go - to critical. - - tweak: Updates advanced scanners with new wound severity levels. - - tweak: Smooths the dexalin and dexalin plus effectiveness curves. - - bugfix: Fixes pulling grabs when the affected person can't move. - - bugfix: Fixes GAS being able to use advanced tools when nabbing. - - bugfix: Fixes grabs with the ladder_carry ability carrying people up ladders. - - tweak: Stops GRAB_NAB base grabs from throwing people. - - bugfix: Allows GAS to remove lights by hand. - - bugfix: Moves GAS eyes below the lighting layer. - - bugfix: Stops mice from pushing crates, lockers, etc. - - tweak: Stops mobs from using pull to move larger mobs (grabs still work). - Heptagon49: - - rscadd: Adds the ability to toggle locks on secure lockers and crates with alt-click. - - rscadd: Adds the ability to open and close fire extinguisher cabinets with alt-click. - - rscadd: Adds the ability to rotate chairs with alt-click. - - rscadd: Adds the ability to change reagent amount tranfer with alt-click. - - tweak: Lowers the odds of vending machines going absolutely ballistic. - - imageadd: Adds a new robot sprite to the security module selection. - Legius: - - bugfix: Sign Language is no longer displayed to clients who are unconscious or - asleep. Probably. - PsiOmegaDelta: - - rscadd: Players with custom AI displays can now have multiple entries, should - they desire. - - rscadd: Players with custom AI displays can now freely select between their custom - and available displays. - - rscadd: Players with custom AI displays no longer have to supply the crashed/dead - AI state. - - rscadd: Traitor/Malfunctioning AIs now have access to additional AI displays. - SierraKomodo: - - rscadd: Added berets that allow a custom color to be set to the loadout menu. - - bugfix: fixed transparent pixels in white beret sprite. - TheWelp: - - rscadd: Adds deity follower tracking and better deity eye in general. - - rscdel: Removes need for deity floors and respective spell. - - rscadd: Nar-Sie zombies will automatically get all of their blood filled when - zombized. - - rscadd: Nar-Sie zombie's breathe will convert faster. - - bugfix: Fixes nar-sie blood forge being automatically unlocked. - nearlyNonexistent: - - rscadd: Added vending machine to the code that contains dice, cards and related - toy type items. One is in the mess hall. - - maptweak: Adds paper for civilians in the mess hall and lounge. Removed a stool - in the mess hall to add the vending machine. -2017-08-12: - Atlantiscze: - - rscadd: Cyborgs can now manipulate IV drips and chemistry grippers can now hold - blood packs. - - rscadd: Improved some SMESes around the station - mainly the Engine SMES. - - rscadd: Shuttles now have a SMES with single transmission coil in them. Primary - input is the main grid, secondary input is a PACMAN generator. - - rscdel: Removed stashes of phoron from the shuttles (they can operate without - generators now) - - bugfix: Fixed bug which caused shuttles to be remotely powered even after cable - connection was severed by jump - - tweak: Rewired SMESes in engine SMES room. Engine - Core SMES can now be charged - from main grid, for example through solars. - - rscadd: SMES and PSU units can now have more than one input terminal at once. - Broseph Stylin: - - tweak: Changed access requirements aboard the Aquila. Helm and Secure Storage - remain as Aquila-specific access, but all other areas have been made SCG Crew - or all-access. - - tweak: Changed sidearm cabinet access requirements. Only line officers, the RD, - the SEA, and the Brig Officer can unlock them now. - Chaoko99: - - bugfix: Makes title1 run at roundstart. - Crushtoe: - - maptweak: Added a First Deck Lounge in the Observation Bubble. - Devildabeast: - - rscadd: Defines an armed role for the Loadout, which includes all jobs that are - allowed to carry weapons from round start. - - rscadd: Adds Scientist and Researcher to semi-formal roles. - - tweak: Frontier clothes are now its own separate item instead of a formal outfit - and can be worn by non-military roles. - - tweak: Holsters can now be selected by armed roles. - FTangSteve: - - rscadd: Added a paramedic alt title for medical contractor. - - rscadd: Added a admin debug verb that lets you see a health summary, same as the - advanced scanner in medical. - - tweak: Makes splashing solutions and using eye droppers only work when not on - help intent. - - tweak: Makes dylovene more effective to help with liver damage and recovery from - severe damage. - - bugfix: Fixes necrotic internal organ surgery. - - bugfix: Changed how toxins work so they now are effective. - - bugfix: Alcohol is once again potentially damaging. - - bugfix: Increases processing accuracy for liver and kidneys. - - bugfix: Radiation now does damage again. - - rscadd: There is now a popup after taking enough brain damage as a stand-in for - clone memory disorder etc. - Heptagon49: - - rscadd: Adds a 1% chance for a diona nymph to pop out when you activate a vending - machine. - - imageadd: Adds a few vending animations. - - tweak: Changes the NutriMax icon from the nutrimat to the pre-existing, but unused, - nutri. - Superbee29: - - tweak: Telecommunications servers no longer know the exact race of a speaker. - TheGreyWolf: - - rscadd: Mechanical and assisted kidneys and livers are now available in character - setup. - TheWelp: - - rscadd: Adds two new Nar-Sie phenomena. - - rscadd: Adds two generic feats involving power generation. - - tweak: Communication phenomena can now be used on non-cultists. We will see if - this is a good change. - - tweak: Tweaks a few of the phenomena names to be more apparently phenomena. - - tweak: Buffed Nar-Sie's power costs (reducing them). - nearlyNonexistent: - - rscadd: Cardemon instructions! Now you can actually play those weird pokermon - cards rather than just look at them. -2017-08-19: - Atlantiscze: - - rscadd: Re-adds on-join announcements to all ranks. - - tweak: Most jobs are announced on relevant departmental frequency (if they have - one). During red alert all jobs are announced on main frequency. - - tweak: Canisters now once again use NanoUI, instead of tgui. Performance on some - devices should be considerably better. - - tweak: AI can once again track people by clicking their name from radio messages, - even when their face is obstructed, assuming they are at least wearing a matching - ID. - Chinsky: - - tweak: Slimetoxin. Slimetoxin changed. Instead of pop and go slimeficiation it's - now a life threatening process. Slime toxin metabolizes slowly, and deals fair - bit of toxins damage. For every unit or so metabolized, it mutates one limb. - Once every limb mutated, there's a 10% every tick to fully mutate into a slimegirl. - If you're lucky, you might mutate right before death and that'd heal your all - wounds! That' a great idea! - Devildabeast: - - rscadd: Adds a cyborg recharging station to the Auxiliary Head. - - rscdel: Removes toilet from said Head. - FTangSteve: - - tweak: Adds more signals letting someone know they have toxin damage and giving - them a chance to get help. - - tweak: Adjusts how often internal organ damage messages are displayed. - TheGreyWolf: - - rscadd: Added hoods to standard hoodies. - tlc2013: - - tweak: Updates the Lobby and Nuclear Explosion cinematics to be more Torch-y. - Special thanks to 50_n00b for the art. -2017-08-23: - Broseph Stylin: - - tweak: The Body Scanner console and IV drips are no longer dense and can now be - walked through. - Chinsky: - - rscadd: Air analysers now have verb to be toggled into advanced mode. It displays - gas properties like specific heat and molar mass. - - rscadd: Air analysers can also now be used on pipes and various atmos machinery - to inspect the contents. - FTangSteve: - - tweak: Makes it easier to recover people from severe radiation damage. - - tweak: Puts a limit on recovery time for surgery with peridaxon, two minutes after - death the organ will no longer be savable. - PsiOmegaDelta: - - rscadd: Underwear is now handled as actual items. - - tweak: Your own underwear can be removed using the 'Remove-Underwear' verb. - - tweak: You can remove others underwear through the strip-menu. - - tweak: To put on underwear, on yourself or someone else, click the target mob - with the underwear in your active hand. - - tweak: The wardrobe now offers a limited quota of underwear if replacements are - needed. - - tweak: You can increase this quota by returning underwear items. - TheGreyWolf: - - rscadd: Tattoos are now available in character setup. - ZeroBits: - - bugfix: Manuals now point to the correct wiki pages. - - tweak: Cleaned up and organized manual files. - - rscdel: Deleted redundant manual that pointed to the same page as another. - Zuhayr: - - rscadd: Diona nymphs can now pick up and carry a small item. Use the drop_item - command or the Home key to drop it. This can also be used to remove your hat. - - rscadd: Losing your head is no longer necessarily lethal, unless you're the kind - of fat nasty trash who has a brain or other vital head organ. - chinsky and mkalash: - - rscadd: 'A randomly generated exoplanet of one of the following for types is now - available for away missions:' - - rscadd: Grassy exoplanets, lush with (probably dangerous) flora and fauna, but - not much else - - rscadd: Snowy exoplanets, like grassy but colder and with less life - - rscadd: Desert exoplanets, rich with minerals below the surface, which is covered - with dangerous quicksand - - rscadd: Mountainous exoplanets, one of the three other options, but also covered - with surface minerals - - tweak: Additionally, the airlocks of the three shuttles aboard the Torch now cycle - to the external atmosphere. - nearlyNonexistent: - - tweak: Fixes the inability to make enchiladas by making popcorn require salt. - Enjoy your salted popcorn. - sabiram: - - bugfix: Maintenance drones now once again take damage and recieve alarm notifications. -2017-08-27: - Chinsky: - - rscadd: Added a ton of usless gasses. Overall fireball planets should be slightly - more rare now - - tweak: Lighters now have fuel storage inside, and will shut down if it's empty. - Can refill at any welder fuel tank. - - rscadd: Can now dig graves planetside. Use shovel on ground to dig a pit. Can - place grave markers with wooden planks. - - experiment: When you speak now, your first name is replaced by your rank in messages. - Only affects those with military rank and wearing ID with it. - FTangSteve: - - rscadd: Adds insulated gloves for nabbers. - - rscadd: GAS can now be chemists and engineers.. - Minijar: - - bugfix: Fixes holosigns to appear above doors - atlantiscze: - - rscdel: Removed Turrets Focus Enhancer malf AI hardware, it is obsolete now. - - rscdel: Hack Camera replaced with Reset Camera. No longer allows camera upgrades, - this has been shifted to Machine Upgrade. - - rscadd: Added Quantum Knowledge Databank malf AI hardware. On use it advances - all research by one level. Single-use. - - rscadd: Added T5 Machine Upgrade ability, behind Machine Overload. Right now only - works on APC, SMES, Turret, Turret control, Camera. It is easily expandable - to any machinery in the future. - - rscadd: Adds four new abilities in a new passive tree. T1 prevents intellicard - transfers (toggleable), T2 removes BSOD/lockout from APCs, but reduces CPU generation - (toggleable), T3 prevents hack failures, and allows you to complete system override - silently and T4 prevents fax/emergency messages from going through. -2017-08-30: - Chinsky: - - rscadd: Health analyzers, advanced scanners and suit sensors will now report blood - oxygenation instead of just how well it flows in general. - - rscadd: If you go near an edge of exoplanet, you get warped around, kinda like - in space. Don't get lost, nerds. - - rscadd: Lush planets now have some drillable minerals too - some coal with a small - chance of diamonds or uranium. - - rscadd: Movie titles music now uses lobby music preference toggle to see if it - should play to you. - Crushtoe: - - maptweak: The derelict is no longer complete trash. There's actual rooms and plenty - of loot to loot, too! - - rscadd: Added random spawns for hostile mobs on the Derelict. Now the good loot - has a guardian pike/carp/viscerator. - FTangSteve: - - bugfix: Updates GAS to properly use the bloodmed system. - - bugfix: GAS eyes are no longer vulnerable to phoron in the air. - - bugfix: Fixed bug with humans not taking oxyloss after two minutes of not breathing. - - tweak: GAS now store more dexalin. - - tweak: Updates unit tests to include GAS. - - tweak: Updates unit tests to work with adjusted oxyloss system. - Minijar: - - tweak: Changes blue alert to orange - - rscadd: Replaces the bluespace artillery cannon with a prototype RUST fusion reactor - for engineering to experiment with. - - tweak: Edits the RUST manual to fit the new setup. - PsiOmegaDelta: - - experiment: Overhauls how reagents are identified, affecting both chemistry and - food. Due to the large scale of these changes more or less subtle bugs may have - crept their way in. - ThatOneGuy: - - rscadd: Can now play as the Explorer Department if you are a EC member. If a complete - failure, up for removal. - - rscadd: Calypso remapped for more cargo space and crew area. Bathroom and Cryo - deleted. - TheGreyWolf: - - rscadd: Fixed up pathfinder and explorer loadout. -2017-09-03: - Earthcrusher: - - bugfix: The electrified arm (e-magged/traitored Engineering borg module) now behaves - like a stun baton. It can be toggled on/off. - - tweak: Activating the electrified arm will now cause the borg to glow a faint - blue, giving away that they are using it. - - imageadd: Added a unique sprite for the electrified arm. - Kelenius: - - tweak: Pulling a knife out of your boot or putting it in no longer makes a message. - Minijar: - - bugfix: Adds atmospheric systemst the rust chamber - - bugfix: fixes the rust airlock - - bugfix: Removes accidental vacuum flooring - ParadoxSpace: - - rscadd: Adds Selenian, a lunar language for those who still hold onto that silver - spoon. - - rscadd: Adds Spacer, a language of Dutch origin for non-landlubbers. - - rscdel: Took Tradeband out back. - dryerlint: - - rscadd: Added ability to put paper bundles directly into paper bins and nano-printers. - - rscadd: Clicking on paper while holding a paper bundle now adds the paper onto - the bundle. - - rscadd: Added new type of crate - the paper refill crate - filled with 30 blank - papers. Intended to be used for refilling bins and printers. - - maptweak: Placed paper refill crate in Deck 1 Maintenance near the Conference - Room. -2017-09-08: - Chinsky: - - rscadd: Calypso is dead, new shuttle is here in same role - Charon. - - rscadd: Can now hide custom loadout items that are not allowed for your job. The - button's in top of loadout menu. Makes browsing less of pain for those with - lots of restrictions. - - rscadd: Wildlife will now respawn if more than half is killed off. Beware. - - rscdel: Added new type of planets - settled ones. Full of xenoarch-filled garbage - piles and hostile robots. - Cirra: - - bugfix: Protein is no longer present in food items which aren't supposed to contain - it, such as skrellsnax. - CrimsonShrike: - - bugfix: Stacking machine will now stack materials again. - FTangSteve: - - tweak: Updates engineering contractor to have access to atmos, EVA, etc. - Kelenius: - - tweak: Defile counts towards rune unlock again, at a rate adjusted for Torch. - - tweak: Mass defile rune won't kill you with bloodloss when you draw it more than - once (cost lowered from 80 to 20). - - bugfix: Soulstones should work properly now. - Minijar: - - rscadd: Adds pilot voidsuits to the Calypso along with a cycler. - TheGreyWolf: - - rscdel: Removes the Zhan-Khazan outfit from the loadout (Taj relevant only). - - rscadd: Added a NT pilot specific voidsuit, currently none are mapped in. - Zuhayr: - - tweak: R-UST backend/manual changes. -2017-09-13: - Chinsky: - - rscadd: Changed way lung damage affects people. Instead of straight up oxyloss, - it now makes you require higher oxygen pressure - so you can work around it - with high pressure internals. Of course it's not 100% failsafe, as blood coughing - and breathing stops still remain. - - rscadd: Inapro does more things now. It can heal brain damage up to 60, and also - slows down brain damaging a general, more effective at higher oxygenation. - - rscadd: Health analyzers report brain damage a bit different now. They don't report - damage that will self-heal without meds. New stage 'minor brain damage' covers - range that can be healed with inapro. Rest are more or less same. - - rscadd: Painstuff tweaked around, should generally see slightly less instant KOs - from lethal damages. - FTangSteve: - - tweak: Makes it so breathing heat or cold will hurt your lungs more than making - your head explode. - - rscadd: Electricity now shocks many parts of your body in a line to the ground - rather than just your hand. - - tweak: Species with an open circulatory system now don't get cut veins or arteries. -2017-09-23: - Atlantiscze: - - tweak: Pulling a knife out of your boot or putting it in produces a message once - again, but only if you are adjacent to the person. - Chinsky: - - rscadd: Can remove rolling end credits with Stop End Titles verb in OOC tab. - FTangSteve: - - rscadd: GAS now are flammable. - - rscadd: Lasers can catch flammable mobs on fire. - - rscadd: GAS no longer are cut by small sources of cuts (they are bruised). - - rscadd: GAS no longer are cut by slithering over glass. - - rscadd: Being on fire now burns immediately and isn't based on body temperature. - - rscadd: Adds an autolathe to robotics. - - rscadd: Adds lightswitches to chemistry, the galley, and robotics. - - tweak: Adjusts some lights so lightswitches make those rooms dark. - ZeroBits: - - rscadd: Activated the Solar Storm random event, which roasts anyone who's EVA - at the time. - - tweak: Added rad-shielding to the bunk room so you can stop dying while AFK, also - added rad-shielding to the saferooms. - - tweak: Tweaks lottery chances. - - tweak: Allows admins to choose whether or not to make an announcement when they - toggle gravity from the secrets panel. - atlantiscze: - - tweak: Walls and similar dense objects are now much better when protecting against - radiation, especially at higher levels. - - tweak: AI integrity restorer program will now upload map's default law set instead - of NT default. - - tweak: Cyborgs can now click ladders to climb. AIs can now click ladders to move - their view to different Z. -2017-09-28: - Banditoz: - - maptweak: Adds tintable windows to the Robotics Surgical Theater. - Broseph Stylin: - - rscadd: Added an Exploration department-specific voidsuit. It has the same stats - of an excavation voidsuit. - - rscadd: Added Exploration department-specific colored uniforms and PDAs. - - rscadd: Added lockers for the Pathfinder and Explorers. - - maptweak: An Exploration Equipment area which can only be accessed by the Exploration - department has been mapped on Deck 4 Aft. - Chinsky: - - rscadd: Pulse now affects blood circulation. Lower pulse effectively lowers it - and vice versa. - - rscadd: Extremely high pulse risks damaging the heart. Shouldn't be a lot, but - it's there. - - rscadd: As you lose blood oxygenation, your pulse tries to rise to compensate. - Thready (>250) pulse will cause a cardiac arrest. - - rscadd: Inaprovaline tries to bring pulse to normal levels, either up or down. - It also prevents thready pulse. - - rscadd: Heart stopping is slightly less 100% surefire, so if you manage to get - heart restarted it might beat for few ticks first. - - rscadd: You no longer need lungs/mouth to give CPR, but you will only do the heart - bit. Checks still apply for mouth-to-mouth. - - rscadd: Shock stage stars rising earlier now (30 damage vs 50) and can go bit - higher than usual. - - rscadd: Painkillers speed changed. Now they ramp up slower if ingested, but stay - longer. Opposite if injected. - - rscadd: Tramadol and oxcodone injectors added to medical vendomats (and tramadol - ones to hacked firstaid vendomats). - - rscadd: Adds some goodies to survival boxes - inapro injector, food and light. - - rscadd: Changed how tramadol/oxycodone work a bit. They now have period for setting - in and wearing off, gradually ramping power up/down. Those are short, ~20 seconds - to reach max - - rscadd: Mixing those with alcohol is now as bad idea as it's supposed to be - - increased liver damage and respiratory depression (harder time beathing) await - you - - rscadd: Inaprovaline helps against breathing effects of both mixing and ODing. - - rscadd: There's now some effects based on how much you consume over time, rather - than single dose. Effects stat at 15u with some slowdown and chance to start - slurring, ramp up from there, with major slowdown and slurring after OD-worthy - doses is metabolized. - - rscadd: Also ODing on those will give you even MORE painkilling effect! At a small - cost of suffocating most likely, and don't even try doing that AND booze. - - rscadd: Ships now have sensors. Overmap is dark by default, with known sectors - emitting some light. Dust/rocks/ion block visibility. You can control the sensor - with console(s) on the bridge, its power setting sets how far it will shine. - Higher settings use /huge/ mounts of power so don't leave it running on those. - Sensors also cannot run in non-vacuum. - - rscadd: Some improvements to helm console - now shows ETA to next grid, can set - max speed for autopilot. - - rscadd: Engines are now buildable - there's circuitboards for them in Tech storage. - - rscadd: Merchant prices are now slightly less wack, they use actual procs for - deciding them, instead of selling containeres full of stuff at price of container - only. - - rscadd: Mineral scanners now store survey data, currently useless aside from penile - comparsions. - - rscadd: New away mission - a drifting empty ship. Can be restored to fly around - on its own like Torch. - atlantiscze: - - tweak: Cyborgs can now unwrap packages by clicking them.. - dryerlint: - - tweak: Autolathes can now print cable coils. They are under the Devices and Components - category. - sabiram: - - bugfix: Cerulean, pyrite, bluespace and sepia slimes now drop the correct slime - core. - - rscadd: Added a jumpsuit with colour selection to the loadout, replacing the list - of presets previously available. - - rscadd: Added a new feminine jumpsuit with colour selection to the loadout. - - rscadd: Added a service uniform skirt for Expeditionary Corps, available in the - uniform vendor. - - rscadd: The clerical module robot now has access to the basic and denied rubber - stamps. Additionally, their hacked item is now the chameleon stamp. - - rscadd: The service department has been split. The Sol Pilot, Pathfinder and Explorer - are now in the Utility department, with their own department radio. The hotkey - for the utility department is 'y'. Bartender, Cook, Janitor and Crewman remain - in the service department. -2017-10-03: - Broseph Stylin: - - rscadd: Added some code by Techhead that allows for accessories to have and transfer - armor values to the item they are attached to. - - rscadd: Added a modular armor system based around a common plate carrier and accessories - that attach to it. - - maptweak: Replaced the armor vests and arm guards found inside the Emergency Armory - with equivalents using the new modular armor system. - Chinsky: - - rscadd: Shrapnel is less deadly now. Tiny items don't jostle around anymore. They - still prevent wounds they're embedded in from healing. - - rscdel: Conductive things embedded in body will heat up in EMP, dealing damage - depending on their size and EMP severity. - - rscadd: Brainwashing implants! Well, kinda. XO now has a box of 'imprinting' implants, - that can be set to a list of instructions, and will remind about those to whoever - is implanted with it. Latest word in grimdark on-job training. They're not binding, - just reminders. - - rscadd: Now the fun part is their abuse - when victim has mindbreaker in blood - and implanted with those, implant wires deep enough to fool host that he actually - believes these. Think borg laws. You can get the kit in uplink too, bundled - with a dose of mindbreaker - - rscadd: Can now emag practice carbines to get lethal lasers out of them. They'll - turn useless after 3-6 shots so bring a lot! Costs an emag charge. - - rscadd: Not having enough air in lungs will prevent you from talking efficiently. - If you don't have air at all, you might use remaining air in lungs for one message. - If you're just not getting enough, you'll be stuck whispering. Long messages - might come out garbled. - FTangSteve: - - rscadd: Added a push back disarm attack for GAS. - - rscadd: Added examine text and a message for GAS stance. - - rscadd: Adds in some of the GAS event things like the threat display and associated - sounds. - - rscadd: Cutlets can now be added to the organ printer as well as full slabs of - meat. - - rscadd: Adds a few cameras to hangar and to exploration with a network for each. - PsiOmegaDelta: - - tweak: Converts the machine, mob, and obj processes to subsystems. - SierraKomodo: - - tweak: Changed wording of maintenance drone laws from 'do not interfere' to 'do - not interact' to better fit the spirit of the law and staff policy. -2017-10-10: - Atlantiscze: - - rscadd: Completely overhauls crew records. Large text fields now support paper - tag formatting. Records are now accessed through a computer program. Everyone - can see generic fields (name, job, rank, ..), specialized fields become visible - depending on your access. - - rscdel: Removed old record computers of all kinds, removed PDA modules for crew - record viewing. - Banditoz: - - maptweak: Mapped in a camera to Bridge's solar control. - Broseph Stylin: - - tweak: All armor-containing lockers now have a 50% chance to contain a modular - armor equivalent to the older armor vests. - - tweak: All armor crates from Supply have been altered to contain modular armor - rather than the older vests. - - rscadd: Plate carriers and storage pouches for them have been added to the loadout, - priced at 1 and 2 points respectively. Only roles already issued armor can obtain - them. - Chinsky: - - rscadd: Added doorbell pager button. Press one and it will ping all PDAs of relevant - department people! There's one in Medical Cargo lobbies each. - - rscadd: EC ranks have been changed, you'll probably need to update your char settings. - Only 3 enlisted ranks now, slightly less officer ones. - - rscadd: 'SUPER IMPORTANT: EC cannot longer be SEA. Also since they don''t have - O2 equivalent, Pathfinder can be either O1 or O3.' - - rscadd: Can now rename alien creatures! All exoplanet animals start as 'alien - creature', and you can use a Name Alien Species verb to rename them when you - see 'em. Name can't be changed afterwards so don't go too silly. Random generated - one is suggested when you use that verb too. - - rscadd: All computers now come with a word processor, NanoWord. Lets you edit - TXT files, with paper preview and markup help - CrimsonShrike: - - rscadd: Ports openspaces. Now open turfs will show whatever is down below. - Crushtoe: - - rscadd: Added the antibody analyser, a new way for virology to contribute to the - crew. Finding new antibodies from curing diseases grants 45 cargo points per - when scanned, allowing up to 1170 points on the furthest end assuming RNGesus - is very merciful. - - maptweak: Mapped in an antibody analyser into the virology lab. - - rscdel: Removes the Chemist as its own job. - - rscadd: Chemist is now an alt-title of Medical Contractor. - Devildabeast: - - rscadd: Gives the SEA Emergency Armory access. - - rscadd: Master Chief Petty Officers and Master Gunnery Sergeants can now be SEA. - FTangSteve: - - tweak: AI drones can no longer use non-drone langauge. - - tweak: Drones can no longer push or pull items larger than medium. - - bugfix: Mechs can now fall and go down stairs. - - rscadd: If a mech falls on you, it does a heck of a lot of damage. - - tweak: Makes hats optional. - - bugfix: Fixes space vine events. - - rscadd: Makes vines spread across z levels. - - tweak: Balances spreading vines. - Quardbreak: - - rscadd: Now you can look up and see out what's going on there. - dryerlint: - - rscadd: Added two Marshalling Wands to the Deck Technician's locker. They light - up and help you visually signal stuff. - mkalash: - - rscadd: Added a net gun. It and a bandolier full of net shells is located in the - Charon storage area. - - rscadd: Added stasis cages for transport of alien fauna without having them suffocate, - located in expedition storage. - - maptweak: Refitted xenobiology to support changing the atmosphere of animal pens. - sabiram: - - rscadd: Keys can now be held in wallets. - - maptweak: The derilect laboratory in the research wing has been refitted into - a break room with public office space. - - bugfix: Personal AI system radios now work once again. - - maptweak: The executive officer's office has been redesigned. - - rscadd: Head of staff offices have been fitted with modular computer consoles. - - rscdel: As the records have been integrated into modular computers, the laptop - on the bridge previously adjacent to the security and medical records consoles - has been removed. - - rscadd: Heads of staff, the Senior Enlisted Advisor and the Bridge Officers have - been leased modular tablets. The BO's are available in their lockers. - - rscadd: The commanding officer and executive officer now have special pens. -2017-10-14: - Broseph Stylin: - - rscadd: Added Marine Corps service uniform skirts. - - rscadd: Added desert boots. Available in the same places as and statistically - equal to jungle boots. - - rscadd: Added Fleet fatigues as an alternate utility uniform. - - tweak: Fleet security and Field Medics now spawn with fatigues instead of coveralls. - - rscadd: Added earrings to the loadout, found in the Earwear section. They're unrestricted, - but can only be worn by humans (subspecies included) - - rscadd: Added a Master at Arms brassard to the loadout. - - tweak: Changed the Military Police armband to a brassard. - Chinsky: - - rscadd: Electrical storms now can be blocked by shields. They have special mode - for it. Keep in mind that they will be taking damage while event is running. - - rscadd: Overmap events (meteor, dust, electrical storm) do not happen randomly - now. - - rscadd: Number of overmap events increased. Asteroid fields now spread over wider - space but have gaps in them. - - rscadd: Hitting edge of overmap will not warp you around to the opposing edge. - Space is around after all. - - rscadd: Away missions no longer glow on overmap, you have to find them now. Planets - are still visible due to sheer size of signature. - - rscadd: Changes to Torch's speed. Now default delay between moving is higher - - 20 seconds vs 12, but speed affects it much more, e.g. at 5 speed you will move - pretty much continuously. - - rscadd: Shuttles have different ranges now. Charon (1) can go to away missions - in adjacent grids, Aquila (2) one tile further. Travel time is multiplied by - the distance. - Cirra: - - rscadd: 'Added a new, more expensive type of 14.5mm ammo, for the anti-material - rifle: APDS. Less damage, but far greater armour penetration.' - - rscadd: Projectiles can now cause internal damage, including organ damage and - severing arteries. Bullets cause more than energy, with x-ray lasers being inbetween - the two. - - tweak: Renamed 5.56mm ammo to 7.62mm and vice versa, to be more consistent with - their damage values. - - tweak: Matebas now use .50 ammo, while revolvers have had their damage reduced - slightly. - - tweak: .45 rounds now do 21.5 damage instead of 20, while 10mm bullets now do - 23.5 instead of 25. - Orelbon: - - rscadd: Consoles now have ambient noise when turned on. - comma: - - tweak: Department of Swag has determined that Torch is 60% clothes by volume. - This was rectified. Now uniform vendors will only dispense 1 (one) item of each - type per person. Don't lose your pants kids. - sabiram: - - rscadd: The Pathfinder now has a special machete with premium fittings, and machete - sheaths have been added to the Pathfinder and Explorer's lockers. - - rscadd: Job bans can now be applied to jobs from the command support, exploration, - service, and supply departments. -2017-10-21: - Broseph Stylin: - - tweak: Holsters and webbing/bandoliers/drop pouches can now be worn together. - - rscadd: Added customization options for modular armor to the loadout. - - rscadd: Added leg guards as an armor module. - - tweak: replaced all static armor spawns with their modular equivalents. - Chinsky: - - rscadd: Planets now have some alien landmarks to find and rub your face on. - - rscadd: Added winter coats for all branches. Can be found in uniform vendors next - to ushankas. - - tweak: Made vent hum bit less of earbleed, made ambience bit lower and rare in - general, try reenabling it. - Datraen: - - rscadd: Allows for labels to be applied to condiment containers. - ParadoxSpace: - - rscadd: Adds eyepatch variants of the Sec, Med, and Meson HUDs, as well as a non-HUD - variant for those missing exactly one eye. - - tweak: Flipping eyepatches (and HUDpatches) is now a verb. - - rscdel: Kills the standard cloth eyepatch for military roles. HUDpatch still works - for them. - TheGreyWolf: - - rscadd: Added toeless jackboots to the EC and civie branch uniform vendor for - the xenos. - TheWelp: - - rscadd: Added a deity hud element that shows your current phenomenas. - - tweak: Reduced D-Nar's blood costs to half. - - tweak: Made it so that a deity's power can never go below 0. - ZeroBits: - - rscadd: 'Added three new strength brackets for the R-UST: 9x9, 11x11, and 13x13. - For the engineers who have 51 extra fuel injectors and way too much free time.' - - tweak: Changed the sprite of the R-UST to look cooler. - dryerlint: - - rscadd: Added queuing functionality to modular computer software downloader. - sabiram: - - rscadd: Added herbal liquor. - - rscadd: Added a new cocktail, the Ibn Batutta, consisting of 2 parts herbal liquor - and 1 part orange juice, with mint as the catalyst. - - rscadd: Added a new cocktail, the Magellan, consisting of 1 part wine and 1 part - premium whiskey, with sugar as the catalyst. - - rscadd: Added a new cocktail, the Armstrong, consisting of 2 parts beer, 1 part - vodka, and 1 part lime juice. - - rscadd: Added a new cocktail, the Zheng He, consisting of 2 parts black tea and - 1 part vermouth. -2017-11-01: - Chinsky: - - tweak: Changed way hallucinations are. Now some things will give you strong ones, - some milder, it's not always same. - - tweak: Most of old hallucinations effects are replaced. New ones are supposed - to be more mindfucky. - - tweak: Synaptizine, Paroxetone and Citalopram help lowering frequency of hallucinations, - and to clear them out faster once whatever causes them is dealt with. - - tweak: Changed lobby music selection, lowered lobby music sound overall. Should - be less ear-gore and fresher now. - Cirra: - - bugfix: Stasis Clamps actually work now. - CountAlex: - - rscadd: Adding new map for overmap list - abandoned supply base. - - rscadd: Adding new map for overmap list - planetside location - frozen with breathable - atmosphere - with pod crashlanding and survior's story. - CrimsonShrike: - - bugfix: Fixed stick messages not showing. - - rscadd: Sticks can now be sharpened using edged sharp tools. - - rscadd: Added morgue access to Forensic Technicians. - - rscadd: Added GAS-poking stick and recipe per request of the more suicidal crew - members. - Devildabeast: - - tweak: Deck Officers can now be E-8 and O-2. - FTangSteve: - - tweak: Robotic organ surgery now needs the hatch screwed back down after it's - closed with a crowbar. - - rscadd: Adds the ability for IPCs to choose whether they are shackled and a lawset - in character setup if they would like. - Heptagon49: - - rscadd: A hologram's color will now vary depending on what kind of holopad is - projecting it. - - imageadd: Added a unique sprite for long-range holopads. - - spellcheck: You now step onto a holopad instead of stepping unto one. - - rscadd: You can now tell if a person's face is disfigured just by looking at them. - TheGreyWolf: - - tweak: Restricts a few more tattoos and prevents xenos from picking normal tattoos. - - rscadd: Added black, blue and red pens, hand labeler, clipboards and destination - taggers to the autolathe. - ZeroBits: - - tweak: moved away sites to away subfolders. - - tweak: You can now disassemble bare plating by first damaging it with a welder - (or bomb) then prying it up with a crowbar. - sabiram: - - rscadd: Added two new alert levels to the Torch map. - - rscadd: Code Violet for major medical emergencies. - - rscadd: Code Orange for major engineering emergencies. - - rscadd: Code Red now has a unique sound on activation. - - tweak: Code Blue alert should now only be used for major security emergencies - and not as a general readiness state. - - tweak: Code Red alert should now be used as a general high alert when the situation - is more severe than or would warrant two of the standard department alert statuses. - - bugfix: Chemical grenades (cleaner, metal foam, etc) now work properly again. - - tweak: Security module robots' stun batons now consume much less of their cell - per hit. - - rscadd: Anyone with bridge access can now lock the holodeck into its current state - in the console interface. - - rscadd: The Pathfinder now has a box of Exploration department encryption keys - to distribute if they choose. - - tweak: As part of the SolGov staff well-being initiative, cigarette supply to - their installations have been restricted. Vendor prices have increased to match - the limited supply. - - rscadd: Added more e-cigarette flavour cartridge types to vendors, including ones - to fill with your own flavours, and added empty e-cigarette cartridges to autolathes. - - maptweak: Wall lockers with cardboard, wrapping paper and destination taggers - have been added to the kitchen, hydroponics and the research and development - lab. - sicktrigger: - - rscadd: Ship sensors will now heat up and eventually take damage at higher settings - (they can be repaired with a welder). Their power usage has also been significantly - reduced. - tlc2013: - - rscadd: Added the Corporate and Service lawsets to IPC shackles. - - rscadd: IPCs now have four new monitors. Nothing special... except for a space - screensaver. -2017-11-04: - CountAlex: - - rscadd: Adding new map for overmap list - smugglers den located inside asteroid. - Tlc2013: - - rscadd: IPCs now have two bonus language slots. - sabiram: - - rscadd: As follow-up to a recent study concerning the trend of people more readily - following leaders with shiny revolvers, the Commanding Officer and the Executive - Officer have each been supplied a Webley style .44 revolver as their personal - side arm. - - rscadd: Added the .44 revolver to the traitor uplink. - - rscadd: Added .44 ammunition to the autolathe. Rubber is always available, and - lethal is available after hacking. - - rscadd: You can now alt-click revolvers to spin the cylinder. -2017-11-10: - Chinsky: - - rscadd: Can now put clothes on skeletor models. - - rscadd: Can rename skeletor models with pen. - Heptagon49: - - tweak: Lowered the chances of a Doona popping out of a vending machine from 1% - to 0.1%. - - bugfix: Made the outer windoor of the sci checkpoint all-access. - - tweak: Added an outer windoor to the RnD desk. - - rscadd: Chem dispenser now has a visual indicator when it has a beaker loaded. - - bugfix: Pill bottles loaded into the chemmaster now get filled. - - tweak: Tweaked uniform vendor so that it'll no longer eat your clothes. - Hubblenaut: - - bugfix: Fixes brig cell timers not connecting to windoors/mounted flashes. - Orelbon: - - maptweak: Science entrance has been edited & science has been made more open. - - maptweak: Medical has been remapped to be more efficient and increase workflow. - Rebruiza: - - rscadd: Individuals with the "Floorlength Braid" hairstyle now occasionally trip - on their hair. - Tlc2013: - - rscadd: Added the legendary CRT Test screen to IPC monitors. - mkalash: - - rscadd: All gloves that are available in the load out now have pre-modified versions - in the xeno load out. - - rscdel: Removed parapen, parasting, and the stun talisman. - sabiram: - - tweak: Maintenance drones now have spray bottles instead of soap. The cleaner - refills in chargers. - - rscadd: Hyposprays have been upgraded and now use removable vials instead of a - internal storage. - - tweak: Voice changers available in the upload now have chameleon mask functionality. - - rscadd: Holsters have been added to the gun cabinets. - - rscdel: Holsters have been removed from the bridge officer and Sol pilot's lockers. - - tweak: Gun cabinets now have a chance to spawn a small e-gun instead of the full - sized variant. -2017-11-11: - chaoko99: - - bugfix: Puts some jackboots in all the security lockers. Your feet will no longer - be cold. - mkalash: - - tweak: Welding tool sizes have been rebalanced. Namely, the industrial welding - tool is now too large for a tool belt. - - rscadd: To balance this out, engineers can now easily carry spare welding fuel - cartridges found in the welding locker and hot swap them out, actually increasing - the welding capacity of the typical engineer. - - bugfix: Experimental fuel tanks now automatically refill, as intended. - - rscadd: The experimental welding tool can now be produced in rnd. -2017-11-19: - Casper3667: - - tweak: Passengers (the job) can now use corporate uniforms. - - rscadd: NT corp uniform is now available in the loadout. - Chinsky: - - tweak: Ordering gun crates now requiers elevated alert level, Blue for small ones, - Red for big guns. - CrimsonShrike: - - rscadd: Now catwalks can be built above plating. - - tweak: Reinforced floor now requires 1 steel sheet instead of 2 rods. - - rscadd: Added catwalks. Can be built by using rods on existing lattice. - - bugfix: Fixed lattice icons on openspace turfs. - Hubblenaut: - - rscadd: The telecomms broadcaster, relays, station bounced radios and intercomms - now broadcast to all connected z levels. - - rscadd: Adds a relay circuit board to the telecomms storage. - - rscdel: Removes relay rooms and replaces them with maintenance. - Orelbon: - - rscadd: Ghosts can now click on non-modular consoles and see their UI. - Rebruiza: - - tweak: Cable coils no longer do damage when thrown. - - tweak: Cable coils are now "ITEM_SIZE_NORMAL", instead of "ITEM_SIZE_SMALL". This - means that they no longer fit in pockets, but rather has to be in a larger container - or off the side of a toolbelt, as intended. - SamSamsonthe3rd: - - bugfix: Can now build ED209 with plate armor. - Serveris: - - rscadd: Added the WT45 pistol. - - tweak: Line Officers now spawn with said in their lockers, rather than energy - guns. - Zero-Bits: - - tweak: '"Library Improvements. Removed Adult Category, made USBN usable."' - atlantiscze: - - rscdel: Cyborgs can no longer be self-destructed through the remote console. - - rscadd: Cyborg's precise position is now displayed on the console instead. - - rscadd: The console now offers you an option to send direct message to a cyborg. - This message is independent on telecommunications and range. - chinsky: - - tweak: Humanoids able to vent-crawl can now bring select articles of clothing - and carry items which are not too big. - comma: - - tweak: Propellant in fuel bay changed, instead of plasma it's CO2 now. Thrust - should be more or less same, but less eternal fires and more space for engies - to increase said thrust. - dryerlint: - - rscadd: Added fuel port object. When mapped into shuttles (like Charon or GUP) - it gives them a finite fuel reserve, which must be refilled with phoron. - mkalash: - - tweak: You can now place crowbars in security belts. - sabiram: - - rscadd: Added the pry bar, a smaller crowbar, to the autolathe. - - tweak: The damage values of tools have been adjusted. - sabirm: - - rscadd: Added a supply crate containing ammunition for the executive heads' revolvers. - - tweak: The rubber ammo crate now contains two rubber .45, two flash .45, and two - rubber .44 magnum magazines on the Torch map. - - tweak: As part of the Great Gun Experiment, all ammunition is now hidden in the - autolathe. - sick trigger: - - rscadd: Ghosts can now Check-Radiation. - sick-trigger: - - rscadd: Ghosts will now be informed of the contests of examined closets/lockers. -2017-11-20: - sabiram: - - rscadd: Added a disguised syringe gun to the loadout. Comes complete with four - cartridges and four syringes. Chemicals not included. -2017-11-22: - Cirra: - - tweak: Radiation is now relevant again, due to material radiation resistance being - lowered. - SierraKomodo: - - rscdel: Removed xenophage and cortical borer from the list of add antagonist vote - options until these antag types can be fixes. - atlantiscze: - - tweak: Communication outages are overall less common. - - tweak: Communication outage has only 75% chance to affect each particular machine, - therefore with some luck, enough machines may remain functional to get at least - some working frequencies. The hub, broadcaster and receiver have 10% chance - to be affected, as they are critical for the whole telecommunications system. - - tweak: Increased chance of ion anomaly being announced. There is still a small - probability of the anomaly occuring silently. - - rscadd: It is now possible to reset EMP/ion/random event affected telecommunications - machinery with a multitool through the UI. The UI also shows a timer until automated - reset. - dryerlint: - - rscadd: Added fuel ports to Charon and GUP. They will consume fuel and eventually - run out - - rscadd: Added small refueling room to Hangar, for anyone with Supply Warehouse - access -2017-11-23: - Casper3667: - - tweak: Fixes up balaclava and half-gas mask sprites for taj. - - rscadd: Adds new shoes for taj called caligae. - CountAlex: - - rscadd: 'Away mission map: Damaged and abandoned Planetary Shield Orbital Station' - Dukica: - - rscadd: Added the braided beard facial hair style. - Orelbon: - - bugfix: Ghosts cant griff with jetpacks anymore. -2017-11-24: - CrimsonShrike: - - rscadd: Added Hydrogen canisters to supply request list. - Dukica: - - rscadd: Added new hairstyles. - FTangSteve: - - tweak: Add SCG Police tag to CoS carrier - - tweak: upgrade CoS armour plate - Kelenius: - - tweak: Camera networks have been sorted in an other that makes more sense. - mkalash: - - tweak: The welding pack is now too large for backpacks. - - rscadd: You can now attach welding tools to welding packs via drag drop. - - rscadd: Welders now show an overlay of what fuel tank is attached, if any. - - tweak: Fuel cartridges are now welding fuel tanks. - orelbon: - - rscadd: New sprites for the 2x1 white airlock. -2017-11-25: - Kelenius: - - tweak: Teleporters don't need to be test-fired anymore. - sabiram: - - tweak: The XO now has unrestricted access to the Aquila. -2017-11-26: - CrimsonShrike: - - bugfix: '"Fixes openspaces above shuttles retaining image of the floor."' - chinsky: - - tweak: Melee attacks will now always hit targets with the Help intent selected. - comma: - - rscadd: Added EC directives plaques on Bridge/Charon/Exped Prep/walls near flags - in cryo etc. Their tl;dr is go explore instead of twiddling thumbs. - sabiram: - - rscadd: Added purple, orange, green and red carpets. - - rscadd: Added blue, blue and silver, purple, orange, green and red carpet tiles - to the supply computer. - - tweak: Changed the brown and blue carpet icons to match the new ones. -2017-11-28: - Casper3667: - - rscadd: Adds new taj security voidsuit sprites from Serveris. - FTangSteve: - - rscadd: makes item slowdown impacted by species strength - - tweak: changeling transform now takes time with a progress bar based on mob_size - difference - sabiram: - - rscadd: Vials can now be placed in bandoliers. -2017-11-29: - Chinsky: - - tweak: Meteor mode now progresses a bit faster on difficulty scale, and can produce - bigger waves in the end. - CountAlex: - - rscadd: Adding new map for overmap list - raided casino ship. - Orelbon: - - rscadd: Self Destruct Sequence Has been revamped. - - rscadd: Keycard device can now be used to get the nuke code. - - tweak: Keycard device now waits 3 seconds for someone else to swipe. - - rscadd: The vault has been replaced by the self destruct room on deck 1. - - tweak: The engineering supply room was moved into the side of the hallway on deck - 1. - - tweak: The vacant office was moved to behind the self destruct room. - Spookerton: - - bugfix: Fixes cyborgs being unable to repair doors. - Techhead0: - - tweak: Removes age gate from Janitor - - tweak: Changes crewman alt-tiles to "Trainee" instead of "Junior" - Zero-Bits: - - tweak: Ports the Library to the Modular Computer System - sabiram: - - rscadd: You can now drink from buckets and beakers by clicking with the HELP intent. - Clicking with HARM intent splashes/spills. - - rscadd: 'Added new scrub and surgical cap colours to random spawns and loadout: - white, lilac, teal, and heliodor.' - - rscadd: Added colour selection to scrubs and surgical caps in the loadout. - sick trigger: - - rscadd: Finalizing a matchmaking connection now informs the other player. -2017-12-01: - Casper3667: - - rscadd: Deck officer, pathfinder and explorers now got binoculars in their lockers. - CountAlex: - - tweak: Changed Biogenerator UI to nano-ui instead of basic HTML. - Dukica: - - rscadd: Added 3 new masculine hairstyles (Slick, Average Joe, Messy) - sabiram: - - maptweak: Added an AI holopad to security processing. - - maptweak: The XO once again has access to an AI holopad in their office. - - rscadd: Suit jackets, suit pants, baggy suit pants, and athletic shorts are now - colour-selectable in the loadout. - - maptweak: 'Added some cameras to the infirmary: one in the operating theatre, - and two in the main treatment centre.' -2017-12-02: - FTangSteve: - - tweak: new sprites for nabbers - - rscadd: can shift equip overlays on per species per slot per direction basis - sabiram: - - rscadd: Added a black pocketbook to the backpack selection. - - rscadd: Added a few dresses. The short dress is available in the loadout with - colour selection. Dresses in two styles and four colours are now available in - the uniform vendor for formal occasions for civilians. -2017-12-03: - BlueNexus: - - rscadd: Added a new creature, which can be found on certain away missions -2017-12-04: - Orelbon: - - tweak: Remapped the Lounge - Zero-Bits: - - bugfix: '"Fixed library program UI and bookbinder linking."' - sabiram: - - tweak: Sunglasses now apply a screen overlay when worn. - - tweak: A makeshift duct tape blindfold can now protect your eyes from welders, - if you don't mind welding blind. - - balance: All HUDs and other glasses types with electrical components are now vulnerable - to EMP, and will disorient you and turn the HUD off when hit. Neither of the - effects are permanent, and you can turn your kit back on right away. - - balance: Any glasses type with night vision no longer has flash/welder protection, - or is otherwise vulnerable to flashes or welders. - sabiram & chinsky: - - rscadd: The tobacco plant can now be grown, with a couple mutates. - - bugfix: Electronic cigarettes should no longer be more harmful than regular cigarettes. -2017-12-06: - PsiOmegaDelta: - - tweak: Character Setup - Some backpacks now have additional setup options. - sabiram: - - rscadd: Added a black pocketbook to the backpack selection. -2017-12-07: - BlueNexus: - - tweak: Slightly buffed "Mehren" - Casper3667: - - tweak: Taj can no longer use zeng-hu or veymed prosthetics or body. - CountAlex: - - rscadd: Added Oxygen regenerator device for Atmospherics. Device takes from an - input pipe CO2 and slowly feeds O2 to an output pipe and drops chunks of coal - on the top tray of the machine. - FTangSteve: - - rscadd: Add new emotes for nabbers. - atlantiscze: - - tweak: AI can now hack multiple APCs at once, assuming it has enough CPU power - to begin the hack. AI can use abilities while hacking an APC (the hacking task - has been completely isolated) - - tweak: AI can now use its abilities during system override. On torch the override - takes quite a long time due to larger amount of APCs, and during this period - the AI is otherwise very vulnerable. - - tweak: Failed advanced encryption hack now offers you to retry the hack without - having to copy-paste/write the message again. This should make the ability a - bit more comfortable to use. - dryerlint: - - rscadd: Added nuclear football (secure briefcase with disk, pinpointer, instructions, - and laptop) - - maptweak: Removed nuke disk and pinpointer from CO's office, replaced with nuclear - briefcase. Added pinpointer to Bridge Storage. - sabiram: - - balance: Flashes have been reworked when attacking humanoid targets. - - balance: Instead of stunning for 20 seconds, they will stun for up to 7 seconds, - and blur vision and confuse for up to 18 seconds. - - balance: Flash stun duration for silicons has been reduced from 10-20 seconds - to 8-12 seconds. - - tweak: The area-of-effect attack for flashes now blurs the eyes of those affected, - in addition to flashing them. - - rscadd: Flashes can now have varying effects by type. - - tweak: The flash used in robot construction is now weaker than the base flash, - but breaks just as often, instead of every time its used. - - tweak: The spray projectile fired from peppersprays now moves much faster and - their capacity has been increased from 4 shots to 6. - - tweak: Pepper spray now incapacitates for an additional 2 seconds. -2017-12-08: - Banditoz: - - tweak: Overmap is now a lot more hostile. - dryerlint: - - rscadd: Added the SolGov flag, a variant of the existing flags, but with SolGov - logo on it. It is found in Exploration Storage. -2017-12-09: - Casper3667: - - tweak: The taj species blurb in char setup has been updated. - sabiram: - - rscadd: A more gentle carp event has been added to the overmap to supplement the - more dangerous version. The event icons with three carp are the more dangerous - schools. - - rscadd: Space carp can now be encountered on the overmap. - - rscadd: Ion clouds have condensed in the vicinity of the ship and can be collided - with on the overmap. -2017-12-10: - sabiram: - - rscadd: Added a few different colours to the satchel and pocketbook selection - in character setup. -2017-12-11: - Orelbon: - - maptweak: Xenobotany Has been remapped for space and usability. - - maptweak: Xenoarchiology lab has been moved to the Petrov. - - maptweak: Misc Lab is now a circuit lab and a small chemical testing chamber. - - maptweak: A chemistry station & toxins have been added to the Petrov. - Techhead0: - - rscdel: Science wing and channel has been reverted back to purple. - dryerlint: - - tweak: Flags can now be placed on any terrain/turf, except for space -2017-12-12: - BlueNexus: - - tweak: Nerfed the .50 pistol fire rate and recoil. - Hubblenaut: - - rscadd: Atmospheric pumps can be toggled by alt clicking. - - rscadd: Carafes and implanters are now available in the autolathe. - - bugfix: Implants are now trackable across connected z-levels. - Kelenius: - - tweak: Merchant now has two slots. - mkalash: - - tweak: Spacemen no longer pin their IDs to their skin when they roll down their - jumpsuits. - sabiram: - - tweak: Mounted flash effect changed from 20 seconds of knock down to 6 seconds - of knock down followed by a further 10 seconds of stun - a total of 16 seconds - of useful disable - followed by a further 8 seconds of confusion. - - tweak: Flash and flare cartridges now inflict more agony damage. - - rscadd: Flash and flare cartridges now blur the vision and disorient those within - their flash ranges - tiles adjacent to the explosion for flashes, and two tiles - adjacent for flares. -2017-12-13: - Techhead0: - - tweak: Vey-Med prosthetics are now restricted to humans only. Zheng-Hu is now - restricted to humans and IPCs. -2017-12-14: - Casper3667: - - rscadd: Vox gas masks are now available for vox in the loadout. - sabiram: - - rscadd: Control+Alt clicking a PDA will now toggle the flashlight. - - rscadd: Control+Alt clicking closets and lockers is now a shortcut to the toggle - open verb. - - tweak: AI door electrification shortcut moved from Alt-click to Control-Alt-click - to remove conflict with Alt-click inspecting the turf. -2017-12-15: - IsdatAfamas: - - rscadd: '"Added a small ship as an overmap location."' -2017-12-16: - sabiram: - - rscadd: Added new varieties of smokable to the smoking vendor. -2017-12-17: - BlueNexus: - - tweak: The WT45 now fires slightly slower, and is more accurate. - - tweak: The Mk58 now fires slightly faster, and is less accurate. - - tweak: Revolvers fire slightly slower, in general. - - tweak: Adjusted fluff for several firearms - - rscadd: The CO's revolver has been replaced with an autorevolver. - ParadoxSpace: - - bugfix: Diona now properly regenerate organs and limbs. -2017-12-19: - Casper3667: - - rscadd: Surgeon borgs now have defibrillator. - - rscadd: Crisis borgs now have medical tape. - - rscadd: Engie borgs got atmos atmos tape. - - rscadd: Security borgs now have a megaphone module. - TheWelp: - - rscadd: Reworks early game deity. No longer have to dole out spells and you regenerate - power 100% faster. -2017-12-27: - BlueNexus: - - spellcheck: Renamed the 9mm machine pistol to the 9mm submachine gun - - bugfix: Fixed the WT45's empty icon not showing - Broseph Stylin: - - rscadd: Added colored helmet covers matching the plate carriers. Available in - the loadout. - Casper3667: - - rscadd: Taj are now forced to have Siik'maas. - Chinsky: - - rscadd: Added some sekrit documents to CO/SCGR offices in sealed envelopes. Don't - really affect anything, just fluff. Moved RD's secret memo to an envelop in - his office too, put a copy on Liason's desk. - CountAlex: - - tweak: Turns casino liner into actual overmap ship with a small shuttle. - - rscadd: Adding new map for overmap list - hidden deep inside asteroid slavers - base. - Kelenius: - - rscadd: Hydroponics now has bees and space for bees. And some chemical machinery. - Orelbon: - - tweak: Laser carbine has 10 more damage and +2 accuracy. - - tweak: Taser carbine now has 12 shots, +1 accuracy and looses its 10 armor penetration. - - tweak: Stun rifle now has 10 shots, +1 accuracy,+10 armor penetration,+5 burn - damage and looses 10 agony. - - tweak: Stun revolver now has 6 shots and 50 agony. - - tweak: Ion weapons shouldn't be horrible anymore, they now activate their emp - no matter what they hit. - - tweak: The rifle now has a max range of 2, and the pistol a max range of 1. - - tweak: Ion pistol max shots lowered to 6. - ParadoxSpace: - - rscadd: Added a regeneration mechanic to Unathi. This works on nutrition. - - rscadd: Unathi now get hungrier faster, and enough hunger starts to give you toxin - damage. - sabiram: - - bugfix: Mounted flashers will no longer permanently scramble ghosts' movement. - - rscadd: Added missing eye blurring effect to mounted flashers. - - tweak: Maintenance and construction drones now move faster. - - bugfix: Lockers can once again be welded shut. - - rscadd: Clicking a drinking glass with a spoon will now call the room to attention. - Just be careful. - tlc2013: - - rscadd: Ported over three IPC screens from Polaris. I think we're done there. -2018-01-03: - ParadoxSpace: - - experiment: Removes the AI from the job list for two weeks. - TheWelp: - - rscadd: Adds band-aid fix to deity spam via cooldowns. Will add graphical indicator - to show what the cooldown is later. - - rscadd: Modifies phenomena near structure logic to include all deity structures, - not just altars. -2018-01-04: - CountAlex: - - rscadd: Adds away mission map - Mobius Rift. -2018-01-05: - CountAlex: - - rscadd: '"Adds engineering program for monitoring shield generators."' - PsiOmegaDelta: - - tweak: Can now adjust (almost) all prefix keys. These are used for language selection, - emoting, etc. See Character Setup > Global > Prefix Keys -2018-01-06: - Casper3667: - - tweak: The CSA now has the crime scene kit in their locker. - - bugfix: Forensic is yet again capable of using the dna search function in records - and can also edit pictures in records. - Devildabeast: - - rscadd: Adds one Crime Scene Analyst slot to Security. They are a forensic contractor - job that are NOT responsible for law enforcement. -2018-01-07: - comma: - - tweak: Adds gauze roll to emergency survival boxes - sabiram: - - tweak: As a cost-cutting measure, all Sol uniforms are now cut from the same cloth. - Armour values have been genericised. - - rscdel: Sol uniform hats no longer provide any armour. - - maptweak: The hydroponics base away site has been updated. - - experiment: As part of AI removal testing, an additional robot slot has been added. - - rscadd: Command hardsuit control modules have been added to the EVA storage on - the bridge deck. - - tweak: Changed CE hardsuit values to sync somewhat with new these modules. - - rscadd: Added a ring bell to the holodeck boxing ring. -2018-01-08: - Casper3667: - - rscadd: Taj now have several new capes! - - rscadd: Cameras can now be found in the loadout. - Chinsky: - - rscadd: Shuttles now need proper docking codes set in their console, or the docking - won't initiate. - - rscadd: Codes can be found in CO's orders, or by using multitool on docking controllers. - You can also hit the button on docking controller from inside to initiate docking. - - rscadd: There is also a program that shows status of all docking ports and their - codes, can be used to remotely let people dock if they're waiting outside. - Techhead: - - rscadd: You now receive pain-flashes for all pain sources. - - bugfix: Possibly fixes an infinite paincrit bug. -2018-01-09: - Devildabeast: - - rscdel: Removes SolGov Pilot. - - tweak: Gives Bridge Officers access to pilot the Aquila and Guppy and accompanying - access. - - tweak: Bridge Officers now have the Pilot's headset. - - rscdel: Removes SolGov Pilot's locker from the Pilot's Lounge. - - rscadd: The Pilot's Qualification Pin is now an item in the loadout for Bridge - Officers who want to flash their fancy training. - Zero-Bits: - - tweak: Cult walls are just normal creepy now instead of super edgy. -2018-01-10: - CountAlex: - - rscadd: Adds away mission map - SEV Icarus irradiated crashsite. - Heptagon49: - - bugfix: Adds a hydrogen tank sprite, among others, for the transfer valve. - Kelenius: - - rscadd: Syringes can now inject people in body bags and cryo bags. - LorenLuke: - - rscadd: Added/changed alt-titles for engineering contractor. - ZeroBits: - - imageadd: '"Hydrogen now has its own canister and tank sprites"' - - spellcheck: '"TX on monitoring computers is now PH, as it should be"' - - tweak: '"Omni Filter and Omni Mixer throughput increased to match pressure regulator"' - - tweak: '"Flamethrower now uses Hydrogen"' - - tweak: '"Phoron canister made slightly more expensive via supply"' - - tweak: '"Hydrogen canister made slightly more expensive via supply"' - - tweak: '"Filters and Mixers can now handle Hydrogen"' - - tweak: '"Supermatter monitoring program and gas sensors can now detect Hydrogen"' - - tweak: '"Overmap shuttles now use Hydrogen by default"' - - rscadd: '"Added purchasable crates of portable Phoron and Hydrogen tanks. Cheaper - than a full canister, but with far less volume."' - - maptweak: '"The SM reactor is now set up for CO2 by default"' - - maptweak: '"The SM reactor now has a Phoron gatherer so you no longer shoot that - valuable Phoron out into space."' - - maptweak: '"Nitrogen is no longer available directly in the SM room (it never - meets energy or safety needs anyway)"' - - maptweak: '"The fuel Bay is now filled with Hydrogen (rocket fuel) instead of - Phoron (the supposed most valuable substance in the universe)"' - - maptweak: '"Most of the Phoron tanks and canisters on the map have been replaced - with Hydrogen. R&D and Engineering each retain one canister."' - - maptweak: '"The Phoron resevoir in atmos has been replaced with a hydrogen resevoir."' - - maptweak: '"The incinerator now uses Hydrogen instead of Phoron. You''re just - burning stuff, you don''t need to do it with gaseous money."' - - maptweak: The Supermatter core is no longer filled with N2 by default. - comma: - - balance: Attacks against legs and heads are now more likely to miss. - tlc2013: - - rscadd: Added sandals to the loadout selection. Because those weren't there before, - apparently. -2018-01-11: - chaoko99: - - bugfix: Synths can no longer fill mechfabs with their matter synths. - rainbowEscapist: - - rscadd: Adds the alt title 'Trainer' to the Passenger loadout. -2018-01-12: - Chinsky: - - tweak: Cryobags, cryo and general stasis changes. Main point is that stasis is - no longer binary on/off, it doesn't stop life ticking, just slows it down (usually - a lot). It chemical processing is slowed down too, so sometimes bigger stasis - is not better. - - tweak: Cryo. Being very cold now provides stasis on its own - and cryo is easiest - way of doing it. At 80K, it applies 20x stasis factor (life ticks once in 40 - seconds instead once in 2). - - tweak: Cryo chemless healing was slowed down a bit. It also no longer magically - multiplies chems in beakers by 10x. Cryox/clonex adjusted to work at same efficiency - with this change. - - tweak: Cold damage in cryo is now prevented by clonex or cryox, not cryopod itself. - On one hand you now NEED to have it in beaker if you care about patient, on - another - you don't need cryopod if you have those and sufficiently cold place. - - tweak: Cryobags. Cryobags no longer last forever. Their power drops every 5 minutes - - examine to see current. It starts at 20x and loses 25% every time, so 20x - to 15x to 11x in 10 minutes and so on. Will drop into nothingness at ~40 minutes - mark. - - rscadd: Stasis will make you drowsy, and at higher stasis settings you will fall - asleep eventually (15x or higher). - - rscadd: 'Sleepers can into stasis too! They have three settings: none, 3x and - 5x.' - FTangSteve: - - tweak: Changeling now can only get nabber DNA with direct absorption. - Hubblenaut: - - tweak: RCON program no longer shows SMES units and breakers offsite the Torch. - - tweak: Alarm monitoring program no longer shows alerts offsite the Torch. - - bugfix: Fixes deck four fore dock. - Sbotkin: - - tweak: RCA, Shield Generator and Emitter crates now require engine access. - TheTrollDoctor: - - rscadd: Adds the MedHUD Visor item to loadout. It's a ~stylish~ MedHUD reskin - accessible for Medical roles. - sabiram: - - rscadd: Added advanced flash, smoke grenade, and metal foam grenade launcher hardsuit - modules. - - tweak: The captain's hardsuit now has an AI container, advanced flash and smoke - grenade launcher. - - tweak: The XO's hardsuit now has an advanced flash and smoke grenade launcher. - - tweak: The CE's hardsuit now has a metal foam grenade launcher. - - bugfix: The rig mounted RCD's use cost has been reduced from 100,000 to 300. - - bugfix: The correct voidsuits can now be found in command EVA. -2018-01-14: - Hubblenaut: - - bugfix: Fixes the horrible mess of pipes that was xenobiology. - LorenLuke: - - rscadd: Adds timestamp to PDA messages. - Orelbon: - - tweak: Consoles have been resprited. - comma: - - tweak: Chemist is now its own job slot. Medical Contractor slots lowered by one. - - rscdel: Removed Mortician because you don't get more useless than that. - sabiram: - - bugfix: Autolathes now function as normal. - - tweak: Bridge Officers now additionally have basic explorer access. -2018-01-15: - Techhead: - - tweak: A survey of medical supplies found the size of pill bottles woefully inadequate. - Larger pill bottles with more pills have been issued. -2018-01-16: - CountAlex: - - tweak: '"Refactoring corpse spawners."' - chaoko99: - - rscadd: Lasers and muzzle flashes now illuminate their surroundings. - - tweak: Beams are not visible quite as long due to vast optimizations in how they - are rendered. - - tweak: Muzzle flashes will now appear over lighting, and do not last nearly as - long. - - tweak: Bullets now fly more smoothly towards their targets. - - bugfix: Fixes a bug that caused the L6 SAW to load an empty sprite when closed - without a box magazine inside. - comma: - - tweak: Overmap size has been decreased. - - tweak: Number of overmap events has been decreased. - - tweak: Potential number of away missions has been decreased. - - bugfix: Ashtrays now empty their contents when thrown. - - tweak: Torch now starts at a random location on the overmap -2018-01-17: - Banditoz: - - maptweak: The GUP airlock now works. - Chinsky: - - rscdel: After yet another PR fiasco over field executions, Marine contingent is - no longer allowed on Torch. Those not under active investigation are offered - a transfer to Expeditionary Corps if they want to participate in the mission. - Earthcrusher: - - tweak: Thanks to the tightening of SCG industrial safety guidelines, you now must - be on harm intent and wait a few seconds before blowing up a fueltank with a - lit welder, lighter, or other handheld source of flame. - chaoko99: - - rscadd: cloaked mobs (ninjas and whatnot/Mehren) can now be spotted via T-ray. - - bugfix: Lasers will no longer fail to disappear during bluespace jump. -2018-01-18: - Chinsky: - - tweak: Modular computer programs were patched to allow more abuse. Now they use - the access of user who started them, instead of constantly checking for current - user's. - Orelbon: - - bugfix: Suit storage units now check for access. - - tweak: Suit storage units don't drop items when the powers fails anymore. - - tweak: Suit storage units can now be pried open when they are powered off and - not locked. - - tweak: Suit storage units can now dispense items when they are offline. - 'author: PrismaticGynoid': - - rscadd: Adds the ability to 'crawl' to an adjacent turf by click-dragging yourself - to it, after a delay. This can be used to move while unable to stand. You can - also do this with other movable objects, if you really wanted to. - - tweak: Conscious mobs lying on the ground can now buckle themselves to chairs/beds. - This includes people missing legs. - chaoko99: - - rscadd: Plasma cutter is now a gun, instead of a fancy drill. -2018-01-19: - Sbotkin: - - maptweak: The Pilot Lounge has been replaced with the Pathfinder's Office. - - maptweak: The NT pilot's voidsuit has been moved to the Petrov, with the cycler. - Techhead: - - rscadd: Corpsman and Engineers have been granted access to the hangar to help - them go on expeditions. Or help with the inevitable injuries and damage from - returning expeditions. You know, whichever. -2018-01-20: - Sbotkin: - - tweak: Changed required players for cult and deity from 5 to 10. -2018-01-21: - Orelbon: - - rscadd: Modular consoles now have colored keys per program. -2018-01-23: - Devildabeast: - - rscadd: Added a maglight to the Security Guard's locker. Yay. - comma: - - rscadd: Sharp things are now better at cutting plants, doing double damage. -2018-01-24: - Chinsky: - - tweak: Expeditionary Corps paygrades were adjusted - Explorers are now E3, Senior - Explorers are now E5. Brings Explorers more in line with 'default' rank of other - branch(es), Crewman/PFC. - - tweak: 'Senior Explorers: can no longer be Janitors, Masters at Arms. Can be Brig - Officers, Deck Officers, Senior Engineers.' - - tweak: 'Explorers: Can be Corpsmen, Forensic Techs.' - - rscadd: Can now use IV bags to give IV to people - drag it onto them to start. - Only works when bag is held in hand by someone. - - rscadd: Can now use syringes to change contents of IV bags. - - tweak: IV bags now hold 120u instead of 200u. Their size is dynamic - tiny item - when empty, turning into normal sized (doesn't fit in pockets etc) when over - 60u inside. - - rscadd: Can now set transfer rate of IV drips with a verb. - - tweak: Blood bags in medical and orderable crates were replaced with NANOBLOOD. - The normal blood was just not as efficient with size/transfer rate changes. - Using NANOBLOOD nets you more or less same re-blooding speed. - FTangSteve: - - tweak: Bioprinter will now print species-specific internal organs if they are - available - Novacat: - - spellcheck: Fixed capitalization issue with Radiant Aura - - rscadd: Added telepath (mRemoteSay) contract to all spellbooks - - tweak: Added 1 point to all spellbooks - - rscadd: Added Teleport, Cure Light Wounds, and Noclothes to all spellbooks that - lacked them - - rscdel: Removed Mage Armor from Standard spellbook, and Cure Light Wounds from - Cleric spellbook - - tweak: Swapped Focus staff for Scrying orb in Cleric book - - rscadd: Added X-ray contract to Battlemage book, parrot transformation to Druid - book - - rscdel: Removed Student spellbook - - tweak: Made staves slightly smaller, so that they are more portable - - rscadd: Overhauled cure spells to be more effective - - tweak: Reduced cost of Spatial's magic missile to 1 - - tweak: Boosts healing spells ability to purge radiation - - tweak: Fixes sacrifice self-damage - Sbotkin: - - rscadd: Adds mounted cooling units, available in all hardsuits. -2018-01-25: - chaoko99: - - bugfix: Attacks will no longer phase through dead or otherwise incapacitated slimes. - - tweak: Slime surgery is generally faster and now supports researched scalpels - and incision managers. -2018-01-26: - Casper3667: - - bugfix: Torso tattoos now works! - CrimsonShrike: - - rscadd: You can now move down onto turfs containing climbable atoms (tables, machinery). - chaoko99: - - imageadd: Removed paint drips from door sprites and doubles their framerates. -2018-01-27: - Casper3667: - - rscdel: Taj curly, housewife, victory curls and finger curls hairstyles have been - removed. - CountAlex: - - tweak: '"Lowered the temperature at which a mob receives lung damage from -13C - to -30C."' - Orelbon: - - rscadd: New glass door sprite. - chaoko99: - - rscadd: Added a parallaxing background space that changes colors every round. -2018-01-28: - Casper3667: - - rscadd: There are new bandanas in the loadout that can be worn on the head and - over the mouth. Old bandanas are still available in the loadout. - Devildabeast: - - rscadd: Adds the decorated harness, an Unathi-exclusive accessory complete with - two dueling knives, to the loadout. - - tweak: Changed the dueling knife to a piss-weak variation of the kitchen knife. - - tweak: Changes scarves to be allowed for semi- and formal roles in the loadout. - Sbotkin: - - tweak: Several loadout access tweaks. More things for civilians and pilot's pin - for the CO, XO, and Pathfinder. -2018-01-30: - Chinsky: - - tweak: Shuffled around EC uniforms. SERVICE uniform is now a thing of its own, - NOT a mix of utility+service. DRESS uniform is now service uniform + dress jacket - + gloves. - - tweak: R&D lab refluffing. No longer 'Research', it is now called 'Fabrication' - Lab. You are not 'discovering' things anymore. You are using high-tech fabricator - that uses self-learning matrix to direct nanobots. Problem is, IT KEEPS GETTING - MEMORY CORRUPTION. You are re-training bots by letting them practice on less - complicated things before they can tackle more challenging blueprints. - Devildabeast: - - tweak: Gives the NanoTrasen badge to the NanoTrasen Liaison in their backpack; - removes it from the NT formal outfit. - chaoko99: - - tweak: Trash bags are no longer denied from holding the nuke disk. Try and figure - that one out. -2018-01-31: - CountAlex: - - rscadd: '"Adds away mission map XCV Ahab''s Harpoon."' - Memescope: - - rscadd: Added new hairstyles, some ported from Eris. - - tweak: Low Bun back sprite tweaked. - - tweak: Half-Shaved Emo renamed to Long Side Emo. - chaoko99: - - rscadd: The T-Ray scanner now can be toggled via an action button. - - bugfix: Lasers now exist long enough that the game is likely to actually render - them most of the time. I blame our tickrate. - comma: - - rscadd: '"Added Fleet patches for their respective Fleets of origin to loadaout. - Check https://wiki.baystation12.net/Defence_Forces#The_Fleet for more deets"' -2018-02-01: - Dukica: - - rscadd: Adds new hairstyles and beards. - FTangSteve: - - rscadd: '"Upgrading to aggressive or initiating normal grab now enters struggle - if victim isn''t on help intent."' - ZeroBits: - - bugfix: '"Heat Exchange Pipes can now be properly constructed."' - - tweak: '"Heat Exchange Junctions will now exchange heat."' -2018-02-02: - FTangSteve: - - tweak: '"Nabbers now have hue shifted sprites available"' -2018-02-03: - Hubblenaut: - - bugfix: Fixes plating being dark when prying off floor tiles. - Sbotkin: - - tweak: Added kitchen access to bartender and bar access for chef. - - rscadd: Added a bar locker. - - maptweak: Added actual bar stools to the bar. - - maptweak: Removed wall-mounted safe from the bar. - 'author: FTangSteve': - - tweak: Makes struggle grab state shorter and causes confusion to make resisting - grabs more difficult - chaoko99: - - bugfix: You can now crawl through vents without worrying about carrying reality - (The skybox) in your body! Squeek! -2018-02-04: - Hubblenaut: - - bugfix: Fixes alert monitors being red for away mission alerts. - - bugfix: Fixes nonmodular atmos/alert consoles showing away mission alerts. - Sbotkin: - - rscadd: Polarized windows are now buildable. Click a reinforced one with a cable - coil. - - rscadd: Their IDs are changeable as well, use a multitool on windows and buttons. - Techhead: - - bugfix: Antag preferences default to Low again instead of Never. Relatedly, your - preferences will now longer display Never when they haven't actually been set - as such, fixing a bug causing unwilling players to be drafted for antag status. - TheTrollDoctor: - - rscadd: Gives Engineering Contractor, Medical Contractor and Research Assistant - access to the hangar. -2018-02-05: - Hubblenaut: - - bugfix: Camera alarms get cleared upon repair. - PsiOmegaDelta: - - tweak: Labels that have been attached using a hand labeler will now be remain - even if the name changes. - - rscadd: Attached labels can now be removed using the "Remove Label" verb in the - "Object" category. - sabiram: - - bugfix: Corrected chemist slot loadout issues. - - bugfix: NanoTrasen security staff can now use their provided holobadges. -2018-02-06: - Hubblenaut: - - rscdel: Removes Captain's spare ID card. - Sbotkin: - - tweak: Supermatter hallucination does not affect people without eyes or with synthetics - eyes. -2018-02-07: - Hubblenaut: - - bugfix: Fixes windows not visually connecting. - Sbotkin: - - tweak: Adds the medical channel to the roboticist's headset -2018-02-08: - Devildabeast: - - rscadd: Added the alternate titles of "SolGov Ombudsman" and "Inspector General" - to SolGov Representative and "NanoTrasen Representative" and "NanoTrasen Executive" - to the NanoTrasen Liaison. -2018-02-09: - Casper3667: - - rscadd: The utility uniforms (EC, general and EC skirt) now looks better on taj. - Additionally so does the welding helmet. -2018-02-11: - ZeroBits: - - tweak: '"Dark Floor Tiles can now be made with steel."' -2018-02-12: - Hubblenaut: - - tweak: There is now an announcement when the rampant brand intelligence was successfully - gotten rid of. - - tweak: The origin vending machine now shoots a lot more aggressively. - - tweak: Blinking red light on a vending machine now means that it shoots. - - bugfix: 'Hacker event: Hacker was destined to always lose. Fixed.' -2018-02-13: - CountAlex: - - rscadd: '"Adds away mission map - Lar Maria."' -2018-02-16: - Techhead: - - rscadd: Adds a new matchmaking relation, Childhood Friend. It'll only pick people - from the same home system with the same approximate age. - - tweak: Served Together now prefers to match people with others in the same branch. -2018-02-17: - sabiram: - - tweak: The mounted plasma cutter found on hardsuits has been converted to a projectile - weapon, like the stand-alone item. - - balance: The hardsuit mounted plasma cutter's ammo capacity has been reduced to - 4 from 10. -2018-02-19: - Techhead0: - - bugfix: PDAs and Air Alarms should now detect exotic gases a little better. Phoron - is now counted as an exotic gas for these purposes. - sabiram: - - balance: Stun weapons are now much less effective against simple animals, such - as carp. -2018-02-22: - Hubblenaut: - - bugfix: Fixes gravity event bringing people to fall in areas that do not usually - have gravitation. - chaoko99: - - rscadd: Ctrl clicking a table will flip or unflip it. -2018-02-25: - Hubblenaut: - - bugfix: Fixes the handheld teleporter only working as expected when adjacent to - teleporter hub. - - bugfix: Fixes the ref2name converter only working when adjacent to target. - - tweak: Medical scanner integrated circuits now work in vision range. - - bugfix: Fixes ducttape not being able to be picked up. -2018-02-26: - Banditoz: - - rscadd: Dog tags now have useful information on them upon spawn, including branch, - religion, and blood type. -2018-02-27: - sabiram: - - rscadd: The null rod can now purify cult floors in addition to walls. - - balance: The null rod's damage has been reduced. - - tweak: Maw creatures, ghost dogs, faithless and shades are now take additional - damage from the null rod. - - tweak: The null rod is now the null sceptre, a normal sized item. -2018-03-03: - LorenLuke, TheTrollDoctor, ChaosAlpha, sabiram: - - rscadd: Humans with sufficiently long hair can now tie their hair into different - styles using the 'Tie Hair' verb in the IC category. - mkalash: - - tweak: Infections get worse much more quickly (from ambient to acute in five minutes, - acute to septic in 10 minutes) - - tweak: Antibiotics take longer to work and infections acute and above require - antibiotics and rest to cure. -2018-03-04: - Banditoz: - - tweak: The shield generator's emergency shutdown function is now hidden behind - a hackable wire. - - tweak: Cut down the shield generator's emergency shutdown time by 50%. - - tweak: The EMP from the emergency shutdown scales with current charge--and is - guarenteed to happen. - Hubblenaut: - - rscadd: The access decrypter now allows the user to choose an access code instead - of picking one by random. - sabiram: - - rscadd: Some simple_animals, most notably humanoid enemies, can now escape nets. -2018-03-05: - Banditoz: - - rscadd: The Chaplain's locker now has a bible. - Novacat: - - tweak: 'Advanced First Aid Kit: Swaps inaprovaline autoinjector for assorted pill - bottle.' - - tweak: 'Burn First Aid Kit: Adds three ointment kits, swaps inaprovaline autoinjector - for tramadol autoinjector' - - tweak: Oxygen first aid kits now contain inaprovaline pill bottle, dexalin pill - bottle, and four inaprovaline autoinjectors - - tweak: Toxin first aid kits now contain a dylovene pill bottle, three hyronalin - pills, and four autoinjectors of dylovene - - tweak: Autoinjectors are now the same size as syringes - - tweak: Emergency Oxygen/Nitrogen Tanks now start off full - - tweak: Regular Nitrogen tank starts off at the same level as oxygen tanks - - tweak: Paracemetol's painkiller effect increased from 25 to 35 - Sbotkin: - - maptweak: The D2 Teleporter and the Custodial Closet are swapped. - - maptweak: The Drone Bay's door access is changed to robotics and no longer bolted. - chaoko99: - - rscadd: Research goggles now readoff research levels, as well as an item's matter - contents. When used to examine reagent containers (Beakers, burgers, bloodbags), - it will read off the contents. But . . . - - bugfix: get_reagent() no longer returns a given reagent's path. - thefrostycoder: - - rscadd: Languages that you can understand will now be named when they are spoke. - (Ex. ' enunciates in Selenian') -2018-03-06: - thefrostycoder: - - bugfix: Fixed random paint drips on doors. -2018-03-08: - chaoko99: - - tweak: Most bots will now render below a human. - - rscadd: Floorbots will now assume the colors of the toolboxes used to make them. - - imageadd: Added a Syndicate floorbot. Sadly, he is not evil. - - imageadd: Advanced trauma medibot added. - - bugfix: Cleanbot works now. -2018-03-10: - Rebruiza: - - soundadd: APC's now play a satisfying sound when they run out of power. - - soundadd: Maintenance now has ambience. - - soundadd: Fire alarms now have a new sound. - - soundadd: Airlocks and bolts now have a new sound. - - soundadd: Blast doors now have a new sound. - - soundadd: Suit storage units now have a new sound. - - soundadd: Lockers now have a new sound. - - soundadd: Touching metal walls now have a new sound. - - tweak: The sound of tube lights turning on is now louder. - Techhead0: - - rscadd: You can now temporarily reseal damaged spacesuits with duct tape. Either - click on the suit itself, or target the chest and click on a mob wearing a spacesuit. - But be warned, further damage will tear off the patch. - TheWelp: - - rscadd: Adds a temporary effect object to make spells look prettier. - sabiram: - - rscadd: The Sol Representative and the NT Liaison have been provided a fancier - pen in their PDA for writing their important documents. -2018-03-11: - Devildabeast: - - rscadd: Adds a Morpheus Cyberkinetics uniform to the loadout. -2018-03-12: - chaoko99: - - rscadd: Cremation now takes time. Doing so with a live subject inside will cause - it to rattle around violently. You monster. - - rscadd: You can now resist out of a crematorium on a short timer. You may also - eject someone from a crematorium from outside it on a similar timer. - - bugfix: Crematorium now uses a glowing sprite when active. - - imageadd: Changes the crematorium and morgue slab sprites to something cleaner. -2018-03-13: - chinsky & sabiram: - - rscadd: Belts and towels can now be worn on the belt slot, even with no clothing - equipped. - mkalash: - - rscadd: Added secure energy guns, which require registration to a user and are - locked to stun without additional per-mode authorization. Secure small energy - guns replace security's tasers. - - rscadd: NTsec now also get a shock mode for their revolvers, which is also locked - behind command authorization. -2018-03-14: - Banditoz: - - tweak: Everyone is now able to use dog tags. - Devildabeast: - - tweak: Off-Duty is now a separate role from Passenger, and is allowed to wear - Service and Dress uniforms. - mustafakalash: - - rscadd: You can now deface people's heads by targeting it with help intent and - using a pen, crayon, or lipstick -- even if it's no longer attached. Heads with - shoulders below them can be gentrified using a shower, or in a sink otherwise. - - bugfix: You can no longer apply lipstick to things without lips. - sabiram: - - rscadd: The King of Goats now has a chance to enter a 2nd phase in combat. -2018-03-15: - Devildabeast: - - tweak: Forensic Technicians can now be Civilian Contractors. - - rscdel: Private Investigator has been removed as an alternate title from Passenger. - afterthought: - - bugfix: The Odysseus syringe gun can now synthesize reagents. - - bugfix: Slipping out of mechas during gravity failure fixed. - sabiram: - - maptweak: The pens that previously spawned in the CO and XO's offices now spawn - in their PDAs, instead. -2018-03-17: - Sbotkin: - - tweak: Makes thick clothes to protect from changelings' stings. - - tweak: Makes buosuits thick. -2018-03-20: - Banditoz: - - rscadd: You will now be thrown around while on a shuttle if you aren't buckled. - Devildabeast: - - bugfix: Corrects a typo in the code, gives the Contractor Forensic Technician - the correct badge, and gives them additional items in the loadout. -2018-03-21: - Chinsky: - - tweak: Non-broken ribs/skulls now protect the internal organs a bit. - - tweak: Bullets no longer damage internal organs twice. As an effect organ damage - from bullets is lowered significantly. - Hubblenaut: - - rscadd: Adds the Disciplinary Board Room. - mustafakalash: - - bugfix: Using resist to unbuckle yourself no longer temporarily breaks your hands. -2018-03-22: - Chinsky: - - bugfix: Mass-spectrometers now actually display names of reagents. - Crushtoe: - - bugfix: For the very first time, toggle-hub-visibility works. - Devildabeast: - - rscadd: Adds a uniform for Skinner Catering and a pin for the Free Trade Union - to the loadout. - afterthought: - - bugfix: Various borg gripper fixes, including self-upgrading, cooking, APCs, and - mecha - chaoko99: - - rscadd: Xenophage cultists are now a feature-- They are allowed to ventcrawl with - tomes, robes, and swords. Also monkies I guess. - mkalash: - - rscadd: You can now toggle off showing end titles. - mustafakalash: - - rscadd: Staff now have the ability to mark variables to easily view them in an - auto-updating panel. - sabiram: - - imageadd: Secure energy guns are now visually distinct. -2018-03-24: - Atebite: - - rscadd: Telecommunication servers now have tagging rules which determine the radio - channel name and color for a given frequency - sabiram: - - rscadd: Hardsuit rig modules damaged by EMP can now be repaired with nanopaste. -2018-03-25: - Devildabeast: - - rscadd: Adds a gyroscooter, a subtype of the space bike. - - maptweak: Adds a gyroscooter to the Research Director's office. - TheWelp: - - tweak: Tweaks zombie turn rate. Should be non-impossible. - - bugfix: Fixes zombie consume. - sabiram: - - rscadd: Wall mirrors are now containers, and contain some things. - - tweak: F6 is now msay instead of asay for staff. -2018-03-26: - Banditoz: - - rscadd: Add the ability to rename a bible, or change its icon. - - rscadd: Add new bible sprites from tlc2013. - Devildabeast: - - tweak: Allows Dionaea to select Forensic Technician at chargen. - - tweak: Makes the Roboticist a hybrid role between Engineering and Medical and - gives them access to medical items in the loadout. - Earthcrusher: - - rscadd: Adds a package wrapper synthesizer. - - tweak: Clerical borgs now include a package wrapper synthesizer and destination - tagger. - - tweak: Clerical borgs now have a "clerical gripper", not a "paperwork gripper", - and can pick up small-sized packages. - - tweak: Clerical borgs now include the Supply channel, in addition to Service. - - tweak: The destination tagger will now give feedback when selecting a destination. - - bugfix: Back-end adjustments to how package wrappers and synth grippers are handled. - FTangSteve: - - tweak: changes injury specific medical kit contents to medical pouches. - - tweak: advanced medical kits are now purple. - - rscadd: adds small emergency medical pouches that require no medical training - to use. - - maptweak: adds new medical items around. - - tweak: adds medical pouches to nanomeds - TheGreyWolf: - - bugfix: Armor pouch colors can now be properly selected from loadout. -2018-03-27: - Atebite and Cakey: - - rscadd: Ironing equipment to get those unbecoming wrinkles out of your uniform... - or your crewmates - - bugfix: Washing machines no longer eat clothes -2018-03-28: - Cakey: - - imageadd: Fleet service and dress uniforms have been re-sprited to take on a navy - blue theme. Fleet uniforms have now been split into three categories, with lower - ranks recieving a sailors uniform rather than the non-commissioned officer's - coat. - - bugfix: Fixes service and exploration uniforms sharing the same datums. - Devildabeast: - - rscadd: Adds a forensic belt to the Forensic Technician's locker. - - maptweak: Changes the Forensics door from glass to regular. - Earthcrusher: - - tweak: The jukebox has been resprited. - - rscadd: New tracks added to the jukebox music selection; some have had their names - corrected. - sabiram: - - soundadd: The Emperor of Goats now comes complete with his own battle themes. -2018-03-29: - Bill-Luxe: - - rscadd: Ported railings from the Europa. You can now create it by using a different - material sheets. - Cakey: - - maptweak: Deck 4 has been re-worked. Supply now has a bigger warehouse and the - escape arms have been moved forwards. - - maptweak: Added the very important laundry room on deck 4, with ironing boards - soon to come. All washing machines outside of the laundry room have been purged. - - maptweak: Added green pens to liason and spare offices. -2018-03-30: - PurpleMartinJCK: - - bugfix: Fix medical crate sprites, adding back to storage.dmi - - tweak: Add pouch spawns to small medical random spawn - - tweak: Add trauma kit to medical kit spawn - - bugfix: Fix pouch names in venders - - rscadd: Add new pouch supply crates -2018-04-01: - Chinsky: - - tweak: Liver damage change. Now when it's not working right, it doesn't apply - staright up damage (only for alcohol), it builds up ammonia in the blood up - to toxic levels. Better get those scrubbers going. - - tweak: Kidneys are doing similar thing, but with potassium. - - tweak: Potassium now raises pulse, dangerously so over 10u. - - tweak: Bananas now have bit of potassium in them. - Devildabeast: - - rscadd: Ports Grayson Arms prosthetics from Polaris. - - rscadd: Ports robolimb optics from Paradise. - - tweak: Vox can no longer be selected as a species when building an FBP. - - tweak: Morpheus prosthetics are no longer restricted to IPCs. - - tweak: The Morpheus Alt. head is now the default and the Monitor is a subtype. - afterthought: - - bugfix: PDAs with medical access once again have a handheld medical scanner scanner - program. -2018-04-02: - Chinsky: - - rscadd: Finally swaps old stinky blood in Medbay for NANOBLOOD(TM). Use wisely. - - rscadd: Increased immersion. - - experiment: To further immerse you in your character, you now need to blink manually - if you have organic eyes. There's helpful messages to remind you of that now. - - experiment: To help new players acclimatize to our high RP standards, helpful - hints have been added, shown when you perform ceratin actions to guide to maximum - RP path. - - experiment: As an experiment, different kinds of guns can now be selected in custom - loadouts in Utility section. Everyone can get holsters too now. Spare ammo is - not included. - sabiram: - - balance: Wizards can no longer teleport to non-station Z levels. -2018-04-03: - Dukica: - - rscadd: With the addition of a fancy new, tentacular helmet, the Skrell can now - use the Rescue Module (Medical RIG) suit! - sabiram: - - maptweak: Added The Orb, a mining focused away site. -2018-04-04: - Devildabeast: - - maptweak: Adds a mech recharger to the Security Armory. - afterthought: - - bugfix: Fixes roller bed SSD bug. - chaoko99: - - bugfix: T-rays actually work on ninjas now. - - tweak: Portable atmospherics devices will now work off an APC if available. - mustafakalash: - - tweak: The Torch will once again always spawn on an asteroid. - - tweak: Changes occupation settings from a cycle to a list. -2018-04-06: - Devildabeast: - - tweak: Allows the Roboticist to select medical webbing vest, medical drop pouches, - and the medical poncho in loadout. - PurpleMartinJCK: - - rscadd: Wizards now have a spell that lets them make a long-lasting portal to - away sites. -2018-04-07: - sabiram: - - tweak: Wire brushes are no longer as effective a melee weapon as a pickaxe. -2018-04-08: - Chinsky: - - rscadd: Can now pick EC Directives as shackles for IPC. - chaoko99: - - tweak: Crawling now occurs by clicking a turf. - - tweak: Crawling is now significantly faster. - - bugfix: You can no longer drag other people, forcing them to crawl. -2018-04-09: - Devildabeast: - - maptweak: Adds green pens to the SolGov Representative's and NanoTrasen Liaison's - offices. -2018-04-10: - ParadoxonKomplikon: - - tweak: '"Exotic seeds do not contain certain reagents, such as alcoholic drinks, - anymore."' - - tweak: '"Exotic seeds'' production time is now generally shorter than before."' -2018-04-11: - CakeQ: - - maptweak: Replaces the conference room on deck one with a briefing room. - - maptweak: Added a table/shutter combo intbetween the captain's mess and briefing - room for the chef's use. - FTangSteve: - - rscadd: Makes breathing far more relevant - - rscadd: CO2 buildup is now potentially dangerous and must be scrubbed - - rscadd: Tank sizes have been adjusted and will need to be refilled more often -2018-04-12: - chaoko99: - - soundadd: 'C4, timers, and nukes will now make an ominous beeping noise. spriteadd: - Porta-nuke resprited, uses the porta nuke sprite from TG.' -2018-04-13: - FearTheBlackout: - - maptweak: Moves exosuit tracking beacon crate to Robotics Maintenance - chaoko99: - - bugfix: Crawling works while lying down again. - - bugfix: Crawling no longer functions in space. -2018-04-14: - Cajoes: - - rscadd: Added a lube variant called oil, comes in jugs of 100 units, dispensable - from robotics vendor. - - rscadd: Added beer and ale cans to the alcohol vendor. - - rscadd: Added lava lamps and office toys to the misc. supply menu. - - rscadd: Added fish meat and a big bag of salt to the kitchen. - - tweak: Changed contents of some drinks. - Cakey: - - imageadd: Adds new floor tile sprites. - - imageadd: Adds new floor decals. - - rscadd: Adds several new floor tile types to litter the station with. - Chinsky: - - rscadd: Can now use grab on EC plaques to display Directives to people. Forcefully. - PurpleMartinJCK: - - rscadd: Adds species based darkvision - - tweak: Tweaks light falloff calculations - sabiram: - - tweak: Species with better than average night vision are now more vulnerable to - flashes. -2018-04-15: - Chinsky: - - rscadd: Can use pill bottle on self aiming at mouth to quick-pop a random pill - from it. Yum. - HetNeSS: - - bugfix: Expedition storage area layout fixed. All lights should be connected properly - now. - - maptweak: Sorted out the expedition storage inventory. Piping, maint door location - adjusted. - Sbotkin: - - maptweak: Removed excess stuff (extra tools, consoles) from the forensic technician's - laboratory. - - rscdel: Removed excess tools from the forensic technician's locker. - sabiram: - - tweak: The automatic transfer vote called at 3 hours has been changed. The 'Continue - the Round' option will now extend the round by 30 minutes instead of 1 hour. - - tweak: The default type of robot in character select is now 'robot', a positronic - unit, as opposed to 'cyborg', which has a human brain. - - tweak: Robots with a computer chip based brain are now referred to as 'drones'. -2018-04-16: - Cakey: - - maptweak: The mess hall has been re-shuffled to allow for the cook to have more - of a presence. - Sbotkin: - - maptweak: The Chief of Security's Office is remapped. - - maptweak: The Board Disciplinary Room no longer has attributes of a high secure - area. -2018-04-17: - Banditoz: - - maptweak: More newscasters have been mapped throughout the Torch. - Sbotkin: - - maptweak: The Brig Officer's office is remapped. - Zuhayr: - - tweak: Xenomorph brute resistance, movement speed and and armour have all been - significantly adjusted. Be on the lookout for xenos being nerf OP and report - issues to the tracker. - afterthought: - - tweak: 'Skills are now selected on a per-job basis under Occupations. Warning: - current skill data will be lost!' -2018-04-18: - Banditoz: - - tweak: Non-living players may no longer cast votes of any kind during crew transfer - votes. - Cajoes/BloodyMan: - - rscadd: Ports TG Cigarette Paper code - - tweak: added four more cigarettes to cigarette packs - - tweak: gave a use for existing filter and cigarette paper icons - - rscadd: added icons for, lollipops, gum, nicotine gum, rolled cigarettes, filter-boxes, - gum-boxes, cookie-packs and spitwads - - rscadd: added icons made by Woah Hold There Buddy, (tobacco packs, chewing tobacco - packs,) - - rscadd: added chewable category, reskinned cigs you equip, chewing tobacco, lollipops - and gum added - - rscadd: added recipes for using the rolling papers to make cigs using dried plant - matter or pre-packed tobacco - - rscadd: added onmob animation for chewing gum (but not for nicotine gum) - HetNeSS: - - tweak: Added a capability for surgeon borgs to pick up an IV packs with their - organ gripper module. -2018-04-19: - chaoko99: - - rscadd: Fire extinguisher may now accept fluids from all forms of reagent containers - (HCL dispensers, capsaicin dispensers, coolant tanks, fuel tanks etc.) and spray - them at EXTREMELY low levels of efficiency (100 units a spray, wasteful for - most things.) Firefighter extinguishers may also accept in the same way. BEWARE. - - tweak: Water may now cool down to 20c when sprayed (Includes grenades, for example.), - with a diminishing return below 60c. - - rscadd: Like the above, coolant may be used to cool areas, best saved for phoron - fires or traitoring, because it's extremely efficient and may dip an area to - just a little over 0 kelvin if you're not careful. - - tweak: Extinguishers will fire multiple puffs of reagents instead of three sprays - at the exact same time. More or less consequence of a performance change. - comma: - - tweak: Replaces most eguns with secure variants. Swipe ID to register. - - tweak: Secure guns get all modes unlocked if it's Red Alert - - tweak: CO's revolver was moved out of locker into a display case -2018-04-20: - Sbotkin: - - maptweak: The Forensic Technician's office is remapped again, a lab added. - - maptweak: It's now possible to access the morgue as the fortech. - TheWelp: - - rscadd: Adds Spellbound Servants. Powerful minions of wizards, each with their - own gimmick and theme. - - rscadd: Implements two mutations, nobreathe and spaceres, in conjunction with - the spellbound. - chaoko99: - - rscadd: hydroponics trays, covers, and plump helmets have been re-sprited. - - tweak: Plump helmets are now repeatedly harvest-able, but require a high amount - of nutriment to sustain. You only harvest the 'helmet' of the plump helmet, - as well. - - tweak: Hydro trays will default to 5 lumen lighting for their covers -2018-04-21: - HetNeSS: - - maptweak: Morgue has been split up to two sections - "Morgue" and "Autopsy". Autopsy - - area created. - - imageadd: Autopsy - area icon added - - rscadd: Two sliding doors added to separate the morgue from the autopsy zone. - Morgue or Medical access level required on each one. Autopsy atmospherics controller - added. Morgue - lightswitch, APC added. -2018-04-22: - Banditoz: - - rscadd: You can now export ore scanner disks inside of crates on the supply shuttle - for some extra supply points. - BlueNexus: - - rscadd: Plasteel combat shields have been added to the emergency armoury, replacing - the unused biosuit closet. - Chinsky: - - rscadd: Adds color picker mode to floor painter (which is renamed to paintgun). - - rscadd: Can now hit APCs with heavy big things to unlock them. Doing so risks - breaking them completely. - - rscadd: Being in pain, not seeing properly, or being confused will now affects - accuracy of your attacks. - HetNeSS: - - maptweak: A survellance camera had been installed - D3 mess hall - galley. - sabiram: - - tweak: Stun electrode projectiles fired from stun revolvers now move faster. -2018-04-23: - Chinsky: - - rscadd: Supply crates now have secure variants of guns. - - rscadd: Unsecure guns can be ordered with contraband crates. - Sbotkin: - - tweak: Bridge Officers' got helmets and correct tablet computers. - sabiram: - - bugfix: Fixes red alert being available in the command and communications program. - - bugfix: Red alert once again may only be set through the keycard authentication - devices (small white and black panels on walls) found in officers' offices and - on the bridge. - - rscadd: Red alert now only be cancelled using the keycard authentication devices. - - tweak: Admins are now provided jump links in the 'has forced open an emergency - shutter' message. -2018-04-24: - Chinsky: - - tweak: Skill costs and free skillpoints amounts were severely tweaked, check your - allocations since they're most likely invalid now. - - tweak: Tweaks to some medicines' OD effects. - - tweak: Paracetamol and cold medicine now do not apply organ damage, but still - prevent natural healing when you OD. - - tweak: Inaprovaline, being brain soothy chem, makes you slower and sometimes slur - and get drowsy when you OD (60u folks). - - tweak: Bicaridine, on top of usual toxic effects, now has a chance to heal arterial - bleedings! But at the same time it blocks blood flow, lowering blood circulation - by 20+% (depends on how much did you go past the OD threshold). - HetNeSS: - - tweak: Magnetic grippers are now capable of grabbing deuterium and tritium ingots - as well. - comma: - - rscadd: PDAs are now modular computers. -2018-04-25: - BloodyMan: - - rscadd: Blending tofu now yields an egg substitute for vegan baked goods. - afterthought2: - - bugfix: Skill system saving ACTUALLY works correctly again. - - bugfix: Skill system saving works correctly again. -2018-04-26: - BlueNexus: - - bugfix: Uplink-bought railguns no longer explode - Chinsky: - - tweak: Lung popping condition changed. Now it only happens when pressure changes - (both internal and external), not constantly when you're in vacuum. Pressurized - suits prevent popping by reducing external pressure difference impact. -2018-04-27: - afterthought2: - - bugfix: Crisis borg splints now work. -2018-04-29: - Chinsky: - - tweak: Moved explorers gearup room to where that gross quarantine thing was. Previous - location is now an unused room - - tweak: Moved bunch of crap from explorer lockers onto the racks and tables. - - tweak: Explorer access now opens the room where anomaly containers/stasis cages - are, the one with the drill. - - tweak: Gave bunch of random crap to explorers in the gear room - glowsticks, cameras. -2018-04-30: - Banditoz: - - rscadd: Cyborgs get a secure energy gun (replaced taser rifle) which can be granted - lethal mode by a console, or red alert. Silicons cannot set it for eachother, - or themselves. -2018-05-03: - afterthought2: - - bugfix: Irreparable organs can no longer be healed by any means. -2018-05-04: - HetNeSS: - - tweak: Bandolier's can now also hold pills, pill bottles, papers, pens, photo's - and marshalling wands. - sabiram: - - rscadd: Added a pathfinder hardsuit module to exploration suit room. - - maptweak: Fixed several issues in the exploration storage rooms. - - rscadd: Added illumination grenades, which generate a bright, wide light when - detonated. Added illumination grenade crate to supply under miscellaneous category. - Added hardsuit illumination grenade module. -2018-05-05: - afterthought2: - - rscadd: Scanner modules added for modular computers. Available (job-depending) - on spawn, and also from supply crates. - - rscadd: 'The scanners are: paper, medical, atmos, and reagent. You can have at - most one at any time. Compatible with all computers, but only the paper and - atmos scanners will do anything when in a console.' - - rscadd: Scanner program added for modular computers, which interfaces with scanners. - Can view and save scan results, which may be edited with NanoWord. - - tweak: If a scanner and a nanoprinter is installed, the printer can now only be - refilled with blank paper. - - bugfix: The tax program should no longer produce duplicate copies or unexpected - behavior. -2018-05-06: - TheGreyWolf: - - bugfix: The MAA alt title is now fixed to not exist. - afterthought2: - - rscadd: 'The crisis borg module comes with a stasis bag rack, which can hold 3 - body bags or stasis bags. Starts empty to avoid exploits: go find your own.' - - tweak: Borgs now fold up roller beds by clicking and dragging, like everyone else. - - tweak: Borg interactions with ironing boards while having the roller rack equipped - are similar to humans (they still can't iron, though). -2018-05-07: - Chinsky: - - rscadd: Can now use multitool on secure guns to disable tracker. Prevents gun - from firing, but won't report its coordinates to the force auth program. - - rscadd: Makes emagged secure guns not show up too. -2018-05-08: - afterthought2: - - bugfix: Borgs and AI are given emails after name selection. Emails are updated - on name change. - - bugfix: Borgs and AI can read emails from the "Email Client" in the Subsystems - verb. The email administration program can still be accessed by AI but has been - moved to "Email Administration." -2018-05-09: - afterthought2: - - tweak: CE and CMO get job-appropriate scanners on their PDAs now. - - tweak: Modular computer scanners can now be printed via protolathe. - - tweak: Hitting a modular computer with a paper bundle puts it in the printer. - To scan, separate the bundle. - - bugfix: The chemist's pda scanner is fixed. -2018-05-10: - chaoko99: - - soundadd: Cleanbots now make cute little beeps when active and functioning. -2018-05-15: - Banditoz: - - rscadd: Added a new gamemode, fathless; a mix between cult and deity (also known - by some as godcult.) - Cakey: - - maptweak: Moved alll checkpoints to be positioned in more key areas. B-deck and - deck one checkpoints are now connected via ladder. All checkpoints now have - the ability to cut-off certain sections of the hallways for flow control. - - maptweak: Brig officer now has a disposals bin. - - maptweak: Emergency armory has been altered to have 3 carbines and 3 e-guns as - opposed to the 2:3 loadout to match the rest of the E-ARM. - - maptweak: Brig armory has been altered to have 4 e-guns as opposed to 3 to match - the rest of the armory. - Casper3667: - - rscadd: Vox now spawn with their air filter gas mask. - Dukica: - - rscadd: 'Enabled ponchos, aprons and hazard vests for GAS to wear. rstweak: Some - typos were cleaned up.' - Miraviel: - - bugfix: You can now use sign language even if you are muzzled. - afterthought2: - - tweak: Very damaged heads will be marked as "critical" rather than "irreparable" - on scanners, and can be healed even past max_damage threshold. - - rscadd: Adds a deck management program, which gives some information on shuttle - movements. - - rscadd: Adds flight plans, which can be filed via this program by those with shuttle - flight access. - - rscadd: If the flight plan includes a roster, the members on the roster can be - summoned via automatic comms announcements or batch-emailed. - - rscadd: Adds other reports that supply can file about shuttle missions after the - mission has departed/returned. - - rscadd: Adds a stripped-down report viewer program, currently mostly useful for - viewing emailed reports. - chaoko99: - - rscdel: Reverted a change that made it impossible to draw/fill plant reagents. - You may now make your tomato grenades again. - tlc2013: - - bugfix: Fixed certain Spellbound Servant equipment not having the proper icons, - or - at worst - having no icons at all. -2018-05-16: - Banditoz: - - maptweak: Remaps the Petrov toxins lab to be more intuitive to use. - - tweak: Powered crossbows have been buffed. You don't need to draw back as much, - and it takes less time to do so. -2018-05-17: - afterthought2: - - tweak: The deck management program will now allow you to queue up scheduled missions, - rearrange their order, and delete them. Once started (i.e. once the shuttle - departs) the active mission is finalized and can no longer be deleted or moved - around, but can still be renamed. - - tweak: Deck management announcements are now a bit less spammy and let you choose - an area other than the shuttle to meet. - - tweak: One more report has been added, a post-mission summary. - - bugfix: Crew record access issues fixed. - chaoko99: - - tweak: Emergency shield generators now cover an entire screen. Power draw per - shield unaffected. -2018-05-18: - Cakey: - - maptweak: Adds railings to all stairwells. - Chinsky: - - tweak: PDAs and ID cards no longer have whole name and job in their item name. - - tweak: When examining people, you will see a linkie to see their ID. That will - give you name/job if you're nearby, or show you the window with full info if - you're adjacent. - sabiram: - - rscadd: Blast doors and shutters can now be damaged by hitting them with sufficiently - powerful items. - tlc2013: - - rscadd: Added a recolorable kimono to the loadout selection. -2018-05-19: - PurpleMartinJCK: - - rscadd: add new nabber organs - - rscadd: flesh printer can now print nabber organs - - rscadd: low blood can force nabbers out of nab mode - - tweak: crushing and shredding now decloak nabbers - - tweak: lower some nabber brute resistance in favour of natural armour - - tweak: encases all external nabber organs in carapace - afterthought2: - - tweak: Those with heads access now have more access to Deck Management. - - bugfix: Access issues with supplementary Deck Management reports should be resolved. -2018-05-20: - afterthought2: - - tweak: Headsets start with a free encryption key slot now. -2018-05-21: - afterthought2: - - tweak: Cryo tubes use up chemicals ten times faster. Effective healing rate remains - unchanged. - - tweak: Genetic damage is healed ten times faster in cryo tubes. - - bugfix: The organ printer now prints visible organs. -2018-05-22: - Banditoz: - - rscadd: Borgs can now lock and unlock their own panel. - Cajoes: - - rscadd: Snix, HotFoods and Lavatory vending machines and hid them on the map. - - tweak: All snack food relative paths are now absolute paths. Nobody noticed nor - cared. - Cakey: - - maptweak: Consoles have been rotated to match how they should be. - chaoko99: - - rscadd: Added a light-toning system, lights will color dynamically to what color - they emit. - - rscadd: Fingerprints will no longer magically phase through gloves. - - tweak: Robolimbs don't make fingerprints anymore. - - bugfix: Thick gloves actually use thickmaterial. -2018-05-23: - Banditoz: - - bugfix: Destroyed portable turrets are now climbable. - TheWelp: - - rscadd: Adds a new deity menu free of uplink structure. - - tweak: Some deity store items now increase in price the more you buy them. (E.G. - Conjuration) - - rscdel: Remove Godvision. - afterthought2: - - bugfix: Fake crew announcements should use ID card data now. - - bugfix: Antag preferences being reset to low should be fixed. If you continue - experiencing this issue, please submit a new bug report. -2018-05-24: - Alex6511: - - bugfix: Fixed "3" being printed when placed on a surgery table. - chaoko99: - - bugfix: Lights aren't super dark anymore. Blame Chaoko99 for being blind and not - noticing the difference during testing. - - bugfix: Fixes weird sprite bugs for broken and burnt lights. -2018-05-25: - PoZe: - - rscadd: Added oxygen candles as an item. They are one-time emergency item that - is used to fill 2-3 tiles of depressurized environment - afirpo: - - maptweak: Added an access button to icly cycle between Exterior and Interior fusion - core chamber. - afterthought2: - - bugfix: Crew records will now correctly display things like ' and " in-game. -2018-05-26: - HetNeSS: - - maptweak: The fore docking port on deck four had been widened in size, as the - main docking port be probably should. - - maptweak: Remodelled the Mercenaries gamemode transport shuttle, to suit the extended - docking bay, as well as for more beefy and physics-justifiable look. - - bugfix: '"Northeast of First Deck" and "Northwest of Fourth Deck" waypoints swapped - places (aka fixed)' -2018-05-27: - Casper3667: - - rscadd: Tajara can now use normal gloves and claw attacks can't be used when wearing - gloves. -2018-05-28: - Cajoes: - - tweak: New fax machine icon. -2018-05-30: - Alex6511: - - tweak: Amputation text is now larger for the surgeon performing the amputation - Banditoz: - - bugfix: The rapid taser cooling module (now called the rapid weapon cooling module) - upgrade now works. -2018-05-31: - afterthought2: - - rscadd: the report editor can now print reports and export them to text files. - - rscadd: the report editor can download new (blank) reports from NTnet. A few of - the forms from the wiki can now be chosen in this way. -2018-06-01: - Banditoz: - - rscdel: Hand teleporters have been removed from teleporter rooms. - - maptweak: Teleporter beacons have been removed from some high security areas onboard - the Torch. - - maptweak: A teleporter beacon has been added to NanoTrasen's miscellaneous research's - test chamber. - sabiram: - - tweak: Off-duty ID cards are now visually distinct and can no longer be modified. -2018-06-02: - afterthought and chinsky: - - rscadd: 'The "Medicine" skill now influences interaction with some medical objects: - syringes, defibrillators, sleepers, handheld scanners, full body scanners, IV - drips, and splints.' - - tweak: Full body scanners now store scan data. Use the menu options to print, - erase, or scan/re-scan. - - tweak: IV drips now take a short time to hook up. -2018-06-06: - afterthought2: - - tweak: Off-Duty is no longer a separate job, but an alt-title of Passenger. You - no longer spawn with ranks in uniform if selecting off-duty. - chaoko99: - - tweak: Books and papers may now be 2x as long. This was changed to make it so - records could be longer, without the skeleton taking up half the usable text. -2018-06-07: - Cajoes: - - rscadd: Added new visors for Tajaran to shield their eyes with. Available exclusively - in the xeno portion of the loadout screen. - - rscadd: Added Hot Food showcase to manage kitchen's output. - - rscdel: Removed Lavatory Essentials Vendor on Deck 2 due to [redacted]. -2018-06-08: - TheGreyWolf: - - bugfix: Press tags can now actually be taken by the press. - Zuhayr: - - rscadd: Added methyl bromide, a fumigant gas that kills spiders. - - rscadd: Added bromide, a toxic reagent, from which can be derived a liquid form - of methyl bromide. Methyl bromide kills spiderlings and egg sacs when injected. - - rscadd: Added algae to hydroponics. Algae produce liquid bromide and gaseous methyl - bromide. - - rscadd: Added an interaction to optables that will automatically put someone lying - on top of it to sleep with no need for N2O or painkillers. - - rscdel: Removed N2O pumps as being both redundant and buggy. - afterthought2: - - rscadd: The slowdown for pulling (i.e. ctl-click) stuff is now affected by the - "Athletics" skill. - - tweak: Bigger/stronger species pull things faster. - - rscadd: Pulling stuff generates adrenaline, depending on "Athletics" skill. This - may raise your heart rate. Pulling for a long time without breaks with low skill - may give you the jitter effect and minor heart damage (won't kill you). -2018-06-09: - Banditoz: - - tweak: The T-Ray scanner is now faster, has an increased range of 7x7, and is - now without the flicker effect. - sabiram: - - tweak: Gyroscooters now shield their pilot from 5% of projectiles, down from 40%. - - tweak: Gyroscooters are now slightly slower. - - tweak: Attempting to move a bike or gyroscooter while stunned will now eject you. -2018-06-10: - Banditoz: - - maptweak: The Aquila has been divided into areas, and remapped a bit. - - rscdel: The Aquila's death trap has been removed. -2018-06-11: - BlueNexus: - - tweak: Increased TC costs for railguns - Chinsky: - - tweak: Now for ghetto EVA the size of thrown thing matters. Tiny things give you - ~10% chance of direction change, with 'normal' sized things having 90%, guartanteed - above. - afterthought2: - - rscadd: Throwing "huge" items (e.g. roller beds, backpacks, certain guns, rigs, - jetpacks) or normal sized mobs without "Basic" skill in "Athletics" will briefly - weaken you (and the items won't go far). - - rscadd: Thrown items don't go as far and have less speed/force if you have lower - "Athletics" skill. - - rscadd: The weightlifting machine at the gym has more weight levels. Having high - "Athletics" means you can lift more. If you try lifting way more than you are - capable of, you may hurt yourself. - sabiram and Cakey: - - rscadd: The bird temple on the mining map has been redesigned and now houses the - fountain of youth. -2018-06-12: - Broseph Stylin: - - rscadd: Added rucksacks to Character Setup. They function exactly the same as - backpacks. - afterthought2: - - rscadd: Lactate is a reagent that increases heart rate, causes generally harmless - shortness of breath, and slows movement. After processing a large amount of - lactate, mobs may experience temporary jitters. - - tweak: Instead of producing adrenaline, pulling produces lactate. - - rscadd: Robots can now interact with storage items like boxes and bags. - chaoko99: - - bugfix: Trays will now adequately notify you of not being able to be placed in - bags. -2018-06-13: - Cakey: - - imageadd: New wall sprites have been added. - - imageadd: New door sprites have been added. - - imageadd: New window sprites have been added. - - imageadd: New grille sprites have been added. - - rscadd: Airlocks are now paintable. - - rscadd: Window frames have been added, which connect to walls for that aesthetic - look. - - rscadd: Airlocks can now be painted using the airlock painter. - - rscadd: Added paint presets to the paintgun. - - maptweak: The Torch has been modified to use window frames instead of just windows. - - maptweak: Maintenance has been given more catwalks. - - maptweak: Added binoculars to security checkpoints. - ZeroBits: - - tweak: Material Grinders have been reworked to allow different reagent quantities - and multiple reagents when grinding material sheets - Zuhayr: - - tweak: Gas inhalation effects are now reagent-based. Gases create reagents inside - the body, which then apply effects. This means that gaseous phoron exposure, - for example, needs to be treated with dialysis/dylovene, as it fills your guts - up with liquid phoron. - - tweak: The poison_type var on species datums is now poison_types, and determines - which poison gasses show you the toxins UI indicator, rather than which ones - cause poisoning. The actual effects of poisonous gasses is determined by the - reagent value (as per dexalin being injected into a vox, etc.). This really - shouldn't impact anything for the average player, except that chlorine and nitrogen - dioxide (not N2O, for clarity) are now actually poisonous. - - tweak: Helium now makes your voice squeaky. Very important feature. - - tweak: Xenon is now functionally the same as N2O, including the following note. - - tweak: N2O now causes giggling, confusion, dizziness and occasional passing out - at high dosages, rather than instant and immediate knockout. Still useful for - riot control and now flooding it into distro isn't a round-ender. You might - even be able to use it without admins shouting at you! Refer to the optable - neural suppressor PR for a replacement method to sedate people for surgery. - - tweak: Finally, as a sidenote, Bogani will actually be poisoned by oxygen and - chlorine will have a visible overlay now. - afterthought2: - - rscadd: Experienced in Chemistry allows you to see scannable reagents in a held - beaker/container. - - rscadd: Professional in Chemistry allows you to see all reagents in a held container. - - tweak: Science goggles give more precise volume readings at higher chem skill. -2018-06-14: - ElRobusto: - - tweak: Cuts the Vox space suit movement penalty by half. - TheWelp: - - rscadd: Adds two currently admin-only races, the Starborn and the Blueforged. - Will be available in future deity form. - - tweak: Tweaks Shadow species death to not cause runtimes. -2018-06-15: - Banditoz: - - tweak: The cyborg manual now has all the current cyborg modules. - - tweak: The Supermatter guide shouldn't lead engineers to delaminate the engine, - now. - ParadoxSpace: - - rscadd: Adds two new IPC/FBP chassii, Morpheus Mantis and Ward-Takahashi Economy. - - tweak: Grayson, W-T Economy, and Xion are now available at the roboticist fabricator. - afterthought2: - - rscadd: The chem grinder is dangerous to use at "Unskilled" in Chemistry and will - lose some ingredients depending on skill level. - - rscadd: The chem dispenser will give inaccurate amounts of ingredients or add - extra contaminating ingredients when below skill "Trained" (in Chemistry or - Cooking, depending on dispenser) Can be slightly dangerous. - - rscadd: The chem master now has two modes. "Quick" will move the correct amount - of ingredients from beaker to buffer, but also add contaminants (depending on - skill). "Thorough" will only move the desired ingredient, but incur losses (depending - on skill). Skill checked is Chemistry for chem master, Cooking for Condimaster. - - rscadd: Moving ingredients from buffer to waste or beaker acts like on "Quick" - mode. -2018-06-17: - ParadoxSpace: - - rscadd: Adds bowman type headsets to all non-service departments. - - rscadd: Adds unique pilot, miner, corpsman, and explorer headsets. - - rscadd: Adds tacticool Syndicate headsets to mercs. - - rscadd: If tcomms is down or unavailable for whatever reason and you have a shortwave - radio in your pocket, your headset will now automatically transmit through it. - It still cannot do department channels. -2018-06-18: - Chinsky: - - tweak: Some loadout items are now restricted by branch instead of jobs. Some are - restricted by both. You might experience sudden loss of swag on next spawn, - check your setup. - TheWelp: - - rscadd: Adds various starlight specific spells for use in future deity form. - - tweak: Adds two new flags for targeted spells to filter via faction. - - tweak: Adds more effects for some spells. - afterthought2: - - rscadd: adds the instruct verb. A character with basic leadership and experienced - skill X can instruct a character in X from Untrained to Basic. Has a 15 minute - cooldown to use; buff lasts all round; max of three buffs on any person. The - target has to be close and there's a short timer during which neither party - should move. - chaoko99: - - rscadd: Adds a fully reusable backstabbing mechanic, used by butterfly knives - and switchblades. -2018-06-19: - Kurgis: - - tweak: Changed the brain loss Impedrezine inflicts to allow it to kill a person. - Miraviel: - - rscdel: 'Removed the time restriction on the following jobs: Explorer, Corpsman, - Deck Technician, and Scientist.' - - maptweak: Reorganized the kitchen cabinet and the crates in the Medical Storage - (the big bag of salt and the defibrillator are no longer blocking everything - else). - - maptweak: Removed the anaesthetics closet from the Medical Storage. - comma: - - tweak: XO now gets a box of spare headset keys instead of box of XO headsets - - rscadd: Bowman headsets can hold 3 keys instead of 2 - - rscadd: BO Bowman headsets hold 4 keys -2018-06-20: - BlueNexus: - - balance: Railguns have been rebalanced to fill the niche of an anti-armour or - sniper type role. - - balance: All railguns now suffer a substantial penalty when fired one-handed. - - balance: The basic railgun projectile no longer stuns, and does less damage. - - balance: All railguns which accept steel rods as ammunition now use the basic - projectile. - - balance: The TCC railgun's (available in the traitor menu) ammo capacity has been - reduced from 10 to 6. - - balance: Substantially increased firing delay on all semi-automatic coilguns and - railguns. - - balance: Holding or stowing a railgun now slows you down more. - Chinsky: - - rscadd: EVA skill now has mechanical effects. - - rscadd: Space slipping chance is affected by EVA skill. Bit higher at unskilled, - lesser with skill, no slipping at experienced. - - rscadd: Flooring when entering gravity from space is now not guaranteed at Basic - skill or more. Doesn't happen at Professional skill. - - rscadd: At Unskilled and Basic skill, jetpack can sometimes go wrong way. Not - that bad if you notice in time and have fuel to turn back. - - rscadd: At Professional skill you go faster when in space with a jetpack. Zooom. - - tweak: Skills now affect surgery. Trained or Experienced (depending on what you're - trying to do) skill is needed to ensure step won't fail. Professional skill - will offset various penalties (not proper optable, improvised tools etc) a bit. - Time of step is affected by Anatomy skill too. - - tweak: Some other skills help with some steps, e.g. Trained Forensics offsets - penalty for incisions, and Complex Devices skill is used instead for robotic - organ steps, with Electrician and Construction helping with simple limb repair - steps. - Chisnky: - - experiment: Melee weapons now have different attack cooldowns, generally with - smaller weapons being faster, bigger slower. Normal sized weapons are baseline, - having same attack cooldown as they did. - - experiment: Material weapons further tweak their attack cooldown based on material - used. - afterthought2: - - rscdel: The leadership skill has been removed. Check your characters' skill allocations. - - tweak: The instruct verb works like before, but no longer requires leadership - skill to use. - chaoko99: - - bugfix: You may no longer spam the skeleton as hard as you could before. - - bugfix: Wall painters no longer hit walls when used. - - bugfix: Energy axes will no longer anchor when dropped. - - bugfix: Candles will now last about 30 minutes. - - bugfix: Bucklers can now block any projectiles that aren't bullets, as suggested - intent in their code. - - rscdel: You may no longer worry about reagent contamination in a soft drink dispenser, - only unintended reagent amounts. - - rscadd: You may light an unlit candle with a lit candle that isn't in your hand. - - rscadd: Optimization pass on Geiger counters, and a few effect systems (Smoke - and sparks) - - rscadd: Underwear may now go into washing machines. Still can't be bloodied, but - at least you can do that now. For you weird people who roleplay showering! - - tweak: Rags may now clean more than just blood. More importantly, they show their - progress bar when cleaning. -2018-06-21: - Chinsky: - - rscadd: Close Combat now has ingame effects. Mostly chances to hit in melee. - - rscadd: Disarm chances now both affected by skills and anything tha affects melee - accuracy (being blind, being confused, blurry eyes, being in pain etc). - - rscadd: Most fancy grab moves (jointlocks, dislocations, tendons cutting) were - locked away behind Trained skill in CQC. - afterthought, sabiram: - - maptweak: The hydroponics station away site has been converted into an exoplanet - site. -2018-06-22: - Banditoz: - - tweak: Borgs have had their overall health doubled. - - tweak: Borgs also have had their armour plating component health doubled. - - tweak: Borgs are now more resistant to EMP, and lose less cell charge per EMP. - Cakey: - - maptweak: The Torch has been modified to use a wider variety of flooring types - and decals. - - maptweak: Added a door button to the XO's office. - - rscadd: Added plated catwalks, which can be constructed by placing monotiles on - catwalks. - Chinsky: - - rscadd: Botany skill now has ingame effects. - - rscadd: Without at least basic skill, you can screw up when planting or weeding - trays. You'll also be unable to recognize pests and weeds from useful things. - - rscadd: Exotic seeds (all random variations) need trained skill to avoid screw - ups like that. - - rscadd: Trained skill is also needed to handle xenobotany machines, otherwise - you'll be prone to wasting your samples really fast. - - rscadd: Experienced and professional levels of skill reduce degradation of samples - in xenobotany machines. - - experiment: Constantly fixing brain is no longer the pro strat anymore. - - rscadd: When fixing very damaged (broken level or more) organs in surgery, their - max health is lowered. - - rscadd: Brains get their health lowered /always/ if oxygenation is below survival - level (30%). Better fix cause of damage first, if you don't want to do permanent - damage. - - rscadd: Forensic skils now have ingame effects. Without at least basic skill, - you leave slightly more fingerprints on things, and you will leave prints when - trying to evidence bag things. - - rscdel: You need Trained skill to use evidence collection things and forensic - machines. At higher skill you work microscope faster. - - rscadd: Offstation antags (and traider) can now become ALIUMS! - - rscadd: Their bases have 'alien monolith' somewhere, which turns you into a humanoid - alien of unknown species. - - rscadd: Remember to implant the spawned translator implanter if you're planning - on talking to people. - afterthought2: - - rscadd: Having Basic finance gives the Appraise verb, which allows you to estimate - the value of items you are holding or have equipped (found in the IC tab). Higher - skill levels give more accurate assessments. - - tweak: The financial skill has a large effect on your starting cash. - - tweak: Higher financial skill gives you better deals from traders. - - rscadd: Using virology machines without sufficient virology skill may get you - or your friends infected. For curing purposes, "Trained" negates this effect, - but for doing splicing and mutations, "Experienced" or "Professional" may be - needed. - - rscadd: The printout from the virus analyzer may have missing or erroneous information - if you lack "Experienced" in virology. Quality of information improves with - skill. -2018-06-23: - afterthought2: - - bugfix: The microscope should now work properly again. - - bugfix: The magic missile wizard spell now works. It inflicts small burn damage - and a substantial disable. - - rscadd: Additional reports have been added to the Report Editor. -2018-06-24: - Chinsky: - - tweak: Handheld radios now have batteries and use power to transmit. You'll have - ~50 transmissions worth of power from one cell. When charge is getting low, - message might become garbled. Radios can be recharged in standard rechargers. - Heptagon49: - - bugfix: Screwdrivers no longer open airlocks upon attack. - Rowtree: - - tweak: Character creation faction/citizenship/religion/home system choices have - been updated. -2018-06-25: - Heptagon49: - - rscadd: You can now alt-click on pipes and disposal pipes to rotate them. - - bugfix: Unathi now have exploration voidsuits, and can now use the exploration - suit cycler. - Spookerton: - - tweak: Zombie abilities now tell you when they can't be used, why, and how long - is left on their cooldown, instead of failing silently. - - bugfix: Zombies can no longer consume or death_breath while incapacitated. - - balance: Zombies can only death_breath once per minute instead of once per second(!). - - tweak: Zombie consume now completes at the same rate as its cooldown, preventing - multiple consume actions being active at once. - - bugfix: Zombie consume no longer allows the user to be the target. - - balance: Zombification doesn't magically replace robot parts - - balance: Zombification organ health bonus is x3 instead of x5, but organ break - threshold is 75% instead of 50% - - balance: Zombie toxin urn reduced from 120u(!) to 10u. - - tweak: Zombie toxin now guarantees conversion for a 5u or greater dose. - - balance: Zombie toxin has a flat per process 20% chance to convert so long as - the current + historic amount of reagent in the victim (ie, the total dose at - one time) is more than 1u. - - balance: Zombie death_breath now only creates 2u instead of 5u. This means a victim - should usually take about 15 tox and have two 20% chances to be zombified if - a single zombie breathes on them. Zombies can work together to push a victim - over the 5u mark and instantly zombify them. - - balance: Zombies cannot re-zombify themselves for a free rejuv. - - tweak: observers cannot circumvent voting checks - afterthought2: - - tweak: Robotics surgery uses the Complex Devices skill now to compute delay. Hardsuit - removal uses the EVA skill. - - bugfix: Constantly escaping from grabs regardless of skill should be fixed. - sabiram: - - tweak: The standard bulkhead paint colour is now in the presets for the paint - gun. - - maptweak: Added a few small ruin sites to make exoplanets a little more detailed. - zaredman: - - rscadd: Added Advanced Trauma Kit and Advanced Burn Kit crates that can be ordered - from Cargo. 6 ATK or ABK for 30 points. - - rscadd: Adjusted cost of Medical Crate to 70 supply points to be more appropriate - when compared to other crates like Stability kit crates. -2018-06-26: - Cakey: - - maptweak: Following several reports of Torch crew being admitted to the infirmary - due to headaches the Torch has been refurbished once again to iron out any kinks - left over from the flooring construction work. - - imageadd: New floor sprites have been added. - - imageadd: New wall-mounted sprites have been added for fire alarms, air alarms, - APCs and intercomms - Chinsky: - - rscadd: Adds volcanic exoplanets. Very few plants and animals, but loads of minerals. - Don't walk in lava tho, use catwalks, Luke. - chaoko99: - - rscadd: Resprited some beekeeping items for the sake of consistency and ease of - use. -2018-06-27: - Chinsky: - - rscadd: Weapons skill now has mechanical effects, hide yo children hide yo wife. - - rscadd: Gist of it is if you don't have at least basic training, you're a hazard - to people. You can point and fire, but safety can be a bitch. - - rscadd: Speakig of safety, help intent doesn't prevent firing now. Safety is now - an explicit toggle, can switch it with Ctrl-Click on the gun or with a rightclick - verb. - - rscadd: Higher values of skill give some buffs to accuracy, and unlikely events - of jamming, also let you perform better when in pain. - - rscadd: Professional skill also has bonuses when using scoped rifles. - - rscadd: Weapons skil cost was changed too. Trained and higher are more expensive - now, with Experienced and Professional being as costly as medical skill. MAAs - start at Trained now to give them headstart. - Spookerton: - - tweak: adds insulated gloves to engineer lockers - afterthought2: - - tweak: Starting cash has been increased. Higher financial skill still gives substantially - more money. -2018-06-28: - Banditoz: - - rscadd: Saferooms can now be bolted and unbolted via the keycard authentication - device. - - rscadd: If there is an impending delamination, supermatter delamination, or escalation - to red alert, saferooms will unbolt. - - maptweak: The button to toggle the saferoom bolts have been moved inside of the - saferoom, and can now be operated by all. - Cakey: - - imageadd: Windows have been resprited. - - imageadd: Wall signs have been modified to fit the new walls. - CrimsonShrike: - - tweak: Moves crawling onto regular movement, fixes crawling while hurt. - Heptagon49: - - bugfix: After hearing about the capture of key operatives, Clan [NAME NOT FOUND] - decided to up the ante and improve the explosive power of their ninja suit's - deadman's switch to ensure that their agents either complete their mission or - die trying. Have fun. - sabiram: - - tweak: Catwalks now act as floors do with regards to clicking to move pulled objects - onto them. -2018-06-29: - Cakey: - - tweak: Replaced the fake lava on volcanic exoplanets with actual, real lava. - afterthought2: - - tweak: MMIs cannot be inserted into non-synthetic mobs. - - tweak: Flesh limbs cannot be attached to synthetic mobs. - - tweak: Robotic limb attachment now uses the devices skill. -2018-06-30: - Earthcrusher: - - tweak: Weaker mobs such as Artificers can now smash doors and windows, albeit - not as quickly as stronger mobs. -2018-07-01: - Chinsky: - - rscadd: Added anti-rad pouches to engineering. Also replaced detox injector engies - get in survival box with anti-rad one. - - rscdel: Removes mapped boomboxes from engineering. Nice try, but you'll have to - do with random spawnpoints as everyone. - - rscadd: Adds deployable SCG flags to Pathfinder lockers. They require Pathfinder - access to pop up. Don't do anything, just fluff. - Heptagon59: - - imageadd: Due to reported ill fits and high amounts of chaffing, SolGov has reissued - their line of uniforms, now with form-fitting features! EC Uniforms now have - unathi specific icons. - Hubblenaut: - - bugfix: The teleporters will no longer send people to nullspace when the beacon - does no longer exist. - sabiram: - - balance: Blink, teleport and ethereal jaunt can no longer be cast while incapacitated. - - tweak: Holographic items created by the holodeck can no longer be deconstructed. - - rscadd: Added the lodge exoplanet ruin site. - - tweak: Increased the cost of the hydrobase exoplanet ruin site. - - bugfix: Fixed incorrect accesses on various air alarms. -2018-07-13: - Alex6511: - - balance: The CoS Locker no longer contains a taser - - balance: The Brig Officer Locker no longer contains a small energy gun. - - tweak: The CoS locker now has a hand labeler in line with the Brig Officer. - Cakey: - - tweak: The Pathfinder job is now Ensign only - - rscadd: 'Belts have been overhauled to have holster slots on certain belts. These - holsters function the exact same way as uniform holsters do. imgadd: Certain - belts now show what their contents are on their icons.' - - rscadd: Added general and general holster belts, used by command, bridge officers, - and supply. Holds general office supplies, tablets, and stamps as well as other - various supply equipment. - - maptweak: Uniform holsters have been removed in favor of belt holsters, however - they can still be found within the loadout menu. - - tweak: Uniform holsters have been modified to use the same slot as webbings to - counter being able to carry two holstered weapons. - - rscadd: Plated catwalks can now be serviced using a crowbar to access anything - underneath. - Chinsky: - - rscadd: Piloting skill now has ingame effects. - - rscadd: Taking Torch's helm without at least Trained skill can make Torch go not - exactly where you want it to go. At Professional, passing meteor fields is less - painful. - - rscadd: Shuttles require different level of skill. Guppy is no-skill, Charon and - Aquila need at least Basic. For purposes of skill, pilot is whoever tells it - to move in console. - - rscadd: If pilot's skill is insufficient, you can end up in wrong place. Also - travel time is affected by skill. - - tweak: Drastically lowers amount of loot-having junk piles on garbge planets. - They have visual cues though so you don't need to try and rummage though literally - every pile. - - tweak: Xenoarch finds no longer yield sheets of steel and claim it's a mysterious - thing. They now mostly drop alium alloy, that has random material properties - each round. Any material weapons you find will be made of it too. - - rscadd: Garbage planets now have radiation sources scattered around. - CrimsonShrike: - - tweak: Roboticist now has access to their own maintenance airlock again. - Heptagon49: - - bugfix: Due to pending discrimination lawsuits, Nanotrasen has upgraded the cryosleepers - onboard the SEV Torch with automatic wheelchair dispensers. Disabled characters - now spawn with wheelchairs. - Miraviel: - - rscadd: Added the "Detach IV Drip" verb under the Object tab. - - tweak: Left-clicking an attached drip will now first detach the patient and only - then it will remove the beaker. Drag and drop still works! - - tweak: The Hot Foods Display machine now accepts and dispenses utensils. - - imageadd: IV drips now have a slightly bigger container sprite and a wider warning - light, for better visibility. - - imageadd: Advanced first-aid kits are now purple in hands too, as opposed to being - red. - Orelbon: - - rscadd: The self-destruct will now begin detonating explosions randomly on the - ship when it reaches its cutoff point. - Sbotkin: - - tweak: Emergency Response Team officially is a part of the SCG Fleet now. - Spookerton: - - bugfix: Paper bundles bundle correctly. - - tweak: Carbon copy paper is now default named "sheet of paper" instead of "paper", - the same as regular paper. - TheWelp: - - rscadd: Adds the ability for holy water to deconvert god cultists and the ability - for the null rod to stop phenomenas (by hitting an altar) - - tweak: Nerfs like 90% of deity items and phenomena costs. This may be heavy handed - or too much. Feel free to complain. - Zuhayr: - - tweak: The Pull Punches verb has been renamed to Switch Stance. - - tweak: Nabber stance switching behavior now replaces pulling punches for them. - - tweak: Nabber nabbing is now achieved by trying to grab someone rather than a - verb. - afterthought2: - - tweak: Almost all maint airlocks now require maint access. - - tweak: Trainee crewman alt-titles have been replaced by separate jobs. - chaoko99: - - rscadd: A ping button for checking your ping has been added to the "file" tab. - sabiram: - - bugfix: Fixes being unable to ignore OOC. - - balance: Machinery may no longer be controlled by the staff of animation; its - maximum charges have been reduced from 10 to 5, and its recharge time increased. - - balance: Wizard familiar transform spell recharge time increased to two minutes - from ten seconds. - - balance: Wizard familiars can no longer transform while incapacitated. - - balance: A percentage of damage taken in a familiar animal form is now mirrored - to the familiar's human form. - - bugfix: Simple animals controlled by a client can once again damage humans. Don't - kick that suspicious goat. - - rscadd: Added functionality for edged weapons to cut wires after a short delay. - Any conductive objects will also shock you! - - tweak: At the same time, clicking wires with ordinary conductive objects will - no longer shock you. - - tweak: Reconfigured access requirements for tactical equipment in the loadout. - - tweak: Sol personnel may no longer select green or tan plate carriers, UBACs or - pouches. - - tweak: Expeditionary Corps personnel additionally may no longer select navy blue - equipment. - - tweak: The King of Goats group encounter has been updated. - - rscadd: The King of Goats can now imbue his attacks with elemental damage for - a short time. - - rscadd: The King of Goats can now rarely knock over its enemies with its attack. - - tweak: The King of Goats will now only yield the golden fleece to those who slay - it in its final form. - zaredman: - - rscadd: Added spare penlights and a linen bin to the lower medical storage. - - rscadd: Expanded medical locker room to fit a washing machine and table with recharger. - - rscadd: Some adjustments to maint immediately by Medical's locker room. -2018-07-14: - Cakey: - - tweak: Dionae may no longer fill in as research director among Nanotrasen staff, - as the board of directors felt they weren't evil enough to push the Nanotrasen - agenda. - - maptweak: Added the volleyball court and cafe to the holodeck. - ChaosAlpha: - - tweak: Engineering robots can now collect cables regardless of the currently selected - color of their synthesizer - - tweak: Robots can now pull-drag (by clicking on an adjacent turf while pulling - something) - Spookerton: - - bugfix: Visible & audible messages should no longer stack an extra prefix for - every connected ghost -2018-07-15: - PsiOmegaDelta: - - rscadd: It is now possible to adjust the playspeed of boomboxes using a screwdriver. - sabiram: - - maptweak: Added some lights to dark spots in hallways around research, chemistry - and the D3 ladders, the main hallway through D2 maint from the stairs/elevator, - and the medbay. - - maptweak: 'The greedy NT guards are now only provided with one chair for their - window desk. imgadd: Changed the intercom icon to be more in line with what - it used to be. Dark frame, green console.' -2018-07-16: - Heptagon49: - - bugfix: Dionaea can now regrow limbs again. - sabiram: - - tweak: Changed the changelog header and credits. -2018-07-17: - Cakey: - - rscadd: The shuttle pilot role has been moved to Exploration. - - rscadd: The prospector role has been moved to Supply. - - rscadd: Two new pilot helmets have been added to the game, one generic and one - NT variation (Sprited by Chinsky). - CrimsonShrike: - - tweak: Implant surgery is now possible for robotic limbs. -2018-07-18: - Earthcrusher: - - rscadd: With a bit of research into Data and Illegal technologies, the Roboticist - can now print an uncertified robot module. What could it possibly do? - TheWelp: - - rscadd: Spells now require you to not be incapacitated (handcuffed, stunned, etc). - afterthought2: - - rscadd: Antag skills are now chosen in-game. Off-station antags get basic in everything - and can select 4 skills at trained, 2 at expert, and 1 at master. On-station - antags get their selection from jobs, and in addition get 3 at trained and 1 - at expert. (malf is unchanged). Once the skill selection is submitted, it can't - be undone without admin intervention. - - tweak: The Show Own Skills verb looks a little different now. Antags can use it - to select skills. - za_redman: - - rscadd: Fixed incorrect req_access for E-Arm lockdown shutter. - - rscdel: Removed biohazard locker in D1/Medical Locker room. The multi-suit locker - in the basement, the two in maint, and the one in viro remain. - - rscadd: Added additional Medical Contractor locker in D1/Medical Locker room. - - rscadd: Adjustments to Contractor Locker contents to bring them more in line with - Corpsman Lockers. -2018-07-19: - CrimsonShrike: - - tweak: Swabbing people wearing gloves should now attempt to swab said gloves instead - of swabbing their evidence-free hands - - tweak: Forensics locker will once again contain a security belt for those who - feel the need of carrying their gear. - - tweak: Restrained, unconscious or otherwise restricted suspects can no longer - keep avoiding swabbing - Ithalan: - - bugfix: PDA medical scanner now works on body bags and stasis bags like the regular - health analyzer, and uses user medicine skill level - - rscadd: Medical belts can now also hold body bags, stasis bag and emergency medical - pouches - Spookerton: - - tweak: SCGR no longer has an unfitting alt title that implies they do something - they don't. - - tweak: SCGR can no longer download and use power RCON. - Zuhayr: - - rscadd: Diona nymph and diona gestalt eyes glow in the dark. - - rscadd: Diona nymphs can no longer grow into adults by themselves. Instead, they - need to merge with two other nymphs, then call a vote with Call Gestalt Vote. - - rscadd: Diona nymphs are now capable of headbutting seeds out of seed vendors, - planting them, harvesting them, removing dead plants, eating pests and refilling - water. Chirp. - - rscadd: Diona nymphs now have a proper UI. - sabiram: - - rscadd: Plastic flaps can now be constructed with plastic sheets. - - rscadd: Plastic flaps can now be unsecured with a wrench, and then destroyed with - a screwdriver. Use a wrench to re-bolt them. - za_redman: - - rscadd: Gives Chef of Security access to the Hangar. - - rscadd: Adds exit button to hangar door. -2018-07-20: - Heptagon49: - - rscadd: A short blurb on the current alert level now appears on the title screen. - sabiram: - - rscadd: Added spy v. spy (autotraitors and renegades) to game mode selection and - secret. - - tweak: Law enforcement (security officer, warden, HoS) and the Captain may no - longer be renegades at round start. - - tweak: Reduced the force of the magnum pistol's melee attack from 14 to 9. -2018-07-21: - sabiram: - - tweak: Command rig suit helmet cameras are now found on the Command network. - - tweak: Mining rig suit helmet cameras are now found on the Supply network. - zaredman: - - rscadd: Introduces Office of Civil Investigation and Enforcement agents to replace - Colonial Marshals. - - rscdel: Removes all references to Colonial Marshals and replaces it with the Office - of Civil Investigation and Enforcement. -2018-07-22: - Devildabeast: - - rscadd: Adds optics for the Hephaestus Alt. head. - Unknown: - - rscadd: ' Removes three of the four monkey cube boxes in virology and replaces - them with a stok cube box, neaera, and farwa cube box.' - sabiram: - - maptweak: Those with shuttle helm access may no longer access the supply office. -2018-07-23: - Ithalan: - - bugfix: Map function in crew monitor program no longer craps out after drawing - first tracked crew member - - bugfix: Suit sensor jammer methods have been updated to be useful for new medical - system - - bugfix: Synthetic hearts and species without a cardiovascular system no longer - generate misleading pulse readings on the crew monitor - - rscadd: crew monitor program icons now change to indicate if there is a crew member - in medical distress, based on pulse and blood oxygenation - - tweak: layout of crew monitor program has been tidied up a bit so that each datatype - aligns nicely. -2018-07-24: - Cakey: - - tweak: EC and Fleet crew may now fill in as shuttle pilots. - - maptweak: Added a pilots locker within the expedition prep room. Pilots now have - access to both supply and the expedition prep room. - - tweak: Added a pilot-specific access type. - CrimsonShrike: - - rscadd: Forensics skill now allows for the detection of possible evidence on examination. - - tweak: Forensics skill is now cheaper at higher levels. - zaredman: - - rscdel: Removes mention of Colonial Marshals in holowarrants and replaces it with - OCIE; format change. -2018-07-25: - Chinsky: - - tweak: Telecomms relays power usage is upper /considerably/ when used off-ship. - Expect to drain Charon in 10 minutes when you switch it on. - - tweak: Having Trained or above Close Combat skill gives bonus to parry chance - with weapons (even ones that don't parry normally). - - tweak: Melee accuracy is now affected by size of the weapon - smaller than 'normal - sized' weapons are more accurate, bigger are less accurate. Some weapons have - individual bonuses/penalties (e.g. swords are bit more accurate for their size, - toolboxes are less) - - tweak: Material weapons now get damaged on parry much like when attacking, and - can shatter depending on material. - afterthought2: - - tweak: Check your skill loadout; it may have been reset! - - tweak: Skills outside your job and not in the general, organizational, or service - categories (minus pilot) are no longer selectable above "Trained" level. - - tweak: Some head roles had skill point allocations reduced. Engineers' skill points - have been brought in line with contractors (increased). Brig Officers' starting - skills brought in line with MaA. -2018-07-27: - Cakey: - - tweak: Senior Engineers, Deck Officers and Brig Officers may no longer be E5s. - afterthought2: - - rscadd: Constructing things with stacks of material now uses the construction - skill. Higher skill is needed to use more advanced materials or to make more - elaborate items. - - tweak: Construction time is modified by construction skill. - sick trigger: - - rscadd: Diona can now 'Jump-to-next-nymph' to cycle between their nymphs after - splitting. -2018-07-28: - Devildabeast: - - tweak: Shuttle Pilots can now be rank E-6 as Fleet. - - tweak: Shuttle Pilots now have EVA access. - - maptweak: The Shuttle Pilot can now access the Ready Room. - - tweak: Shuttle Pilots can now select the pilot pin in the loadout. They can also - now select the EC cap if they're EC. - - bugfix: The EC Shuttle Pilot no longer spawns with service uniform. - - tweak: The Shuttle Pilot now gets a regular pilot headset and a bowman headset - in their locker. - - tweak: Shuttle Pilot is now defined as a SolGov role. -2018-07-29: - CrimsonShrike: - - tweak: APC lights now brighter. - Spookerton: - - tweak: maintenance drone laws tweaked to read more goodly. - - tweak: mdrone laws tweaked to not imply that mdrones are intelligent, because - they're not. - - tweak: mdrone laws include not interfering with people while trying to do your - job, roomba. -2018-07-30: - Devildabeast: - - bugfix: The SEV Torch's Heads have had ventilation introduced to the stalls in - order to prevent unwanted suffocation. -2018-08-01: - Devildabeast: - - tweak: Corpsman now has the alt-title of "Nursing Assistant" instead of "Nurse". - afterthought2: - - bugfix: APC, fire alarm, and air alarm frames should once again show up as buildable. - - tweak: Faction, citizenship, and home system character creation choices have been - updated. - zaredman: - - rscadd: Added a MIA (Missing in Action) option to crewmember status choices. -2018-08-02: - Cakey: - - maptweak: The brig has been moved to deck one. Deck three has been adjusted to - be further enforce it being the habitation deck. - - maptweak: Added the Commissary, an on-ship store run by supply and service crew. - - maptweak: Moved the pathfinder's office to deck four. - - maptweak: Moved the bluespace drive to deck two. - - maptweak: Moved the observation bubble, diplomatic quarters and vacant office - to deck three. - Devildabeast: - - rscadd: Adds a PCRC suit, a more formal variation of the PCRC uniform, to the - loadout under Corporate Uniforms. - Hubblenaut: - - tweak: Brig cell timers will notify Security over Sec HUDs when expiring. - zaredman: - - rscdel: Replaces double doors to Xenobio, Viro, D2 Maint, D3 Old Brig, Conference - Room, Engineering hard storage, and NT Labs with normal doors. -2018-08-03: - Hubblenaut: - - tweak: All Heads are now able to authorize warrants using the holowarrant projector - regardless of their Security access. -2018-08-04: - sabiram: - - tweak: The mercenary shuttle is now less easily vented by destroying a single - r-window. - - bugfix: Hardsuit rig modules now check properly access for those attempting to - use them. -2018-08-05: - Hubblenaut: - - bugfix: Bridge Officers can once again access their lockers. - - bugfix: SCGR can once again access the bridge. - zaredman: - - rscadd: Allows IPC and Skrell to be Brig Officer. -2018-08-06: - Cakey: - - maptweak: Bearcat has been tweaked slightly to allow for better repair opportunities. -2018-08-07: - Devildabeast: - - maptweak: Removes a catwalk from the Utility Down in the deck 1 substation room. - - maptweak: Adds scrubbers to the toilet stalls on deck 3 to prevent CO2 buildup. - - rscadd: Adds a new branch known as "SolGov Employee"; the SolGov Representative - and OCIE Agent have been moved under it as ranks. - - tweak: SolGov loadout items, including SolGov berets, awards, and hat, can now - be worn by all SolGov-affiliated branches.. - - tweak: Updates the sprites for the Hephaestus Alt. head optics. - Zuhayr: - - rscadd: Added sushi and sashimi. Slice fish or meat into strips, then use them - on rice. Also accepts egg and tofu. - nearlyNon: - - maptweak: Moves notice board between main mess hall doors, removing the window. - RIP. - - maptweak: Adds a holopad to the holodeck, so the AI can hang out there. - - maptweak: Expands holodeck door to be two tiles wide, to prevent bottlenecking. - - maptweak: Adds a newscaster to the vacant office. -2018-08-08: - Devildabeast: - - bugfix: Allows FT to be contractor again for real this time. - - bugfix: Allows FT to be played as Contractor again. - - bugfix: SCGR can now wear most loadout items again. - Nearlynon: - - bugfix: Fixed missing pipes + wires in holodeck. - - maptweak: Adds 2 paperbins to deck 3 in the mess and lounge respectively. - nearlyNon: - - rscadd: Eight balls, able to be bought from the vending machine in the mess. Ported - from TG. "Will the CMO be useful today?" "Not likely." - - rscadd: Add bells; can be made with any material. Ring by clicking with intents - other than grab; grab picks up. Shatters if you hit someone with it! - - maptweak: Distribute bells throughout desks. - sabiram: - - tweak: The Booze-O-Mat menu has been reordered; vessels at the top, followed by - bottles, followed by ready drinks, followed by mixers, and ending with glass - accessories. - - tweak: Added a bottle of mint oil to the Booze-O-Mat for mixing. -2018-08-09: - Flatty: - - rscadd: You can now change icon scaling method in the "Icon" menu on top left! - Zuhayr: - - rscadd: Skrell now appear neutrally gendered to non-Skrell. Use the headtail length - descriptor to specify your secret squid gender. - - rscadd: Vox now have neck markings to show importance to other vox. -2018-08-10: - TheWelp: - - rscadd: Adds the Lost Souls, the remnants of souls sucked into the Starlight Gateway - (for future deity mode). - - rscadd: Added the ability for god cultists (and lost souls) to be able to hear - through the pylons like the deity can. - nearlyNon: - - bugfix: ALL MATERIAL WEAPONS ARE NO LONGER INSANELY FRAGILE. -2018-08-11: - Devildabeast: - - rscadd: Adds Observatory and Field Operations patches to the loadout. - nearlyNon: - - maptweak: Replace the crowbars in medical storage with prybars, which makes more - sense and was requested in the Little Things thread. - - tweak: Added multipens to loadout. - - bugfix: Saves diona from their impending death in holodecks & when preparing to - go to the ship as off-vessel antags. - - bugfix: Fixed grammar on diona nodes. "You plant the diona notes" no more. - sabiram: - - rscadd: Boomboxes now have adjustable volume. - - tweak: Boomboxes can no longer be placed in backpacks. - - tweak: Boomboxes now have a chance to break each time they're turned on. -2018-08-12: - Cajoes: - - rscadd: Added flood lamps (portable) to supply offerings. -2018-08-13: - Hubblenaut: - - bugfix: The diffuser bypass mode on the shield generator will now work on already - active diffusers. - - bugfix: Fixes the shield generator's atmosphere containment mode. - PsiOmegaDelta: - - rscadd: Admins can now alt-click possessed mobs to efficiently kill them. - afterthought2: - - rscadd: The SM monitor readings will fluctuate with some errors at Trained in - Engines skill and below (max 40%, 20%, and 5% at Untrained, Basic, and Trained). - At master they'll be like previously. - - rscadd: Turning on the emitter will recompute its efficiency (i.e. power) to a - lower random value, depending on skill. - - rscadd: Examining the SM at Expert skill will give some information about its - integrity. At Master, it will give a guesstimate for the EER. -2018-08-14: - sabiram: - - rscadd: The shaker now really acts like a shaker, and must be interacted with - to mix its contents (click it in hand). - - maptweak: The bar, mess hall, captain's mess, and cold storage rooms have been - redesigned. - - tweak: Iced tea is no longer sweet. - - tweak: Added sweet tea. 3 measures of iced tea + 1 measure of sugar. -2018-08-15: - Sbotkin: - - tweak: Allows shredding of fingerprint cards. - Zuhayr: - - rscadd: Numerous new ores spawn on the asteroid. They can be compressed into bricks - and ground up for reagents. - - tweak: The ore processor has been rewritten and will happily eat anything containing - metal or other substances, and can then fart them out as sheets. - - rscadd: All material sheets now fetch a price from the supply drone, not just - plat and phoron. - - tweak: As a result, the prices of all materials have gone up to a minimum of their - resale cost. Steel is 60 credits now, for example. - - tweak: The recipe of plasteel is now steel + platinum (put the steel back through - the unloader) and the recipe for osmium-carbide plasteel is plasteel + osmium. - afterthought2: - - rscadd: Hacking without the electrical skill is harder now. - - rscadd: If you are unskilled in electrical, hacking will randomize the wire positions - (not meanings) each time you open the screen. If you are basic, you'll get some - possible duplicate colors/omitted colors, with smaller probabilities. - - rscadd: If you pulse a wire below trained skill, you have (progressively smaller) - chances of pulsing the wrong wire. If you are untrained, you may randomize wire - positions for everyone else trying to hack the thing. - - rscadd: If you cut/mend wires below trained skill, you may cut/mend some extra - wires by accident. - - rscadd: If you try to place a remote signaler with low skill (trained or lower), - you might place it on the wrong wire, and then have a hard time removing it. - - rscadd: A new "Examine" option has been added to the hacking menu. Below experienced - it doesn't do much. On experienced one or two wires will be identifiable on - examine, while at master most will be. Less effective for "secure" objects with - randomized wiring. -2018-08-16: - IsdatAfamas: - - rscadd: Added an away site. It has a few slots open to join as a survivor. - - rscadd: See https://forums.baystation12.net/threads/ctis-research-ship-missing.6790/ - for lore info. -2018-08-17: - Cajoes: - - tweak: flood lamps now start in the off position - - tweak: green ink pens are now greener - - tweak: washing machines now more in line with graphic style of server - - tweak: toys and plants now use less unused animation frames, reducing overhead -2018-08-18: - IsdatAfamas: - - maptweak: Added polarized windows to robotics. - - bugfix: CTI ship should spawn correctly now. - Zuhayr: - - rscadd: Added Tritonians, an uwhitelisted human subspecies. -2018-08-19: - Devildabeast: - - tweak: All Marine Corps uniforms and items have been renamed to reflect the SCG - Army, removing all references of the Marines. - - rscadd: Adds an array of Army outfits, spawnable by admins. - - tweak: The Marine (now Army) PT uniform is now black instead of green. -2018-08-20: - IsdatAfamas: - - bugfix: Various fixes implemented for SRV Verne. Overall should be far less deadly - as an away mission. - nearlyNon: - - tweak: You can now select a bible from the loadout. - sick trigger: - - rscadd: Ghosts can now 'Scan-target' to analyse the thing they're following. -2018-08-22: - Cajoes: - - rscadd: Napalm and Napalm B recipes. Sticky burny goo. - - tweak: relabeled old napalm recipe to phlogiston. Makes heat. And little else. - Same as old napalm. - Cakey: - - rscdel: Removed Tajarans from the server. - Hubblenaut: - - bugfix: Fixes cable coils spawning in tool belts having old vibrant color. - - tweak: Tool belt cable colors are now completely random. - IsdatAfamas: - - bugfix: Some more CTI ship fixes. - Sbotkin: - - tweak: Allows shredding of fingerprint cards. - TheWelp: - - rscadd: 'Imports TG''s circuit updates: ICs now requires power to operate. IC - printer is now hand-held and can copy & print assemblies fully.' - - rscadd: Adds new ICs. - Zuhayr: - - rscadd: Numerous new ores spawn on the asteroid. They can be compressed into bricks - and ground up for reagents. - - tweak: The ore processor has been rewritten and will happily eat anything containing - metal or other substances, and can then fart them out as sheets. - - rscadd: All material sheets now fetch a price from the supply drone, not just - plat and phoron. - - tweak: As a result, the prices of all materials have gone up to a minimum of their - resale cost. Steel is 60 credits now, for example. - - tweak: The recipe of plasteel is now steel + platinum (put the steel back through - the unloader) and the recipe for osmium-carbide plasteel is plasteel + osmium. - afterthought2: - - rscadd: Hacking without the electrical skill is harder now. - - rscadd: If you are unskilled in electrical, hacking will randomize the wire positions - (not meanings) each time you open the screen. If you are basic, you'll get some - possible duplicate colors/omitted colors, with smaller probabilities. - - rscadd: If you pulse a wire below trained skill, you have (progressively smaller) - chances of pulsing the wrong wire. If you are untrained, you may randomize wire - positions for everyone else trying to hack the thing. - - rscadd: If you cut/mend wires below trained skill, you may cut/mend some extra - wires by accident. - - rscadd: If you try to place a remote signaler with low skill (trained or lower), - you might place it on the wrong wire, and then have a hard time removing it. - - rscadd: A new "Examine" option has been added to the hacking menu. Below experienced - it doesn't do much. On experienced one or two wires will be identifiable on - examine, while at master most will be. Less effective for "secure" objects with - randomized wiring. - nearlyNon: - - rscadd: Inducers. Make them in science. They're a TGstation item, you can charge - anything that uses a battery with them. Almost. Screwdriver to remove and replace - its battery. - - rscadd: Cyborg integrated version of the above, using the borg's internal battery, - and a failsafe on it. - - rscadd: IPCs and FBPs are now adversely affected by ion storms. They will be confused - and have blurry vision as their system partially resets to remove ionospheric - corruption. To avoid this, hide out in a saferoom or shuttle, or the dorms or - such. - - rscadd: Prescription science goggles can now be selected from loadout. -2018-08-23: - CrimsonShrike: - - bugfix: Oxygen regenerators should no longer get stuck trying to get or output - gas. -2018-08-24: - Chinsky: - - tweak: CO2 is no longer poisonous. Just non-breathable. Should make Bearcat a - walk in the park. - - tweak: Added CO, which /is/ poisonous. - - tweak: PACMANs that run on plasma now produce some CO, around a mole per 40 seconds, - so make sure you open the window (or turn on scrubbers) before using. - SierraKomodo: - - tweak: Makes NT Security Guard HUD icons purple instead of red. -2018-08-25: - Cajoes: - - rscadd: added supply crate for wrapping paper - - tweak: toned down the toner and floodlamp crates - Textor: - - rscadd: Sleepers, cryo tubes, full body scanners, full body scanner control consoles, - and operating tables can now be constructed. - - rscadd: The aforementioned machine boards are now researchable and printable at - the protolathe. - - rscadd: Added the ability to drag-and-drop players to cryo pods. - Zuhayr: - - rscadd: The General character generation tab has been split between Background - and Physical. - - rscadd: The faction/species/homeworld backend has been completely rewritten. - - tweak: Check your species, faction and homeworld settings as well as the new 'culture' - option under Background. -2018-08-26: - Heptagon49: - - rscadd: You can now rotate unwrenched computer frames via context menu or alt-click. - - imageadd: Added directional icons for computer frames. - nearlyNonexistent: - - rscadd: Two new IPC monitor screens, one an obvious parody of the original Doom, - the other Tetris. -2018-08-28: - Cakey: - - rscadd: Added the Secure Energy Revolver to the CO and XO's closets, replacing - their respective energy guns. - CrimsonShrike: - - rscadd: Oxygen regenerator board added to circuit printer. - nearlyNonexistent: - - tweak: Chameleon kits no longer shapeshift back to normal (and psychadelic) when - EMPed. -2018-08-29: - SierraKomodo: - - rscdel: Removed Floorlength Braid hairstyle - nearlyNonexistent: - - tweak: Press drone can now take photos. - - tweak: Cameras stay off after taking a photo. - - tweak: Photo albums can be taken from the loadout, along with a roll of photo - tape. -2018-08-30: - Chinsky: - - tweak: Sensor console now grants much further viewrange on the map. - Textor: - - rscadd: You can now build light switches and window tint switches with a steel - sheet. - - rscadd: 'To build: use a screwdriver on the frame. You can also use a screwdriver - to disassemble them.' - - bugfix: Fixed issue with converting new-style reinforced windows to electrochromatic - windows. You can use a cable coil on them to convert them properly now. - - tweak: Modified how window tint switches interact with multitools. You can now - set the window ID with the multitool. You can also set the window ID by using - a multitool on the electrochromatic window. -2018-08-31: - Miraviel: - - rscadd: Added 10 more targeted emotes! Use them as *salute fullname. - Textor: - - bugfix: GAS have now been adequately trained by Xynergy on the proper use of stairs. - They will no longer hover above them, afraid to go down. - - bugfix: GAS no longer have their tracheae rupture in low pressure environments. -2018-09-01: - Banditoz: - - tweak: Light frames can now be placed in the actor's area. - Cakey: - - tweak: APLU circuits can now be printed by default. - MO_oNyMan: - - maptweak: Added missing cameras to forensics office, evidence storage and briefing - room - - maptweak: Added a recharger on d4 security checkpoint - - maptweak: Forensic technician can now access morgue from the front door - Textor: - - bugfix: The supermatter monitor no longer cares about delaminating supermatter - crystals not on board the Torch. Those other crystals must suffer silently, - now. - nearlyNonexistent: - - rscadd: Ports Polaris's synthetic eye color changing. IPC, synthetic human, and - Adherent eyes are now RGB. Properly covered by display monitors too. - sabiram: - - tweak: People wearing most hardsuits are now able to be handcuffed. -2018-09-03: - CrimsonShrike: - - bugfix: Fixes pulling circuit checking for its own position and not its holders - Sbotkin: - - maptweak: Replaces strategic reserve of laptops in the infirmary with consoles - and telescreens, where needed. - afterthought2: - - rscadd: Makes exterior airlock assemblies buildable (need Basic skill). - sabiram: - - tweak: The force authorisation and docking management programs now must be run - on suitably powerful equipment, namely a laptop or a console. - - tweak: Increased tech cost of the teleporter console circuitry. - - maptweak: Moved research and development circuit boards into secure storage. - - maptweak: Added more APC and airlock circuits to tech storage. -2018-09-04: - Chinsky: - - rscadd: 'Added a new event: Maintenance Drones Uprising.' - - rscadd: It spawns hostile versions of maint drones in maintenance. They will not - attack anyone they perceive as synth. - CrimsonShrike: - - tweak: Medical circuits now largely inform of severity instead of exposing internal - values. Adapted medical integrated circuits to brainmend. - nearlyNonexistent: - - maptweak: Security now has prybars instead of crowbars. - - rscadd: You can now flip blindfolds up, and start with one from your loadout. - Tape ones can't be flipped as they're not made of cloth. Blindfolds from loadout - are colorizable. - - rscadd: One new AI hologram. - - tweak: Clippy is no longer malf only. -2018-09-05: - nearlyNonexistent: - - rscadd: 'New items intended for antags to steal; several secret documents that - spawn in the SCGR''s office, the conference room, and the NTL''s office. Gotta - collect them all! (Disclaimer: only 3/6 spawn in a game.)' -2018-09-06: - nearlyNonexistent: - - tweak: Water now lasts a minute on the ground, to make it more useful to have - wet floor signs. For reference, space lube is 10 minutes, and the cult spell - is 6 minutes. -2018-09-07: - Textor44: - - bugfix: Surgeons can no longer create magical floating limbs by attaching hands - and feet to a patient lacking an arm or leg. -2018-09-08: - Textor44: - - rscadd: Adds the savage hunter (male and female) clothing for Unathi civilians - in the loadout under xeno wear. -2018-09-09: - FTangSteve: - - rscadd: simple mobs now take different damage from different unarmed attacks - Textor: - - tweak: Staff now take tickets when they hit the "PM" button in the ticket panel. - - rscadd: Adds the ability for admins to change the end credits slightly. - Textor44: - - bugfix: Catwalks can now be cleaned by mops and soap by simply clicking on them. - Janitors everywhere rejoice at having to do less work. - - tweak: Soap now takes a longer time than a mop to scrub floors. Janitors everywhere - grumble at having to take longer at doing their job. - - tweak: Soap no longer can be used to knock people over by dragging them onto it. - Janitors everywhere are sad they can no longer prank people as easily. -2018-09-10: - CrimsonShrike: - - tweak: Signallers no longer give visible or audible feedback that they received - data. There's circuits for that and frankly we were all thinking of killing - the roboticist. - - rscadd: New filter circuits, so that you can discriminate properly - - bugfix: Fixed hypoinjector circuit not injecting - Zuhayr: - - rscadd: Added the ability to carve graffiti into some walls and floors with sharp - objects like screwdrivers. - - rscadd: Being a slog now has long-term consequences. -2018-09-11: - Cajoes: - - rscadd: Some new cargo items, boxed snack foods for refilling vendors, etc. (canned - bread does not go into Galley-!) - - rscadd: Added new cargo order tabs and orderable items. Galley, Custodial, Exploration, - Non-Essentials, etc. - - tweak: Rearranged existing cargo tab contents to something resembling logic. Floor - tiles go into Flooring food supplies to the galley, costumes and hats into Non-essentials, - etc - - rscdel: 'Removed the Tabs: Reagents, Miscellaneous and Hospitality tabs as they - ended up empty once the re-ordering was complete and no longer served a function.' - - rscdel: Crate of Boxes, Crate of Empty Reagent Cartridges, Ripley APLU Circuitboard - Crate - Chinsky: - - bugfix: Fixes microscope always treating partial prints as complete. End of golden - age of forensics. - - rscadd: New forensic evidence type - trace DNA. Left on unfinished food, glasses - people drank from, cig butts and gum wads. Collected with swab kits, investigated - in DNA scanner. - - rscadd: Grabbing, pulling, and hitting people unarmed now will wrinkle their uniform/suit - and leave fingerprints. Usual protections against prints apply there. - CrimsonShrike: - - bugfix: Demultiplexers should have data set correctly now. - ParadoxSpace: - - rscadd: Tritonians now handle water better. They still cannot breathe it, so be - careful, okay? -2018-09-19: - Chinsky: - - rscadd: Added ANFO, a fertilizer+fuel explosive. Mix any of fertilizers (EZ-nutriment, - Left 4 Zed or Robust Harvest) with welder fuel to make it. Add aluminium for - more oomph if you can get it. - - rscadd: To actually make it boom, you need ANOTHER explosion first. A weak explosion - will pretty reliably activate <60u, strong <120u, devastating for more. If it - wasn't strong enough, it can still trigger part of reagent. - - rscadd: Due to related changes, any container holding welder fuel can now explode - if caught in an explosion, though don't expect much oomph. - - rscadd: Added ability to manipulate tape recorder tapes. - - rscadd: User wirecutter to cut tape, use tape on tape to join them. - - rscadd: You can get loose tape out by clicking tape inhand. Join them to put back. - Master forensics techs will be able to tell if it was tampered with. - - rscadd: Tape recorder now have a single wire that starts playback when pulsed. - - rscadd: Adds vinegar reagent. Can be made from ethanol or apply juice by applying - universal enzyme as catalyst. - - bugfix: Adds mayo. Can be made from egg yolk and vinegar or lemon juice. - - tweak: Adds alternative soy sauce recipe. Now it can be made with 5u Soy Milk - + 5u Vinegar - CrimsonShrike: - - rscadd: 'New instruments are now available through supply. rscdelete: Removed - old piano and old violin,' - Zuhayr: - - rscdel: Removed NanoTrasen rank. You can use the contractor rank to get access - to science roles now. Play whatever company you like. - - tweak: The Torch has unionized under the Torch LLC Corporate Union. You can get - a union card in loadout and the Corporate Liaison is now the Workplace Liaison, - with Corporate Liaison and Union Representative available as alt titles. Worker's - rights! - sabiram: - - rscadd: Added missiles for admins to throw at the ship. -2018-09-22: - Aticus: - - imageadd: Adds a new, female-centric hair style for Unathi. The Frills Strike - Back. - Neon1ight: - - rscadd: Added the Xenolife Technician job. It is a crew research position, allowing - EC players to be part of the research department. ICly, it specializes in xenobiology/xenobotany. - Zuhayr: - - rscadd: Education is now a selection in your background tab. Jobs are restricted - to certain minimum educations. You will likely need to change your background - tabs for all characters who work jobs other than Passenger. - - rscadd: Doctorates and medical degrees in the education system modify your record - and ID name to 'Dr. Foo, MD' or 'Dr. Foo, Phd'. - - tweak: Skrell will no longer present as hive minds on their ID and crew records. - - rscadd: Mops can now mop up shallow fluids. - - tweak: Hydrogen fires should no longer result in biblical floods. - - tweak: Floods should now clean up filth decals properly. -2018-09-24: - Cajoes & ChaosAlpha: - - rscadd: mobs now tip over when slipping or resting - Chinsky: - - rscadd: Can now put items into forensic microscope for scan, instead of using - tools on it first. Clicking on microscope with evidence bag puts item inside - too. - - rscdel: Removed alium-turning monolith from trader base. - CrimsonShrike: - - rscadd: Adds some more feedback to augments. - Miraviel: - - rscadd: Added a normal headset to the pilot locker and bowman headsets to corpsman, - medical contractor, physician lockers. - Zuhayr: - - tweak: Graffiti now requires you to be on help intent. -2018-09-26: - Zuhayr: - - tweak: Noticeboards can be built out of wood, dismantled with a wrench, and rearranged - with a screwdriver. - - rscadd: Papers on noticeboards will persist round to round. - - rscadd: Sticky notes can be ordered from cargo and will also persist round to - round. - - rscadd: Mods can now view a list of all persistent data. Admin can use this list - to destroy it with prejudice. - - rscadd: Relatedly, you can now be jobbanned from Graffiti. - nearlyNonexistent: - - rscadd: Science can now print bluespace syringes and cryostasis syringes. Inject - people with more chems at once (20u each; 60u total) or inject them with water/potassium. -2018-09-27: - CrimsonShrike: - - tweak: Rigs can now be hacked after lifting wire cover with a screwdriver. - - tweak: Rig modules and cells are now removed with wrench. - ParadoxSpace: - - rscadd: Adds the Yeosa'Unathi subspecies, their language, their faction, and their - attack. Also gives Yeosa glowing eyes. - - tweak: Lowers how hungry Unathi are at the expense of slower healing. - - bugfix: Fixes issue with tail attack messages. - - bugfix: After much debate as to whether Yeosa count as Unathi, the Expeditionary - Corps have finally allowed Yeosa to wear Unathi cultural clothing from the loadout. - - rscdel: Unathi can now no longer manually toggle on and off involuntary processes - like self-healing. - Textor: - - maptweak: Bridge Deck - Captain's quarters' light switch is moved so that you - are no longer likely to remove the light tube when turning the lights on. - - maptweak: Deck 1 - Xenoflora and Miscellaneous labs are now brighter. This should - allow for scientists to actually see the things they work on. Robotics now has - solid doors. Privacy windows are no longer thwarted by looking through the door-windows. - Added a window to the mech bay side to compensate for the lack of visibility - from that direction due to the door no longer having a window. Door to storage - next to robotics actually opens for the roboticist now. Removed power cable - to nowhere in deck 1 starboard fore maintenance. Swaps the filing cabinet and - table in the morgue so that the paper bin, folder, and pen are actually accessible - when someone is working in there. - - maptweak: Deck 2 - Adds a shield diffuser at the edge of the old brig border so - trash will stop being stuck behind the shields when ejected into space from - the trash room. The shield should no longer block the airlock in deck 2 starboard - mid maintenance due to wall unevenness. - - maptweak: Deck3 - Adds a second mineral bath to deck 3 cryogenic storage wardrobe. - Moves photocopier and shredder in office so that they can both be used normally. - - maptweak: Deck 4 - The toxins storage room is now directly off the hangar in order - to let scientists actually get to their toxins storage room. Finally adds a - security camera to the fuel bay. The AI can now watch the fascinating process - of refueling. Moves the atmos control computer in the Petrov Laboratory so that - you can actually reach all the counter space when working. - - bugfix: Had a long discussion with the OR computers and we both agreed that they - need to actually face the direction they were mapped in. - Zuhayr: - - rscadd: Added a crashed escape pod that may generate on exoplanets and allow for - latejoiners a la Bearcat. - - tweak: Some ruins and submaps will add themselves to the distress signal list. - Probably worth checking now. - - rscdel: Prevented submap jobs from being test-spawned by the global datum system - as they do not expect null args. - afterthought2: - - rscadd: The IT skill now has gameplay effects when using modular computers. - - rscadd: 'Higher IT skill allows the user to bypass logging on program download - with higher probability (Trained: 30%, Expert: 60%, Master: 90%). Logs will - still be generated, with faked entries for the download info.' - - rscadd: The antag access decryption program is more effective at higher skill - levels. It works faster and has a chance to avoid tripping the alarm. At unskilled - (generally meaning non-antag) it has a chance to give the wrong access. - - rscadd: The antag camera alarm-trip probability is now tied to skill, with similar - effectiveness as current at Trained. - - rscadd: The antag dos program is more effective at higher skill, with more dos - attacks per tick at higher levels (equal to current at Basic). At expert and - master, gives extra fake attacking nodes to the system log to impede sysadmins. - - rscadd: The network monitor, email administration, and AI management programs - are locked below basic, basic, and trained skill, resp. You will instead get - some random data displayed. The programs do link to a terminal now. - - rscadd: Added a command line interface for modular computers. With enough skill - (expert+ for most things) you can run specific commands (type man for a list) - to do rudimentary sysadmin diagnostic tasks. Notably, with network access, you - can ssh into terminals of other computers over the network. If you are unskilled, - you may get various failure effects or just be unable to do anything. - - rscadd: To access the terminal, either use one of the programs or use Ctl Alt - Click. - zaredman: - - tweak: Adds defib and compact defib crates to be ordered through supply. - - tweak: Added holosign projector and advanced mop to the janitor robot. - - tweak: Added medical HUD to the surgical robot. -2018-09-28: - sabiram: - - tweak: Added a delay to welding/unwelding airlocks. - - tweak: Xenolife Technicians no longer have access to the fabrication lab or Petrov - helm. -2018-09-30: - Cakey: - - maptweak: Added Deck 5, an expansion of Deck 4 adding more verticality to the - ship beyond stairs and ladders. Deck 4 has been split up to accomodate these - changes. - - maptweak: The hangar has been moved inwards to be more centralised on Deck 5. - - maptweak: The lounge has been moved under cryogenics and now overlooks the hangar - (Still accessible from cryogenics). - - maptweak: The officer's mess has been moved under the mess hall and now overlooks - the hangar (Still accessible from the mess hall). - - maptweak: The Petrov has been made slightly bigger to be more useful. Moved several - research suites to the Petrov. - - tweak: The Research Director and Corporate Liason can now use the ID program to - modify accesses within their own department. Petrov accesses are now only modifiable - by the Research Director and NTL - - tweak: Fixes the commissarry shutter access requirement. - Miraviel: - - maptweak: Repositioned lights in the SEA's office, the XO's and CO's request consoles, - the fire extinguisher cabinets on the Bridge, the labels at the stairs, and - the CO's light switch. Removed the overlapping Nanomed from the Bridge and the - urinal from the Aquila. -2018-10-02: - Cakey: - - maptweak: 'Made maintenance style-consistent throughout all decks with techmaint - tiles and railings. maptweak: Made railings not obstruct items, shuffled some - items around to not be behind railings.' - - maptweak: Added a single seat in the lounge facing space, which takes up barely - any extra space. - - maptweak: Added a fax machine to the pilot's lounge. - - tweak: Fixed Petrov airlock accesses. - - tweak: Fixed Hangar maintenance airlock accesses. - ParadoxSpace: - - rscadd: After complaints that Unathi would have to be cut open [stack overflow] - amount of times with a scalpel, Unathi can now again toggle their healing. - - tweak: To reflect their biology, Unathi are now actually ectotherms instead of - being particularly cold-sensitive endotherms. - Sbotkin: - - rscdel: Removed peacekeeper armband from loadout. - Textor: - - bugfix: Helm control, engine control, sensor, and navigation consoles no longer - stop functioning after repair or construction. Just hit "reconnect." - - bugfix: The windowtint button on the back wall of the XO's office actually works - now. - sabira: - - tweak: The research department's colouration has changed from the red of NanoTrasen - to the green of Torch, Limited. - - tweak: Torch, LLC (the holding company representing the research department) has - been renamed to Torch, Ltd. - - maptweak: Changed the area around research to use the green decals, and new Torch - Ltd logo. - - maptweak: Changed the research director and liaison's offices on the bridge to - make use of the green decals. - - rscadd: Added legacy NanoTrasen uniforms to the loadout. - sabiram: - - tweak: Adherents of the Vigil can now play as Janitor, Chef, Bartender, Supply - Assistant, Engineering Contractor, Roboticist, Chemist, Research Assistant and - Researcher. - zaredman: - - maptweak: Adds dedicated Robotics OR. - - maptweak: Each OR now has holosigns to show when they are in use. - - maptweak: Moved some items from the joint OR to the robotics OR, added some extra - tools. - - rscadd: Separates Roboticist and Biomechanical Engineer. -2018-10-03: - Chinsky: - - tweak: Various changes to gunshot residue (GSR) forensic thingamabob. - - rscadd: Shooting someone pointblank will now leave GSR on the targeted organ, - and burn them a bit. Just like in those mystery novels! - - rscadd: You now need to aim at hand to take GSR from THAT hand, not from both. - You can take GSR from other bodyparts by aiming at them too. - - rscadd: Gun actually gets GSR too now. - - rscadd: Guns have a chance to leave GSR on the ground when fired. - Miraviel: - - rscadd: Added mechanical description to skill blurbs. - ParadoxSpace: - - rscadd: Adds a menu for you to select from your list of available attacks. Naturally, - this depends on species. - Sbotkin: - - rscdel: Removed ID modification and weapon authorization tools from command computers. - Textor: - - tweak: Lets engineering module and maint drones pick up floor tiles. They can - now put the tiles they levered off the floor back. - sabiram: - - maptweak: The hallway leading from the elevator to engineering in the maintenance - deck has been re-opened. - - maptweak: Moved security guard lockers from Petrov to the main checkpoint. -2018-10-04: - CrimsonShrike: - - bugfix: Rotating should no longer make science floor disassemble. - afterthought2: - - experiment: 'We are conducting some stability testing. You may notice issues with - how objects below you, on other z levels, are rendered: this is expected.' -2018-10-05: - Spookerton: - - bugfix: Automatic shutoff valve circuit toggling now works as intended. - Textor: - - rscadd: Deimos Advanced Information Systems (DAIS) is now officially in the game. - Lunchboxes, mugs, an undershirt polo, contractor uniforms, winter coats, and - a labcoat, are all in-game now. - - rscadd: DAIS is now a faction in the background tab of the character creator. - - rscadd: A new experimental DAIS lawset is available for researchers to install - in an AI. - - maptweak: Adds DAIS lunchbox, coat, and mug to telecomms room. - - bugfix: Corrects science labcoat description to reflect new color scheme. - - bugfix: Replaces lingering references to Torch, LLC with Torch, Ltd. - greggbot: - - rscadd: RFID Card Broadcasters, previously only found in PDAs, can now be printed. - zaredman: - - tweak: Adjusts max skill points and skill caps for Biomech and Roboticist. -2018-10-06: - Sbotkin: - - bugfix: The microphone circuit now translates non-GalCom languages only. - sabiram: - - rscadd: Added new colours of wrench and wire cutters, wherever wrenches and wire - cutters are found. - - rscadd: Adherent players can now select from some pre-set colours in character - creation. -2018-10-07: - Cajoes: - - rscadd: Added cubed spiders - - rscdel: Removes previously added domestic animal cubes - Cajoes & Earthcrusher: - - rscadd: Mass Driver Ammunition, two types. - - rscadd: Icon for the blunt mass driver round by Earthcrusher - afterthought2: - - bugfix: Air sensor thresholds should now work properly. - zaredman: - - tweak: Adds wheelchair and roller bed crates to be ordered through supply. - - tweak: Raises minimum player age for AI to 7 days and Cyborg to 3 days. -2018-10-08: - Atebite: - - bugfix: Fixed less wet floors increasing slip chance. Mopped floors should now - only have a 50% chance of slipping you. - Cajoes: - - rscdel: Removed the mention of crate in the cargo interface order form. Since - it is implied the shipment will be in a crate.. or locker.. or otherwise sealed - in some material. - - rscdel: Removed \improper tags from labels that didn't require them. You will - neither notice nor care. - - rscdel: Removed dispenser cartridge packs from Galley-Cargo due to redundancy. - Refer to Dispenser Refills-Cargo. - Textor: - - rscadd: Adds buttons to allow selecting "high," "low," or "never" on all antag - roles with a single click. - TheWelp: - - rscadd: Adds the starlight deity! Embodiment of fire and flame, watch out for - its super-powerful heralds and minions of light and darkness. - afterthought2: - - tweak: '"Starburst" spell has been heavily nerfed. The fireball spell is no longer - available in starlight deity mode pending balance adjustments.' - zaredman: - - tweak: Adds recipe for Chemistry to synthesize adrenaline. -2018-10-10: - FTangSteve: - - tweak: janihud now bases vision off of what the mob wearing it can see instead - of the tile - - rscadd: nabbers can now use HUDs - greggbot: - - bugfix: IC seed extractor now properly creates the appropriate seed and deletes - the fruit. -2018-10-12: - Atebite: - - tweak: Added a skillcheck for slips based on athletics - Cakey: - - maptweak: Tweaked several areas within maintenance after feedback. Removed majority - of railings. - - maptweak: Fixed shutoff valve layout on decks 4 and 5. - - maptweak: Swapped Petrov air pump with one that starts as on. - - tweak: Railings can now be wrenched open to allow passage, and the time it takes - to climb railing has been reduced from 5 seconds to 1.25 seconds. - - maptweak: Fixes merchant base accesses. - - maptweak: Removes a bunch of tiles from maintenance over piping and wires. - - maptweak: Fixes lack of cameras on D5. - - maptweak: Fixes dark spot on D4 fore hallway. - - maptweak: Adds consoles to pilot's lounge, exploration prep. - - maptweak: Adds suit sensors/camera monitoring console to Charon. - - maptweak: Adds exploration network cameras to explorer helmets. - - maptweak: Gives the shuttle pilot access to explorer camera network, suit sensors - monitoring. - - maptweak: Fixes noticeboard placement around the map, added extra noticeboards - to departments that lacked one. - - tweak: Fixes Petrov camera network, only accessible by LLC employees. - Chinsky: - - tweak: Disarming is now riskier. There's a chance to hurt your hand on the weapon - you're going for instead, with chance adjusted based on skill difference / being - flashed etc / being on help intent. -2018-10-13: - Anticept: - - balance: Increased atmospheric pump efficiency, and atmospheric filter efficiencies. - Pipe wizards rejoice! - - balance: Increased air injector internal tank size as well as power cap. this - increases its flow rate due to how atmospheric devices perform their math. Pipe - wizards rejoice! -2018-10-15: - Textor: - - tweak: Due to the extremely likely outcome of death for the crew upon ejection - of the escape pods, command has moved abandon ship from Command and Communciations - to Keycard Authentication Devices and renamed it to "Initiate Evacuation Procedures." - Abort still occurs at C&C consoles, as does bluespace jump initiation. - - tweak: Moves bolt/unbolt saferooms from Keycard Authentication Devices to C&C - - tweak: Changes Keycard Authentication Device interface to NanoUI -2018-10-16: - Cakey: - - maptweak: Fixes Petrov isolation cell alarm placement. - - maptweak: Added sticky notes to offices around the ship. - - maptweak: Added noticeboard to head of staff offices where missing. - - maptweak: Added missing air alarms to hangar, hangar storage. - - maptweak: Fixes hangar exit button access. - - maptweak: The Aquila is now overmap-capable. - - maptweak: The Guppy has been given some extra cargo space. - Roland410: - - tweak: Changes Tower deity spells to have more charges, and the fountain of power - only takes 30 seconds to recharge it. - Textor: - - tweak: O2 Tanks are once again removable without having to take your entire hardsuit - off. Hardsuit users will no longer risk suffocating in a vacuum because they - ran low on air. - afterthought2: - - rscdel: Spiderbots have been removed. - - maptweak: The telescreen by the copier in medical has been removed; some laptops - have been restored. - - tweak: Everyone gets four times more starting cash. - - tweak: Traders spawn much more often, and stick around about four times longer. -2018-10-17: - Melioa: - - bugfix: Fixes text displayed when examining an Automatic Shutoff Valve. - Textor: - - rscadd: Body scans now look different depening on the skill of the person reading - them. This includes printed and scanned versions. - - rscadd: 'New machine: Body Scan Display. It can have scans pushed to it for surgeons - to reference.' - - tweak: Body scanner UI updated to nanoui. - - maptweak: Maps in two body scan displays, one in the main operating room, the - other in robotics operating room. - sabiram: - - tweak: The conglomerate representing corporate interests onboard the Torch has - been renamed to Tenjin Holdings. - zaredman: - - maptweak: Adds washroom to medical. Moves a maint ladder to give some space. - - maptweak: Expands medical's D3 storage slightly to use up unused space. - - maptweak: Adds trash chute to medical locker room. -2018-10-18: - sierrakomodo: - - bugfix: Fixes mouse/drone duplication bugs with cookers, microwaves, and destructive - analyzers (#14179) - zaredman: - - tweak: 'Change to chem recipe for making adrenaline: now requires inaprov, hyperzine, - and dex+.' -2018-10-19: - Miraviel: - - maptweak: Added proper piping to the infirmary hallway and lighting to the locker - room. Added missing shutters and moved around a few overlapping objects. -2018-10-20: - EcklesFire: - - rscadd: Added helmets to Xenowear loadout for Skrell in security/roles that use - armour. Credits to Karbivio for icons - Miraviel: - - rscadd: 'Added the following new emotes: afold, alook, crub, eroll (targeted), - erub, hbow, hip, holdup, hrub, hshrug, hspread, fslap, ftap,pocket, rsalute, - rshoulder, squint (targeted), tfist, tilt.' - Sbotkin: - - bugfix: Fixes the integrated circuits recycling. - - rscadd: Allows to recycle assemblies and individual circuits. -2018-10-21: - zaredman: - - bugfix: Replaces D2 Atmos CO2 high-power pump with pressure regulator and replaces - D5 CO2 high-power pump with a normal pump to avoid unintentional blowouts. -2018-10-22: - Datraen: - - tweak: Uplink kits come in generic containers now. - Textor: - - tweak: Changes Torch Ltd. to Expeditionary Corps Organisation in several spots. - - tweak: Adds DAIS labcoat to roboticist and biomech engineer loadouts. - sierrakomodo: - - rscadd: Bridge Officers now have access to the Charon's Airlock and Charon's Helm -2018-10-24: - Anticept: - - tweak: All pipes, except fuel pipes, now have the same pressure damage threshold. - Previously, cross-z pipes were significantly weaker. Fuel pipes' extremely high - threshold remain unchanged. - - tweak: All pipes have a slightly higher burst pressure threshold. - BlueNexus: - - tweak: '"Many chemicals now require heating or cooling in order to mix. Check - the wiki for specifics."' - - maptweak: '"Added heaters and coolers to various locations on the map."' - Roland410: - - rscadd: Radiation suits got a larger pocket and you can fit your geiger counters - on them now. Technology! - Sbotkin: - - tweak: All guns now spawn with safety on. - - bugfix: Fixes twohanded weapons not being rendered when on back. - afterthought2: - - tweak: Ship movement physics have been altered. Ships are now generally slower - to accelerate, though can move pretty fast when at max speed. This includes - the Torch as well as overmap-capable shuttles and away site vessels. - - bugfix: Overmap wrapping when moving diagonally has been fixed. - - tweak: Shuttles no longer have gravity when not at a location that has ambient - gravity. - - rscadd: A new admin tool has been added, Toggle Overmap Halt, which allows admins - to make all overmap ships stop and freeze them from moving. - - rscdel: The Move To Top object verb has been removed due to changes in the new - BYOND version making it no longer work consistently. - sierrakomodo: - - maptweak: Pilot's Lounge and Deck 5 Maintenance now have air alarms -2018-10-26: - Sbotkin: - - rscadd: Experienced shooter will disable the safety if they draw a gun with harm - intent. - - tweak: Captain's revolver (the one in the showcase) spawns with no ammo. - - bugfix: Fixed a bug with safety state not showing after unholstering. -2018-10-27: - Melioa: - - tweak: Replaces 'Broad-shouldered' setup build for 'Well-built' -2018-10-29: - Gates: - - rscadd: NTOS now requires MANDATORY updates every once in a while. - MistChristmas: - - maptweak: Added a weapon charger to Deck One Checkpoint - - maptweak: Removed fire alarm hiding in a bin in excavation prep -2018-10-30: - BlueNexus: - - rscadd: Added insulated beakers. It is now actually possible to make clonex. Oops. - - tweak: Clonex no longer requires phoron. - RyanSmake: - - rscdel: Removed NTNet relay from Bearcat space ruin as it was non-functional. - SierraKomodo: - - bugfix: All disposal units should now be connected to the disposal network. - sierrakomodo: - - bugfix: Adds missing disposal pipes to the briefing room. -2018-10-31: - Textor: - - tweak: The bodyscanner now provides feedback when pushing scans to the OR displays. - sabiram: - - rscadd: Some jobs now have a cap on education tiers you can select. -2018-11-01: - EcklesFire: - - imageadd: Adds new icons for the Skrell riot security voidsuit to bring it in - line with the Torch voidsuit. Credits to Karbivio. -2018-11-02: - afterthought2: - - tweak: Secret and random will (almost) never fail to start when voted in. - zaredman: - - maptweak: Adds Security, Science, and Engineering department pagers in their respective - lobbies. -2018-11-03: - Cakey: - - rscadd: Added fleet branch berets, for showing off your branch when you need to - wear your service uniform. - SierraKomodo: - - bugfix: Job slots should now open back up properly whenever someone cryos from - a multi-slot job -2018-11-04: - SierraKomodo: - - bugfix: OOC lobby manifest entries should now show proper Active/Inactive status - - rscadd: Crew records now have a separate 'Formal Name' field that contains the - MD/PhD/etc suffix. This will be the name displayed on manifests. - afterthought2: - - balance: TC prices on some merc items have gone up. - - tweak: You can now dump the contents of a pill bottle into the chem grinder by - clicking the grinder with the bottle. -2018-11-06: - Datraen: - - rscadd: Added Skrellian SDTF Holobadges, verb to set individual SDTF. - Miraviel: - - rscadd: 'Added three new hairstyles: Donut Bun, Gentle 2, Gentle 2 Long.' - SierraKomodo: - - bugfix: Crew manifest entries should now update properly when someone cryos - afterthought2: - - balance: EMPs now deal much less damage to synthetic humans (FBP, IPC), though - the amount is still considerable. - - balance: Damaged robotic legs and feet reduce movement speed. - - balance: Robotic external organs will, if heavily damaged or the damage taken - is large, pass burn damage to contained internal organs. - - tweak: Cell organs are dramatically less power-efficient if damaged. - - tweak: If a synthetic human runs out of juice, they become unconscious. -2018-11-07: - sabiram: - - tweak: It now takes some time to repair and pry open/closed blast doors and shutters. - - rscadd: Added a EXO polo undershirt to the loadout underwear options. -2018-11-08: - Earthcrusher: - - bugfix: Emotes ending in quotation marks will no longer add a superfluous period - on the end. - - bugfix: Lazy typists rejoice! When speaking, the game will automatically capitalize - and add punctuation where needed. Well at least on the end of the sentence. - - tweak: Emotes now use the visible emote character set in your Character Setup, - which defaults to "^". - EcklesFire: - - tweak: Removes Skrell education background requirements and allows them to utilise - more unarmed attacks. - SierraKomodo: - - bugfix: Deck 5 hallways now have air alarms. - sabiram: - - tweak: All various subcontractor (NanoTrasen and Hephaestus Industries, at time - of writing) items in the loadout have been merged into one item with type selection. - Key word to search for (CTRL-F) is 'corporate' - - rscadd: Lighters, zippos and candles now come in a variety of new colours. -2018-11-09: - Miraviel: - - rscadd: Prospectors were given EVA and SolGov crew access. -2018-11-10: - MistChristmas: - - maptweak: Replaces overlapping Xenobiology pipes for Scrubbers and Supply Ones. -2018-11-11: - Roland410: - - rscadd: Added a playable crashed survival pod. - - maptweak: Converted the old crashed pod into a random ruin. -2018-11-12: - Alex6511: - - tweak: Reduced the frequency of windows updates events by half - Blue Bit: - - imageadd: Added sprites for the anomaly console and scanning pad. - Datraen: - - bugfix: Cancelling SDTF naming for Skrell badges no longer blocks setting in the - future. - Sbotkin: - - rscadd: Adds digital multitool to the engineering toolset augment. - SierraKomodo: - - bugfix: Fake Crew Announcements traitor service now broadcasts the correct arrivals - message on use - - bugfix: Fake Crew Announcements traitor service now properly updates the crew - manifest with rank, name, and honorifics -2018-11-15: - Roland410: - - tweak: Gamemode vote starts at 160 seconds, giving players 100 seconds to change - their character/preferences according to the voted gamemode. - - tweak: Should a non-secret mode fail to start, you will have one minute to adjust - your preferences or unready before roundstart. -2018-11-16: - Faustico: - - rscadd: Added basic security belts, like normal security belts but without a holster. - - maptweak: Added basic security belts to MAA lockers. - - tweak: Storage accessories and holsters use two different accessory slots again. - SierraKomodo: - - tweak: Blob resistance has been rebalanced. Brute-based weapons (Crowbars, fireaxes) - are more effective against cores, while fire-based weapons (Welders, lasers*) - are more effective against blob and strong blob. *Laser rifles take a 1/2 damage - penalty against all blob targets. See https://github.com/Baystation12/Baystation12/pull/23774 - for specific numbers. - TheWelp: - - rscadd: Adds ability to destroy circuit assemblies via damage. Bigger assemblies - means more health. Can be healed with wire. -2018-11-17: - CrimsonShrike: - - rscadd: Adds the mech pilot inspired Null Suit to robotics fabricator. This lightweight - rig offers little to no protection and cannot mount weapon modules. -2018-11-19: - Alex6511: - - tweak: the malfunctioning drone on away sites has had its damage adjusted - BlueNexus: - - bugfix: Cryo Cells now work properly, with temperature. This means clonex is possible. - - tweak: Clonex can no longer mix below -200C - Miraviel: - - tweak: Updated the guest pass terminal icon. Added guest pass terminals to supply - and to the Pathfinder's office. - - tweak: Using the autopsy scanner in-hand will now print the scan. Its icon was - also updated. -2018-11-21: - Aticius: - - bugfix: Crashed pod should no longer have random space tiles causing constant - air flow/air loss. - SierraKomodo: - - tweak: Charon and Aquila APCs now include helm access flags, meaning anyone who - can access the shuttle's helm can also unlock the shuttle's APCs. Engineers - still have APC access as well. - afterthought2: - - bugfix: Clonex should work properly with cryo tubes now (recall that you have - to make it at -100 to -75 C, best done with the cooler). It will adjust its - temperature to that of the cryo tube, which should prevent it from denaturing - under normal circumstances. -2018-11-22: - Alex6511: - - maptweak: Added a large insulated beaker to chemistry. - EcklesFire: - - bugfix: Makes Skrell medical voidsuit helmets work. - afterthought2: - - tweak: Clonex now won't denature below 50 C (i.e. unless you heat it). - sabiram: - - balance: Space carp now have generally more health and more powerful attack values, - and move faster. Pikes and sharks now have more health and do more damage. - - balance: All castes of giant spiders are now tougher, faster, and more deadly - all around. Hunters in particular are very dangerous. - - rscadd: Hunters and guards now use a new venom. - - rscadd: Added colour variants for space carp. - - rscadd: Added randomly coloured eyes for giant spiders, and made them glow. - - rscadd: Hostile mobs will now attempt to pry open doors between them and their - target, though they can be interrupted. - - rscadd: Hostile mobs can now destroy window-doors and tables. - - bugfix: Fixed hostile mobs not destroying windows, grilles, wall frames, etc. - - rscadd: Added more colours for space carp. -2018-11-24: - Blue Bit: - - rscadd: 'There are now two additional exoplanet types: shrouded and chlorine.' - - rscadd: Added a few alien creature color variants. - - maptweak: Added six new randomly spawning exoplanet sites. - - bugfix: Fixed a portion of the "Lodge" away site that was designated as space. - RyanSmake: - - rscadd: Adds a Bluespace Artillery to Deck 2 missile bay. Select an adjacent overmap - tile, and get rid of the event on it, or shoot at the away sector a charge of - your choosing (emp, remote mining, explosive, fire, or droppod). - Toriate: - - tweak: Photocopier now uses new photocopier icon state in bureaucracy.dmi instead - of the scanner iconstate. - - imageadd: New photocopier sprites added! Made by yours truly. - afterthought2: - - rscadd: The mecha skill (Exosuit Operation) is now a subskill of EVA. You need - to have at least Trained in EVA to select it, and then choose it from skill - selection. - - rscadd: Driving mecha without the mecha skill may result in unpredictable movement. - - rscadd: Exiting a mecha without proper skill may occasionally force-eject you. - - tweak: The mecha skill no longer has anything to do with mecha fabrication in - the description. - sabiram: - - tweak: Nurse spiders should infest their enemies with eggs less often than before. - - rscadd: Added giant spider legs, harvested from giant spiders. Can be used in - sushi or boiled in the microwave. -2018-11-25: - RyanSmake: - - bugfix: The BSA actually works now. -2018-11-26: - Funce: - - bugfix: You can no longer get infinite amounts of cable coil from constructing - and deconstructing certain telecomms equipment - Hubblenaut: - - tweak: Drawing guns based on intent is now a preference option. - SierraKomodo: - - tweak: Autopilot default speed lowered from 2 (Exceeds max speed hardcap of 0.1) - to 0.0025 (40 seconds ETA per tile) - - bugfix: Autopilot no longer burns fuel needlessly bouncing above/below the speedlimit, - and will now never go above the speedlimit. - - tweak: Autopilot now handles changing direction/destination and diagonal movement - much more efficiently fuel wise - - bugfix: It is once again possible to decelerate to a speed of 0. -2018-11-28: - afterthought2: - - tweak: Surgically repairing decaying organs is once again viable. -2018-11-30: - Heph-hasto: - - rscdel: Removes ability for ship AI to be traitors -2018-12-01: - Cakey: - - tweak: After the sudden drop in SCG funding, the newly released MRE line has been - reduced in content. - SierraKomodo: - - rscadd: General Notes (Public) field has been added to crew records. These are - records visible to anyone who can open crew records, and are intended for 'common' - information between security, medical, /and/ employment records. - afterthought2: - - rscadd: A new admin tool, Toggle Circuits, has been added to the Secrets panel. -2018-12-02: - Aticius: - - rscadd: Adds a joinable Colony map that can spawn on exoplanets. Rimworld mode - is here. - Broseph Stylin: - - rscadd: A new Scientist rank is now available for the SolGov Employee branch. - - tweak: The Scientist and Research Assistant jobs are now open for the SolGov Employee - rank of Scientist. -2018-12-03: - Cakey: - - rscadd: Added katsu curry, made with a slab of chicken, 10 units of rice, 10 units - of water, 5 units of flour, an apple, a carrot, and a potato. - Toriate: - - imageadd: The LAEP90's sprites have been replaced with new ones! - sabiram: - - tweak: Wall frames now use materials like walls do, and can be painted and unpainted - with the paint gun. -2018-12-04: - Aticius: - - maptweak: Bunch of minor fixes and tweaks to the Colony map. The walls no longer - eat mining computers. Oops. - Cakey: - - rscadd: Added Terran Navy uniforms. - - rscadd: Added Terran Navy ranks and structure. - sabiram: - - balance: Giant spider nurses will now only inject eggs into organs that have space - for them. - - balance: Reduced the number of spiders hatched per egg injected. - - balance: Injected spider eggs now mature more slowly. - - tweak: Slightly reduced maximum possible health for all castes of giant spider. - - tweak: Reduced occurrence weight and severity of spider infestation event. - - tweak: Spiders bursting out of organs is more damaging. - - tweak: Hostile simple animals can now destroy railings. - - tweak: Simple animals should now die faster after taking fatal damage. - zaredman: - - rscadd: Adds a MEDIC and OCIE AGENT tag for plate carriers. -2018-12-06: - Cakey: - - imageadd: Fleet uniforms sprites have been re-done. - - rscadd: Added Fleet officer's alt utility uniform, mainly used by bridge crew. - - rscadd: Added Fleet service jackets, with alternating trimmings based on rank - (enlisted, officer, senior officer, flag officer) - - rscadd: Added new Fleet dress jackets, with alternating trimmings based on rank - (enlisted, officer, senior officer, flag officer) - afterthought2: - - maptweak: The GUP is now overmap capable, though with poor sensor quality. - - maptweak: The GUP is no longer fully pressurized. Use the unlocked air alarm to - properly modify the atmosphere as needed. -2018-12-07: - Aticius: - - rscadd: A new paint job has been added to suit cyclers in the Engineering department. - Stomp around in style in a Hazardous Operation suit! - RyanSmake: - - bugfix: Stopped AIs and ghosts from activating artifacts. -2018-12-08: - sabiram: - - maptweak: The ship's Christmas tree has been installed in the galley. -2018-12-09: - Eckles: - - tweak: Changed Terran to Gilgamesh/Independent. Faction rename. - - tweak: Enforced Martian and Martian Surfacer as default human culture/system instead - of generic 'humankind'. - Persona E: - - balance: Unathi and Dionaea can no longer regenerate without nutrition. - Roland410: - - tweak: Construction skill is required for basically any recipes now, and material - difficulty (what skill you need to be able to craft from it) has been upped - for most of them. - - tweak: Engineering contractors receive trained construction now to be able to - handle plasteel. - Sabira: - - balance: Handheld and mounted/portable flashers now work on all simple animals. - - balance: All hostile mobs can now be stunned. - - balance: Spiderlings now pull from a weighted list of castes when determining - which caste to grow up into. Hunter spiders are rare, all other castes are even. - - balance: Every caste of spider except hunters can now be captured with nets. - - balance: Various spider numbers tweaks. Reduced hunter maximum damage. Reduced - lifesteal for all castes. Reduced nurse venom-ness. - - balance: Nurse spiders now have a maximum amount of eggs they can lay. They can - ready more eggs by feeding from mobs trapped in cocoons. - - rscadd: The base variant of giant spider is now an unremarkable generic worker - meant to fill the ranks. They don't have any special gimmicks. They're green. - - rscadd: Added a proper guard caste to spiders. Guard spiders (brown) will now - be paired with a nearby nurse (beige), and will closely follow them til' death - do they part. Killing a nurse might throw their guard into a rage. - - rscadd: Added a spitting spider (purple) caste - once they're out of venom, they'll - have to generate more before they can spit again. They'll resort to melee combat - if they're out of spitting venom. - - rscadd: Hunter spiders can now initiate combat by leaping at their prey. - - tweak: Hostile mobs will now only attempt to destroy their environment if the - obstacle is between them and their target. - - tweak: Hostile mobs now have a chance to miss their attacks. Flashing them increases - the chance. - - tweak: Hostile mobs can now have individual delays for prying open doors. Spiders - and carp are currently the only ones set. -2018-12-10: - Blue Bit: - - rscadd: Liquids can now be collected from exoplanet puddles. - - rscadd: Added tar. It's a bit toxic, but it can be heated and broken down. - afterthought2: - - rscadd: Some exoplanet plants now produce exotic chemicals, with effects that - are randomly generated each round. - - rscadd: Inspecting these chemicals in the mass spec with high chemistry and/or - science skill will reveal additional information about them. - - rscadd: By heating them to almost, but not quite, their boiling points, the effects - of these chemicals strengthen (if with phoron catalysis, then weaken). By also - adding certain additional ingredients (depending on the effect), the effect - will instead be left unchanged. - - rscadd: 'Cooling works similarly, but now the default behavior is that the effect - is left unchanged: you need to add certain additional ingredients to make the - effect strengthen (or weaken, with phoron).' - - rscadd: These chemicals may have powerful combinations of medical (or poisonous) - effects that can be used, or (if purified sufficiently) can be sold for large - profits. - sabiram: - - bugfix: Giant spider nurses will no longer infinitely attempt to cocoon deceased - giant spiders. -2018-12-11: - Persona E: - - rscdel: Removed the TCC ushanka from the loadout. - afterthought2: - - tweak: You can now order additional BSA charges from supply. - - tweak: Mass driver ammo is now cheaper. -2018-12-12: - Carlen White: - - tweak: The supply terminal listing of supplies shade every so listing to help - item selection. -2018-12-13: - Dave-TH: - - bugfix: The Pilot's qualification pin can now be pinned to jackets. (Like the - rest of the pins) - - bugfix: The dedication plaques on the bridge are no longer invisible. - - bugfix: The Pathfinder's hardsuit no longer has an invisible chest piece when - sealed. - WhiteHusky: - - rscadd: Supply consoles now show a notice when there are pending orders when properly - authenticated. - - spellcheck: Fixed misspellings in the Supply Console. -2018-12-14: - PoZe: - - tweak: Admin verb Create Object major flaw was optimized to display/search lists - of all objects instantly, instead of freezing for 3-4 seconds. - RyanSmake: - - bugfix: After repeated complaints from the SEV Torch that all showers are constantly - clogged we have deployed the NanoTrasen Bluespace Plunger(tm). Operation successful, - showers will never clog again. - WhiteHusky: - - bugfix: You no longer "see" items being removed from bags or other storage items - when blind. - sabiram: - - tweak: Placing acids in a fire extinguisher will now destroy them, and may splash - acid onto the user. -2018-12-15: - afterthought2: - - rscdel: NTSL has been removed entirely. -2018-12-16: - Alex6511: - - bugfix: Normal humans can no longer select the vat-grown specific culture - Hubblenaut: - - bugfix: Fixes movement with grabs. -2018-12-22: - sabiram: - - rscadd: Added two new holodeck programs; a plaza and a bathhouse. -2018-12-24: - WhiteHusky: - - rscadd: You can enable notifications for the shipping program. -2018-12-27: - Anticept: - - tweak: 'XO default access is no longer spotty. It now has access to the entire - ship and shuttles, including research. Specific changes: Added robotics, all - of research including petrov, Pilot, Mining, and Commisary. Places XO does not - have access: Captain, Research Director''s office, Research Director''s Petrov - Office, SolGov Rep, and Corporate Liason.' - - rscdel: Removed Genetics access from the game. - - tweak: Renamed "Nanotrasen" in the access computer program to "Corporate". - - tweak: Renamed access "Psychiatrist's Office" to "Mental Health". Renamed access - "Head of Security" to "Chief of Security". Renamed "Head of Personnel" to "Executive - Officer". "Quartermaster" is renamed to "Deck Chief". - Hubblenaut: - - bugfix: Anomaly isolation and Xenobiology air alarms will no longer cause atmos - alarms. - Toriate: - - tweak: RCD now carries 120 matter units at max. Small matter cartridges give 30 - units, while large ones give 120. - - rscadd: Rapid Crossbow Device added. Craft by screwdrivering a RCD and then slapping - a fully assembled crossbow frame into it. - - imageadd: New RCD sprites in tools.dmi, made by yours truly. Originally made for - Eris. - - imageadd: New Matter Cartridge sprites, based off /tg/'s. - - imagedel: Old RCD sprites deleted. - WhiteHusky: - - rscadd: You can now print receipts on pending, approved, and archived orders. -2018-12-28: - WhiteHusky: - - rscadd: You can now examine neural laces, and understand them assuming you have - the skill. - afterthought2: - - tweak: Off-station roles are blacklisted from being on-station antags. -2018-12-30: - WhiteHusky: - - rscadd: RFID card readers firmware has been updated to allow verbose diagnostics - checks. -2018-12-31: - WhiteHusky: - - tweak: You no longer drop computer hardware onto the floor if possible. -2019-01-02: - afterthought2: - - tweak: The colony will no longer start irradiated. -2019-01-03: - Broseph Stylin: - - rscadd: A system to automatically switch clothing icons based on gender has been - introduced. It is currently set up to work for humans and human subspecies. - - tweak: Expeditionary Corps, Fleet and Army uniforms as well as EXO and corporate - variations of the Torch Research uniforms now have gendered icons. -2019-01-06: - Cakey: - - maptweak: Fixed odd spacing in supply, adds a cargo lift to the warehouse. - CrimsonShrike: - - rscadd: Adds detective instinct verb for master forensics. This will give most - of the scene a distinctive noir look. - Hubblenaut: - - bugfix: Fixes shuttles removing air from the hangar upon arrival. -2019-01-07: - Anticept: - - tweak: Radiation resistance now fully blocks radiation levels below its radiation - resistance percentage, and thereafter will only allow some radiation leakthrough. - Lower resistance suits leak much more readily once past the threshold, while - high resistance suits will only leak a little bit after the threshold is reached. - Very highly irradiated environments are still extremely dangerous. -2019-01-08: - Anticept: - - tweak: The CE Firesuit is now firefighting rated, just like firesuits and atmos - suits. - Chinsky: - - soundadd: Pain has a low chance of heartstop again. High shock levels ('You feel - like you can die any moment now!' level) can sometimes cause thready pulse. - Countered by giving poor sod some painkillers to prevent shock, or some inapro - to stabilize the pulse. - sabiram: - - maptweak: The Christmas tree in the bar has been removed. -2019-01-10: - Anticept: - - rscadd: Added a waste tank for atmospheric waste gasses next to the fuel bay. - Now there's a place for gasses the Torch doesn't have a tank for, as well as - storage for engine byproducts, and can be dumped to space or recovered with - canisters. Also acts like a good way to clear a backed up atmos system if you - know how to configure the pumps and valves, and don't mind spacing the gas. - - rscdel: Engineering thrusters (not nacelles) are now purged from the game. They - offered next to no thrust at all and now the engine room is a little bit simpler. - - tweak: All black pipes in engineering ultimately go to the waste tank. - - tweak: Removed redundant fuel bay firedoor (it had two at the entrance). - RyanSmake: - - bugfix: AIs now get alerted once again when someone edits their laws. - Textor: - - rscadd: Adds DAIS, Xynergy, EC, and EXO logos to paperwork formatting, adds help - information about new logos to nanoword formatting help. - - rscadd: Adds all missing logos to the admin paperwork so that they can be used - in fax replies. - - tweak: Changes [tccseal] to [iccgseal], makes the EXO logo take over "[logo]" - and moves nt logo to [ntlogo] - comma: - - tweak: All speed/acceleration values are now displayed multiplied by 1000. Actual - mechanics are still same. - - tweak: Only 1 random alien seed in Xenoflora storage now, and can't order them - from cargo. Go on expeditions nerds. - - maptweak: No more pre-spawned anomalies on Petrov. Go on expeditions nerds. - lorwp: - - tweak: IPCs can now use the Command Hardsuits -2019-01-11: - Anticept: - - tweak: Radiation planets background rads peak out at 75bq. Hotspots are still - deadly though! - - tweak: Adjusted waste tank dump port so it goes to the edge of shields, rather - than dumping onto the top of D3 pod. - - tweak: Added a pump to the waste tank canister port. - BlueNexus: - - maptweak: Nacelles have been reworked. - - bugfix: As a result, combustion mode works again. +2022-07-25: + ? '' + : - tweak: GPS units now provide a visual compass to track each other. MistakeNot4892: - - rscdel: Removed the education system entirely. - RyanSmake: - - bugfix: Chief Engineers now spawn with correct backpacks. - Zuhayr: - - rscadd: Added a department goal system. Use Check Goal to view them inround. - - rscadd: Added a personal goal system. Defaults to disabled. Set Crew Goals to - something else in your global preferences to start getting them on join. - - tweak: Merged ambitions into goals. -2019-01-13: - Anticept: - - tweak: The "Set transfer amount" verb's range is now one tile, so now you don't - have to be carrying them to set it anymore. - - bugfix: ghosts and unconscious can no longer invoke the set transfer amount verb - on containers and IVs. - - tweak: Gas sensors in atmos and waste tank now display all gas contents that they - can identify. - Chinsky: - - tweak: Falling down zlevels now has a chance to dislocate feet/arms. Athletic - skill mitigates it, Trained and above are safe. - - tweak: Setting dislocated limbs now requires Medicine skill to be reliable, especially - for self-setting. Basic skill is enough for ~90% success rate, Trained is guaranteed - or your money back. - - tweak: Walking on fractured or dislocated limbs now applies additional pain to - that limb. Rest a bit for it to clear up or use a cane. - Hubblenaut: - - rscadd: Large escape pods will now repressurize themselves after undocking. -2019-01-21: - Anticept: - - rscadd: CMOs rejoice! Your hypospray now has a quantity setting, you can administer - in 1,2,5,10,15,20, or 30 units per injection! - - rscadd: CMOs rejoice! You can now pour your hypospray contents into a container - without removing the vial! (you can already put reagents in it too without swapping - vials) - - rscadd: CMOs rejoice! You are now coordinated enough to swap vials on the fly. - No longer do you have to remove and put away the old vial before you can install - a new one. - - rscadd: Medical rejoice! The contractor producing your syringes have heard your - cries and installed easier to read graduations on syringes. You now can set - transfer amounts in 1, 2, and 5. - - rscadd: Everyone rejoice! When pouring containers, you will now be able to see - how many units are remaining. - - bugfix: drones and borgs can once again use r-glass. - - bugfix: drones and borgs glass stacks are colored correctly. - Blue Bit: - - rscadd: Security borgs now have a hailer. - - bugfix: The playable colony should once again have its rods. - Cakey: - - maptweak: The robotics lab is now two-floored. Has a lift. - - maptweak: Cyborg station has been moved next to atmospherics. - ChaosAlpha: - - bugfix: Robots and drones should once again be able to drop items from their grippers - from the Silicon Commands tab (the verb has been renamed "Drop Gripped Item"). - - bugfix: Robots and drones now drop all gripped items on death. - Chinsky: - - rscadd: Rods are now material based, can be made from more than just steel. Same - with grilles and lattices. - - rscadd: Windows are material based too, any non-opaque material can be used to - make them (currently diamonds and quartz). - - rscadd: You can get back rods from rglass (rphoronglass) by welding them out. - - bugfix: Autolathe now will properly get some steel material on top of glass if - you feed it rglass. - Eckff: - - tweak: The sleep button now keeps you asleep until you press it again. It will - not wake you up from other things that cause you to sleep, like chems. - Eckles: - - bugfix: Fixes sprite and object issues with the riot security voidsuit for Unathi - and Skrell - Hubblenaut: - - bugfix: Fixes cameras of robots, hardsuits, Thunderdome and similar not being - accessable. - MistakeNot4892: - - tweak: Locker icons now use a runtime-based system. This should have no player-facing - impact other than the cosmetic effects of new locker icons. - - rscadd: Added a Loss Prevention Associate role. Basically a bodyguard for the - Workplace Liaison. They can only spawn with an active Liaison in the round, - and get a secure gun with corporate access. - - tweak: Added backend support for deferred roles, please make a bug if this breaks - anything in roundstart job allocation. - - rscadd: Added a stomach organ. If your stomach is damaged, you can't eat properly - and won't metabolize reagents well. - - tweak: Puke now contains some of the reagents you had in your stomach, plus some - stomach acid. We are pushing the boundaries of puke simulation technology. - - rscdel: Removed Xenolife Technician and NT Guard. - - tweak: Research Director is now the Chief Science Officer and may only be EC-ranked, - not contractor. - - tweak: All other science roles are now available to EC staff as well as contractors. - WhiteHusky: - - rscadd: Intergrated circuit's medical scanners can now get a patient's pulse. - afterthought2: - - tweak: Adherent are now shock-immune. - lorwp: - - tweak: the EVA Hardsuit in Engineering Hard Storage now fits on IPCs. Rejoice - sabiram: - - rscadd: Added aluminium. It's the standard material for furniture such as tables - and chairs, among other things. - - tweak: Added plastic and aluminium to the autolathe. Many recipes have been adjusted. - - tweak: Smelting bauxite now yields aluminium. Bauxite blocks can still be obtained - by compressing. - - tweak: Added aluminium sheets to the supply menu. - - maptweak: Added aluminium sheets to where metal sheets are found. - xales: - - tweak: Torch command (CO, XO, SEA) now share a headset type and encryption key - - tweak: The XO now has science keys in their locker. -2019-01-26: - Cakey: - - rscadd: Re-adds exploration helmet-cameras. - MistakeNot4892: - - tweak: YOU WILL NEED TO UPDATE YOUR RANK AND BRANCH PREFERENCES, READ THIS CHANGELOG. - - tweak: Occupations panel got a visual overhall. Click the link-name of a job to - set alt title, and click the never/high/low/medium to cycle between job weights. - - tweak: Rank is now tracked by job, not by save slot. You can set your rank and - branch up as you like for each given job. - - tweak: You can now set/save skills for submaps in the occupations panel. - Pandolphina: - - rscadd: Adds a new exoplanet ruin, a data capsule ejected from a ship with zombie - juice inside. - Textor: - - rscadd: Escape pod blast doors now open upon reaching pod launch sequence. You - might want to stay out of maint areas near escape pods when pods are getting - ready to launch. - - maptweak: After much deliberation, the Health and Safety department decided that - Engineering, the misc laboratory, and the tunnels outside the deck 2 escape - pods should be more well-lit. - - maptweak: The forensics office and bridge now have chairs that can rotate. - - maptweak: The deck 1 conference room floor has finally been repainted properly. - - maptweak: The R-UST now has its own power monitor installed and a gas injector - and a port to allow engineers to inject various gasses into the R-UST chamber - if they want. - - maptweak: Deck 3 has more emergency shutters to prevent the spread of fire and - decompression and prevent hapless engineers from wandering into unknown danger - outside the EVA room. - - bugfix: Fixes deck 5 subgrid configuration. - - bugfix: Fixes stasis cages. - - maptweak: Replaces ready room with adherent maintenance. Ding. - - tweak: Adherents now recharge at cyborg rechargers at half the rate. - - maptweak: Removes mineral baths from all other map locations. - - tweak: Adherent pylon will now damage robots. - - rscadd: Adds adherent tool vendor and crystal material airlock. - WhiteHusky: - - rscadd: You can show the contents of supply products. - afterthought2: - - tweak: Rad collectors and potted plants now cost more when ordered from supply. - - tweak: Adrenaline now does some heart damage if used to restart the heart. - sabiram: - - rscadd: Added green tea, iced green tea, and sweet green tea. - - rscadd: Added green tea to bartender soft drinks and coffee reagent dispensers. - - rscdel: Removed iced tea dispenser. Combine ice and the tea of your choice to - create iced tea. - - rscadd: Added flavour pods and sugar packs to the hot drinks vendor to flavour - your tea or coffee. - - rscadd: 'Added two new mixed tea drinks: Baron Grey is prepared by mixing black - tea and orange juice, and Maghrebi mint tea is prepared by mixing sweet green - tea and mint.' - - rscadd: Added teacups to the cutlery vendor. - - rscadd: Added chazuke. It can be prepared by mixing ten parts rice and one part - green tea in any container. Microwaving ten parts chazuke will result in a snack - bowl meal. - - rscadd: Added aluminium and plastic into the protolathe system. Many recipes have - been adjusted. - - maptweak: Removed protolathe from the robotics laboratory. - - maptweak: Added aluminium sheets to the research and robotics storage areas. -2019-01-28: - Roland410: - - bugfix: Fixed/removed the cap on away site jobs' skills. - sabiram: - - tweak: The circuit printer and protolathe can now hold more materiel. -2019-02-05: - Anticept: - - tweak: Pilot skill description now clarifies random movement occurs until trained - or greater, regardless of what ship you are flying. - - bugfix: Fixed phoron glass sheet's melting temperature so that reinforced phoron - glass is consistent with the pre-material overhaul melting temperature. This - should stop the random window breakage in the engine core until close to delamination - temperatures. - - tweak: Due to the nature of the material overhaul and this change, regular un-reinforced - phoron glass also gets its temperature significantly buffed. It's still weak - to physical attack by comparison to reinforced phoron glass. - Cakey: - - maptweak: Added LPA equipment closet to the Workplace Liason's office. - - tweak: Added "Asset Protection Agent" as an alt title to LPA. - - tweak: You can now put people onto wall frames with grabs - Chinsky: - - rscadd: Added an exploration shotgun. It's in a wall locker on Charon, along with - ammo, replacing netgun. What can possibly go wrong? - - rscadd: It can fire freely off-ship, but onboard you gotta register and get XO - or CO to authorize it. Yes it's pain, yes it's intended. - - rscadd: It is only guaranteed to work with types of ammo it ships with - beanbags, - flash, net rounds. Loading combat ammo voids warranty and may result in fun. - Datraen: - - rscadd: Adds Skrellian Weapons, currently admin spawn only. - Herigony: - - bugfix: Fixed admin jobban panel - Textor: - - bugfix: After paperwork being filled out in triplicate, lost, found, and buried - in peat for two weeks, the CSO now has access to their uniform in the uniform - vendor. - - bugfix: You now need to be an EC scientist to select an EC labcoat in loadout. - Senior Researchers and Assistants now have access to some of the same stuff - as normal scientists that they lacked. Also adds some equipment the biomech - should have access to. - - bugfix: Non-senior researcher Ensigns in the science department are now properly - considered officers and have an officer's uniform given to them when they wake - up instead of an enlisted uniform. - - rscadd: Labcoats can now be issued via the uniform vendor for EC science people. - sabiram: - - rscadd: Added the CSO's rigsuit. - - maptweak: Removed the AMI rigsuit module from the CSO's Petrov office and added - the new rigsuit to the bridge EVA storage. - - maptweak: Resized and reorganised the bridge EVA storage. - - rscadd: 'Added new wood material types: mahogany, maple, walnut, and ebony. These - types are largely identical apart from their colour.' - - rscadd: Added supply crates to obtain the new woods. - - maptweak: Several tables and chairs across the ship that were previously generic - wood are now made from mahogany, maple, or walnut. - - maptweak: Shuffled things around a bit in the captain's quadrant. - - maptweak: Moved the CSO's primary office back to the bridge, from the Petrov. - - rscadd: Clipboards are now a material item and can be constructed from most materials. - Clipboards that spawn around the map will be of various materials. -2019-02-06: - ghostsheet: - - maptweak: Rearranged the Guppy's interior for quality of life conveniences. - sabiram: - - rscadd: Radiation collector arrays will now fail catastrophically if exposed to - extreme temperatures, such as those found within the supermatter core. - - maptweak: The robotics lab has been messed with again, everything should work - now hopefully. -2019-02-07: - comma: - - tweak: The year is 2307 now. Roleplay accordingly. - sabiram: - - rscadd: Added explosive harpoons to the uplink. These will only explode upon embedding - in a target, by throwing it at them or sticking them close up. - - tweak: Increased the base harpoon's throwing force divisor. -2019-02-08: - Datraen: - - bugfix: Fixes incorrect access on hangar maintenance doors. -2019-02-09: - Anton-Kr: - - rscadd: Adds Vox ship and base to the game. It's join-able as a submap. -2019-02-10: - SierraKomodo: - - maptweak: Added rechargers to merchant shuttle and merchant base - - maptweak: Connected Flight Control disposal bin to pipe network - - maptweak: Added borg rechargers to communal brig and merchant's station - comma: - - tweak: Uplink gun selection for traitors was scaled down. Assault rifles and similary - big guns are gone, only pistol-likes available now. - - tweak: Wall of text about clothing items property is moved to a codex entry for - the item, instead of being shown on every examine. - sabiram: - - maptweak: The king of goats in the hydrobase planetary ruin has been retired. -2019-02-12: - Chinsky: - - rscadd: CPR changes. It now will help with blood circulation even if it fails - to restart the heart, so there's a reason to do it (especially on higher levels). - Fake circulation lasts 20 seconds and is better with Anatomy/Medicine skill - (highest). - - rscadd: Can now put IV bags etc on rollerbeds and use them as IV stands for buckled - people. Click with beaker to add it. Click with empty hand on empty (no buckled - guy) bed to remove it. Drag bed on people to hook/unhook. - - rscdel: Damaged livers no longer generate ammonia. It was creating self-perpetuating - damage which wasn't intended, it was for diagnostic memes. - - rscadd: Adds auto-CPR device. Goes into victim's suit slot. It won't do mouth-to-mouth - or resusticate them, but it will help with circulation. Needs Basic Anatomy - and Medicine skills to use, or risk rib fracture. Basically continuously applies - circulation part of CPR. Mapped bunch of them in medbay - - tweak: Sleepers now have 10x stasis option. Their power usage now also scales - with stasis factor greatly, 500 per factor, so ~5000 W at 10x - - rscadd: Guns suck now. - - tweak: When you have a gun in activa hand, you're considered to be 'aiming'. Moving - or changing active hand resets timer. - - tweak: Aiming gives bonuses to accuracy, longer you aim, capped by accuracy of - the gun - so no point in aiming longer than few secs with pistol, but with sniper - rifle, take your time. - - tweak: If you haven't stood still for at least a second, you get penalties based - on size of your gun. Pistols are almost not affected, but rifles are affected - greatly. - - tweak: Accuracy falloff differs for different calibers. Pistol rounds are best - used 4 tiles or closer, rifles can be used from any range without ok results. - Lasers mirror that setup, with higher range. - - tweak: Overall, pistols are now useless at range, but don't suffer much if you - move around or change hand to do something else. - - tweak: Rifles are oppsite, can hit if you aim even from other end of screen, but - if you move around, you're not going to hit shit. - - tweak: Moving around (not towards gun) will make you harder to hit now. Yakkety - sax away. - - rscadd: Added a small bells ringing sound playing when you regain consciousness. - Will only play if player is considered AFK (currently 5 minutes without activity) - Spookerton: - - tweak: Mercenary and Raider game modes no longer do early round-end votes when - the antagonists leave or die. - afterthought2: - - rscdel: Guns and armor are no longer available in personal command lockers. - - tweak: The bridge sidearms closet now also has three sets of command armor. -2019-02-14: - Anton-Kr: - - bugfix: Some misc things fixed on Vox ship. - RyanSmake: - - bugfix: Holodeck windoors now actually face the right direction. - SierraKomodo: - - maptweak: Added Pilot Voidsuit to bridge deck's EVA Storage that Bridge Officers - and Senior Enlisted Advisors can access. - - maptweak: Re-arranged the bridge deck's EVA storage. - Spookerton: - - tweak: IPV Fortuna can now fly on the overmap without being doomed. - Textor: - - maptweak: The battery backup PSU in telecomms has been moved after many Chief - Engineers and Senior Engineers have complained about its disruptive location. - The battery backup PSU also now recharges off of the deck 3 subgrid rather than - making a loopback off of the telecomms subgrid. Grey outlines have been moved - around in telecomms to be more consistent with the rest of telecomms' appearance. - - tweak: All telecomms machinery and computers have been updated to use NanoUI style - interfaces, bringing them in line with the majority of UI interfaces on the - Torch. -2019-02-15: - Chinsky: - - tweak: Accidental gun discharge chances upped, and now it can happen when aggressively - unholstering (hurt intent). Chance is now 20% at unskilled, 5% at Basic and - 1% at Trained. - - tweak: When unholstering or trying to fire a safetied gun on hurt intent, there's - now a chance you automatically unsafety it. Chance is 0% at unskilled, 25% at - Basic and 50% at Trained, guaranteed above. - RyanSmake: - - rscadd: You can now interact with emergency shutters through ladders and open - spaces. - SierraKomodo: - - maptweak: Added air and fire alarms to the deck 4 hanger catwalks. -2019-02-18: - Chinsky: - - rscadd: Crypods now have more immulsion. When joining round you will spawn inside - a pod, asleep for 1-5 seconds. Roleplay accordingly. - - tweak: Can now place auto-cpr device on people by clicking on them with it on - help intent. - afterthought2: - - experiment: No stasis bags are available on spawn on the Torch, except one on - the Charon. - - tweak: Stasis bags can now be printed from the protolathe. - - tweak: Stasis bags are now more expensive when ordered from supply. - - tweak: Rollerbeds can now be placed in backpacks. - comma: - - tweak: Autopsy scanner can now be used on severed organs to get some information. - No trace chems or time of death though, need body for that. -2019-02-19: - afterthought2: - - tweak: Modular consoles will no longer have access to NTnet when off-station. - comma: - - rscadd: Mountains can now spawn on any type of planet -2019-02-20: - Chinsky: - - rscadd: Added rescue bags. Work like bodybags, but provide atmosphere from attached - gas tank. Will set internal atmosphere of the bag to tank's release pressure. - Use screwdriver to remove tank. -2019-02-21: - Anticept: - - tweak: XO now has CSO access. - MistakeNot4892: - - rscadd: Added a drug called Three Eye to the contraband drug crate. - - rscadd: Added a chemical agent for crystallizing people. Good for repairing golems. - - rscadd: Breaking a soulstone into shards and stabbing them into a wizard (or firing - a null rod out of a pneumo cannon hard enough to embed it) will now prevent - the wizard from casting spells. - - rscadd: Added supporting code for psionics. - sabiram: - - rscadd: Added chevaux de frise, or spiky barriers. They're constructed by first - building a barricade of any valid material, and then attaching rods of any material - to the barricade. It will damage anyone who walks into it. -2019-02-23: - BlueNexus: - - rscadd: Added Venaxilin, a powerful antivenom made with spider venom. - - rscadd: Added leporazine variants, which are made by either heating up or cooling - down leporazine. Heating it up makes a chem that raises body temperature, cooling - it down makes one that lowers it. - Textor: - - rscadd: Adds new global preference to opt into having your ckey displayed in the - credits. This is set to hide your ckey by default. - - tweak: Adds additional snark to the end of the credits and some new randomly generated - title possibilities. - - tweak: Changes some awkward wording in play global sounds command, makes the change - end credits song command not suck anymore. - afterthought2: - - bugfix: The merchant can now use the merchant program again. - - tweak: The merchant program cannot be downloaded on NTnet. - comma: - - rscdel: Stasis bags are no longer orderable from cargo. -2019-02-24: - RyanSmake: - - bugfix: Shuttles no longer steal asteroid tiles when undocking. -2019-02-25: - Spookerton: - - tweak: Medals can be stored in wallets. - afirpo: - - bugfix: viruses weren't correctly cleaned up from the human-like mobs' bloodstream. - afterthought2: - - tweak: Door access has been substantially reworked. Please report any anomalies. -2019-02-26: - Piccione/Textor: - - rscadd: Adds new duty gloves for utility uniforms. They are available in some - lockers and via the uniform vendor. All gloves offer some protection, and engineering - gloves are also insulated. - SierraKomodo: - - bugfix: Officer's Mess doors will have the correct access flags again. - afterthought2: - - tweak: Arbitrary shuttles can no longer land at restricted landmarks. - xales: - - tweak: Adherent eyes have been upgraded. They no longer need a welding mask to - not go blind. As a side effect, they also cannot be flashed. -2019-02-27: - Chinsky: - - rscdel: Removes Medical Contractor job. It's merged into Physician/Corpsman, number - of slots for those bumped. GAS can join Corpsman only. - - rscadd: Physician and Corpsman jobs can now be joined with Contractor rank. - - rscadd: Engineering Contractor and Supply Assistant were merged into Engineer - and Deck Technician respectively, pick Civilian branch to join as contractor - SierraKomodo: - - maptweak: The Officer's Mess booze-o-mat is now accessible by officers. If you - can open the door, you can vend things. -2019-02-28: - SierraKomodo: - - bugfix: Senior Researcher now has standard sol gov crew access (Notably, access - to the bridge foyer and firing range), maintenance access, and Petrov security - checkpoint access. - - bugfix: Fixed access flags for bridge foyer, charon guppy and aquila airlocks, - communal brig, and supply office windoor. - - bugfix: Counselors can now access medical storage again - - bugfix: Bridge EVA storage windoors have the proper access restrictions again - mikomyazaki: - - bugfix: Swapped the names around on the D3 Ladders/Firing Range Hallway Cameras. - mikomyazaki2: - - bugfix: Removed duplicate items from B-Deck - Captain's Flask and Nanomed Vendor. - - rscadd: Geiger counter now makes a sound when radiation levels are high enough. - Volume increases with increased radiation level. - - soundadd: Added a geiger counter sound. - - bugfix: Fixes the case where the supply pack contents will be blank when ordering - live cargo. - - rscdel: MULE is no longer orderable, since it does not work on the Torch. -2019-03-01: - mikomyazaki2: - - rscadd: QOL Change - Adds an extra Supply & Denied Stamp to the Deck Tech lockers. -2019-03-02: - MistakeNot4892: - - tweak: Removing organs from a robotic bodypart (ie. FBP or IPC) will now use Devices - skill. - - tweak: A longstanding bug with amputated/severed limbs has been fixed and new - limbs will once again require reattachment with a hemostat after replacement. - - tweak: Surgery will now present a list of possible surgeries (if skilled enough) - rather than using a priority system. - SierraKomodo: - - tweak: Renamed NSV Petrov area tags to SRV Petrov. - - tweak: Soviet Cola has been renamed to TerraCola. - mikomyazaki2: - - bugfix: Corpsmen can use the Paramedic alt-title again. -2019-03-03: - Spookerton: - - tweak: Updated Workplace Liason and LPA job descriptions and access to match their - current role. - mikomyazaki2: - - bugfix: Game no longer assumes genders when self-examining as a neuter/plural. - - bugfix: IC Printers now take materials correctly when cloning. -2019-03-04: - Chinsky: - - rscadd: Examining things now shows message about it to people in 4 tile range. - If you don't wanna see it, you can disable it with a preference. - MistakeNot4892: - - tweak: Facial repair surgery is now a single step conducted with a hemostat after - making an incision. - - tweak: Skull repair is now identical to regular bone repair. - mikomyazaki: - - bugfix: Extends the restriction on some types of prosthetics to cover the entire - set of human subspecies instead of just human-basic. - sabiram: - - tweak: Adherents can no longer slip if they're floating. - - rscadd: Added two new colours to the adherent colour selection. - - tweak: The job slot formerly known as Corpsman is now Medical Technician by default, - with the former name as an alt-title. - - tweak: The job slot formerly known as Corpsman Trainee is now Trainee Medical - Technician by default, with the former name as an alt-title. -2019-03-05: - Crystalnole: - - bugfix: Securing microwaves gives the right securing verbs - Spookerton: - - tweak: Bridge officer lockers are harder to get into. - afterthought2: - - bugfix: Surgery is again possible. - - tweak: Makes cryo bags much more expensive in the protolathe, and require higher - tech levels. - mikomyazaki: - - bugfix: Fixes an error introduced through resolving a merge conflict incorrectly - with my earlier prosthetics restrictions PR. - sabiram: - - maptweak: The second deck hallway leading from the stairwell and elevators to - the engineering foyer has been reconstructed in the style of the typical hallways - on the ship. - - rscdel: Engineering duty gloves are no longer insulated. -2019-03-06: - CrystalNole: - - bugfix: Fixes invisible Cyborg materials - mikomyazaki: - - bugfix: Fixes an issue where full fire extinguishers would report an incorrect - message when you tried to fill them further. -2019-03-07: - Higgin: - - rscadd: Added a moderately weak TTV to the traitor uplink. 40 TC cost. - MistakeNot4892: - - tweak: Species who can eat mobs or items will now get an action button to puke - it back up. - - rscdel: Removed Regurgitate verb in favour of above. - SierraKomodo: - - bugfix: Security lobby door is now accessible by Sol Gov crew - - bugfix: Bridge safe room is now all-access - - bugfix: Merchant shuttle doors and windoors now require merchant access - - maptweak: Bridge access hallways now have their own area tags - Bridge Port Access - Hallway and Bridge Starboard Access Hallway - Textor: - - bugfix: You are able to construct glass and material airlocks again. - - bugfix: Airlocks that have their control circuits removed will remember their - paint jobs after the circuit is re-inserted. - - tweak: Atmospheric tanks now hold more CO2, H2, and O2 in the tanks due to increased - usage on board. - - maptweak: Camera networks have been adjusted to reflect reality. The lounge is - now located in the deck 4 camera network, as is the pathfinder's office camera. - The deck 1 fore hallway cameras have been renamed to reflect their location - better. The Adherent room now has a camera. - - maptweak: Adds deck 5 signage and warning signs to the escape pod launch areas - on deck 4, in addition to more escape pod direction signs to make sure confused - passengers know where to go to find pods on decks 2 and 4, and the deck 2 stairwell - is now more well-lit. - - maptweak: The R-UST now has an atmos control console in the control room so engineers - can adjust the injector port for gas. Don't forget to refresh the input. - - maptweak: New emergency shutters have been added to deck 4 to limit the decompression - caused by escape pod launch procedures. - - maptweak: At the direction of the Expeditionary Command Fire Marshal, there are - now more fire closets on board the Torch. - - maptweak: All the nacelles now have phoron windows installed on half-walls to - conform with the aesthetic on the rest of the ship. - - rscadd: After evaluating flaws in evacuation procedures, all escape pod outer - hatches now have a manual bolt override that can be manipulated with a wrench - after opening the cover in the event that the power is offline. As a reminder, - the outer hatch must be closed and the bolts re-engaged before the pod will - launch. - - tweak: Code Delta announcement no longer specifically mentions self destruct due - to rare cases in which it is engaged without the destruct mechanism being online. - Code Delta procedures have not changed. - mikomyazaki: - - rscadd: Adds Cultural Exchange patch to xenowear loadout for EC Unathi, Skrell - and IPCs. - - imageadd: Adds images for the Cultural Exchange patch. -2019-03-08: - SierraKomodo: - - maptweak: Antag shuttles, merchant shuttle, and admin shuttles are now shielded - against rad and ion storms. -2019-03-09: - MistakeNot4892: - - rscadd: Adamantine golem extracts now contain crystalizing agent. - - rscadd: Crystalizing agent can be used to produce resin globules that work like - medpacks for adherent and golems. - - tweak: Golems can now be operated on by substituting a surgical drill for a scalpel, - and resin packs for bone gel/fixovein/medpacks/cautery. - - tweak: Vox are now capable of gaining nutrition from wood pulp, napalm, glue and - various other inedible reagents. - - tweak: Vox are now capable of gaining nutrition from various materials and processing - others into a usable form with their stomach. - - tweak: Vox now require a hindtongue to speak Vox-Pidgin. - afirpo: - - rscadd: now it is possible to export virus dishes to earn credits (supply points). - - bugfix: now Toxicity related to a virus dish (Incubator) works again. - - tweak: checking for virus dishes already exported in the past or not analyzed - at all (those MUST NOT be exported!). - afterthought2: - - tweak: The IC printer can now take any materials as inputs. - - bugfix: Circuits properly init their steel cost now; this means that some are - much more expensive than previously. - - tweak: 'The TP circuit now costs more and rarer materials, and has a very high - complexity: you''re going to need the medium assembly or larger to house it.' - - tweak: The TP circuit will not function properly if the slaved computer is on - a z level not connected to its location. - mikomyazaki: - - bugfix: Fixes an issue with prosthetics selection for IPCs due to previous changes - for allowed_bodytypes on prosthetics. - - bugfix: Condiment containers can no longer be stored inside food. -2019-03-10: - Anticept: - - tweak: Atmos pumps have all had their power limits increased considerably. This - means atmospherics will operate faster, but at the cost of much more power at - peak performance. In addition, vents and scrubbers will operate faster when - stressed, but they too will cause a tremendous power spike in a ship wide atmos - contamination emergency where a huge number of scrubbers have to work hard (from - a badly clogged waste line, for example). A flooded deck can also overload a - deck substation, so bypass switching may be required in such cases. Beware of - extreme scrubber overload! - - tweak: Filter pressure limits raised to 15,000 kpa. They are still not powerful - devices when pumping from low to high pressures. You should put pumps around - them if you intend them to work quickly with moving pressures in a non-passive - manner. - FTangSteve: - - maptweak: deck 2 hallway by janitorial now dimmer and with no cameras - SierraKomodo: - - bugfix: Medical is now restricted access again. - SierraKomodo & Anticept: - - tweak: Flight manifest input box no longer shows the rank to make it easier to - find personel in the list. The report itself will show the rank. - afterthought2: - - bugfix: Disassembling research machines should now work. Upgrading circuit printers - should be more consistent. - sabiram: - - tweak: Most castes of giant spider will generally do more damage, and may have - more health. -2019-03-11: - SierraKomodo: - - tweak: You can no longer use headsets while sedated or sleepy-penned due to paralysis - making you unable to use your hands. - afirpo: - - bugfix: now the Core Sampler (Xenoarcheologist and perhaps Anomalist related) - works again - the sample is spitted out from its sample \ evidence bag. - afterthought2: - - rscadd: Adds the proxy command to terminals. This lets you obfuscate your nid - by routing through another computer. Requires access_network and experienced - skill. Generates local logs on the machine you route through, stored as a file - on the hard drive. -2019-03-12: - SierraKomodo: - - maptweak: Added fire shutters to the cargo warehouse shutters - Spookerton: - - bugfix: Inappropriate crew and passengers no longer have supply program admin - rights. - afterthought2: - - tweak: Petrov and research access can now only be granted by the XO and CO. You - can now build/adjust access on Petrov doors. - mikomyazaki: - - bugfix: Booze-o-mat contained a tea master item rather than actual actual tea. - Made it contain black tea instead. - - tweak: Robotics R&D consoles can no longer link with destructive analyzers. - - tweak: Made the Geiger Counter sound falloff and range larger. -2019-03-13: - Devildabeast: - - rscadd: After numerous flight tests and simulations, Adherents have begun to receive - piloting licenses and can now serve aboard the SEV Torch as Shuttle Pilots. - sabiram: - - maptweak: The firing range on deck 3 has been removed due to consistently causing - crashes. -2019-03-14: - Datraen: - - rscadd: Adds the Xilvuxix, a Multi-Z Shuttle capable of overmap travel and it's - own shuttle (capable of overmap travel as well) - Higgin: - - tweak: Traitor TTVs now share power with merc TTVs. They were underwhelming for - 40 TC cost. - SierraKomodo: - - bugfix: Windoors will now ignore walls when determining autoset access. This should - fix hardsuit windoors. - afterthought2: - - tweak: Unathi brute mod for the subspecies has been decreased a lot. - - tweak: Unathi healing can only be toggled once every two minutes. It cannot be - toggled within a minute of being hit in combat. - - tweak: Unathi limb and organ regeneration is only possible when the heal can be - toggled. - - tweak: When an unathi is at extreme levels of hunger, it no longer receives healing - from the passive heal ability. Instead, it takes internal organ damage, converting - it into nutrition. This is inefficient, so if the healing ability is left on, - it will die quickly. - - tweak: Unathi passive healing is less nutrition-efficient now. -2019-03-15: - SierraKomodo: - - tweak: Prone mobs can no longer buckle other mobs to beds/chairs. This prevents - crawling bucklespam during combat. - mikomyazaki: - - bugfix: Changes pin to an in-type pin on the reagent storage circuits. - - bugfix: Disassembling sleepers with an occupant will now eject the occupant. -2019-03-16: - Chinsky: - - rscadd: Coffins are made with steel now. Can still make wooden one with wood if - needed. - Datraen: - - bugfix: Fixes prosthetics not being selected by subspecies. - SierraKomodo: - - maptweak: The Deck Chief's office now has a guest pass terminal. -2019-03-17: - MistakeNot4892: - - rscdel: The flying pizza sprites are no longer available to crew robot modules. - - rscadd: A flying robot frame can now be constructed as an alternative to standard - robot. It uses the same arms, chest and head as the regular robot, but needs - the 'flyer' frame. - - rscadd: Flying robot frames produce flying robots, which use the flying pizza - sprites and can pass over tables. They have a selection of unique modules to - pick from and are generally faster but more fragile. -2019-03-18: - SierraKomodo: - - bugfix: Chairs and stools now have the correct materials when constructed and - deconstructed. - sabiram: - - rscadd: Added bamboo seeds to the vendors. Their produce can be chopped up into - wood. - - tweak: You can place wrenches onto tables if you're on help intent. Use harm intent - if you want to disassemble them. - - tweak: Halved the number of seeds stored in machines from 30 of each type to 15. - Use the seed extractor if you need more. -2019-03-20: - MistakeNot4892: - - rscadd: Added a humanoid species for the Vox Armalis, representing a larger, slower - voxform. It is not currently accessible outside of adminbus. - - rscdel: Removed armalis simple_animal and icon. - - tweak: Vox now have their own damage masks, blood masks and damage overlays. - - tweak: Vox wizard spell will now transform into a lesser version of the giant - space parrot. - sabiram: - - bugfix: Fixes IPCs becoming blind after being revived in surgery. - - bugfix: IPCs are no longer immune to sources of eye damage such as flashes and - welders. - zaredman: - - imageadd: Adds OCIE logo to be drawn onto official paperwork. -2019-03-21: - Hubblenaut: - - maptweak: Adds binoculars, prybar and a station bounced radio to the CoS Office. - RyanSmake: - - bugfix: Touching anomalies now works properly. -2019-03-22: - Devildabeast: - - tweak: Large mobs and bigger can no longer enter exosuits. - Hubblenaut: - - maptweak: Removes the disposal bin from the brig. - SierraKomodo: - - tweak: Synaptizine now overdoses at 5u instead of 30u. - sabiram: - - bugfix: Fixes issues with assigning and deleting accesses to mechs. -2019-03-23: - Devildabeast: - - rscdel: Due to numerous concessions to mental health procedure and human rights - complaints, the Sol Central Government will no longer stock straight jackets - on-board their vessels. - SierraKomodo: - - tweak: Characters that have ghosted (NOT aghosted) will be immediately flushed - when placed into cryo. - Spookerton: - - tweak: Viruses no longer infinitely increase the duration of effects like deafness - and drowsiness. - sabiram: - - tweak: Butchering simple animals now relies on your cooking skill, requires a - butcher's cleaver, and must be done on a table. - - tweak: Added cleavers to the dinnerware vendors. - - rscadd: Wood rendered from the produce of the bamboo plant will now be the bamboo - material. - - balance: Blobs will now spread and attack diagonally. - - balance: Blob attacks now take into account armour. - - tweak: Blob attack damage now depends on the individual blob segment attacking - you. The core defends itself the most vigorously. - - tweak: Blobs now attack with a random damage type. - - rscadd: You can now attempt to remove a sample from blobs by attacking it with - wire cutters. The regular blobs produce fairly powerful weapons in various damage - types, and the nuclei produce cores which can be disassembled for research points. - - tweak: Cigarettes and the like can now be lit by more hot objects such as plasma - cutters, and some tendrils snipped from the blob. -2019-03-24: - Spookerton: - - bugfix: Robot organs in meat bodies can be repaired with nanopaste in surgery. -2019-03-25: - Datraen: - - bugfix: Fixed Skrell Recon channel; Skrell ship holopad, spawns not operating - properly. - - bugfix: Filled the first-aid kits on the Skrell ship by making them the proper - subtype. - - maptweak: Fixed thrust, external access, and rearranged some parts of the Skrellian - vessel. - - tweak: Changed Skrellian Suits to voidsuit subtypes, allows stacking of helmet/magboots - inside of it. - - tweak: Lowered slowdown on the skrellian rifle. - SierraKomodo: - - maptweak: Added carp spawn zones to Torch bridge deck, Bearcat, and Unishi for - overmap events. - - maptweak: Moved a Torch deck 2 carp spawn from outside the reactor area to avoid - carp spawning inside the shields. - - tweak: Deck Chiefs now have access to Exploration comms. - Spookerton: - - tweak: Traitor Binary Gas Bombs are weaker, but also cheaper. - sabiram: - - rscadd: Added folding knives, replacing boot knives. - - rscadd: Added two types of folding knife to the loadout. -2019-03-26: - MrKicker: - - tweak: Players can pull items across Z-Levels - SierraKomodo: - - maptweak: Various areas on the SEV Torch have been renamed to be more descriptive - of their purpose/location. - - tweak: Typing indicator bubbles no longer appear for hidden mobs (Cloaked or inside - objects such as lockers). Indicators after you say or emote still appear. - ajkrupka: - - bugfix: Fixed an oversight to make armbands and webbing hide when jumpsuits are - rolled down. - sabiram: - - rscadd: Screwdrivers, wirecutters and all types of pry bar now come in a variety - of new colours. - - balance: Reduced armour values for the breacher and heavy mercenary rigs. -2019-03-27: - mikomyazaki: - - rscdel: Removes fax machine from Pilot's Office. - - tweak: Merges plastic flaps and airtight plastic flaps into one item. Can change - airtight setting with screwdriver, deconstruct now with crowbar. Can now construct - airtight flaps. - sabiram: - - tweak: Added colour selection to the suit vest and waistcoat in the loadout. -2019-03-28: - Datraen: - - tweak: Changes renegade spawn list to allow for any bag to conceal a spawned weapon. - - bugfix: Gyrojet no longer drops casings, now accepts magazines properly. - SierraKomodo: - - maptweak: Unishi and Bearcat now have long-range holopads. - sabiram: - - tweak: Crawlers who are weakened (forced down) will crawl slower. Being confused - will now additionally reduce their crawl speed. - - tweak: You can no longer attack with harm intent while incapacitated. - - tweak: Being incapacitated in any way will drastically reduce your melee accuracy. -2019-03-29: - sabiram: - - tweak: All knives have been unified under one type. Please report any irregularities. - - rscadd: 'Added an additional folding knife to the loadout: ''tactical folding - knife''' - - rscdel: Butterfly knives and switchblades can no longer backstab, temporarily - at least. -2019-03-30: - SierraKomodo: - - tweak: Intercom sprites now reflect the on/off status of microphone and speaker - switches. -2019-04-01: - Chinsky: - - bugfix: Torch is now facing upper side of the map. - SierraKomodo: - - bugfix: Bluespace River away site no longer spawns with a teleporter beacon. -2019-04-02: - Atebite: - - bugfix: Fixed weapon firing mechanisms not being able to fire in cardinal directions - CSCMe: - - rscadd: Adds extracting a specific amount of slime cores as a departmental goal - for science - Loaf && Banditoz: - - rscadd: 'Added four flying robot modules: repair, cultivator, surveyor, and forensics.' - SierraKomodo: - - tweak: There can now be 3 bridge officers in a round. - - maptweak: Playable colony now has universal enzymes in the freezer - - tweak: Rogue maintenance drones now spawn in separate smaller groups instead of - one massive blob. Total number of drones spawned per event is unchanged. - Spookerton: - - bugfix: Being cured of a virus now correctly adds its antigens where appropriate. - afterthought2: - - tweak: Some tweaks have been made to job spawn code. Beware of any anomalies. - ghostsheet: - - rscadd: Prospector locker will now always spawn with a duffle bag - mikomyazaki: - - bugfix: Moves the engine ejection door controls inside the box with the eject - button. - sabiram: - - tweak: Admins will now be informed why antagonist autospawn fails, instead of - printing to debug logs. -2019-04-04: - Banditoz: - - tweak: Flying mobs are now immune to quicksand. - Higgin: - - tweak: Push-time now depends on the difference of CQC skill between the two parties. - - tweak: At equal skill levels, pushing has a very short duration. - - tweak: Grabbing a prone person is no longer automatically an upgraded grab unless - the victim is stunned, unconscious, or on help intent. - - tweak: CQC costs more. Check your skill loadouts! - - tweak: Increased global miss chances to head, feet, and legs. - - tweak: Additionally reduced knockdown chances. - - tweak: Made organ damage much less likely before ribs/skull are broken. - - tweak: Increased likelihood of organ damage after encasing bones are broken - - tweak: Increased damage to brain when dealt and probability of brain damage from - damage to the head. -2019-04-05: - Cakey: - - maptweak: Added wooden walls to some areas of the Torch. - - tweak: AI holopads have been renamed to holopads. - - tweak: Removed the long range holopad's Z-range. - Cronac: - - tweak: Adds egg cartons as an item the biogenerator can produce. - - bugfix: Adds missing biohoods to CSO locker. - Higgin: - - tweak: Chances of collapsing from limb damage can now be mitigated by walking - and moving along walls/other objects you could reasonably use to prop yourself - up. - - tweak: This mitigation only works if at least one of your legs fully works. - - tweak: Stools and beds are collapse-exempt. IPCs at funerals rejoice. - - tweak: The chance of collapsing when not doing these things to mitigate it is - now significantly higher to compensate. - Spookerton: - - tweak: Wallets can hold ribbons, armor tags, and patches. - - tweak: Ribbons, armor tags, and patches are now tiny instead of small. - afterthought2: - - admin: A new admin tool, Toggle Harddelete Queue, has been added to the Secrets - panel, under Debug. Do not use this unless you know what you're doing. - ghostsheet: - - rscadd: Carp shoal map hazard now works for overmap shuttles such as the Charon, - Aquila and Guppy. - - bugfix: Fire alarm can now be constructed properly -2019-04-06: - Banditoz: - - tweak: Flying mobs are now immune to lava. - Cronac: - - bugfix: Fixes morgue trays and cremation trays displaying above bodies and bodybags. - Spookerton: - - bugfix: Refilling a fire extinguisher from a tank no longer tells you the extinguisher - is full when the tank is empty. - WatermelonsEverywhere: - - rscadd: Added a spare explorer equipment crate to Supply. -2019-04-07: - Cakey: - - tweak: Increased explorer job slots from 3 to 5. - - tweak: Lowered prospector job slots from 4 to 2. - Higgin: - - tweak: Prevents material weapons from taking damage on parry except against other - material weapons. - - tweak: Increases material weapon health. - - tweak: Reduces crowbar and toolbox accuracy penalties. - - rscadd: Adds an inferior, expensive, steel machete to the autolathe. - afterthought2: - - tweak: Acids are generally weaker now. - ghostsheet: - - rscadd: Ore boxes can now be ordered in supply -2019-04-08: - Chinsky: - - tweak: Charon and Guppy now only need Basic skill for flying on overmap without - random turns. -2019-04-09: - ChaosAlpha: - - bugfix: Drones spawn with modules once again. - - bugfix: All robots/drones material synthesizers should be functional once again. - - bugfix: AI cores should once again be constructible. - - bugfix: Surveyor bioreactor doesn't runtime and actually gives a reasonable amount - of power now. - - tweak: Flying repair robot module comes with slightly nerfed synthesizers. - - tweak: When remote controlling a maintenance drone, the AI can now use its radio - as normal. - - tweak: Cultivator module comes with a robot harvester. - Cronac: - - bugfix: Targeted healing spells such as those used by wizards should now properly - heal synthetics. - - rscadd: Adds the ability to synthesize crystallizing agent via chemistry with - polytrinic acid, tungsten, and silicon (and a bit of heat). - - tweak: Rogue drones now leave cleanable corpses when killed. - - bugfix: Monkeys are no longer ripping out their augments and throwing them across - the room. - - tweak: Augments now show up on medical scanners and related admin scans. - SierraKomodo: - - bugfix: Glowing slime extracts now create light. - - bugfix: Lit flares now process fuel and shut off when out of fuel again. - mikomyazaki: - - rscadd: Upgrading a sleeper now reduces power requirements, unlocks new chemicals, - and increases pump rate. - - rscadd: Adds emag effects to sleeper. - xales: - - tweak: Antag selection now defaults to NONE. You may need to update your antag - prefs. - zaredman: - - maptweak: Moves Security's Deck 1 checkpoint to the old Research Checkpoint. Decommissions - old Deck 1 Checkpoint. Adds lockdown shutters by ladderwell. - - maptweak: Adds 2 prisoner lockers for Communal. Also changes newscasters in the - Brig to the SEC variant where appropriate. - - maptweak: SEC-VEND now has new stock. More cuffs, more evidence bags, and now - carries pepper spray and holowarrant projectors. -2019-04-10: - Unknown: - - rscadd: Added a verb to change lobby track playing - Play Different Lobby Track - in OOC tab. -2019-04-11: - BiscuitCookie: - - maptweak: Renamed the HoP Office Privacy Shutters to XO Office Privacy Shutters - - bugfix: Removed objects outside the ship that didn't belong there. - Cronac: - - bugfix: A damaged aorta can once again be repaired while the chest cavity is open. -2019-04-12: - Randall: - - maptweak: The Supply Office and Supply Warehouse shutters now require Supply access - from the outside. -2019-04-13: - Chinsky: - - rscadd: Added speed indication to helm console. Green means 'slow', red means - 'too fast'. - - rscadd: Pilotable shuttles now can pass through meteor fields safely. Keep at - green speed and you'll make it. Need Trained skill for Charon/Aquila and Basic - for GUP. At Master/Experienced can do this at normal speed too. - - tweak: Torch now accelerates roughly 2x slower - Cronac: - - bugfix: The Adherent mineral bath will no longer kill Adherent users by deleting - their tendril junction. - - tweak: The Adherent mineral bath now removed embedded objects like shrapnel, but - will not remove implants such as tracking implants etc. - MikoMyazaki: - - rscadd: Titanium and its ore Rutile are now available via mining, allowing repair - of shuttles and the ship exterior. - Spookerton: - - bugfix: Lava turfs no longer incorrectly reignite and burn you every process forever. - mikomyazaki: - - tweak: Time police fixed a couple of items that weren't adjusted when we travelled - back 300 years. - myazaki: - - bugfix: Corrects piloting skill description to reflect recent change to basic - training with Charon and GUP movement. - zaredman: - - tweak: Security Equipment supply order replaced with Master at Arms supply order. - - tweak: Auto-Compressor and Rescue Bags can now be ordered via Supply. -2019-04-14: - Aurum22: - - bugfix: Fixes various layering issues with stasis cages, honey extractors, and - reagent dispensers (chemistry and bar varieties). - Cronac: - - bugfix: Cryogenic tubes will no longer heal anything without containing a drug. - - tweak: Clonexadone and Cryoxadone have been buffed due to cryogenic tube changes. - - rscadd: Adds nanite fluid, which is like cryoxadone for robotic parts. It can - be made with cryoxadone, space lube, and aluminum chilled down to -25C. Requires - 5 phoron as a catalyst. This is NOT safe to use on its own and should be used - on conjunction with cryoxadone or clonexadone. - mikomyazaki: - - bugfix: Floor lights can now be dismantled with a wrench. -2019-04-15: - CarefulLilCassie: - - rscadd: Adds high heels. - - tweak: Changes some items in the civilian uniform vendor to match the military - ones and utilises some more categories for cleaner usage. -2019-04-17: - Atebite: - - rscadd: Three new random events have been added - - tweak: The T-ray scanner can now inspect disposal pipes for damage - Chinsky: - - maptweak: Charon laoyout changed, it now has a cargo bay that can be cycled to - outside air. - Crackers5: - - rscdel: Removes some existing body markings - - rscdel: Removes species restriction from tattoos - - rscadd: Splits up existing body markings/tattoos to be selectable per limb instead - of full body. - Roaper: - - rscdel: Removed old contraband poster that depicted a spess cat. Also commented - out it in the code. - mikomyazaki: - - bugfix: Smartfridge ID Scan hack now allows access. -2019-04-18: - mikomyazaki: - - bugfix: Allows setting stasis to x10 on sleepers. - zaredman: - - tweak: Medical max staff numbers decreased to a maximum of 2 Physicians, 3 Medics, - and 1 Trainee Medic. -2019-04-19: - GooeyChickenman: - - bugfix: Defibrillators no longer appear empty on spawn. - mikomyazaki: - - bugfix: Voice changer now works properly while using an active camouflage module. - xales: - - tweak: Adherent can now play as Prospector -2019-04-20: - Chinsky: - - rscadd: 'Most handheld scanners (plant, health, gas, mass spectrometer, reagent, - xenobio, price) now store last scan result. Click inhand to see it. tweak : - Mass spectrometers now can be used directly on open reagent containers or syringes - to take sample. Old behaviour is still supported too.' - - rscadd: 'Price scanners keep adding scan results instead of overwriting them. - You can clear buffer in scan result view window. tweak : Tweaked health analyzer - colorings a bit. Now not coloring things like section headers, coloring more - deviations from norm (blood oxygenation / pulse)' - Flying_loulou: - - tweak: Blood bags are now small if containing a reaggent, and tiny if empty. -2019-04-23: - Flying_loulou: - - rscadd: Adds a new command voidsuit type for bridge officers and the SEA. - - maptweak: Replaces the pilot voidsuit in the bridge EVA storage by the command - voidsuit. - GooeyChickenman: - - tweak: More common medicines and reagents will appear on medical scanners. - Higgin: - - rscadd: Cult members can now make stun talismans again. Requires a tome, paper, - and a substantial amount of blood. - - rscadd: Ported obscure and reveal runes back into cult. Obscure runes make all - runes around them invisible, reveal runes reveal them. Runes cannot be used - while invisible. -2019-04-24: - Datraen: - - bugfix: Ion Thrusters now respect on state and thrust modifier when calculating - thrust -2019-04-25: - Datraen: - - rscadd: Adds lighting, overlaying to energy melee weapons. - Draxtheros: - - rscadd: Robots will now announce via chatlog when they enter an emergency power - state. - FTangSteve: - - bugfix: ingested reagents are now handled properly - - tweak: pulse impacting reagents now have stronger effects when compounded - - tweak: stomach volume is now 65 units instead of 30 - - tweak: vomiting when stomach is overfull now based on chance, higher with the - more you're over the limit - GooeyChickenman: - - bugfix: Ryetalyn will now fix a characters appearance after resetting genes. - Hubblenaut: - - bugfix: Fixes syndicate ID cards not being examinable. - Lilja: - - bugfix: Fixed sheet materials stacking bug where icon wasn't updating. - - tweak: Recolored & adjusted all sheet material icons to have more contrast. - - rscadd: New aluminium sprite, new plastic sprite, new glass sprite, new reinforced - glass sprite, new diamond sprite, new wood sprite, new uranium sprite, new rod - sprites, new cable wire sprites, new deuterium and tritium sprites. - - rscadd: Sheet material stacks now change appearance when they have reached maximum - stack. - Randall: - - maptweak: The auxiliary sanitation closet now holds a spare mop. - Spookerton: - - tweak: Optical Meson Scanner glasses only protect from supermatter hallucinations - when turned on. - ghostsheet: - - rscadd: Hardsuit overlay icons will now change depending on what module is selected - - tweak: Hardsuit drill mount now functions like a normal drill, being able to mine - multiple tiles at once - - tweak: Hardsuit drill mount energy usage has increase to a non insignificant amount - - rscadd: Mounted plasma cutter has a close range mode to enable object interaction - accessible by configuring - - bugfix: Selecting a hardsuit module now checks for energy and suit status - - bugfix: The energy blade projector can now fire darts again - - rscadd: Mounted plasma cutter now has a sprite - - rscadd: Mounted energy gun and Tazer now has a sprite - - rscadd: Mounted medical injector now has a sprite - - rscadd: Mounted grenade launchers now has a sprite - mikomyazaki: - - bugfix: Holocomms will no longer transmit speech before the call is accepted. -2019-04-26: - Randall: - - maptweak: The Auxiliary Warehouse shutter buttons now require Supply access from - the outside. - mikomyazaki: - - tweak: Allows changing a cryptographic sequencer's icon and name in a similar - way to chameleon items. -2019-05-03: - CarefulLilCassie: - - rscadd: Adds folding knives based on the Swiss Army Knives made by Victorinox - & adds them to lockers based on job as well as the loadout for a basic one. - ChaosAlpha: - - bugfix: Fix robots click-dragging things on catwalks. - - rscadd: Robots can now use the , and . hotkeys to move up and down z-levels in - hotkey-mode. - - rscadd: Everyone can now use > and < in non hotkey-mode to move up and down z-levels. - Chinsky: - - rscadd: New sprite for mining scanner, look for air analyzer-like thingie in miner - colors. - - tweak: Mining scanner now behaves like other scanners, storing last scans. To - use it click on a tile you want to scan. It will keep all scans unless buffer - is cleared. - - rscadd: Scanners now make sounds when used. - - rscadd: You can now make handrolled cigs out of any dried plants. - - tweak: Tobacco from cig vendomats can be put in pipes. - Flying_loulou: - - rscadd: Medical Technicians rejoice ! Following OHS inspections, EXCOM decided - to grant you a light polymer helmet, as in most of other EMS services throughout - human space. - - rscadd: Medical Technicians rejoice ! EXCOM also issues you a 'medical technician - chest rig', to help you carry your equipment without being forced to sweat in - a jacket. - - tweak: Medical personnel rejoice ! your paramedic and EMS jackets have been modified, - and now allow you to store a blood bag on the suit storage slot. - - maptweak: The MT chest rig and the EMS helmet are now available in the medical - technician's lockers. - - maptweak: Due to budget cuts, EXCOM had to sell the labcoat from the MTs lockers, - in order to aquire the new equipment. Therefore, you will no longer find labcoats - in the MT lockers. - Higgin: - - tweak: Tactical armor plates now offer extra resistance against brute and bullet - damage over regular medium plates. - - admin: Adminhelps not taken or closed in five minutes automatically close with - a reminder to the owner. - - tweak: Being stunned, weakened, or paralyzed now all prevent radio use. - - tweak: Getting hit can apply a very brief cooldown before you can use your radio - - guaranteed for stun weapons, projectiles, and powerful melee weapons. - - tweak: Pepperspray no longer automatically stuns/weakens targets without mouth/nose - protection. - - tweak: Pepperspray briefly confuses targets without eye protection. - - tweak: Pepperspray has a 50/50 chance to stun targets without full mouth/nose - protection. - - tweak: Partial mouth/nose protection (masks, bandanas) reduces pepperspray stun - chance. - - tweak: Pepperspray weakens stunned targets without full face protection. - - tweak: Buffs pepperspray gas pain damage and adds a chance of stun to gas effects. - Hubblenaut: - - rscadd: Adds a new chameleon headset to the chameleon kit. - - rscadd: Adds three new chameleon accessories to the chameleon kit. - - bugfix: Fixes chameleon items having broken sprites. - Randall: - - tweak: The advanced mop now synthesizes space cleaner instead of water. - RyanSmake: - - bugfix: The Torch is now a valid target for the BSA (for BSAs not on the Torch). - SierraKomodo: - - bugfix: Deck 1 security checkpoint shutters work as intended now. (Actually fixed - this time). - Spookerton: - - tweak: Secure guns are slightly more informative about registration changes and - have shorter ranged interaction logging. - - tweak: Welding tools are now all just one pocket-sized item with swappable tanks. - Tanks change the size of the tool when attached. - - tweak: Emergency toolboxes now also contain a welder with a tiny fuel tank. - - admin: Admin narrations can be styled. SubtleMessage is part of DirrectNarrate. - Moderators get limited DirectNarrate with a SubtleMessage style. - mikomyazaki: - - rscadd: Cooking supply pack now has a bottle of universal enzyme. -2019-05-08: - ChaosAlpha: - - bugfix: New < and > keybinds are now CTRL+. and CTRL+ in non hotkey-mode, to circumvent - a byond limitation. You will need to update your skin. - sabiram: - - rscadd: 'Added several new human languages: Yangyu, a Chinese language (key 2); - New Dehlavi, a Hindustani language (key 3); Prototype Standard Arabic, an Arabic - language (key 4); and Iberian, a Spanish-Portugese language (key 5).' - - tweak: Changed the way human culture defines assign language. Please double-check - your loadout. - - tweak: Sol Common's syllable list has been adjusted. - - tweak: Renamed 'Independent' to Pan-Slavic. - - tweak: The language keys of several languages have changed. Xenophage (4 to L); - Borer (x to z); Vox (5 to x) - - rscdel: Removed 'Lunar' and 'Spacer' languages. -2019-05-12: - Chinsky: - - rscadd: Adds jars of medical lollipops (holding 15u of a random common medicine) - to infirmary lobby and CMO office - - rscadd: Can now scan overmap things with sensor console. By default just shows - site description. - - rscadd: For ships, shows heading and speed, if ship is moving. - - rscadd: For planets output depends on Science skill - atmosphere / plantlife / - wildlife presence (Basic), number of non-natural ruins (Trained), compoisition - / temp / pressure of atmosphere (Expert). - Novacat: - - tweak: Fixes a UI bug with the modular computer downloader and antag programs - Spookerton: - - tweak: Arterial bleeding is now much more obvious to the bleeder. - mikomyazaki: - - bugfix: You now need to wear hardsuit gloves/boots to have a complete airtight - seal when wearing a RIG. -2019-05-13: - Cakey and Marie Taylor: - - imageadd: Adds directional sprites for vending machines, smartfridges, watercoolers, - drying racks and medivendors. Sprites by Marie Taylor. -2019-05-14: - Chinsky: - - tweak: Shuttles now display their fuel in Delta-V rather than pressure gauge. - They also show Delta-V used per move, so you can actually gauge how many jumps - you have left on your fuel. - Devildabeast: - - rscadd: IPCs can now select kicking and stomping as their default unarmed attack. - SierraKomodo: - - bugfix: Energy guns no longer become invisible if cell charge exceeds cell capacity - due to adminbus. - - bugfix: Spacer now has a text color again. It's dark-yellow. -2019-05-15: - ChaosAlpha: - - bugfix: Robots can once again build windows using their synthesizers. - Eckles: - - rscadd: Adds new Skrell factions and home systems. - SierraKomodo: - - bugfix: Being incapacitated no longer affects talking and radio use if the radio's - microphone is set to on. - - bugfix: Talking normally with a nearby radio set to on will no longer trigger - aim-mode shooting. - afterthought2: - - tweak: Movement delay handling from items has been tweaked slightly to give more - fine-grained effects. -2019-05-16: - Chinsky: - - tweak: Helm console layout changed, mostly to prevent sector descriptions shifting - movement keys down at WRONG FUCKIGN MOMENT. - - rscadd: Added acceleration limiter to helm console. Hard value vs engine thruster's - percentage. Doesn't affect fuel usage, use engine limiters for that. - ghostsheet: - - tweak: Hardsuit ore scanner module can now print survey data disk. - - tweak: Hardsuit mounted drill now has an increased energy cost of 2Wh per use. -2019-05-17: - Montykore: - - imageadd: Atmos canister icons and canister details revamped and updated. -2019-05-18: - Chittersky: - - tweak: If you are wearing a voidsuit, spiders now need to breach it before injecting - poison. On other hand, spiders now can breach voidsuits. - - tweak: Spider venom's toxin damage is now slightly weaker, but can cause confusion. - Montykore: - - imageadd: Updated and revamped corgi related icons. - SierraKomodo: - - bugfix: Deck 1 security checkpoint windoors have the correct access flags now. - babydoll: - - tweak: Simple animals' speed prying doors open now depends on the door. - ghostsheet: - - rscadd: 'Plasma cutters can now cut through the following: bulkhead walls, floor - platings, girders, catwalks, windows, low wall frames and lattices.' - - rscadd: Plasma cutters will now spark and require eye protection when interacting - with object. - - tweak: Mounted plasma cutter has an increased object interaction energy cost, - 10 Wh per use. - - bugfix: Drills will now have a delay and sound when drilling through girders. -2019-05-19: - Chinsky: - - rscadd: Added 'Known Implants' field to medical record, that gets auto-filled - with roundstart robotic organs - - rscadd: Added buddy tags to explorer lockers. These can be worn as an accessory, - and will start pinging every half a minute or so if they don't detect another - tag with the same ID in 10 tile range. They can be clicked in hand to set ID - and toggle on/off. - SierraKomodo: - - tweak: Helm and navigation consoles now show 'gigameters/hour' for speed and acceleration. -2019-05-20: - Albens: - - maptweak: Bridge Deck has undergone a refit. -2019-05-23: - Devildabeast: - - tweak: The Roboticist and Biomechanical Engineer have had their access adjusted - to better reflect their respective departments, and the Roboticist can now access - the Engineering Locker Room and front desk, but has had Tech Storage access - removed (which was unusable anyway). - - rscdel: The Roboticist's headset has been removed; the Roboticist and Biomechanical - Engineer now spawn with their respective department's headset. - - tweak: The Roboticist is now Trained in EVA and exosuit operation by default. - - maptweak: The Engineering Locker Room's material reserves have been locked behind - windoors in order to prevent certain nerds from thieving. - - maptweak: Robotics now gets two loaded toolbelts and multitools instead of one, - as well as two pairs of insulated gloves. - SierraKomodo: - - maptweak: Various map tweaks to Aquila to fix clickable sprites being under other - sprites and other mapping nonsense. - - maptweak: The Charon power compartment has a camera again. - ghostsheet: - - rscadd: Medical drop pouch and Medical webbing is now available on the loadout - to medical trainee, chemist and biomech. -2019-05-24: - SierraKomodo: - - bugfix: 7mm haywire ammo boxes now contain the correct ammo. - - bugfix: Flying borgs are no longer capable of having infinite VTEC modules installed. -2019-05-25: - Flying_loulou: - - rscadd: The EC now issues branch berets to their personnel, to denote which section - they're from (available in the loadout, hats and headgear section). - - rscadd: Following extensive training the personnel of the Torch is now able to - clip their helmets on their plate carrier's suit storage slot. - - rscadd: Following even more extensive training the medical technicians can now - clip their EMT helmet on their MT Chest-rig's suit storage slot. - SierraKomodo: - - tweak: Flying borg speed has been reduced one level. Flying borg default speed - is now the same as a regular borg with a VTEC module. Flying borgs with a VTEC - module will be as fast as the old default flying borg speed. - - rscadd: Pill bottles can now be printed at autolathes - afterthought2: - - tweak: The pilot qualification pin is now restricted to Fleet and EC. -2019-05-26: - Chinsky: - - tweak: Spacesuits etc now have maximum pressures they can handle. You can check - their codex entry to see it. - babydoll: - - rscadd: You can now permanently disable radio/teleporter beacons with an emag - or EMP attack. Any connected teleporters will also lose their connection. - - rscadd: Anchored underfloor beacons can be repaired with nanopaste. Handheld or - portable beacons are unrecoverable and must be replaced. -2019-05-27: - BearKingKrug: - - tweak: Clicking on borgs/drones on harm intent with a welder/crowbar actually - attacks them now - ChaosAlpha: - - bugfix: In non hotkey-mode, move-up/down have been moved to CTRL+Numpad_Add/Numpad_Substract - to fix issues with some keyboard layouts. - Chinsky: - - tweak: NTIRC client no longer spawns by default, freeing up some space on PDAs - and such. - - tweak: Reports editor now spawns on Cargo and Command PDAs by default. - Flying_loulou: - - tweak: Security coveralls are now also available for all fleet security personnel - (via the uniform vendor, under utility extra). - - tweak: Changes the firesuit sprite for a new one, based on TG's. - - tweak: Lowered the firesuit slowdown to 0.6 (voidsuits' slowdown is at 1). - - rscadd: Based on TG's sprites, adds the firefighter helmet, and the chief firefighter - helmet (for the CE). You don't need to wear a mask while wearing it, and it - does connect to internals (you still have to toggle them on, of course). - - maptweak: Adds said helmet in the fire closets, to replace the already existing - red hardhat. - - maptweak: Adds fire closets throughout the ship. - - maptweak: Adds fire closets in the Charon and the Aquila. - NewOriginalSchwann: - - tweak: Fatigues have been added to the Fleet pilot's uniform vendor under utility. - SierraKomodo: - - maptweak: 'The bridge deck has received some minor tweaks and fixes. See https://github.com/Baystation12/Baystation12/pull/25628 - for details. Notable changes below:' - - maptweak: CMO's office fax machine no longer blocks access to part of the table - - maptweak: Meeting room now has a fire alarm - - maptweak: Additional cameras were added to CO's office and aft hallway to fix - blindspots - - maptweak: Fire doors were added to doors and windoors that were missing them - - maptweak: PPE closet access flags now match the sidearm closet - - rscadd: Shield generator and shield generator monitor UI now includes a capacity - percentage. - - maptweak: The lift now has firedoors. - - rscadd: Flying borgs now have light-weight armor, providing half the armor value - of a regular borg's armor. Light-weight armor can be printed from fabricators - for half the cost of regular armor, and can also be applied to regular borgs - (Not that you'd ever want to do this.) -2019-05-28: - AlexMorgan3817/_Elar_: - - bugfix: Now device can't be its own proxy. - BearKingKrug: - - spellcheck: Fixed AI intro text to not mention being a traitor - Cakey: - - rscadd: EC service and dress under-uniforms have been replaced with service jumpers, - with complimentary departmental colouring. - - rscadd: EC senior officers (captain and above) now have a unique service cap. - ghostsheet: - - tweak: Overmap Fast speed is now reduced from 20 to 15, this applies to dodging - meteors in shuttles at experienced/master levels. - - tweak: Gas thrusters for overmap travel, will now calculate thrust and fuel consumption - by volume. Lower volume limit from the engine control for more fuel efficiency. - - tweak: Guppy's mass and max speed has been increased. - - maptweak: Charon's atmospheric and electric compartment has be reworked to accommodate - for the fuel consumption. - - maptweak: There are now shuttle navpoints on the hanger deck. -2019-05-31: - EcklesFire: - - rscdel: Removed inappropriate boots from Fleet EMT. - ghostsheet: - - rscadd: Vey-Med has generously donated two prototype hardsuit defibrillator modules - to be used on the torch mission. - - rscadd: Hardsuit defibrillator module has been added to the rescue rig and the - CMO hardsuit. - - tweak: Hardsuit health scanner can now display their reading like the ore scanner. -2019-06-01: - Orelbon: - - rscadd: Adds NanoUI interface to suit storage units. - SierraKomodo: - - rscdel: Vat-grown blanks have been removed from the SRV Petrov. - babydoll: - - tweak: Many objects that were previously rotatable with a verb are now rotated - using alt-click. Any such object will report in examine that it can be rotated. - - tweak: You can now rotate vending machines with alt-click. - ghostsheet: - - maptweak: The Aquila's engine room has been updated, most notably it now has a - fuel pump for easy refuelling. -2019-06-02: - Atebite: - - rscadd: 'New integrated circuit components have been added:' - - rscadd: Reagent funnels - Allows you to use reagent containers such as beakers - on the assembly to refill internal reagent storages - - rscadd: Reagent heaters/coolers - Heats/cools contained reagents, similar to heater/cooler - pads - - rscadd: Anchoring bolts - Anchors the assembly so that it cannot be moved - - rscadd: Hatch locks - Prevents opening the assembly with screwdrivers while enabled - Spookerton: - - rscdel: Resleevers and neural laces no longer exist. - babydoll: - - rscadd: Blobs will now additionally attempt to attack a random nearby tile, even - if they aren't expanding to that tile. The core nucleus itself is particularly - aggressive. - - tweak: Material coins are no longer effective weapons. - ghostsheet: - - rscadd: Plasma cutter can now deconstruct closet. - - tweak: Hardsuit chemical dispenser now has inaprovaline instead of tricordrazine. - - tweak: Rescue rig can now have auto-compressor hooked on the suit storage slot. - - tweak: Ninja's chemical dispenser now has dermaline instead of radium, no more - radioactive super powers today. - - bugfix: Hardsuit module item will no longer be put into bags or closets. -2019-06-03: - SierraKomodo: - - tweak: You know longer magically know an emag is an emag because of your complex - devices skill. - Spookerton: - - tweak: Hearing your current default language skips adding the language identity - to the log. - - tweak: You no longer grunt as if you have no languages if you have any language - you can speak. - - tweak: Team outsider special roles are given an appropriate team language. - - bugfix: Legalese is enabled in the dme again. Derp. - - rscdel: GalCom no longer exists. - - tweak: Everyone on the Torch and Verne except stowaways and merchants are given - ZAC on spawn. - - tweak: Non-Torch jobs do not give a language on spawn unless you spawn with no - languages, in which case you get Spacer. - - tweak: The maximum number of preferences-selectable languages is 3 instead of - 4 due to other changes. - - tweak: Sinta Unathi speak Sinta. Yeosa Unathi speak Yeosa. Having the other language - is optional for both. - - rscadd: Selenian exists. It is a dialect of ZAC (high cross-understanding), not - money-speak. It is the language of selenians, and optional for residents of - luna. - - bugfix: Having no languages at all prevents you from speaking in raw text that - everyone understands. - - tweak: Chimpanzee is renamed Primitive. Subtypes of Primitive no longer exist. -2019-06-04: - WezYo: - - bugfix: Ghosts can no longer close antag pda program -2019-06-05: - Cakey: - - tweak: You can now rotate in chairs when buckled to them by clicking once again. - SolarK: - - tweak: Slowdown penalties based on cold now affected by species discomfort levels - babydoll: - - tweak: All types of blob will now launch bonus attacks less often overall, and - will attack more or less often depending on their type. - - rscadd: Added the 'ravaging mass', which forms an offensive line around the shield - blob spawned by the cores. This type attacks most often and most potently of - all the blob types. - - tweak: The base type (which makes up the bulk of the blob) formerly known as 'ravaging - mass' is now 'pulsating mass', and has had its maximum damage potential reduced. - - tweak: Reduced damage potential of the shielding mass. Increased hit points. - - tweak: Mecha are now valid targets for the blob's bonus attacks. -2019-06-06: - Cakey: - - rscadd: Added a new on-ship ambience sound, for that in-flight pressurised cabin - feel. - Devildabeast: - - rscadd: Adds a nine-pointed star icon to the list of potential bible choices. -2019-06-07: - WezYo: - - bugfix: resetting a flying drone will no longer make it invisible -2019-06-11: - Spookerton: - - tweak: Radio messages no longer show language identifiers if the language is the - same as your default. -2019-06-12: - Chinsky: - - tweak: Doors to the catwalk overlooking Hangar are no longer access-locked. - Devildabeast: - - rscadd: Adds urns which can contain, move, and release ashes, and can be constructed - from different materials. The Counselor gets a wooden urn in their locker on - round start. - Kamiztheman: - - tweak: Item descriptions in the traitor uplink menus have been adjusted so that - new recruits actually understand what they are buying. - - tweak: EMP ammo boxes purchased from the uplink should now have enough ammo to - refill a magazine. - - bugfix: 7mm EMP ammo boxes now contain and can store the correct caliber rounds. - MistakeNot4892: - - tweak: Status indicators on the UI have had a makeover. - - rscadd: You can now click status indicators to get an idea of how things are in - your current state. - Spookerton: - - tweak: The brig no longer contains prison camp clothes because it's not one. - - tweak: The brig officer gets a multitool for locking guests' sensors on. - - tweak: You can lock and unlock suit sensors through the stripping menu with a - multitool. - WezYo: - - bugfix: Attacking with swiss knives properly displays attack verb - ghostsheet: - - rscadd: Hardsuit interface now has internal tank controls. - - tweak: Hardsuit interface has been updated. Fresh coat of paint to keep it looking - good. - - bugfix: Tank "reset" button now works properly, resetting tank release pressure - to its original value. -2019-06-13: - Draxtheros: - - tweak: Raised the temperature at which Unathi begin to receive "warmth" messages. - Spookerton: - - tweak: IPCs cannot be OCIE agents. -2019-06-14: - MistakeNot4892: - - rscadd: Adds thirst. It's like hunger. - Spookerton: - - tweak: Changing species with the changer re-adds languages required by the user's - antagonist type. -2019-06-15: - Cakey: - - maptweak: 'adjusted the bridge deck slightly:' - - maptweak: straightened the outer hallways to be more convenient - - maptweak: reorganised the meeting room to use its space better - - maptweak: matched wood types accross all offices - - maptweak: gave an extra console to the side-islands in the bridge - - maptweak: reshuffled COS and CE office contents, added disposal chutes - - maptweak: brought outer hallway decals in line with door marking standard - afterthought2: - - bugfix: SMES inverted logic fixed; should now work with terminals properly. - - bugfix: APCs now charge from empty properly again. - - bugfix: Heaters/coolers/protolathe/circuit printer work again. - babydoll: - - bugfix: Fixed mirrors not opening their menu. - - rscadd: Added yew wood, and its planks to the supply menu. - - tweak: Adjusted mahogany and walnut wood colours. - - bugfix: Corrected mahogany and maple plank loadout info. - ghostsheet: - - maptweak: Deck three toilets now doesn't suffocate people anymore. - - tweak: Hardsuit modules can now be deselected by pressing select again. - - tweak: Hardsuit plasma cutter automatically do object interaction if they're adjacent. - They will now also always fire on harm intent. - - tweak: Hardsuit flash module now flashes on unarmed attacks. - - tweak: Hardsuit flash module now has has a function to activate the flash without - targeting anything. - - tweak: Hardsuit flash now has a higher energy cost of 10 Whr per use. -2019-06-16: - Devildabeast: - - rscadd: "Adds the Bah\xE1'\xED Faith to the list of selectable human religions." - - tweak: Suit sensors can now be set by alt-clicking your uniform. - MistakeNot4892: - - tweak: Humans can now leap/tackle at a small distance based on their Athletics - skill. - - tweak: Leaping and tackling (Vox and Xenophage powers) are now invoked by attempting - to make a ranged grab - if it's not a mob you'll just hurl yourself in that - direction like an idiot. They have had timing values tweaked and require a short - channel before use. - - tweak: The various outcomes for leaping/tackling have been made dependant on skill - levels in Athletics and Combat. Check the PR for specific values. - - tweak: Split the Chaplain and the Counselor into two separate roles. Chaplain - was moved to Service and lost Medical access. - - rscadd: Replaced the defunct Sec checkpoint near the Chapel with the Counselor's - Office, it's where t'Counselor lives. - - tweak: Moved the Psychiatrist and Psychologist alt titles to the Counselor. - Spookerton: - - bugfix: Species toxins modifiers are used again, and modify internal organ damage - taken from toxins and organ failure. - - bugfix: Lava no longer deletes human and human derived mobs early when braindead. - afterthought2: - - bugfix: Borg chargers once again spawn with the cell installed. - - bugfix: Vents starting as off are fixed. -2019-06-17: - SierraKomodo: - - tweak: Brig Officer is now known as Brig Chief. - afterthought2: - - bugfix: SMES sizes and starting charge should now be back to normal. - - bugfix: Pressure regulators should once again be interactable. - babydoll: - - rscadd: Added a system to rarely spawn larger, more dangerous fauna on exoplanets. - - rscadd: A giant crab, peaceful until provoked, can now spawn on desert exoplanets. - ghostsheet: - - tweak: Plasma cutter now uses up half a charge per deconstruction. - - bugfix: Deconstruction of walls and girders now gives the appropriate materials. -2019-06-18: - MistakeNot4892: - - tweak: Dionaea can stand in water to recover thirst, and lose hydration slower - than others. - - tweak: Going prone on water turfs will now drown you. -2019-06-19: - SierraKomodo: - - tweak: Airlock control boards now have 'Autoset Access' enabled by default. -2019-06-20: - Heptagon49: - - bugfix: Fixed variables so powercells aren't duped when inserted into the coilgun. - - bugfix: Fixed coilgun examination so that it works now. - Kamiztheman: - - rscadd: Adherents aboard the Torch have finally found their crystalline toolboxes, - and have loaded their vending machine with them as an alternative to the harness. - MistakeNot4892: - - tweak: You now use grab intent only to perform a tackle/leap. - - tweak: Running off a ledge with a leap prepared (using Prepare To Maneuver) will - automatically try to jump to the next closest non-open turf. - - tweak: Mobs will now behave more like objects when thrown - they will pass tables/rails - and collide with obstacles. - SierraKomodo: - - rscadd: AI can now jump to people talking near an active holopad. - Spookerton: - - tweak: Improvised cuffs break if resisted out of a few times. - - tweak: Cuffs and improvised cuffs can now be attached to most shoes, hobbling - them. Improvised cuffs break if the wearer moves enough. - - tweak: Knives can be stored in more kinds of shoe. - afterthought2: - - tweak: Kitchen cookers, microwaves, gibbers, and seed/honey extractors are now - buildable. -2019-06-21: - Alex6511: - - tweak: Meteor now requires 15 players - Textor: - - rscadd: Adds gas sensor, air injectors, digital 3-way valves, and gutters to pipe - dispenser - - rscdel: Removes non-omni versions of filters and mixers from the game. - - rscadd: Pipe dispensers UI is updated. Pipe dispensers can now dispense normal - pipes with paint already applied to them and dispense 1, 5, or 10 pipes at a - time. - - rscadd: Atmospheric control console UI updated. You may now directly input values - instead of using plus and minus buttons. - - rscadd: Pressure tanks can now be built with steel sheets, and deconstructed. - - rscadd: Vent pumps and injectors can now have their configuration changed using - a multitool. - - tweak: Due to fuel pipes having different tolerances, they are no longer compatible - with normal pipes and need a universal adapter to connect two networks together. - - maptweak: Removes all non-omni filters and mixers from all maps and replaces them - with omni versions. - afterthought2: - - tweak: Washing machines are now buildable. - - tweak: Portable pumps, scrubbers, huge scrubbers, and hydroponics trays are now - buildable using circuitboards. -2019-06-22: - Unknown: - - tweak: The Mend psi-power now scales in effectiveness to your rank, and is available - at lower ranks. - - tweak: Autoredaction is now less buggy in regards to fixing bleeding, and somewhat - less spammy when healing you. - - tweak: Coercion now has Mind Read as a power. It prompts someone with a question - that they are compelled to answer - RP tool only. - - tweak: Blindstrike now has a visible tell when used. - - tweak: Spasm, Agony and Blindstrike have been shuffled around within the Coercive - tree. - - tweak: Latent psionics will no longer be aware they are latent psionics. - - tweak: The Probe power is now called Assay and has been moved to operant-rank. - - tweak: Made some roundstart announcements bigger/easier to read. - babydoll: - - maptweak: Moved the chapel down to deck 3, south of the holodeck. - - maptweak: Remapped the mental health section of the infirmary. - - rscadd: Added pews for the chapel. - - rscadd: Added pews to the material construction menu. They can only face south! -2019-06-23: - MikoMyazaki: - - rscadd: Traitor robots always get their emag items. - - rscadd: Cultivator drone now has an emag item, an energy machete. - - bugfix: Restores Petrov access to the Access Decrypter antagonist program. - MistakeNot4892: - - tweak: The config options RUN_SPEED and WALK_SPEED are now more accurately named - RUN_DELAY and WALK_DELAY. Default values have been adjusted to match the previous - behavior. - - rscadd: Stamina now exists. You will recover stamina fastest while well fed and - lying down, but will recover it slowly so long as you aren't actively sprinting. - Stamina recovery can be tweaked in config. - - tweak: Running will now consume stamina. Costs can be tweaked in the config. If - you run out of stamina, you will not be able to run again until it refills. - - rscadd: You can now hold shift to sprint, and release it to walk. You can set - default walk/sprint options with Set Default Walk and Set Default Run. - - tweak: The Counselor is now mildly psionic, and is a registered affiliate of the - Cuchulain Foundation for RP purposes. They have some tat in their office relating - to psionics more generally. This is hopefully going to be a way to make psionics - more broadly known ingame - see Discord/PR/other discussions if interested. - - rscdel: Removed Psychiatrist. - - tweak: Psychologist is now a Passenger alt title. - afterthought2: - - tweak: Machine interaction has been reworked further. Be ready for some issues. - - tweak: You may now install and remove machine components by hand on (some) machines - you can build from circuits. To do this, first open the panel with the screwdriver - (you may need to make sure the machine is off or other conditions are met). - Then either insert a component by clicking on the machine with it, or use a - wrench on the machine to remove the component. - babydoll: - - rscadd: Added the disorientator, a short-ranged beam weapon with effects similar - to a flash. - - rscadd: Added the disorientator to core department head closets and RnD. -2019-06-24: - Alex6511: - - balance: The meteor gamemode is now significantly more powerful. - MikoMyazaki: - - bugfix: Spells granted by The Tower deity no longer require robes to cast. - - tweak: Adds an exit button to the Deity punishment menu incase you open it accidentally. - - rscdel: Removes some stamps that shouldn't exist. (Warden, HoP, HoS, etc.) - - imagedel: Removes some now unused stamp icons. - - tweak: RIG stamp module now does the normal stamp instead of the Internal Affairs - stamp. - - tweak: Centcomm stamp (used on admin faxes) now uses the map specific boss name - for the stamp. - - bugfix: Prevents putting polytool augment tools in your pocket, behind your ear, - etc. - - tweak: RIGs will now warn you if you make them malfunction while offline, requiring - nanopaste to repair. - Mistakenot4892: - - rscadd: Added a slower version of walk, Creep intent. - NobleCaos: - - tweak: Diona Nascent Gestalts can now katamari up items as well as nymphs based - on the amount of nymphs in the gestalt - SierraKomodo: - - maptweak: Filters in atmospherics no longer connect to the wrong pipes. - - maptweak: The Corporate Liaison's office now has a gun recharger for the LPA's - sidearm. - - tweak: LPA and CL lockers now spawn with spare headsets, including bowmans. - afterthought2: - - bugfix: SMES panel opening, shieldgen deconstruction, and door autoclose have - been fixed. - - tweak: You can rotate disposals pipes now. - - tweak: Flipping disposals pipes moves them to the mirrored state (unlike rotating - twice). - - tweak: Dragging disposals pipes no longer rotates them. - - bugfix: various issues with disposals construction have been addressed. -2019-06-25: - ghostsheet: - - bugfix: Shuttle thruster now block air and fire; shuttles are more fireproof and - less gas contamination should occur. - - tweak: Shuttle engine heater, are now climbable. - - maptweak: Medical bathroom now has a mirror, for all your post radiation treatment - needs. - - maptweak: Charon atmospheric compartment has been returned to its previous state. - - maptweak: Hanger fuel bay now has a high power pump, to reduce prep time. -2019-06-26: - Cakey: - - tweak: Grass, carpets, and dirt have new icons. - - rscadd: A new system has been put in place for floor detailing, allowing for pre-made - edges. -2019-06-27: - MikoMyazaki: - - bugfix: Can no longer drag people off of something they are buckled into (e.g. - roller bed) onto an op table without unbuckling. - MistakeNot4892: - - rscdel: Removed xenophage and all adjacent code. - - tweak: You now need to hold CTRL to do a leap. - SolarK: - - tweak: Added damage limit applied by vacuum. - babydoll: - - rscadd: Swarms of enormous leeches can now spawn on shrouded exoplanets collectively - as megafauna. - - rscadd: Soap now comes in a few different shapes, sizes and colours. - - rscadd: Cleaning someone with soap will now attempt to transfer some of the soap's - reagents to that person. -2019-06-28: - MikoMyazaki: - - rscadd: Adds a chemistry recipes book to the chemist's locker that lists the medication - recipes. - Novacat: - - rscadd: Adds the dufflebag of holding, a cosmetic reskin of the Bag of Holding. - - tweak: Fixes some onhand sprites for dufflebags. - Roland410: - - maptweak: Moved the CE's suit to the bridge EVA storage. - - maptweak: Made the conference room a tad bit bigger and moved items around, gave - it a request console. - - maptweak: Removed one console on each side of the bridge and added tables instead, - gave another emergency toolbox, donut box, coffee mug, and a shortwave. - - maptweak: Gave the CL a box of cigars, bronze zippo, union card box, and made - the backroom properly boltable by the button. - - maptweak: Added disposals to the CL office. - - maptweak: Shuffled around the contents of the CE's office. - - maptweak: Gave the CO a Torch ship model. -2019-06-29: - .verarch: - - tweak: lizard horns should no longer obscure eyes. - - tweak: work gloves should fit unathi somewhat better now. - Cakey: - - rscadd: Adds pixel offsets to all mobs to give the game more feel for depth. - - rscadd: Gives all mobs a drop shadow. - afterthought2: - - admin: More things should show up in admin logs now. -2019-07-01: - MistakeNot4892: - - tweak: Vox jobs (scav and stowaway) now have soft antagonist status. - Spookerton: - - bugfix: Microwaves don't eject their components. - - tweak: dismantling a microwave empties it first. -2019-07-02: - Cajoes: - - tweak: modified adherent tool vendor to look modified - - tweak: changed adherent tool vendors vend animation from "tool_vend" to "tool-vend" -2019-07-04: - MikoMyazaki: - - maptweak: Officer's Mess is now all access. - Spookerton: - - bugfix: microwaves properly remove their ingredients after cooking. -2019-07-05: - Cajoes: - - tweak: Lava lamps have been optimized. - MistakeNot4892: - - tweak: Borers now use Dominate via ranged disarm attack and Infest via melee grab - attack. - - tweak: Language on borer messages is now more neutral. - - tweak: Borer powers now largely have UI buttons. - - tweak: Psionics can see auras around borers when they aren't inside hosts. - - tweak: Borer Dominate is now properly psionic, and respects psi-null atoms and - psi armour (ie. Coercion ranks). - - rscadd: Added neutered borers. Adminspawn only, basically defanged peaceborers. - - tweak: Significant backend refactor for borers, please report borer bugs. - afterthought2: - - rscadd: Robots now get skills set according to their module choice. - babydoll: - - tweak: Bog-standard parrots will now retaliate briefly when attacked. - - tweak: The space parrot occupying its temple in the asteroid will now retaliate - with force when attacked. Beware! - - rscadd: A giant parrot can now spawn as the grass planet's megafauna. - babydoll, Xhuis & Sunner: - - rscadd: Added the hivemind, a megafauna spawn for settled exoplanets. Beware its - attacks and strike when it's vulnerable. -2019-07-06: - Devildabeast: - - rscadd: Inscriptions can now be carved into material (gold, steel, silver, etc) - rings using sharp objects. - MikoMyazaki: - - tweak: Antagonist implants are now not visible to the bodyscanner, you can find - them by opening the implanted bodypart and examining. - afterthought2: - - tweak: If a machine is hackable, you'll now only get shown the wires panel; to - see the usual interface close the hacking hatch with a screwdriver again. -2019-07-07: - Devildabeast: - - tweak: 'Counselor now gets different psionic faculties by alternate title: Redaction - for Counselor and Coercion for Mentalist.' - - rscadd: Focus has been added as an Operant Coercive ability; grab a target while - target the mouth, then use the grab on them on disarm intent to cure the target - of various mental ailments. Power scales by rank. - - tweak: Spasm is now a Master ability rather than Operant. -2019-07-08: - Devildabeast: - - rscadd: Dog tags can now be added to the commemorative plaque to memorialize members - of the Expeditionary Corps. - afterthought2: - - tweak: The emergency supplies crate is cheaper but has no armored vests now. - mikomyazaki: - - bugfix: Clonexadone and Cryoxadone no longer reduce damage on necrotic organs. -2019-07-09: - mikomyazaki: - - tweak: RUST manual now links to the wiki guide (and doesn't teach you to blow - up the RUST) -2019-07-10: - afterthought2: - - rscadd: Machines now require power components to draw power. These can be printed - from the autolathe. The tesla link one is the default one to use. - - rscadd: Many machines now require screens and keyboards to be fully interactable. - You can print them from the autolathe. - - rscadd: To install components, open the panel with a screwdriver (after the machine - is built) and click on the machine with the component. To remove components, - use the wrench while the panel is open. - - tweak: 'Computer construction has been changed. A screen and keyboard is required - now. The order is: make a frame, wrench to anchor the frame, add 5 coils, add - the circuit, add all components as prompted, screwdriver to build. To deconstruct, - crowbar to remove components, wirecutters to cut the wire, unwrench, and apply - welder.' - - tweak: General machinery follows the same construction steps as computers now. - - rscadd: Computers now have panels, like other machines. To deconstruct a computer, - use a screwdriver to open the panel and then a crowbar to deconstruct. - - tweak: Newly built machines have the panel open. - - rscadd: If confused about this, examine the machine while standing next to it - to get information about which tools to use on it. - mikomyazaki: - - bugfix: Can now properly construct multi-tile glass airlocks. -2019-07-11: - afterthought2: - - rscadd: Shuttle consoles are now buildable. Use a multitool on the circuit while - on a shuttle to set the shuttle first! Shuttles are still not buildable; you - must do this on an existing shuttle. - mikomyazaki: - - bugfix: pAIs no longer have to fold up twice to become a card. - - bugfix: pAIs with the Universal Translator module can now speak and understand - Spacer and Gutter. - - bugfix: Mend psychic power now works properly on operant level to fix bleeding. - zaredman: - - maptweak: Adds an Interview Room to the Brig. Adjusts nearby rooms to fit. -2019-07-12: - Cajoes: - - rscadd: food in steel cans and support for canned items, added to cargo - - rscadd: Added pistachios to snix vendor - - rscadd: Added Sol Snacks vending machine. (And ethnic sol foods to go with it) - - Vendor by Chinsky - - rscadd: Added japenese snacks to the snix machine and changed it to its own vendor - with some label tweaks please welcome the painfully ethnic "Yummy Fods" vending - machine. Available in cargo - - tweak: Snix machine now more slavic in design - - rscadd: Added deoderant to lavatory essentials - - rscadd: Added chessboard to game vendor - - rscadd: Added numerous vendors to the Cargo Supply Form - mikomyazaki: - - bugfix: Printing from the file manager program now prints visible paper. - - tweak: Adds basic medical and trained chemistry skills to the Service Module. - Gives the Service Module the full selection of booze and soft drink dispenser - drinks. Significantly reduces power requirement of the drink dispenser tool. - - bugfix: Autopilot will now accelerate correctly. - - tweak: The psiblade can now hit robots instead of trying to cut their wires like - a wirecutter. - sick trigger: - - maptweak: Added tinted windows and a light switch to the chapel. - zaredman: - - maptweak: Fixed some map oversights following the Security interview room addition - (like the wall blocking the door to the FT's lab). - - maptweak: Added laundry pods to the Medical washroom. -2019-07-13: - mikomyazaki: - - tweak: Machines will now have a hint if you have forgotten to install a tesla - link. - - rscadd: Robco vendor will now vend tesla links and keyboards for building machinery. -2019-07-14: - Devildabeast: - - tweak: Makes the machete sheath its own selection under loadout; removes it from - the list of holster selections. - - rscadd: The Chaplain's bible now has "blessings;" as a Chaplain, use your bible - (or holy book) on another character to recite a prayer to them, or use the book - in your hand to read a passage to everyone nearby. If you are of the same religion, - they will receive a message putting them at ease. - sick trigger: - - maptweak: Skrell ship air alarms set to a higher, more appropriate temperature. -2019-07-15: - afterthought2: - - admin: You can now ban, jobban, and view notes on logged out mobs. This will act - on the last ckey to have possessed the mob. - babydoll: - - maptweak: Replaced all-in-one grinders in cooking areas with idiot proof juicers. - These cannot hurt your hands. - - maptweak: Replaced all-in-one grinders in laboratory areas with industrial grinders. - These can hurt your hands. - mikomyazaki: - - rscadd: Conveyor Belt and Switch assemblies can be created from the autolathe. - Use the switch on the conveyor belt to link before placing, crowbar to remove - both. -2019-07-16: - MikoMyazaki: - - imageadd: New MMI icons with damage states by Joeynosegay. - - tweak: FBPs no longer get brute/burn mod bonuses from their human subspecies. - - rscadd: Prosthetic organ fabricator can now print replacement FBP power cell organs. -2019-07-18: - Devildabeast: - - rscadd: Adds colorable beanies and rastacaps to the loadout. - babydoll: - - rscadd: The zeq queen megafauna can now spawn on chlorinated exoplanets. -2019-07-20: - Boznar: - - maptweak: Adjusted fire locks on deck one and three for better mobility and logic. - Devildabeast: - - rscadd: Adds several Chaplain religious insignia to the loadout, representing - various faiths. - - rscadd: Adds Sikhism to the list of human religions. - - rscadd: Adds several preset religious books to the loadout. - - rscadd: Adds Shinto to the list of human religions. - Funce: - - bugfix: Bad Chefs no longer make runtimes with the juicer. - Rain7x: - - tweak: Increased the chances of the mail event; and of its rare gifts spawning - SierraKomodo: - - bugfix: Masks can now properly hide ear and eye slot items if configured to do - so. - WezYo: - - bugfix: renaming paper no longer runtimes - YodaDoge: - - bugfix: Farmbot can now harvest plants and remove dead plants, again. - afterthought2: - - tweak: Adding capacitors to a machine buffs the battery backup's charge rate. - - tweak: Borg chargers recharge faster now. - - bugfix: Toggling APC power manually with exotic mapped apcs should work properly - now. - ghostsheet: - - maptweak: Hanger Atmospheric Storage room has been added to the hanger. This replaces - the unused refinery slot near the fore of the charon. - - bugfix: Restore button pressing sprites to their previous states. - - bugfix: Cell charger will now work in Z-level transition, and they now have proper - sprite charge bar. - - rscadd: Cells now have a red charge state which is below 25% charge. - - tweak: Suit cyclers repair function is now default for all suit cyclers. - - bugfix: Duct tape space suit repairs now works properly while suits are being - worn. - - rscadd: Mining drill head now indicate how full they are. - - tweak: Mining drill head logic change slightly to be more informative. - - tweak: EVA airlock on deck 3 now has all its access set to ACCESS_EVA. So anyone - who can enter the room can use the airlock. - mikomyazaki: - - tweak: Can no longer adjust your Chameleon Item's appearance while restrained - or disabled. - - maptweak: Toxins lab now has a button for its blast doors, labels for its pumps, - chamber now has a gas sensor, and more lighting. - - tweak: Can no longer do surgery through thick clothing, suits, RIGs, etc. You - will need to remove the clothing before you can make incisions. - - bugfix: Female characters will now be able to use the roll down and roll sleeves - verbs without their jumpsuits disappearing. -2019-07-21: - SierraKomodo: - - tweak: Blob resistance values have been tweaked. Cores are now weak to fire and - laser, and strong to brute, like green blob. - - tweak: Blob shielding mass regeneration rate has been very slightly reduced. -2019-07-22: - MikoMyazaki: - - rscadd: Adds Vecuronium Bromide, a paralytic drug. - afterthought2: - - rscadd: Vending machines are now constructable using circuits, and also can be - deconstructed. Drag the container they drop to another vendor of the same type - to restock it. - - tweak: To add things back to vending machines, you now must be on help intent - (useful for tool machines). - zaredman: - - maptweak: Moved and remodeled Investigations Office, Forensics Lab, and Evidence - Storage. - - maptweak: Slight adjustments to Brig Chief's office to better accommodate the - redesigned processing room. -2019-07-23: - CrimsonShrike: - - rscadd: Exosuits have been completely refactored. Make sure to check your skills - before joining the round. - - rscadd: You can now slide ID across a PAI to grant them your access. - Devildabeast: - - rscadd: Adds a unique holosign to the Chapel airlock. - - rscadd: Adds Jainism and Taoism to the list of human religions. - - rscadd: Adds two new chaplain insignia for Jainism and Taoism. - Eonoc: - - tweak: Tweaks Vox codex entry - - rscadd: Add Vox shriek audible emote - afterthought2: - - tweak: Manually toggling apc settings will no longer raise alarms. Also applies - to some mapped APCs. - ghostsheet: - - tweak: Electron reservoir will now shock you upon bumping/getting thrown into - it. - mikomyazaki: - - tweak: Supermatter manual will now show you the wiki page for the Supermatter - Engine. - - bugfix: Underwear will now no longer be kept on species change, if the species - you are changing into cannot wear underwear. -2019-07-24: - Chinsky: - - tweak: Earmuffs now actually muffle sounds. You'll also not hear spoken things. - - rscadd: Headphones can actually play music now. Drag onto yourself when worn in - ear slot to access menu. They act as earmuffs when music is playing. - mikomyazaki: - - bugfix: IV Bag construction option name changed from 'plastic bag' to 'plastic - IV bag' so it is different from the other 'plastic bag'. -2019-07-25: - WezYo: - - tweak: Aiming point blank at someone will actually aim at them now - YodaDoge: - - tweak: Order Ranks of Jobs ascending so the lowest rank is selected by default - afterthought2: - - rscadd: An overmap-capable shuttle can now catch/grapple another overmap-capable - shuttle currently moving on the overmap. You do this by moving to an appropriate - landmark on the shuttle console. - - rscadd: If a shuttle is grappling another shuttle, it cannot move on the overmap; - it will be moved by the other shuttle. - - rscadd: If a shuttle is being grappled by another shuttle, it cannot make shuttle - jumps until the grappler has left. - - tweak: Ships within ships count towards vessel mass now, meaning you'll accelerate - slower with them landed/attached. - - tweak: All greentext for antag objectives and game modes has been removed. - babydoll: - - tweak: All hivebots now have increased health. - - tweak: Increased hivebot megafauna 'hivemind' damage output. - - tweak: Reduced hivemind vulnerability duration. - - tweak: Reduced hivemind cycle duration. -2019-07-27: - zaredman: - - maptweak: The larger portion of the Security Armory is now Equipment Storage. - Security Staff now have access to this room. -2019-07-29: - Chinsky: - - rscadd: Added a medical health checkup to Reports program for all you thirsty - doctors - CrimsonShrike: - - rscadd: Exosuits can now be repaired without using a recharger using either a - welding tool or cable coil depending on damage. - Devildabeast: - - rscadd: Adds Hephaestus Titan, a bulky full-body prosthetic, and Morpheus Atlantis, - a skeletal head prosthetic, to chargen. - Eonoc: - - bugfix: Fixes the Vox spacesuit light overlay from a grey hat, to just nothingness, - since I didn't feel up to making new sprites for it, and most of the suits have - glowy-looking bits anyway. - Rain7x: - - tweak: Makes the "boot selection" in loadout available to civilians only. - Spookerton: - - tweak: Prosthetic limbs previously named Grayson are now named Shellguard. - mikomyazaki: - - tweak: Unathi brains will now not accept being MMI'd. - - tweak: Unathi may no longer have prosthetic internal organs attached. - - tweak: Unathi may not start the round as FBPs. - - tweak: Unathi may no longer select assisted or synthetic internal organs on round-start. - - maptweak: Vox ship burn chamber now operates properly (fixes incorrect injector - settings) - - maptweak: Vox ship burn chamber can no longer cause the ship to self-destruct - due to temperature melting the windows, since they have been replaced with walls - that handle up to 12,000K. - - maptweak: Adds a temperature/gas sensor to the burn chamber. - - maptweak: Vox ship ignition switch now isn't hidden under a light. -2019-07-30: - Rain7x: - - tweak: Medical & Engineering trainees can now select their department specific - webbing & drop pouches; and medical trainees now have access to their department - armbands. - mikomyazaki: - - tweak: Senior Engineer now gets access_network, allowing them to use the NTNet - Diagnostics and Monitoring program and various command line tools. - - tweak: Access hacking antag program can now hack access_network, if the antag - has master level IT skill. - - tweak: The NTNet Quantum Relay in telecomms will now keep physical logs of network - activity, wiping the NTNet Diagnostics Program logs will not affect these, and - they cannot be accessed remotely. The portable drive can be removed via a UI - eject button and the data imported from it into a modular computer. - - maptweak: Telecomms storage room now has a couple of spare portable hard disks. -2019-07-31: - Devildabeast: - - rscadd: Adds colorable bracelets to the loadout. - WezYo: - - bugfix: Requesting pAI personalities works now -2019-08-01: - BlueNexus: - - rscdel: The Security cyborg module has been disabled. - afterthought2: - - bugfix: Chloral hydrate is once again effective; this applies to sleepy pens. - babydoll: - - rscadd: Added the antlion and antlion queen to desert exoplanets. - - tweak: Moved the giant crab megafauna to snow exoplanets. - mikomyazaki: - - bugfix: Nacelle control switches in the engineering monitoring room will now work. - - bugfix: Fixes issue that prevented organ transplants. -2019-08-02: - CrimsonShrike: - - rscadd: Added 2 new exosuit propulsions. The quadlegs and the armored tracks. - - tweak: Speed tweaks to exosuit legs. - Noble Caos: - - rscadd: Allows nascents gestalts to add human-sized mobs when the gestalt contains - 20 nymphs. - babydoll: - - tweak: Renamed all tasers in their various forms to electrolaser. - zaredman: - - tweak: Re-adds the Torch variant of the Sec-Tech and actually stocks it with more - gear. -2019-08-03: - Boznar: - - maptweak: Nacelles now have air alarms, fire alarms, and fire doors. - Nirnael: - - bugfix: Fixes bug in using a new apc frame on a broken apc to repair it. - Rain7x: - - tweak: Tweaks the event announcement messages to be more tone-neutral & standardizes - the announcement header - WezYo: - - tweak: Attaching a photo to a newscaster story will no longer remove it from your - hand - afterthought2: - - tweak: The shield generator has been reworked. It is now much more expensive to - keep the shields on continuously, and for large shields it's likely not viable. - - rscadd: The shield generator now has an idle and active state (as well as the - off state). In the idle state, it consumes limited power and does not generate - a shield. In the active state, it consumes a lot of power and produces a shield. - - rscadd: If an idle generator is toggled on, it takes a short amount of time to - spin up to active state. If an active generator is toggled to idle, it will - switch to that state instantly. - - rscadd: There are several levels of idle power usage that can be selected. Higher - power usage decreases the spin-up time proportionately. - - rscadd: The shield generator takes time to adjust the radius of the shield. The - radius will not be adjusted while the shield is active. - - tweak: The shield generator's power storage has been vastly expanded. - - tweak: The shield generator's field integrity is now tracked separately from the - power storage (it's determined by the amount of power stored, up to a threshold). - mikomyazaki: - - tweak: Radiation collectors are now capped at 500kW output at 250Bq radiation. - They are more efficient at lower radiation levels. - - tweak: Radiation collectors will have variable fuel usage, capping out at 250Bq - radiation. Fuel usage increased significantly (1-10x depending on radiation - levels) - - tweak: Radiation collectors will now break from high radiation levels (500Bq) - as well as temperature, they will display a warning and play a warning sound. - - maptweak: Stowaways can no longer spawn in the incinerator room, which they cannot - leave. - - bugfix: Fixes inconsistent icon names for female jumpsuit icons. Should work for - rolling down / roll sleeves for all jumpsuits/suits now. -2019-08-04: - Bxil: - - tweak: Inflatables now have 1 second delay. - Chinsky: - - rscadd: Adds 'Codex' verb that shows user the 'frontpage' of codex, with links - to search / index / categories. - Eonoc: - - rscadd: Adds a Vox RIG. Same statline as the Industrial RIG, but with full temperature - and radiation resistance. Vox had no way to scavenge radioactive or volcanic - planets up until now. - - rscadd: Adds flux cannon. Essentially a Vox AEG, but with the lasers doing brute - damage, and shock mode replaced by a mode that scatters low damage pellets in - a burst. - - rscadd: Adds sonic cannon. A vox stun rifle, with a mode that uses up all the - gun's charge to push, deafen, and dizzy an opponent. Ear protection such as - helmets and earmuffs will negate the deafening, and reduce the dizziness. - - rscadd: Added the associated projectile types for both above, obviously. - - rscadd: Added two new firing sounds, spike.ogg and eLuger.ogg - - tweak: Changes spike launcher firing sound to spike.ogg - - tweak: Stealth buff to Armalis to make their large size reflected more mechanically. - - tweak: Changes the Vox species check on Vox guns to make the guns hiss and jump - out of your hands. - WezYo: - - rscadd: CSO now has maint access - - rscdel: Removed the discard verb from playing cards - - rscadd: Added the ability to pick a card by clicking it with an open hand - comma: - - tweak: Blunt yet sufficiently strong weapons can now pop inflatables - mikomyazaki: - - bugfix: Yeosa unathi have correct job restrictions now. -2019-08-05: - mikomyazaki: - - tweak: Resisting will auto-cancel resting. -2019-08-07: - BlueNexus: - - tweak: All non-total radiation resistance values for suits etc have been halved. - - tweak: The Supermatter, nuclear reactor, R-UST, PACMANs and other radiation sources - which were too weak to be relevant have been buffed. - - tweak: Radiation sources that were deemed to be too strong have been nerfed, such - as garbage planets. - - tweak: Grilles have had most of their radiation resistance removed. - - tweak: Low walls and windows have had their rad resistance halved, so they add - up to a full 100% instead of 200%. - MistakeNot4892: - - rscadd: Added a more involved butchery system. - - rscdel: Removed stowaway. - mikomyazaki: - - maptweak: Double sets of windoors now have only the interior windoor at department - reception desks. - - bugfix: Low wall frames deconstruct into 3 steel sheets, which is the amount required - to build them. - - maptweak: Robotics central windows are now not tintable, surgery area still is. - - tweak: Autoinjectors now have a timer for use on other people, instant for yourself - OR on incapacitated people with any skill level. They take a third the time - compared to a syringe. -2019-08-08: - Cajoes: - - maptweak: Reworked the abandoned shooting range space into additional lavatory - facilities and a sauna. - - rscadd: Adds a wooden bucket -2019-08-10: - Bxil: - - rscdel: The asteroid will no longer spawn at the Torch every round. - mikomyazaki: - - bugfix: Relocating limbs will now properly always work when you have high enough - medical skill. -2019-08-12: - Boznar: - - maptweak: Adds shutters to the exterior windows of hydroponics, aft bubble, and - lounge. - Chinsky: - - tweak: Medical Technicians can no longer have Anatomy skill at Experienced or - higher. - - tweak: Surgery skill reqs and penalties got beefed up. - - tweak: Most surgery step require both Trained Anatomy AND Expert Medicine. - - tweak: Delicate' surgery steps (basically inside organ stuff) require both Expert - Anatomy AND Expert Medicine. - - tweak: Penalties to success chance for missing skills were jacked up mercilessly. - Unless you're missing 2 or less skill levels you're not going to succeed, sorry - bud. - - tweak: Physicians now start with Expert Medicine, free skillpoint pool lowered - by its cost. - - tweak: Robotic steps require Trained Complex Devices. If there's meat bodyparts - involved (e.g. installing into one), need both Trained Complex Devices and Trained - Anatomy - - tweak: Slime surgery steps require Trained Science. - Piccione: - - tweak: Heads of Security are now are better screened to ensure loyalty to the - SCG - ghostsheet: - - tweak: Butterfly knife damage is now slightly lowered. Still pretty deadly. - mikomyazaki: - - bugfix: Airlock bolt buttons (e.g. SMES room and engine hatch doors) will now - work. -2019-08-13: - Terror4000rus: - - rscadd: You can take a pill from pillbottle by using it. - YodaDoge: - - tweak: reduced shield power usage - ghostsheet: - - tweak: Due to the space related mortality rate of our recent expedition, the EXO - has increased funding to restock EVA equipment. There are now 5 jetpacks and - 3 cooling units in EVA on deck 3. - mikomyazaki: - - bugfix: Resetting a tech you have no levels in at the RnD Server will no longer - give you 1 in that tech. - - rscdel: Removes Arcane Tech, as it did nothing. - - rscadd: Worn RIG suits will now be charged if you walk into a cyborg recharger. - If you have an internal cell (FBP/IPC) then that will charge first. - - bugfix: Airlock access buttons will now work even if the area they are in has - no power. - - rscadd: Traitor Robots will get a verb 'Reset Identity Codes' that will remove - their external camera connection, robot console connection and lawsync status. - - bugfix: Fire axes can now attack unpowered airlocks on harm intent, regardless - of the damage level of the door. - - tweak: It now takes several hits to get through an undamaged door with a fire - axe. -2019-08-14: - MistakeNot4892: - - rscadd: Added a new human subspecies, the boosters. - mikomyazaki: - - tweak: Illegal Tech is renamed to Esoteric Tech. Producing items with this tech - & having esoteric tech levels is not illegal, however possession of those items - may be if they appear on the contraband list. - - bugfix: Petrov RnD console will start the round able to access the Core RnD server - data and sync with the rest of the Torch. - - bugfix: Elevator will no longer get stuck when you give it multiple move orders - via the elevator panel or the buttons on each floor. It will wait for nine seconds - on each floor and then move to the next one in the list. - - rscadd: Surveyor Flying Robots now have an emag item, an energy machete. -2019-08-15: - Cajoes: - - tweak: Improved kitchen utensil visibility on grey surfaces. - babydoll: - - rscadd: The drake megafauna can now spawn on volcanic exoplanets. - mikomyazaki: - - rscadd: As the Torch now starts at random coordinates, the Torch round-start sensor - scan will list these coordinates so it is clear where the bearings point from, - incase you forget / join the round late. -2019-08-16: - mikomyazaki: - - bugfix: RnD server control consoles will only connect to things on connected Z-levels. - So the Torch won't pick up away-site RnD servers only the RnD server control - console. - - tweak: Robots can open the door control menu again, like AI. - - tweak: FBPs don't get affected by their species slowdown stat, positive or negative. - - tweak: Robotic eyes ignore your species flash modifier. - - tweak: Robotic eyes don't get species darkvision bonuses (e.g. from Space-Adapted - Humans) -2019-08-17: - ghostsheet: - - maptweak: Torch's fuel pipes have been slightly remapped into safer positions - with parts segmented by automatic shutoff valves to prevent leakage. The fuel - lines has also been removed completed from the SM heating element (although - the HE pipes are still there) and they should now be able to survive an SM delamination. - To balance out these safety features, fuel line pressure has been doubled to - increase the risk of bodily harm. - mikomyazaki: - - bugfix: Glasses that apply a vision overlay (mesons, tactical goggles, etc.) will - no longer function when you are using a sensor console to view the overmap. -2019-08-19: - Chinsky: - - tweak: Can no longer sample plants with machet. Need an edged weapon of size 'small' - or 'tiny'. Normal size and above will chop as usual now. Harm intent also forces - chopping instead of sampling. - - tweak: Can alt-click vines when holding normal-sized blade (machet) in hand to - chop them down. It'll take a short time, faster if you have Trained botany skill. - Basically less chat-spamming alternative to just bashing them down. - mikomyazaki: - - bugfix: Ghosts can't interact with space heaters anymore. - - bugfix: Stacks of one sheet will now not be deconstructable twice in the deconstructive - analyzer. -2019-08-20: - Devildabeast: - - bugfix: Mules will no longer spawn with psi-dampener implants. - MistakeNot4892: - - rscadd: Added a new human subspecies, the Mule. Mules can be merchants or submap - roles. - mikomyazaki: - - bugfix: Space vine event will now never have invisible vines. - - bugfix: Surveyor drone now has skills. -2019-08-22: - ghostsheet: - - rscadd: SMES chance to discharge is now skill based, with 50% increase at unskilled - and 50% decrease at master. - sunofang: - - maptweak: Revamps the yacht into a prettier state. -2019-08-23: - Boznar: - - maptweak: Adds large vents to both sides of the engine room. These can be opened - with a button in the emergency box in the control room. - - maptweak: Renamed all of the glass box emergency buttons and added descriptions. - - maptweak: Engine hatch bolt control button has been moved to the inside of the - engine room next to the hatches. - Cajoes: - - rscadd: Commissary now spawns with a vending machine. - - tweak: tweaked the sauna thermostat and auxiliary space heater to bring the room - up to a comfortable 348.15 kelvin. Which I am reasonably sure the human body - can tolerate. For a while. - MistakeNot4892: - - rscadd: Enhanced an opossum. - mikomyazaki: - - bugfix: Adherents now properly get their speed bonus again. -2019-08-24: - Anticept: - - rscadd: Water tanks are now immune to atmospheric temperatures - - rscadd: Fire extinguishers can be filled from sinks! When full, they are instead - washed. - - rscadd: Fancy progress bar when washing in a sink! - - bugfix: Slightly refactored sink washing code. if a user interrupts the process, - it will not continue processing the item or most item effects. - ghostsheet: - - rscadd: Floodlights are now constructable circuit machines. - - rscadd: Floodlights can now be upgraded with capacitor components, for increased - brightness with a higher power cost. - - bugfix: Floodlights also work in areas without APC. -2019-08-26: - Boznar: - - maptweak: Shield generators have been consolidated to a single shield bay with - its own substation. Bridge deck shield has been left in place to account for - all 5 shield generators. Shields also have their own SMES units so that configuring - each individual shield can be done more precisely. - - maptweak: Bluespace drive has been remapped to be prettier. It is no longer considered - a maintenance area and wont spawn drones or trash. - - maptweak: Deck two saferoom has been removed to make room for these changes. - Plaguewalker: - - imageadd: Adds 3 new FBP variants for Morpheus - Blitz, Airborne, and Prime -2019-08-27: - Bxil: - - tweak: The Bluespace Artillery has been rebranded to Obstruction Field Disperser. - Cajoes: - - tweak: Ascent Cutter has been updated. - ghostsheet: - - bugfix: Fixes various bugs for emergency fire shutters construction/deconstruction, - such as going invisible, returning incorrect amount of metal and skipping steps. - - tweak: Emergency fire shutters will now have a delay for welding them. -2019-08-30: - CrimsonShrike: - - bugfix: Fixes exosuits being able to use all modules at any range. - Devildabeast: - - rscdel: Removes the Biomechanical Engineer as a role. - - tweak: Gives the Roboticist trained Anatomy by default. - Rain7x: - - tweak: The sleepy pen now contains Vecuronium Bromide instead of Chloral Hydrate. - WezYo: - - bugfix: Ghosts can no longer interact with pagers - ghostsheet: - - bugfix: Fixes toolbelt overlay. Putting tools into toolbelt will now show up the - belt icon again. -2019-08-31: - BRAINOS, Plaguewalker: - - rscadd: Ported new prosthetic types from Aurora; Bishop Rook, ZH Spirit, Xion - Econ - BlueNexus: - - rscadd: Sauna heaters and reagent sublimators can now be emagged to make them - accept any reagent. - Bxil: - - rscdel: The OFD can now only shoot at overmap events. - WezYo: - - rscadd: Skrellship crew can now be selected as provocateur -2019-09-01: - Hubblenaut: - - imageadd: Adds new sprites for the TEGs, made by spriter who does not want be - named. - Zenithstar: - - maptweak: Maintenance near the shield bay now has radiation shielding. - babydoll: - - maptweak: Replaced all the various depreciated shield rooms. - - maptweak: Split the bluespace drive chamber into two areas for air alarm accuracy. -2019-09-02: - babydoll: - - tweak: Reduced attack frequency and damage for nearly all castes of asteroclast. - - tweak: Asteroclast nucleus' values change as they're damaged. They become more - aggressive, but more vulnerable to attack, and spend more energy regenerating - than trying to expand. - - rscadd: Added incense cones. - mikomyazaki: - - imageadd: Adds the 'Trimmed Right Sidecut' hairstyle. -2019-09-03: - CrimsonShrike: - - rscadd: Adds second robo slot since biomech is now gone and workload is too high. - Devildabeast: - - rscadd: Adds a Morpheus Cyberkinetics labcoat to the loadout. - Piccione: - - rscadd: Added Crosses buildable out of Material Sheets. Can also be found in Loadout. - Rain7x: - - rscadd: Added "Resident" Physician Alt Title - - rscdel: Removed "Trauma Surgeon" Alt Title -2019-09-04: - CrimsonShrike: - - rscadd: Mapped a basic exosuit to the cargo bay. -2019-09-06: - BlueNexus: - - tweak: Default Cyborgs no longer have stunbatons -2019-09-10: - Boznar: - - maptweak: Skrell Air alarms are now set to 40 degrees instead of 65 degrees. Server - air alarm added to Skrellship engineering bay at 20 degrees. - Chinsky: - - tweak: You can now grab yourself. Can't grab grabbing limb (e.g. right arm with - right hand), can't throw yourself, can't nab yourself. Otherwise you can do - whatever you want, like inspecting limbs, or covering your own eyes, or dislocating - your leg as a party trick. - Nirnael: - - rscadd: Adds pencode tags [pre] [fontblue] [fontred] [fontgreen], with closing - [/pre] and [/font] universal for the three fonts. They only work digitally with - nanoword, emails, report editors and direct txt files. Font color gives color, - [pre] gives monospace font and preserves whitespace spaces only and not tabs, - e.g. for ascii art. - - rscadd: Gas analyzers now show total moles, total volume and moles per gas, check - codex for more info. - - bugfix: Fixed robot inventory not updating automatically when dropping items which - are stored back into it. - - bugfix: Saving emails to a txt file on disk now works correctly and can be printed - with the new tags. -2019-09-11: - Spookerton: - - tweak: Added guidance on law priority and conflicts to the text shown when laws - are listed. -2019-09-12: - WezYo: - - rscadd: Adds new paperwork commands to the pen codex - ghostsheet: - - rscadd: Gas thruster is now modifiable machine. - - bugfix: Gas thruster now hooks up to their ship when built. - - rscadd: Gas thrusters now has a boot up time. - - rscadd: Gas thruster can be upgraded with matter bin for extra fuel intake volume - and less boot up time or capacitor for energy efficiency. - - rscadd: Gas thrusters has an increased energy usage on idle (6 Wh per tick so - every 2 second) and 10 Wh per burn. So please keep them off unless you need - them, for that same reason all thrusts starts offline. - - tweak: Guppy's mass and max speed has both been increased. - zaredman: - - tweak: Wizard and Ninja now require a minimum of 5 players. -2019-09-13: - babydoll: - - rscadd: Added geese, available in the supply menu. -2019-09-14: - BlueNexus: - - tweak: Tripled the damage mobs take from being in low pressure - afterthought2: - - admin: Some rudimentary spam prevention has been added. Offending users will be - kicked and noted, and you will receive notice of this. If you see patterns of - abuse, further admin action may be warranted. False positives due to overly - aggressive client macros may be possible. -2019-09-15: - WezYo: - - bugfix: Turning on a floodlight will no longer make it invisible - babydoll: - - experiment: Disables macro use. -2019-09-16: - Anticept: - - bugfix: Rigsuit codex entries now read the correct armor values for each piece. - Has no effect on damage calculations, that has always worked correctly. - - tweak: Medical voidsuit descriptions no longer imply that they have some incredible - radiation resistance, but it's still relatively good to most things in the game. - - tweak: Medical voidsuit bomb resistance values increased slightly. It's still - not a bomb suit! -2019-09-17: - Rain7x: - - rscdel: Removed old Research Director gear from the CSO locker -2019-09-18: - Chinsky: - - tweak: Inflatables now have maximum pressure difference and maximum temperature - they can endure. Currently it's 5000 kPa pressure difference and 5000 K temperature. - Every second or so when they're in worse condition than that it'll take damage. - You can patch them once with duct tape but otherwise just consider more permanent - solutions. - Rain7x: - - tweak: Members of the exploration department can now select Science Goggles, Botany - Gloves, and the Brown Webbing Vest in loadout - - tweak: Non-Civilian pilots can no longer take the EXO Flightsuit - - tweak: Webbing names now reflect their color, rather than their department. - bitMuse: - - rscadd: Added an empty autoinjector schematic to autolathes. -2019-09-20: - Rain7x: - - bugfix: The supermatter grenade box now has a working icon and is no longer invisible. - SparklySheep: - - rscadd: Adds in the fake moustache as a cheap 1 crystal item for traitors. It - will hide your identity, but that's about it. -2019-09-21: - Rain7x: - - rscadd: Added the biowaste disposal cart, for disposing of organs. - ghostsheet: - - bugfix: Boosters randomised speed has been fixed, no more indefinite speed malaise. -2019-09-23: - Imienny: - - tweak: Change heavy armor plate slowdown from 1 to 0.5 - babydoll: - - tweak: Sunglasses no longer provide full protection from handheld flashes, instead - halving their effect. - - tweak: Green glasses now have prescription lenses. - bitMuse: - - rscadd: Added reagent grinder, chemical heater, and chemical cooler to Unishi - Chem Lab. -2019-09-24: - Chinsky: - - rscadd: Added vitals monitor machines. Drag them onto people to 'hook' them. They - will display general state of brain activity, pulse and breathing, with blinky - warnings if something's wrong. - - maptweak: Replaced computers by optables with vitals monitors. - - rscadd: Chemical explosions (welderfuel and ANFO) now produce a bunch of heated - gas during explosion. - - rscadd: Welderfuel produces N, NO, NO2 and a pinch of Hydrogen for flavor - - rscadd: ANFO produces CO2, nitrogen and water - - tweak: '''Settled'' exoplanets have been renamed to ''ruined'' for 23% less confusing.' - NanakoAC: - - tweak: Adds bottled water to gym vendor - - tweak: Adds bottled water to ration crates - adamkad1: - - rscadd: Variation of artery repair surgery for Kharmaani - bitMuse: - - rscadd: Added gyrotron recipe. - - rscadd: Changed minimum fire rate of gyrotron from 1 to 2. Nerf. - ghostsheet: - - rscadd: Pipe dispenser is now a modifiable machine. - - rscadd: Pipe dispenser circuit is now a printable research design. - - bugfix: Disposal outlet will now properly eject objects outside of shuttles - - tweak: SMES installing/removing components are possible while active. They still - need to have their safety wire disabled but this will allow for more sabotage - or anti tampering opportunity. - - tweak: SMES discharge will now call electrocution (with some minor nerfs so it's - little less lethal), so insulation and armour will be taken into calculations. - - tweak: SMES will now shock people upon pulsing/cutting the grounding wire, similar - to vending machines. The severity is based upon the SMES's powernet and is reduced - with the safety wire on. - - tweak: Stun acts (from weapons) will now take existing pain of limbs and any painkillers - into account. - - tweak: Stun acts will now rely on pain to calculate, so damaged limbs will go - down to stuns easier. It also means it longer affect robotic limbs or anything - that can't feel pain. Ya IPC! - - tweak: Painkillers will now resist some stun effect due to them blocking pain. - - tweak: Stun weaponry now deals a very small amount of burn for flavor, 1-3 burn - depending on the gun. - - bugfix: Stun act will now work properly on body shots, bringing down targets with - enough pain on chest/head/groin shots. - - tweak: Robolimbs will no longer have blurry eye/ stutter or create adrenaline - upon being hurt. - - tweak: Adjusted some stun and shock duration, lowering most of it. - - tweak: Shock has a lower tier stun effect, stunning people that takes 10-15 damage - for 2 seconds. - - tweak: Shock and Stuns weapon inconsistency and damage has been adjusted. - - tweak: Shock will now activate a weak local EMP on the limb they hit (if they - deal more than 10 dmg), frying any implants, augments or synthetic organs inside - and also the limb they hit. They will neutralise an IPC/FBP after 3/4 shock - shots to the chest, frying their microbattery. - - tweak: EMP on robotic limbs will make them fail. EG. as Shock beam to a roboleg - will cause it to collapse. - - tweak: EMP now deals more damage to internal synthetic organs. - - tweak: Implants are now vulnerable to EMP if they weren't already. EG, shock beam - might fry, disables or activate the implant. - - tweak: Security and Engineering (not atmospherics) voidsuit is slightly more insulated - against shocks and stuns. Still not as a good as a hardsuit. - - tweak: Light bulbs can be taken down without gloves, on non help intent, for extra - badassery. - - tweak: Wall toss will now take armor calculations into account. - - tweak: Rejuvenate will now restore stamina. - - bugfix: APC construction has been fixed, they will now be deconstructable even - when broken. - - tweak: Space adapted human oxygen pressure requirement has been lowered to 14 - kPa. - - tweak: Grav adapted human oxygen pressure requirement has been increased to 18 - kPa. - - tweak: Grav adapted strength has been increased to high, this means they get reduced - slowdown for wearing or carrying heavier gear, eg. dufflebags, voidsuit. Still - slower than human in most regards. - - tweak: Unathi oxygen pressure requirement has been increased to 20 kPa. They - need more oxygen to support their extremely robust metabolism. -2019-09-25: - MrKicker: - - tweak: Command announcments are now multi-line. - - tweak: Command Announcements can now be multi line to allow for clever formatting -2019-09-26: - Boznar: - - maptweak: Adds mineral processing, chemistry, and cages to the ascent seedship. - - rscadd: Adds voidsuits for Alates to replace the hardsuits as base gear. Hardsuits - can still be granted to alates at the Gyne's discretion. Icons and code credit - to Zuhayr/Loaf/MistakeNot. - Chinsky: - - rscadd: Using xenolife scanner on a stasis cage will now scan the animal inside. - CrimsonShrike: - - rscadd: Exosuit pilots can now manage their inventory, throw items and some other - minor actions so long the cockpit is open. This prevents usage of exosuit modules. - Imienny: - - tweak: Ammonia now work like Dexalin Plus for Vox instead of removing oxy loss - - tweak: Nerfs Vox breathing mask to filter out only oxygen - - tweak: Updates Vox alien mask's filtered gases list - - rscadd: Adds inaprovaline autoinjector to Vox survival kit - - tweak: Change Vox minimum/maximum age from 17 - 70 to 1 - 100 - - tweak: Vox get +8 skill point bonus instead of bonus based on their age. -2019-09-27: - Chinsky: - - tweak: Made modular computer consoles proper machines instead of big items. Report - any odd behavior. - - tweak: Modular computers are now constructed via normal computer frames, requiring - a circuitboard and various generic machinery parts like input/output controllers - like other computers. - nearlyNonexistent: - - tweak: Janitor module synths now have a welding tool, to remove graffiti with. -2019-09-28: - EcklesFire: - - tweak: Made EC scarves for all uniforms, not just Dress. - comma: - - rscadd: Adds loadout accessories that are locked behind Trained skill level. - ghostsheet: - - tweak: Rescue rig can now carry an inflatable dispenser in its suit slot. - - tweak: EVA and CE rigsuit's offline slowdown has been increased to standard offline - slowdown. - - tweak: Mining prep, and prospector's locket has its round start equipment changed. - - tweak: Mining voidsuit has its laser resistance lowered and its bullet and energy - resistance rounded up, to be more a well rounded suit. - - tweak: The industrial rig has its tint lowered to moderate. -2019-09-30: - Chinsky: - - tweak: Windows now have much less health. - ghostsheet: - - maptweak: Most interior windows inside medical are now non-reinforced windows - - tweak: Full-tile glass are now tintable whereas border windows are not. -2019-10-01: - ghostsheet: - - bugfix: Overmap shuttles can now dodge meteors again. - nearlyNon: - - bugfix: Certain IPC monitor options will no longer shapeshift you into a Morpheus - monitor head. -2019-10-03: - Boznar: - - maptweak: Lepidoptera has been remapped to be more compact for planetary landing. - Extra space has been utilized for additional rooms. - - bugfix: Ascent airlocks will now all cycle and dock correctly. - - maptweak: Ascent seedship walls made more uniform. Keel is composed of reinforced - walls, while the outside is regular walls. The Tricoptera has been tweaked to - prioritize form over function. - Chinsky: - - rscadd: Adds entries for skills to Codex. They have description and what levels - of skill mean. - - rscadd: Minimum character age for jobs is now code-enforced. You may have to adjust - your chars to be able to join as your preferred job. - Rain7x: - - tweak: The labcoat can only be selected in loadout if your job would realistically - require it. It has also been removed from the medical wardrobe. - WezYo: - - bugfix: Fixed janibot and medibot crafting - comma: - - tweak: Larger internal organs are now more likely to get hit than larger ones - - tweak: Energy-based weapons are now in many cases less likely to cause internal - organ damage than ballistic weapons (based on damage output) -2019-10-04: - Rain7x: - - rscdel: Several alt tiltes have been removed. - - tweak: The job Chemist is now called Pharmacist. -2019-10-05: - Flying_loulou: - - rscadd: Creates the red ("grunt"), Yellow (Senior) and White (Chief) Damage Control - Helmets - - rscadd: Damage control helmets have now been issued to the engineering department, - they can be found in the engineer's personnal equipment lockers. - WezYo: - - bugfix: Fixed transferring reagents between beakers -2019-10-06: - Chinsky: - - tweak: Thrown items will go down the ladder if they hit it. - - tweak: If you use Move Up verb, it will try climbing random climbable turf above - if you couldn't just straight up move up. -2019-10-08: - PhosphoricPanda: - - tweak: Stabilization kits now have a radiation pouch. - nearlyNonexistent: - - rscadd: Non-Branded Spirit Boards. Gather around in the dark with another friend, - and move the planchette around. Now only works in cult rounds, otherwise just - is silly fun. - - tweak: Steaks, kabobs, and a few other recipes use cutlets instead of full-on - slabs of beef. (Plain steaks don't due to the sprite) -2019-10-10: - Chinsky: - - tweak: Stack recipies that you don't have skills for are now visible too, marked - with red warning label. You can even attempt them, wasting resources almost - certainly. -2019-10-11: - Cakey: - - bugfix: Fixed airlock paint vanishing when interacting with unpowered airlocks. - ghostsheet: - - tweak: Default aim mode allows all movement, items an radio uses. -2019-10-12: - Flying_loulou: - - tweak: Sailors rejoice ! New coveralls have been issued by the fleet. - Mordeth221: - - rscadd: Adds fancy pens to character loadout -2019-10-13: - CrimsonShrike: - - rscadd: Adds exosuit energy shields. - ghostsheet: - - maptweak: Deck 4 aft airlocks' controllers are now accessible from inside of the - airlock, so they can be more easily cycled and force. They are still not accessible - from the outside. -2019-10-14: - Chinsky: - - tweak: OCIE renamed to SFP (Sol Federal Police). There was never OCIE. - Rain7x: - - rscdel: The Corporate Security Beret has been removed from the loadout. - ghostsheet: - - rscadd: Plasma cutters can now be ordered from supply, they are locked to mining - access and engineering access - - tweak: Plasma cutters now needs trained construction to deconstruct safely. - - rscadd: Updated the skill description of the EVA, Piloting and Construction skills. - - bugfix: Fixes gun accidents only hitting the user; instead now everything in their - general vicinity is fair game. -2019-10-15: - Nanako: - - rscadd: Airlocks, curtains, ladders and cult runes can now be interacted with - by clicking the floor in their tile. - - tweak: Lift call buttons and panels are now easier to click -2019-10-16: - Anticept: - - bugfix: PAI should no longer fold up when hitting it with an access card while - on help intent. - Chinsky: - - experiment: Armor calculations and some values were changed. It should be generally - more protecting now. Report weird stuff happening. - Datraen: - - bugfix: Microwaves now properly handle non-item based recipes all the time - LiljaMortensen: - - imageadd: Updated holopad sprites - PsiOmegaDelta: - - tweak: Most objects now always consider ghosts to be adjacent when examined - - tweak: Must now shift+click to interact with boardgames - - tweak: Must now shift+click to interact with integrated circuits - nearlyNon: - - maptweak: Counselor's office reworked to have an actual desk. Much more comfortable. -2019-10-17: - Flying_loulou: - - tweak: Resprites the red O2 tank to make it look like an actual firefighter's - tank. - - tweak: The duty boots, jackboots and workboots are now fireproof. - - tweak: The firesuit no longer covers the whole body, but only the chest, arms - and groin. - - rscadd: Adds a "fire overpant", to be worn over the uniform as an accessory to - protect your legs against a fire. - - rscadd: Adds the fire gloves, fully fire proof. - - rscadd: Adds the EFT (Emergency Forcing Tool). - - rscadd: Adds the "water grenade" to fight fires more efficiently. - - rscadd: Creates the firebelt, which has 5 slots and can contain EFTs, water grenades, - inflatable doors and mini-extinguishers. It comes filled with 3 water grenades, - 1 EFT and 1 inflatable door. - - rscadd: Adds the new equipment in the fire closets (places them into a dufflebag - for convenience) - - tweak: In order to survive a fire, you now have to wear the fire overpants, firesuit, - fire gloves, duty boots (Jackboots and Work boots are fire resistant as well), - as well as a fire resistant helmet/hardhat and proper internals. -2019-10-19: - CrimsonShrike: - - rscadd: Allow some more interactions from inside exosuits such as grabbing items - from clamp if the cockpit is open. - Marie Taylor: - - imageadd: Updated fridge sprites - - imageadd: Updated pylon sprite - - imageadd: Resprited holopad, the artist of the previous version has been executed - - imageadd: Resprited bell - - imageadd: Added ringing animation to bell - - imageadd: Resprited notice board, added 4 dir -2019-10-20: - Anticept: - - bugfix: PAIs, Photos, Integrated Circuit Printers, Printed Crew records, and Warrant - Projectors should be working again. - Ithalan: - - bugfix: Fixes modular computer icons not updating automatically for certain monitoring - program events. - WezYo: - - bugfix: Fixed crafting floorbots -2019-10-21: - Nirnael: - - bugfix: Fixes personal closets. - ghostsheet: - - soundadd: Voidsuit now has sounds for tank ejection and disassembling. -2019-10-22: - Higgin: - - bugfix: SecHUDs and goggles will now protect against flashes and flashbangs as - they used to. -2019-10-23: - Marie Taylor: - - imageadd: Resprite of crates, open decals added - Spookerton: - - admin: Build mode has an area viewer/editor. - ghostsheet: - - tweak: Senior researcher no longer has access to mining. - - bugfix: Plasma cutter crate access has been fixed to work with both engineering - and mining access - - tweak: Supply's warehouse is now open to mining access. -2019-10-24: - Boznar: - - maptweak: Maps Vox rigs, soundcannon, and flux cannon to Vox base - CrimsonShrike: - - rscadd: The SEV Torch is now fitted with point defense batteries, that will protect - certain parts of ship from meteor impacts. - ghostsheet: - - tweak: Supply's mechsuit now has two hydraulic clamps instead of a drill. -2019-10-27: - Higgin: - - tweak: Radicals rejoice! Head Revolutionaries once again get traitor uplinks. -2019-10-28: - Ithalan: - - bugfix: Fixed several cases of missing powercables underneath doors and tables - aboard bearcat - - bugfix: Fixed a couple of tiles in bearcat atmospheric compartment that were permanently - without pressure or gravity - - maptweak: Added girders and a few walls to more clearly indicate original extent - of damaged rooms aboard bearcat, for purpose of predicting APC and gravity coverage -2019-10-29: - BlueNexus: - - tweak: Nerfed the bloodsucking creatures often found on away sites -2019-10-30: - SierraKomodo: - - rscadd: Added rooibos tea, chai tea, chai latte, london fog, and mocha latte as - dispensable or mixable drinks. - - rscadd: Added chocolate, vanilla, caramel, and pumpkin spice syrups for flavoring - drinks. - - rscadd: Added alternate title 'Barista' to the Bartender job. - WezYo: - - spellcheck: Fix gaia blurb -2019-11-02: - Imienny: - - tweak: Fix races with low oxy_mod recovering slower from oxygen deprivation than - races with high oxy_mod -2019-11-03: - CrimsonShrike: - - rscadd: Exosuit cells can now be swapped without disassembling entire thing. Simply - use a crowbar while mainteance protocols are active to take one out. - ghostsheet: - - rscadd: Welding tool now gives off light when active (it's a little weaker than - a flashlight) and sparks blue when it's welding. - - tweak: Lighters had their light color adjusted for the sake of ambience -2019-11-04: - Higgin: - - tweak: The accuracy bonus for shooting ranged weapons from standing still has - received a slight buff. - ghostsheet: - - tweak: Mining voidsuit now has minor bullet resistance and can withstand up to - 5000 kPa worth of pressure. -2019-11-05: - Higgin: - - tweak: Harm-intent clicking will now remove shotshells directly from shotholders. - SierraKomodo: - - tweak: Tablets now beep just like PDAs. - - tweak: Borgs can now alt-click doors to access the tile tab instead of shocking - them. To shock a door, use harm intent when alt-clicking. -2019-11-06: - Ithalan: - - tweak: Solar arrays on planetary surfaces now only require 5 tiles of clear space - around them to work at all, instead of 20. Solar arrays in space are unchanged. - SierraKomodo: - - bugfix: Cyborg cable coil can now be used to build machines -2019-11-07: - Albens: - - tweak: Bridge Holopad is now named SEV Torch Bridge - Soviet Swede: - - rscadd: Added the inflatables dispenser to the surveyor -2019-11-08: - Marie Taylor: - - imageadd: Updates the appearance of crates -2019-11-10: - SierraKomodo: - - bugfix: The `hwinfo` command in console terminals now outputs to the terminal - window instead of to chat. - - tweak: The console terminal prompt now includes a helpful reminder about the `man` - command. -2019-11-11: - Bxil: - - bugfix: Character setup works as expected again. - Rain7x: - - bugfix: You can now attach pins to Dress Jackets again. -2019-11-12: - Flying_loulou: - - bugfix: The nitrogen tanks again look like nitrogen tanks. - - tweak: Changes the fire (red) oxygen tank name to 'self contained breathing apparatus' - (SCBA) - - rscadd: Adds the Emergency Management Bureau helmetto the loadout - - rscadd: Adds the ancient Emergency Management Bureau helmet to the loadout (credits - to Sin2 for the sprites) - - rscadd: Adds the light damage control helmet to the loadout - - rscadd: Adds the SCBA mask, and adds it to the engineering crew survival kit, - instead of the breath mask.(credits to Sin2 for the sprites) - Imienny: - - rscadd: adds zipgun, knock-off pistol, small energy gun, ion pistol, ion slug, - duct tape, combat defibrillator, stasis bag, stabilisation kit, balaclava and - "exceptionally robust MRE" to uplink - - tweak: MRE coffee and tea powder no longer require heating - - bugfix: fixed MRE menu 8 (chilli) spawning with pizza instead of chilli - babydoll: - - rscadd: Added scented candles. - - rscadd: Incense and scented candles are now available in the aromatherapy crate - in supply. - ghostsheet: - - rscadd: Rapid Piping Device has been added! - - rscadd: RPD can be ordered from supply, at semi-reasonable cost of a 100 points - a piece. - mikomyazaki: - - bugfix: Body bag label overlays will now properly persist through opening/closing, - instead of disappearing. -2019-11-13: - SierraKomodo: - - bugfix: Intercoms and handheld radios can now select common and entertainment - channels again. - comma: - - tweak: Wall girders are now easier to take down using brute force - mikomyazaki: - - bugfix: NTNet downloads will no longer download the file at the beginning of the - download sequence, instead only adding the new program at the end of the download - timer. -2019-11-14: - mikomyazaki: - - bugfix: Different pen types (blue, red, multicoloured, black) now have different - names. They will now appear as differently named items on the autolathe list. -2019-11-15: - Higgin: - - tweak: Limits the range within which escaping cuffs/unbuckling yourself while - cuffed is visible. - - tweak: Readded different furniture/structure recipes to wood. - - tweak: Added orderable titanium sheets to supply. - - tweak: Fear the gun! Buffed all bullet damage towards a benchmark of 50. Gave - additional armor penetration to most common rounds with more than 50 damage. - - tweak: Love the armor! Buffed many armors' resistance to bullet damage. - Jaraci: - - tweak: Fixes/expands loadout options for off-Torch away site roles. -2019-11-16: - MrKicker: - - bugfix: Fixed Roboticist JumpSkirt appearing invisible - SierraKomodo: - - rscadd: Added soy and iced variants of the chai latte, london fog, pumpkin spice - latte, and mocha latte. - mikomyazaki: - - bugfix: Engine emitter control button (and other buttons of this type) no longer - go invisible for a couple of seconds when clicked. - - bugfix: Surgical borgs can now use their hypospray on targets that are on an operating - table. -2019-11-17: - Chinsky: - - tweak: Geiger counter thresholds have been tweaked upwards, 'high' is now for - rads that will breach most non-radproof suits, 'very high' is dangerous even - to 'radproof' suits. - Imienny: - - rscadd: Improved a bit Vox hardsuit, now you can store more useful stuff in hardsuit - storage slot and use claws attack through now-insulated hardsuit gloves. - Technetium: - - rscadd: Wound infection speed is now twice as fast at 50-70% immunity as it was - before, and 10 times as fast at 0% immunity. - mikomyazaki: - - tweak: Instruct verb will inform you better about why it fails, if it does. - - bugfix: Stationary consoles now have a 'Forced Shutdown' verb, just like other - kinds of modular computer. - - bugfix: The 'boiled spider meat' recipe now correctly produces an item called - 'boiled spider meat' rather than 'giant spider leg'. -2019-11-18: - Higgin: - - imageadd: Added two bunny-eared booster sprites. -2019-11-19: - mikomyazaki: - - bugfix: Removing an ID from a modular computer no longer brings up a selection - menu containing other modular computers with ID card slots in range. -2019-11-20: - Rain7x: - - tweak: Mentalists can now only be an O-1 (Ensign) - - bugfix: The Pathfinder, Med Tech, and pilot headsets now have an on mob icon again. - SierraKomodo: - - tweak: Swallowing pills now displays a message to people within a 2 tile radius. - This message does not tell them what pill you swallowed. - - tweak: Initiating a give (Right click > Give) now displays a message that you - 'hold out an item' to the target. - Technetium: - - rscadd: Adds immunobooster, an immune-system restoring drug that will rapidly - bring a ruined immune system up to half strength. Will not replace a proper - immune system, though, so be careful with those rads and spaceacillin. - babydoll: - - rscadd: Added the incendiary laser blaster to the traitor menu. - ghostsheet: - - tweak: Ion rifle and pistol has its capacity reduce to 8/4 shots respective and - had their delay between shots increased to 3 seconds. - - tweak: Uplink implant is now more EMP resistant, it can still be disabled by an - EMP but its chance of permanently breaking is significantly lowered. - - tweak: Imprinting implant cannot be implanted into synthetic being and must now - be imprinted where the brain organ is eg. For a GAS that would be their thorax; - for humans, their head. - - bugfix: You can leap over objects once again. - mikomyazaki: - - bugfix: Supermatter hallucination effect now checks for any source of meson vision, - rather than just meson glasses. Other sources of meson vision, e.g. the hardsuit - module will now properly stop hallucinations from developing when active. - - bugfix: You can now remove splints from yourself. - - tweak: '''Remove Splints'' is now a verb (right click your target to find it) - rather than in the stripping menu.' -2019-11-21: - Chinsky: - - tweak: Airlock controllers were resprited to blend with rest of wallstuff, have - directional icons now - - tweak: Flashbangs nerfs! No flooring, stun durations are now very short (you have - 4-6 seconds against non-protected, 2 against anyone with a helmet. Added confusion - effect (generally 2-3 times longer than stun) to them too. - SierraKomodo: - - bugfix: Give emotes now display the correct text for recipient vs everyone else - Technetium: - - rscadd: Carbon mobs now take immune damage from radiation. - WezYo: - - bugfix: Clicking on first aid kits (or other crafting objects) with certain items - will no longer delete the first aid kit. - babydoll, dirtygirl: - - rscadd: Added the dire goose, occasionally making its nest on grass exoplanets. - mikomyazaki: - - soundadd: Vending machines now play a sound when dispensing an item. - - bugfix: SolGov Employees now have clothing in their uniform vendor, the same as - the civilian uniform set. -2019-11-23: - Rain7x: - - tweak: The CMO now has the same amount of total skill points as a regular physician. - ghostsheet: - - rscadd: Added a navigation telescreen to the Charon crew compartment. - - rscadd: Replaced the rack on the Guppy with a storage compartment crate - - rscadd: Added binoculars to mining prep. - - rscadd: Carp migration event got reworked! They will now be launched into the - ship at slow speed, over a period of time. - - rscadd: Overmap carp hazard, has been tweaked in same maner as the carp migration - event, carps will be launched at the ships over a period of time. The speed - of carps hitting ships will be dependent on the ship's speed, multiplied by - the pilot's skill. (Go fast for road kills, you want to go fast to escape the - carp event either way). - - tweak: Structures and machine such as windows and computers, will hurt any mob - thrown against it, similar to being thrown against a wall. (Throwing people - against things now deals the same damage as a wall) - mikomyazaki: - - tweak: Firing a gun successfully will now switch off RIG-based cloaking devices. -2019-11-24: - mikomyazaki: - - bugfix: Malfunctioning AIs will now properly get the ai-select-hardware, ai-select-research - and display-help and set-ambition verbs. - - tweak: Malfunctioning AI is now consistently called Malfunctioning AI everywhere. - (This will not affect your character role settings.) - - tweak: Ascent Drones will no longer have the bureaucracy skill to speak legalese. -2019-11-25: - Chinsky: - - tweak: Free skillpoints for medical jobs were lowered, check your skill setups. - - tweak: Virology is no longer a full skill, a perk now requiring Trained Medicine. - - tweak: Codex now has navigation bar to get to home page quickly, or search or - list all stuff. - SierraKomodo: - - tweak: Borgs with the proper skills can now use console terminals with ctrl+alt+click. - You must be adjacent to the console to use this. - Technetium: - - tweak: Immunobooster now has overdose effects and a lower OD threshold (60u -> - 30u). - - tweak: Immunobooster now has strong negative interaction with spaceacillin. Do - not mix. -2019-11-27: - Anticept: - - tweak: Deck Chief now has mining access - MrKicker: - - tweak: Added extra table to OR 2 - - bugfix: Fixed medical hallway telescreen - Rain7x: - - tweak: The job Pharmacist is now called "Laboratory Technician". Their job has - been expanded to include virology duties. - - rscdel: The "Laboratory Technician" alt-title has been removed from the Research - Assistant Role. - SierraKomodo: - - tweak: Shield generator monitoring programs now display the same shield statuses - as the shield generator UI itself - Technetium: - - rscadd: Carbon mobs now take radiation damage upon exposure, modified by their - species radiation modifier -and- burn modifier. - mikomyazaki: - - rscadd: All Deity mode spells and structures now have a codex entry visible to - the God Cultists that explains what they do, or how to use them. - - tweak: Dionaea can be cured of viruses by receiving a middling dose of radiation. - Exposure to a radiation storm or standing outside the supermatter containment - window for a short time should be sufficient. -2019-11-28: - Rain7x: - - tweak: The Lab Tech now only has 16 skill points, and is restricted to trained - medicine and anatomy. - babydoll: - - rscadd: Added two new types of fauna to volcanic exoplanets. - - tweak: To account for their low health, simple animals take less damage from ballistic - and laser projectiles. -2019-11-29: - mikomyazaki: - - tweak: Failing to do surgery due to thick material clothing items will now display - an appropriate error message. -2019-11-30: - afterthought2: - - bugfix: Robotic limb attachment and connection surgery now consistently checks - robotic skills (complex devices, also anatomy if on flesh target). -2019-12-01: - mikomyazaki: - - bugfix: The delete warrant button in the main window of the Warrant Assistant - program will now properly do its job. -2019-12-02: - MrKicker: - - tweak: Notes/memories can now be multi-line. - Rowtree: - - rscadd: Added 30 new drinks, added recipes for Nothing, and added new bottles - to the booze-o-mat -2019-12-03: - Technetium: - - tweak: Nerf to Vox Slug Sling, 2.5x addt. egg generation speed. - mikomyazaki: - - bugfix: Antagonist HUD markers e.g. Cultist indicators will now properly show - up instead of being under the floor layer sometimes. -2019-12-04: - Rain7x: - - tweak: Candy Bar sprite has been updated. - afterthought2: - - rscdel: Virology has been entirely removed from the game. -2019-12-05: - Spookerton: - - tweak: Booster biomod hair options have been replaced with booster markings. -2019-12-06: - MrKicker: - - tweak: Allows hand-labeler to label storage items when used with non-help intent. - babydoll: - - rscadd: Added retractable ball point pens. - mikomyazaki: - - bugfix: Taping paper to windows will no longer put it below the window. -2019-12-07: - Boznar: - - maptweak: Engineering bay and atmospherics have been remapped to be less cramped - and more space efficient. - - maptweak: RPDs added to atmospherics lockers. Additional EVA hardsuit and Atmos - Voidsuit added to engineering. - Imienny: - - tweak: You can no longer hear aiming sounds, unless you are being aimed at/aiming - at. -2019-12-08: - Imienny: - - rscadd: Added option to change type of stomach in character setup menu - - bugfix: Fixed bug allowing to use stun batons without charges - - bugfix: Fixed bug preventing stun prods from working with standard device cells - Spookerton: - - bugfix: Female rolled uniform and sleeves for EC command uniform no longer makes - you naked. - mikomyazaki: - - tweak: Burn damage from radiation exposure is nerfed by 75%. -2019-12-09: - mikomyazaki: - - bugfix: Robots can now wrench portable rechargers to move/anchor them. -2019-12-12: - Rowtree: - - bugfix: Fixes recently added drink strengths to a more accurate level. - Spookerton: - - tweak: Bald boosters get bald ears. - mikomyazaki: - - bugfix: AIs can now spawn properly at roundstart. - zaredman: - - bugfix: Biowaste disposal cart access to only require surgery access instead of - requiring 6 different accesses. Corpsmen rejoice! -2019-12-15: - Spookerton: - - bugfix: Starborn, Blueforged, and Promethean variations properly show the head, - torso, and groin. -2019-12-17: - CrimsonShrike: - - rscadd: Drill heads show current status while mounted and can be examined for - information when not mounted on an exosuit drill. - EcklesFire: - - tweak: Adjusted renegade numbers. - - bugfix: Removed duplicate vars. -2019-12-19: - Spookerton: - - tweak: PTR bullets aren't hitscan and do a little less damage and penetration. - babydoll: - - rscadd: Added foam dart launchers. - - rscadd: Foam dart launchers can now be won as prizes from arcade machines. - - rscadd: Added a modified foam dart launcher to the uplink's gimmick weapons menu. -2019-12-20: - Cajoes: - - rscadd: Added orderable replacement barricade tape rolls from supply. - PsyCommando: - - tweak: Made the currency used in text entries read from the current map. Mainly - to help with downstream stuff. - afterthought2: - - rscadd: Buildable radio components for machines are now available. They will have - limited use with machines currently. - - tweak: When building air sensors, you now must also add a power component and - a radio transmitter. You can use a multitool on the radio transmitter while - standing near a machine to configure it. - ghostsheet: - - rscadd: Mercenary gamemode is now overmap. -2019-12-21: - Imienny: - - tweak: Tweaked TC cost of uplinks in Character Setup menu, radio uplink now gives - you 30% more TC, uplink Implant cost only 20% of total TC and taking TC without - uplink gives you 50% more TC. - - tweak: Message shown after receiving PDA uplink now should explain better how - to access uplink. - - tweak: Delay for removing knives from boots was decreased to one second - - tweak: Using combi-knifes on intent other than help intent will now open their - blade - - tweak: Portable freezers can now fit inside backpacks and have capacity of large - box - - tweak: Combat knifes can now fit inside boots - mikomyazaki: - - bugfix: Sleepers will now properly display the amount of a drug in the occupant - on the UI. - - tweak: R-UST now has a prompt to tell you when hitting the shutdown button will - cause an instant explosion, asking whether you're sure. - - maptweak: R-UST room machinery starts the round anchored. - - tweak: Improves the fuel injector controller UI, with injection rate and toggle - all injectors controls. -2019-12-22: - Chinsky: - - tweak: During the metor rounds, evacuation jump will be called automatically after - announcement that rocks are coming. It will take 30ish minutes to arrive - - tweak: Since there's less time and Torch is /very/ sturdy (thicc hull and PD), - initial intensity is bumped a bit and escalation is going faster, so will hit - max intensity at around 30 minutes mark. - - tweak: 'After the jump mode will check for some important things and will print - red/green text about them: helm console (need to have at least one and powered), - thrusters (ditto), bluespace drive (the room must be powered).' - mikomyazaki: - - tweak: Trained Forensics now provides a much larger bonus to making simple incisions - on dead targets for autopsies. -2019-12-23: - mikomyazaki: - - bugfix: Can't put objects inside bags that are in pockets anymore. - - tweak: Updated traitor extended round description so it is appropriate for the - SEV Torch setting. - - bugfix: Double doors are properly solid again. -2019-12-27: - babydoll: - - tweak: Increased damage taken when falling down a hole to another deck. - - tweak: Increased duration of stun after falling. - mikomyazaki: - - bugfix: Merchant station teleporter computer will now display the proper messages - relating to costs. -2019-12-28: - Cheb Pomidorov: - - tweak: Scientists and Research Assistants can now enter areas such as Medbay and - Brig's hallways and the Bridge Entry. - Devildabeast: - - tweak: Changes the Mentalist's Mind Read time limit from 25 seconds to 60. - Spookerton: - - tweak: Mercenary and Provocateur starting points are hidden from the Torch's roundstart - sensor message. - zkxs: - - bugfix: The psionic signal event can no longer give synthetics genetic disabilities -2020-01-03: - Devildabeast: - - tweak: Changes "restricted roles" to the broader "casual roles" in loadoout. - - tweak: Adjusts several loadout item restrictions. - Imienny: - - tweak: Replaced spoon in MRE with spork - mikomyazaki: - - bugfix: Nymphs and Golems are no longer valid targets for auto-traitor. - - bugfix: Mercenary radio channel now works again for mercs, raiders, traitors etc. - zkxs: - - bugfix: Fixes a runtime when using an atmos analyzer on a pit -2020-01-30: - Anticept: - - tweak: Farmbots now refill from a sink at a higher rate, up from 10 to 100 per - cycle. - Cheb Pomidorov: - - rscadd: You can now lock and unlock coffins using a screwdriver. Locked coffins - can be struggled out of, similarly to welded closets. - Imienny: - - rscadd: Added a new roles to Vox Scavenger away site, "Shoal Biotechnician", "Shoal - Technician" and "Quill" - MrKicker: - - tweak: AI can now make multi-line announcements - Spookerton: - - rscdel: IPCs can no longer be counsellors. - WezYo: - - bugfix: Flying drones can now open windoors - Xaytan: - - tweak: Adds welding goggles as an option in loadout. - afterthought2: - - rscadd: Pipe meters, vents, scrubbers, and pumps now use radio components. - mikomyazaki: - - tweak: Guest pass icon will now change colour to black when expired. - - tweak: Guest pass machine gets an updated UI. - - tweak: Humanoid Dionaea now get the audible chirp emotes. - - soundadd: Added a new multichirp (*mchirp) audible emote sound effect for humanoid - Dionaea. - - bugfix: Portable drives now work properly in modular computers for all operations. - - bugfix: Dense objects will now properly stop throwing/leaping. - - bugfix: Hand teleporters will now create portals that aren't random, when you - are linked to a teleport computer on a connected z-level. - - tweak: Hand teleporters will now only list teleport computers that are on a connected - z-level. - - bugfix: Can no longer right-click darkness due to being unconscious to see what - is on that turf. - - tweak: Decreased difficulty of installing augments to the same level as installing - robotic organs. - - imageadd: Adds three xenowear options for Space-Adapted humans - Leg braces, neck - brace and venter. - - imageadd: Adds animations for the sleeper & bodyscanner when active & occupied. - - soundadd: Adds a scanning sound for the bodyscanner. - - tweak: Space-Adapted humans' stamina now depends slightly upon gravity levels, - with better stamina than baseline humans in low-gravity, worse in standard gravity. - - tweak: Space-Adapted humans are adapted for lower-pressure environments, but suffer - in higher pressure environments faster relative to baseline humans. - - bugfix: The Vox shuttle can now return to its hangar properly. - quardbreak: - - tweak: Tweaked welding sounds on airlock and vents. Now after weld operation you - should hear second sound like you end your action. - zkxs: - - bugfix: Combining stacks from an inventory no longer leaves bugged sprites - - bugfix: Having more than 10 brain damage no longer grants immunity to peridaxon's - side effects (confusion and drowsiness) - - spellcheck: Sec HUD goggles description grammar fix - - rscadd: Adherent can now float over tables -2020-01-31: - Lorwp: - - soundadd: Energy melee weapons now have an on-hit sound - mikomyazaki: - - tweak: Paper will now check if your pen works before you start writing instead - of after you've written your text. - - tweak: If your retractable pen isn't in its active state when you start writing - on something, your character will automatically click it. - - tweak: Retractable pens will now toggle to their active state when you write on - anything (union cards, people, the wall) instead of only paper. - zaredman: - - tweak: Security now has access to a written statement, weapons license, arrest - report, and restraining order template on the Reports program. Paperwork masochists, - rejoice. -2020-02-03: - mikomyazaki: - - bugfix: Throwing items at a disposal chute will properly dispose of them again. - - bugfix: Fixes a bug where (for example) throwing an object at a grilled window - would hit the grill inside the window instead of the window. -2020-02-05: - mikomyazaki: - - admin: Mobs without the UI elements to use psionics can no longer be granted psionics. - e.g. simple animals. - - bugfix: Polytools now allow you to extend tools again. -2020-02-07: - Chinsky: - - tweak: Various drinking glasses are now printed from a microlathe instead of being - vended. Bar now has pre-loaded microlathe for this purpose. - - rscadd: Added new type of drinking glass - flute glass. - - tweak: Added transparency to some reagents, namely water and booze. - - tweak: Can now select recipies category in fabricators - - tweak: More types of glasses can take accessories like sticks or straws now, try - it out. -2020-02-08: - mikomyazaki: - - bugfix: Atmospherics' tank controllers work again when controlling the output - vent. - zaredman: - - maptweak: Removes Explorer and Pilot access to Xenobiology, Xenoarchaeology, Toxins, - and assorted labs. Pathfinder retains their original access. -2020-02-10: - Flying_loulou: - - rscadd: Fleet engineers rejoice ! The fleet unlocked some funds, in order to provide - you with a dedicated uniform, constituted of a polo, some pants, and a jacket - (available in the uniform vendor, under the utility extra section). -2020-02-12: - SomeoneStoleMyNickname: - - bugfix: The Guidebooks Hacking and Repair and Construction should now work as - intended. -2021-01-27: - MistakeNot4892: - - tweak: Will the bot generate the changelog now? Let's find out. - - tweak: Coat racks are now material-based and craftable. - - tweak: Coat rack backend has been rewritten to support hanging any hat or suit - item. - - experiment: A bunch of structures have been rewritten to use some shared code. - As a result, you can examine most structures to see some tips on how to interact - with them, and you will find several construction/deconstruction steps have - changed. - - tweak: Metal structures must be dismantled with a welding tool, while other materials - use a crowbar. - - tweak: Girders are now 'supports', and are reinforced by using a material stack - on them before anchoring. Using a screwdriver will remove the reinforcement, - or toggle whether or not the support will produce a fake wall. - - experiment: This is going to be buggy, please report issues and problems. - N8-Toe: - - rscadd: Added chemical saftey suits to code, protect against gas in the air but - need to be used with a face covering mask, unimplemented at this time. - SierraKomodo: - - admin: Disposal bin stuffing and flushing are now attack logs instead of admin - logs. - - tweak: Cutting the ID Scan wire on doors will now disable ID scanning. If the - door is 'secure', this blocks access entirely. For all other doors, this fully - bypasses access requirements. - - bugfix: Windoors are now properly emag-able. - - tweak: Emagged windoors will now provide feedback that they are broken when you - try to close them. - - tweak: You can now tell if a door's control board has been fried by examining - the door with an IT skill of trained or higher. - - tweak: '''Mild'' labels in medical scans are now highlighted in yellow and bold - to make them more noticeable.' - - rscadd: Windows and airlock windows are now paintable. - - admin: Smothering people with a rag and hitting people with an ignited rag now - generates attack logs. - - tweak: You now require a grab to smother people with a rag. - - tweak: Smothering people with a rag now has a timed progress bar - 3 seconds if - your CQC skill is trained or above, 6 seconds for everyone else. - - rscadd: General station/ship lights now have randomized tones - The old default - warm yellow, a cool blue, and pure white. - SierrqKomodo: - - admin: Banned player's mobs now have their ckey stripped so they display the permanent - SSD message and instantly cryo. - SolatK: - - bugfix: Dropped mobs should not take the same direction with those who held them - - bugfix: CE rig now have a boots - SomeoneStoleMyNickname: - - rscadd: Added a new digital pencode tag. [redacted] creates the string R E D A - C E D in black lettes on black background to give the illusion of redacted contend - in reports. - The Stalker: - - rscadd: Finished up some unused void suits. So they have stats (finally) - - rscadd: Added new materials to vender and recipes. Will be doing a part two i - gues. Will eventually look into finishing the cotton plant or make a mega edition - pack of new weapons - Winter: - - rscadd: Added textbooks. Textbooks are items that give skillbuffs while you are - actively using them. Textbooks require basic literacy to use, and you must have - the specific textbook for your skill level. - - rscadd: Added a book merchant who sells textbooks. - - tweak: Molluscs and Mollusc meat now have monetary value. - - maptweak: Tradeship now always starts the round with a book trader available. - - maptweak: Tradeship has four randomized textbooks in various locations at roundstart. - - experiment: Please report balance issues (and of course bugs) that may arrise - from this feature. - - tweak: 'Bonus: Codex links now open new windows.' - - rscadd: Those with Master Literacy can now make their own textbooks. Blank textbooks - are acquired via an autobinder and then written using a pen. - - rscadd: Includes codex information on this process. - - tweak: Made textbooks in general to be one size smaller to allow being put in - bags. - - tweak: Very basic support for fabricators to get colours from something else other - than pipe_colors - - experiment: Unsure how this impacts skill balance, please report on that if there - are issues. - comma: - - tweak: Desert planets now have 'dry mud' turfs in the areas where quicksands can - spawn. - - rscadd: Added new type of toolbox - electrician's. It holds all needed tools for - machinery components interactions and several boxes of most common components. - Can be found in supply (electrical maintenance pack) and electrical locker - - balance: Engineering vendomats now vend APC/air alarm kits instead of just circuitboards. - - balance: Most machinery components are now tiny rather than small - - bugfix: APCs can be fixed again after explosions - - tweak: APCs now don't draw screen overlay / glow if screen component is destroyed - - tweak: APCs now don't report cell power in UI etc if battery backup is destroyed - - tweak: APCs now show that external power is not coming in if terminal component - is destroyed - - experiment: Machines can actually be destroyed fully by strong explosions again - (not just component damage) - - tweak: Added categories to textile designs - - balance: Costs for armor items are adjusted, generally more expensive to produce - - tweak: Holsters now leave their fibers on things put inside. - - tweak: Crowbarring doors now leaves scuffing on them, visible when examined up - close. Can be repaired as any other damage. - - tweak: Gas tanks will now dump their content into air when destroyed - eckff: - - rscadd: Backported Adherent species from Baystation12. - - rscadd: Backported Lizards species (previously Unathi). - - imageadd: Lizard people get new dark sprite. - - bugfix: Fixes monitor mask initial world icon. - - rscadd: Adds radial icon choice for monitors. - - tweak: Roundstart can now be any hour. -2021-01-28: - comma: - - tweak: Ha ha ha I am abusing my GitHub maint powers to make chinsky commit a changelog - via the bot workflow. Science! -2021-01-30: - eckff: - - rscdel: Removed the privacy poll. -2021-01-31: - comma: - - tweak: Credsticks are now tiny instead of normal sized -2021-02-02: - MistakeNot4892: - - tweak: Firearms now use pixel-precise projectile iteration, ported from Aurora. -2021-02-03: - MistakeNot4892: - - tweak: Amputating the second-to-last organ on a human mob (typically leaving the - torso) will drop the last organ as a limb and destroy the mob -in other words - you can now chop bodies up entirely instead of being left with a weird unwieldly - torso. - - tweak: Amputation is faster but messier if you're doing it improperly (improvised - tool or circumstances). - - tweak: Failing an amputation will now get the tool stuck in the person's limb. -2021-02-04: - eckff: - - tweak: Tweaked bucket world-icon state. It's little bit bigger now, but still - tiny. - - rscadd: Added augmentation implanting support code if anyone would like to add - implants or augmentations in loadout. -2021-02-05: - comma: - - tweak: Need to be on same tile as rollerbed to buckle to it. - - tweak: Fires no longer destroy wiring under floor tiles. - - bugfix: Guns found in xenoarch now have icons again - - imageadd: Added inhands for xenoarch find blades - eckff: - - rscadd: Added the panic bunker support from Hestia repository. By default, it - turned off and can be toggled on in config or manually for a round. - - admin: Admins can control the panic bunker state and add/revoke bypass in Server - section with R_SERVER flag. -2021-02-08: - eckff: - - rscadd: Added a overmap-based merchant submap ship - Liberia. -2021-02-13: - MistakeNot4892: - - rscadd: Ailments and prosthetic faults now have codex pages. - - rscadd: You can diagnose some ailments and faults with grab-examine diagnosis. - - rscadd: Failing a skill check after prosthetics replacement surgery can add a - fault to the prosthetic. -2021-02-14: - comma: - - tweak: Airlock tool interactions changed. - - tweak: Screwdriver on airlock will open wires panel, letting you access wires - for hacking. - - tweak: Crowbarring a secured (welded/bolted/braced) airlock will open the hatch - letting you access components for repairs and deconstruction. - - tweak: Hatch can only be opened if you have appropriate access to the door. Use - ID on the door to toggle the lock. -2021-02-16: - MistakeNot4892: - - rscadd: There is now a Mouseover Highlight preference that can be set to Show, - Hide or Show While Shift Held. This will highlight the object you are currently - mousing over. You can set colour and alpha for the highlight in your UI preferences. - silicons: - - bugfix: projectiles use a better get angle function now -2021-02-17: - MistakeNot4892: - - tweak: 'Several changes of note only to administrators:' - - tweak: Traitor panel has been renamed to Special Roles. - SolatK: - - bugfix: now the tail will not stick out through the clothes where it is not necessary -2021-02-20: - comma: - - imageadd: Radio receivers / transmitters (machine components) got new icons -2021-02-22: - comma: - - bugfix: Emagged airlocks can now be crowbarred close, after they're depowered. - - tweak: Airlocks now use access lock components to decide their access, instead - of circuitboards. Locks now use same UI as airlock electronics did for access - setup. Mapped airlocks should spawn these as needed to work same. - - tweak: Doors can now have their internal components damaged too like the rest - of machinery. It won't happen until they're bashed down first though. - - tweak: Access locks with auto-set option will automatically set their access to - the area's on installation into machine (like doors do) - - imageadd: Access lock components (and network lock) now have their own icons instead - of reusing scanning module one. -2021-02-24: - MistakeNot4892: - - rscadd: Poppy and other possums can now be picked up thanks to Pawn. -2021-02-27: - SierraKomodo: - - admin: Admin logs for turret setting changes now display the correct user instead - of *INVALID* and a loc link. - - admin: Attack logs for cremation no longer has the attacker and victim reversed. -2021-02-28: - MistakeNot4892: - - tweak: Webhook config now supports per-endpoint mention lists. Consult config/example/webhooks.json - for the format. If you don't need individual pings, you don't need to update - anything. - SierraKomodo: - - tweak: Codex entries for magnetic guns (Coilguns, railguns, etc) have been updated - with a lore blurb and detailed information on specific mechanics. - comma: - - bugfix: Airlocks no longer spawn extra lock when constructed - - tweak: Wall emergency lockers renamed to emergency dispensers (since they're not - lockers at all), and given new icon - - soundadd: Crypods, sleepers and bodyscanner pods now make sounds when someone - enters/leaves -2021-03-02: - SierraKomodo: - - admin: Supply beacons now generate attack logs when activated - - admin: Suicide by gun in the mouth now trigger attack logs instead of admin logs, - including a new log when starting the suicide process -2021-03-03: - SierraKomodo & Pawn: - - imageadd: New sprites and lighting overlays for teleporters have been added. -2021-03-06: - comma: - - tweak: Walls now take much less damage from melee strikes, depending on material. -2021-03-08: - MistakeNot4892: - - tweak: The status condition backend (paralyzed, asleep, etc) has been completely - rewritten; please report any inconsistencies or bugs. -2021-03-09: - eckff: - - rscadd: 'Added prepared subtypes of suit cyclers which usually hold helmets/hardsuits/magboots - on roundstart:' - - rscadd: 'Jobs which have prepared suit cyclers: engineers, atmospheric engineers, - security, medical and generic.' - - rscadd: Generic is access-free suit cycler which contain simple space suit and - space helmet. - - maptweak: 'Did some changes for merchant away submap Liberia:' - - maptweak: Added more money in trading room. Initially there's should be 13k credits, - but before this change there only 1k. It fixed now. - - maptweak: Added light switches in almost all rooms. - - maptweak: Removed a few spawnpoints in rooms. - - maptweak: Replaced bar keg in bar room with alcohol chemical dispenser. - - maptweak: Replaced some bubble lights in atmospherics with tube lights. - - maptweak: Replaced bookcases in library room with skillbook bookcases, since nobody - really use manuals and skillbooks will be useful for merchants as a trading - product. - - maptweak: Moved disposal bin in library a bit, so it will not interfere with the - passage to the chairs. -2021-03-13: - Andrew-Fall: - - tweak: Drastically increases large map loading speed -2021-03-19: - afterthought2: - - tweak: Additional support has been instated for templates which are to be loaded - multiple times. The main user-facing change is that when adding shuttle-restricted - waypoints to an overmap object's initial_restricted_waypoints list, use the - shuttle's type path, not its name. Templates that load ferry-type shuttles with - waypoints not on the template will break with this system, but you can opt out - by setting modify_tag_vars on the template datum to FALSE. -2021-04-28: - Koollan: - - tweak: Changed a couple things about armor values of some of the new metals. Shinier - metals are now semi-useful for laser protection. Also, Slag is now able to be - dissolved into some reagents. - - rscadd: Added a new metal and more alloys. - - rscadd: I added some metals and mineral types in order to actually acquire the - new metals. This is the first pass. Check the PR for full details. - MistakeNot4892: - - tweak: You can now target head/hands/arms on help intent to do some more specific - hug actions (headpats and handshakes). - - tweak: You can now headpat simple animals and robots. - - tweak: Many objects previously made of glass are now made of fiberglass, which - is stronger but less heat resistant. - - tweak: Cables are now made of copper rather than steel. - - tweak: Slag can now be processed via grinding and acid to recover some useful - trace elements. - - rscadd: Fiberglass sheets can be made from glass and plastic at an autolathe or - textiles fab, or by grinding glass and plastic then heating over 100C. - - tweak: Age is now a descriptor, and can be found alongside height and build in - preferences. - - rscadd: Some status effects (sleeping, stunned, confusion, weakened) are visible - in the form of markers over the victim's head. This can be disabled in preferences - if you'd rather not see them. - - tweak: Your gender no longer determines your base character icon. Instead, there - is a 'bodytype' option. - - tweak: Character gender pref has been renamed to pronouns. - - tweak: Species skin variants have been changed into body types. - MuckerMayhem (Ported by SierraKomodo): - - bugfix: Fixed the skill panel losing focus when editing skills. - SierraKomodo: - - rscadd: Admin paralyzed players now have notices to inform other players they're - paralyzed and being handled by staff, and to not interact until staff are done. - - tweak: Cargo trolleys can now be hitched together regardless of what direction - the trolley is facing. - - tweak: Cargo trolleys now tell you if and what they're linked to when you examine - them. - - admin: Mech weapons now generate proper attack logs instead of admin logs, and - only appear when targeting mobs. - eckff: - - rscadd: Adds diona nymph chirp as fun instrument for synthesizer. Available only - with dionaea modpack. - - maptweak: 'Liberia: Added two ATM on Mule shuttle.' - - maptweak: 'Liberia: Removed redundant firealarm from bar.' -2021-04-29: - ghostsheet: - - bugfix: Camera shake has been refactored. -2021-05-02: - MistakeNot4892: - - tweak: You can now aim at people with fruit, and will throw the fruit if they - trigger reflex fire. -2021-05-06: - MistakeNot4892: - - tweak: Examining an object will show you if it is usable as a tool. - - tweak: Ghetto surgery steps have been adjusted to use a shared tool flag system, - check the codex for updated tools for surgery steps. - - tweak: The incision manager no longer has a special surgery type, but counts as - several different surgical tools at once. -2021-05-07: - MistakeNot4892: - - tweak: Some material stack items and messages around them may have changed due - to a backend refactor of materials. -2021-05-08: - Coltrane97: - - tweak: Radiation closet now contains radiation medpouch instead of toxin one -2021-05-11: - Coltrane97: - - bugfix: Identification cards now properly get their account number; ATM third-level - security will work. -2021-05-12: - MistakeNot4892: - - tweak: Fluid interactions with atoms have been disabled until they can be optimized - to be less of a server killer. Mobs will still drown, you just won't melt in - acid. On the plus side, fluids are more performant now. - - tweak: Records now have their own area in character preferences. -2021-05-14: - MistakeNot4892: - - tweak: Double-clicking to see turf contents is now a preference. You can choose - alt click (default), double click or nothing. -2021-05-20: - Andromeda-K22: - - tweak: AIs can now have a default holopad color tone set, and set their own color - tone for on-station/ship holopad rendering. - koboldlove: - - bugfix: fixed the character creation preview sometimes not updating when changed - or loaded -2021-05-27: - comma: - - bugfix: Melee weapons now actually use their armor penetration values against - armor -2021-05-30: - Coltrane97: - - bugfix: Missing wall-mounted relay circuitboard - - bugfix: Network cables dupe - - rscadd: Network cables can now pass through z-levels -2021-06-12: - CakeQ: - - rscadd: Added two new layers to walls, paint and striping. Walls will now maintain - their material coloring, and instead have paint colors applied as paint layers - on top. Standard walls can be painted two-tone with the main body and striping - (wooden walls too). - - rscadd: Wall paintability is now defined by their materials. - - rscdel: Removed legacy wall stripe system in favor of the new paint striping. - - tweak: Wall edge connections to things like windows and airlocks have been simplified, - fixing a few erroneous connections. - - tweak: The paint sprayer has finer control when interacting with walls and wall - frames. - - tweak: Renamed airlock paint flags to be generic. These are now also used for - defining wall paintability. - MoondancerPony: - - rscadd: Trays now use vis_contents, so you can interact with tray objects by clicking - on them. - - rscdel: Trays no longer drop their contents when set on a table. - - tweak: Storage UIs now ignore pixel_x and pixel_y when displaying items. -2021-06-16: - SierraKomodo: - - tweak: There is now a user feedback message for wiring a window. - - rscadd: You can now de-polarize a window by using wirecutters to remove the wiring. - - tweak: The set id prompt when using multitools on polarized windows now defaults - to the current id instead of null. - - rscadd: Using a multitool on an anchored (fully installed) window now toggles - the tint instead of changing the ID. To change the ID, unanchor the window first. - - tweak: Examining windows now tells you if they are anchored and/or polarized, - and the construction state (screwdriver/crowbar steps) of reinforced windows. -2021-06-20: - CakeQ: - - rscadd: Walls can now connect to walls of other types depending on their material - by comparing material wall icons - NataKilar: - - rscadd: You can now build landable ships by toggling docking beacons to construction - mode. - PsyCommando: - - rscadd: Added Ice extractor. - - imageadd: Added a placeholder icon for the extractor. - SierraKomodo: - - bugfix: Ghosts will no longer break skill checks for helm controls. - - tweak: Ship helm consoles now only allow a single person to use manual control - at a time, including viewing the overmap through the helm. - - rscadd: Messages are now displayed whenever another mob takes control of a helm - control, to make it outwardly obvious who's skills are used to calculate flight. - - admin: Debug log messages were added for helm control changes, for tracking of - potential issues on live. -2021-06-27: - quardbreak and Pawn: - - rscadd: Added a picnic basket. Sprites made by Pawn. -2021-07-02: - NataKilar: - - tweak: Fusion fuel compressor can now create fuel rods of mixed materials. - - rscadd: Added fission reactor to the game for isotope and power generation -2021-07-06: - MistakeNot4892: - - rscadd: Ports the aspect system from Europa, specifically the backend, not the - aspects themselves. This is a menu in character preferences that allows you - to pick a series of traits for your character, as in some RPGs. - - tweak: Moves prosthetic limbs, prosthetic organs, amputated limbs and nearsightedness - onto aspects instead of the Physical tab. - - tweak: Moves preview options from the Physical tab to the header of character - preferences. -2021-07-10: - Geeves: - - soundadd: Added a sound to falling over, willingly resting does not play the sound, - however. - Gr1lledcheese: - - bugfix: Made oxygel scannable -2021-07-11: - MoondancerPony: - - rscadd: Replaces the HTML microwave UI with a new NanoUI-based one, complete with - an animated progress bar! - - tweak: Microwave recipes can now be made in bulk by multiplying the recipe amounts. -2021-07-12: - greggbot: - - rscadd: PDAs are now constructable -2021-07-13: - Geeves: - - rscdel: AI can now turn their holograms without moving by using the eastface, - westface, northface, and southface macros. -2021-07-15: - quardbreak: - - imageadd: New IV drip sprites from Haven-Urist. -2021-07-16: - PsyCommando: - - bugfix: Fixed shutters and blast doors deconstructed and panel_open state being - unreachable. - - bugfix: Fixed shutters assemblies having the wrong icon. - - bugfix: Fixed shutters deconstructing to blast door assemblies. -2021-07-17: - Azlan (as the sprite author) and quardbreak: - - imageadd: Replaced Supermatter sprites with ones by Azlan. -2021-07-18: - CrimsonShrike and quardbreak: - - rscadd: Ported pool tiles and related to pool objects. You can build pool and - keep water inside it. -2021-07-19: - PsyCommando: - - tweak: Allow anchoring/unanchoring closets/crates to the ground. - - imageadd: Added the access_button_off icon state -2021-07-22: - retlaw34: - - imageadd: Added new fuel port sprites. -2021-07-24: - Nyxodile: - - bugfix: Backend fixes for mobile ladders. - - bugfix: Fixes toggling plated catwalks. - - bugfix: Fixes Wi-Fi bypass. - - bugfix: Minor fireaxe attack fix. - Tennessee116: - - maptweak: A cell charger has been added to the research lab of the tradeship! -2021-07-28: - quardbreak: - - tweak: Skybox transit overlay now should be more noticeable than before. -2021-07-30: - Gr1lledcheese: - - tweak: Adds different levels of the CE_OXYGENATED effect -2021-07-31: - PsyCommando: - - tweak: Made material doors less loud. - - bugfix: Made a few machines stop reporting they're not receiving power when they - do not need power at all. -2021-08-02: - PsyCommando: - - bugfix: Fix reinforced floor being impossible to build due to a bug. -2021-08-03: - MistakeNot4892: - - tweak: Supply beacons no longer need a wire under them to function. -2021-08-15: - comma: - - tweak: Instead of selecting bottle sprite, you can now select lid and label color - - rscadd: Sprites for bottles and beakers were changed -2021-08-22: - PsyCommando: - - bugfix: Logging procs don't crash when used during early init anymore. -2021-08-24: - Andromeda-K22: - - rscadd: the supermatter now makes noises depending on damage. - - rscadd: the supermatter now glows if severely damaged, and changes contrast / - color -2021-08-26: - Andromeda-K22: - - tweak: gas filters no longer use hardcoded modes (i.e ATM_N2), they now use gas - decls and a list that is dynamically generated. - PsyCommando: - - tweak: Make curtains use decl instead of several subtypes. -2021-08-29: - Andromeda-K22: - - rscadd: handcarts are now a thing. control-click a pullable atom, then click the - cart with them to load them on. Only works with ITEMS and OBJECTS, not PEOPLE. - Items have a minimum size to be loaded onto the cart. - - tweak: wheeled objects should now be given ATOM_FLAG_WHEELED and are easier and - less exhausting to move. - - tweak: the skill requirements for landing properly during the gravity failure - event has been changed from professional to trained. -2021-09-01: - PsyCommando: - - bugfix: DNA now properly keep track of facial hair color independently from hair - color as it was intended. - - bugfix: Fix skillset not being a path on mob init crashing mob/Initialize(). -2021-09-03: - MistakeNot4892: - - rscadd: A BYOND emblem modpack has been added that adds an emblem to OOC chatter - from people with membership. Defaults to unincluded. - PsyCommando: - - bugfix: Fix occasional runtime in mob/Destroy() when deleting an ai var that wasn't - initialized yet. - comma: - - tweak: Added more hints to xenoarch effects -2021-09-05: - comma: - - tweak: Planet types are now weighted, with some (barren and shrouded) spawning - less often than normal ones - - rscadd: Adds meat planets made of meat (rarer spawn) -2021-09-09: - Andromeda-K22: - - tweak: updated the UI on species selection - - tweak: species selection is now in the background tab. - - tweak: the pda screen is now an overlay. -2021-09-11: - Andromeda-K22: - - tweak: NTOS is now GOOSE. - SolatK: - - bugfix: Fixes accessory offsets for avians -2021-09-12: - Andromeda-K22: - - rscadd: adds the 'strut' material stack, used for a number of items. - - tweak: metal sheets are no longer used for many things, struts are used instead. -2021-09-14: - Geevies: - - rscadd: Species now have special footprint handling when walking on simulated - turfs, though no core species has anything implemented yet. - SolatK: - - bugfix: Avians can wear gloves. -2021-09-15: - PsyCommando: - - bugfix: Prevent APC runtime spam when in a null area. -2021-09-17: - Andromeda-K22: - - tweak: air alarms now sound different. - MistakeNot4892: - - rscadd: Ports geothermal generators from Europa. - SolatK: - - tweak: a credit-stick can be inserted into an ATM - - rscadd: The tail is now a separate limb. You can select it as target, and button - is shown when you look at somebody with a tail. -2021-09-21: - Gr1lledcheese: - - bugfix: Fixes windoor electronics icon -2021-09-23: - NataKilar: - - tweak: Camera networks are now known as channels and are not tied to access. - - rscadd: Security cameras are now tied directly to computer networks, and can be - managed as with other network devices. -2021-10-01: - Andromeda-K22: - - admin: the player panel has been moved - can still be accessed by the usual verbs - and right-click context menu. -2021-10-02: - MarinaGryphon: - - bugfix: Fixes body scanners not showing organ damage - chaoko99: - - imageadd: Very slight color adjustments to the skybox underlay. - - imageadd: New combat shield sprite. -2021-10-03: - MarinaGryphon: - - bugfix: fixes the emote keybind creating two windows -2021-10-05: - lolman360: - - bugfix: fixes charge pylon (electron reservoir) from shocking adherents -2021-10-06: - MistakeNot4892: - - tweak: All energy weapons (ninja blade, esword, energy axe, energy cutlass, energy - machete) can be used as scalpels when they are energized. - - tweak: Energy swords can be used to slice open safes, lockers, windoors and tables - a la the ninja blade when they are energized. -2021-10-08: - PsyCommando: - - tweak: Makes changing a var type in VV take a type path string instead of having - the slow nearly useless listbox with all the atom types listed in. -2021-10-17: - CrimsonShrike: - - rscadd: Adds a number of exosuit modules - - rscadd: Resprites exosuits -2021-10-19: - CrimsonShrike: - - bugfix: Exosuit radios work again. - - tweak: Intercom shortcut is not usable for exosuits too - CrimsonShrike & Azlan: - - rscadd: Adds exosuit cameras - MistakeNot4892: - - tweak: Species information is now found in the codex rather than primarily in - character preferences. -2021-10-20: - CrimsonShrike: - - rscadd: Swimming. - NataKilar: - - bugfix: Robots now properly work as cameras for the purpose of AI vision - - bugfix: TV cameras can now have their network settings adjusted as intended. -2021-10-21: - MistakeNot4892: - - tweak: Brute and burn meds no longer stack with regenerative serum. - - tweak: Light tubes and floodlights are higher range. -2021-10-31: - Kaksisilma: - - tweak: Ion Thruster density is now set to 1. - PsyCommando: - - bugfix: Fix cryopods without control computers from runtiming during init. - lolman360: - - bugfix: plasmacutters now cut mineral walls -2021-11-01: - MistakeNot4892: - - tweak: Painkillers will now apply their additional effects at much lower cumulative - dosage. -2021-11-02: - PsyCommando: - - bugfix: Fixed runtime on autosetting airlocks placed outside an area. - - bugfix: Fixed runtime on building an external airlock outside an area. - anconfuzedrock: - - tweak: graphite is now spawnable and orderable. -2021-11-03: - NataKilar: - - bugfix: Fixes a bug with blueprint and shuttle landing vision causing mobs to - see blackness. -2021-11-07: - MistakeNot4892: - - rscadd: Added behavior for reloadable energy weapons. -2021-11-09: - Andromeda-K22: - - tweak: machines no longer directly check brainloss, but instead rely fully on - dexterity checks. - - balance: dexterity is influenced by brain damage, starting at 30 brainloss (configurable). - Dexterity loss is on a sliding scale. - MistakeNot4892: - - experiment: There is now a weather system on exoplanets. Take your umbrella. -2021-11-14: - Kaksisilma: - - tweak: painkillers now have a number of modular vars for use in the creation of - subtypes. -2021-11-24: - SolatK: - - bugfix: Russian radio keys work again. -2021-11-27: - SolatK: - - tweak: Sleeper uses actual drug dosages to stop you from overdosing -2021-12-01: - PsyCommando: - - bugfix: Blanks don't runtime. -2021-12-02: - PsyCommando: - - tweak: File changes. - - tweak: Fishes can float now. -2021-12-03: - NotRanged: - - tweak: Lying down while facing left or right now lays you down left or right. - - tweak: You can now change facing direction while lying down. - PsyCommando: - - tweak: Tweak inventory hiding fix. -2021-12-04: - MistakeNot4892: - - tweak: Utility frames, Kharmaani and adherent now bleed exciting new colours. - - tweak: Human subtypes can now share blood without triggering a rejection. -2022-01-03: - Gaxeer: - - bugfix: fix looping APC power down sound -2022-01-11: - Gaxeer: - - bugfix: fix the bug with grab-moving dead mob -2022-01-24: - PsyCommando: - - tweak: Changes to human mob initialization. -2022-01-27: - Noelle Lavenza: - - bugfix: Brute damage healing medications now heal brute damage again.. -2022-02-02: - Noelle Lavenza: - - bugfix: Sometimes, thrown fruit smudges would fail to save. That's fixed now. -2022-02-14: - comma: - - bugfix: Network relays will now attempt reconnect on their own, so if router had - a blackout, they'll rejoin on their own without manual reboot. - keIgaras: - - balance: if you hit a person against a window while they are in a grapple, you - release them from the grapple, also increased the duration of the weakness effect - from 1 to 2 seconds -2022-02-16: - keIgaras: - - bugfix: You can force move mob on catwalk in passive grab -2022-02-18: - keIgaras: - - bugfix: Fix bug where sprites for open doors were not displayed -2022-02-20: - comma: - - bugfix: Cannot phase onto low walls through solid windows anymore. - - bugfix: Shuttle chairs now display their bars in raised state too -2022-02-24: - SierraKomodo: - - rscadd: You can now remove ID cards from wallets with AltClick. This only works - for human mobs, and only if you're holding or wearing the wallet. - keIgaras: - - tweak: Change the location of the ui_storage, now it is more convenient -2022-03-02: - NataKilar: - - bugfix: Fixed a bug where wall damage would not be retained when moving a shuttle -2022-03-14: - SierraKomodo: - - bugfix: Deaf mobs no longer see 'You hear something about' messages while asleep. - keIgaras: - - rscadd: added sofa, rounded chairs and updated armchair sprites - - tweak: fixed names of chairs in the construction panel -2022-03-21: - hermaplusplus: - - bugfix: Fixes potential index out-of-bound error when filling grown foods with - reagents. -2022-03-24: - PsyCommando: - - bugfix: Brains removed from someone's head now properly gets renamed to whoever - the brain owner was. - - bugfix: Organs now properly deleted in some cases where they wouldn't be. -2022-03-28: - PsyCommando: - - tweak: Refactored fabricator UI. -2022-04-10: - PsyCommando: - - bugfix: Explosion won't damage a human mob with the godmode flag on anymore. -2022-04-16: - NataKilar: - - bugfix: Fixes a bug causing windows and pipes to be constructed incorrectly. -2022-04-25: - NataKilar: - - tweak: Machinery which previously connected to cables directly for power now require - terminals, which can be added by attacking the machine with a stack of cables. -2022-04-29: - PsyCommando: - - bugfix: Fix organ surgery. - - bugfix: Manually spawned human mobs of the "human" species now spawn with a language. -2022-05-04: - PsyCommando: - - tweak: Greeting message now check if your starting loadout actually gives you - a headset before advising you on how to talk through your headset.. -2022-05-09: - PsyCommando: - - bugfix: Godmode human now properly ignore fall damage, shock, and dislocation - effects. - - bugfix: Fix heart not restarting on rejuv. -2022-05-10: - NataKilar: - - rscadd: Adds user accounts and network groups which allows for custom access systems - tied to computer networks - - rscadd: Adds access requirements tied to computer files for read/write - - rscdel: Removes previous grant based computer network access system - - tweak: You can now hack industrial fabs to print shields, or craft a buckler from - a stool. -2022-05-12: - afterthought2: - - tweak: Engine power use has been decreased substantially. -2022-05-13: - MistakeNot4892: - - tweak: You can now carry things up ladders and through space with grabs. - PsyCommando: - - bugfix: Dislocated limbs now show in medical scans again. - - bugfix: Dislocating someone's limb now causes pain again. - - tweak: Now get feedback when trying to use a jointlock or dislocate someone's - limbs and don't have the required skills. -2022-05-15: - tag if you want to specify another name or several people. -->: - - tweak: Upward pointing cable stubs now give proper feedback, and install properly - when clicked on with a cable coil in hands. You used to need to click on the - turf instead before, which was a bit confusing. -2022-05-18: - keIgaras: - - rscadd: new icons for vents and scrubbers -2022-05-22: - MistakeNot4892: - - tweak: Inflatables are now craftable. -2022-05-26: + - tweak: Ported Skrell from Stella and added to the Bay alien roster. quardbreak: - rscadd: Progress bars use gradient function for transit animation now. - rscdel: Failure animation for progress bars has been removed. -2022-05-30: - MistakeNot4892: - - tweak: Ported Skrell from Stella and added to the Bay alien roster. -2022-06-03: - SolatK: - - tweak: Airlock components panel now opens with wrench - 2022-06-04: - MistakeNot4892: - - tweak: Removes HULK, FAT and LASER mutations. - 2022-06-05: - gyurka66: - - bugfix: Fixed the TEG icon - - maptweak: Added SM to engineering - - maptweak: Removed 2 of 3 solars - 2022-06-06: - MistakeNot4892: - - tweak: Tajaran icon has been updated with new work from Azlan. - PsyCommando: - - soundadd: Added sound for some tool interactions with the axes and hatchets. - - tweak: Config `expanded_alt_interactions` allows for various generic actions (look, - grab, drop, rotate) to show up when alt-clicking. - - soundadd: Changed the handling sounds for several material stacks to something - more fitting. - 2022-06-10: - PsyCommando: - - bugfix: Fixed how some tool interactions wouldn't play tool sounds. - 2022-06-15: - PsyCommando: - - tweak: Generic plants can now be cut. Trees can be chopped down with an axe. - - soundadd: Added several sound effects when dealing with generic plants. - 2022-06-16: - gyurka66: - - maptweak: Randomised Ministation Asteroid Field - 2022-06-20: - MistakeNot4892: - - tweak: GPS units now provide a visual compass to track each other. - 2022-06-22: - NataKilar: - - tweak: Network machinery now has lower tech requirements across the board. - - tweak: Network broadcasters now have their signal strength scale with the rating - of installed microlasers. - - rscadd: Computer networks are now able to communicate over PLEXUS. - - rscadd: Adds PLEXUS uplinks, machinery which allows devices to connect to PLEXUS - in conjunction with a PLEXUS repeater. - - tweak: Network signal simulation has been adjusted slightly. Connection strengths - should be comparable with old setups. - 2022-06-25: - MistakeNot4892: - - tweak: Species previews are no longer naked. - 2022-07-01: - MistakeNot4892: - - tweak: Construction skill will now speed up some tool interactions. - 2022-07-25: - PsyCommando: - - tweak: More things are now considered pens. Like the flashlight pen. + tag if you want to specify another name or several people. -->: + - tweak: Airlock components panel now opens with wrench From 15549b31f9a6ef3c9a79e2c4189c246272aef3df Mon Sep 17 00:00:00 2001 From: jade-lavenza Date: Wed, 27 Jul 2022 20:48:12 -0500 Subject: [PATCH 0225/1518] Add optional bodytype arg to change/set species --- code/modules/mob/living/carbon/human/appearance.dm | 6 +++--- code/modules/mob/living/carbon/human/human.dm | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index c0b481c8dac..a80427b8394 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -3,7 +3,7 @@ AC.flags = flags AC.ui_interact(user, state = state) -/mob/living/carbon/human/proc/change_species(var/new_species) +/mob/living/carbon/human/proc/change_species(var/new_species, var/new_bodytype = null) if(!new_species) return @@ -13,7 +13,7 @@ if(!(new_species in get_all_species())) return - set_species(new_species) + set_species(new_species, new_bodytype) dna.ready_dna(src) //Handle spawning stuff @@ -23,7 +23,7 @@ apply_species_cultural_info() species.handle_post_spawn(src) reset_blood() - full_prosthetic = null + full_prosthetic = null apply_species_inventory_restrictions() var/decl/special_role/antag = mind && player_is_antag(mind) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 76264308561..e6458f54dca 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -646,7 +646,7 @@ //set_species should not handle the entirety of initing the mob, and should not trigger deep updates //It focuses on setting up species-related data, without force applying them uppon organs and the mob's appearance. // For transforming an existing mob, look at change_species() -/mob/living/carbon/human/proc/set_species(var/new_species_name) +/mob/living/carbon/human/proc/set_species(var/new_species_name, var/new_bodytype = null) if(!new_species_name) CRASH("set_species on mob '[src]' was passed a null species name '[new_species_name]'!") var/new_species = get_species_by_key(new_species_name) @@ -679,7 +679,9 @@ set_gender(new_pronouns.name) //Handle bodytype - set_bodytype(species.get_bodytype_by_pronouns(new_pronouns), FALSE) + if(!new_bodytype) + new_bodytype = species.get_bodytype_by_pronouns(new_pronouns) + set_bodytype(new_bodytype, FALSE) available_maneuvers = species.maneuvers.Copy() From c52a6908c97e4e3a2d57021d0ad32023889d63d9 Mon Sep 17 00:00:00 2001 From: jade-lavenza Date: Wed, 27 Jul 2022 20:26:53 -0500 Subject: [PATCH 0226/1518] Add UpdateAppearance call to change_species --- code/modules/mob/living/carbon/human/appearance.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index a80427b8394..948d9b9989b 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -19,6 +19,7 @@ //Handle spawning stuff species.handle_pre_spawn(src) species.create_missing_organs(src, TRUE) //Not fully replacing would cause problem with organs not being updated + UpdateAppearance() apply_species_appearance() apply_species_cultural_info() species.handle_post_spawn(src) From d1cce00fb056595fd4144f92455f4e83f5cd14f1 Mon Sep 17 00:00:00 2001 From: jade-lavenza Date: Wed, 27 Jul 2022 22:01:30 -0500 Subject: [PATCH 0227/1518] Fix is_default_limb --- code/modules/species/species.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index 23e7c7ed3c3..ff1aaaf71f5 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -455,9 +455,11 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 //Checks if an existing limbs is the species default /decl/species/proc/is_default_limb(var/obj/item/organ/external/E) - if((species_flags & SPECIES_FLAG_CRYSTALLINE) && !BP_IS_CRYSTAL(E)) + // Crystalline/synthetic species should only count crystalline/synthetic limbs as default. + // DO NOT change to (species_flags & SPECIES_FLAG_X) && !BP_IS_X(E) + if(!(species_flags & SPECIES_FLAG_CRYSTALLINE) != !BP_IS_CRYSTAL(E)) return FALSE - if((species_flags & SPECIES_FLAG_SYNTHETIC) && !BP_IS_PROSTHETIC(E)) + if(!(species_flags & SPECIES_FLAG_SYNTHETIC) != !BP_IS_PROSTHETIC(E)) return FALSE for(var/tag in has_limbs) if(E.organ_tag == tag) From 0f3a5ef89c8f138354e0b3d7fab5ece927f53b4e Mon Sep 17 00:00:00 2001 From: jade-lavenza Date: Wed, 27 Jul 2022 19:56:09 -0500 Subject: [PATCH 0228/1518] Hotfix for changelogs being nuked --- html/changelog.html | 89 +- html/changelogs/.all_changelog.yml | 14236 ++++++++++++++++++++++++++- 2 files changed, 14315 insertions(+), 10 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 4ba0814c33b..b2a08fd844e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,23 +53,102 @@

      25 July 2022

      -

      updated:

      +

      PsyCommando updated:

      +
        +
      • More things are now considered pens. Like the flashlight pen.
      • +
      + +

      01 July 2022

      +

      MistakeNot4892 updated:

      +
        +
      • Construction skill will now speed up some tool interactions.
      • +
      + +

      25 June 2022

      +

      MistakeNot4892 updated:

      +
        +
      • Species previews are no longer naked.
      • +
      + +

      22 June 2022

      +

      NataKilar updated:

      +
        +
      • Network machinery now has lower tech requirements across the board.
      • +
      • Network broadcasters now have their signal strength scale with the rating of installed microlasers.
      • +
      • Computer networks are now able to communicate over PLEXUS.
      • +
      • Adds PLEXUS uplinks, machinery which allows devices to connect to PLEXUS in conjunction with a PLEXUS repeater.
      • +
      • Network signal simulation has been adjusted slightly. Connection strengths should be comparable with old setups.
      • +
      + +

      20 June 2022

      +

      MistakeNot4892 updated:

      • GPS units now provide a visual compass to track each other.
      + +

      16 June 2022

      +

      gyurka66 updated:

      +
        +
      • Randomised Ministation Asteroid Field
      • +
      + +

      15 June 2022

      +

      PsyCommando updated:

      +
        +
      • Generic plants can now be cut. Trees can be chopped down with an axe.
      • +
      • Added several sound effects when dealing with generic plants.
      • +
      + +

      10 June 2022

      +

      PsyCommando updated:

      +
        +
      • Fixed how some tool interactions wouldn't play tool sounds.
      • +
      + +

      06 June 2022

      +

      MistakeNot4892 updated:

      +
        +
      • Tajaran icon has been updated with new work from Azlan.
      • +
      +

      PsyCommando updated:

      +
        +
      • Added sound for some tool interactions with the axes and hatchets.
      • +
      • Config `expanded_alt_interactions` allows for various generic actions (look, grab, drop, rotate) to show up when alt-clicking.
      • +
      • Changed the handling sounds for several material stacks to something more fitting.
      • +
      + +

      05 June 2022

      +

      gyurka66 updated:

      +
        +
      • Fixed the TEG icon
      • +
      • Added SM to engineering
      • +
      • Removed 2 of 3 solars
      • +
      + +

      04 June 2022

      +

      MistakeNot4892 updated:

      +
        +
      • Removes HULK, FAT and LASER mutations.
      • +
      + +

      03 June 2022

      +

      SolatK updated:

      +
        +
      • Airlock components panel now opens with wrench
      • +
      + +

      30 May 2022

      MistakeNot4892 updated:

      • Ported Skrell from Stella and added to the Bay alien roster.
      + +

      26 May 2022

      quardbreak updated:

      • Progress bars use gradient function for transit animation now.
      • Failure animation for progress bars has been removed.
      -

      tag if you want to specify another name or several people. --> updated:

      -
        -
      • Airlock components panel now opens with wrench
      • -
      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index d851883ee91..3b672b11f2f 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -1,12 +1,14238 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. --- -2022-07-25: - ? '' - : - tweak: GPS units now provide a visual compass to track each other. +2013-01-07: + Cael_Aislinn: + - tgs: Updated server to tgstation r5200 (November 26th, 2012), see https://code.google.com/p/tgstation13/source/list + for tg's changelog. + Chinsky: + - rscadd: 'Implants: Explosvie implant, exploding when victim hears the codephrase + you set.' + - rscadd: 'Implants: Compressed Matter implat, scan item (making it disappear), + inject yourself and recall that item on will!' + - rscadd: Implant removal surgery, with !!FUN!! results if you mess up it. + - rscadd: Coats now have pockets again. + - rscadd: Bash people on tabetops. an windows, or with stools. Grab people to bash + them on tables or windows (better grab for better hit on windows). Drag stool + sprite on you to pick it up, click on it in hand to make it usual stool again. + - rscadd: Surgical caps, and new sprites for bloodbags and fixovein. + - rscadd: Now some surgery steps will bloody your hands, Full-body blood coat in + case youy mess up spectacualry. + - rscadd: Ported some crates (Art, Surgery, Sterile equiplemnt). + - tweak: Changed contraband crates. Posters moved to Art Crate, cigs and lipstick + ot party crate. Now contraband crate has illegal booze and illicit drugs. + - bugfix: Finally got evac party lights + - bugfix: Now disfigurment,now it WILL happen when damage is bad enough. + - experiment: Now if you speak in depressurized area (less than 10 kPa) only people + next to you can hear you. Radios still work though. +2013-01-13: + Chinsky: + - tweak: If you get enough (6) blood drips on one tile, it'll turn into a blood + puddle. Should make bleeding out more visible. + - tweak: Security belt now able to hold taser, baton and tape roll. + - tweak: Added alternative security uniform to Security wardrobes. + - rscadd: 'Ported Urist cult runes. Down with the crayon drawings! Example: http://dl.dropbox.com/u/26846767/images/SS13/255_symbols.PNG' + - bugfix: Engineering tape now require engineer OR atmos access instead of both. + - rscadd: Implants now will react to EMP, possibly in !!FUN!! ways + GauHelldragon: + - rscadd: Servicebots now have RoboTray and Printing Pen. Robotray can be used to + pick up and drop food/drinks. Printing pen can alternate between writing mode + and rename paper mode by clicking it. + - rscadd: Farmbots. A new type of robot that weeds, waters and fertilizes. Use robot + arm on water tank. Then use plant analyzer, mini-hoe, bucket and finally proximity + sensor. + - rscadd: Chefs can clang their serving trays with a rolling pin. Just like a riot + shield! +2013-01-21: + Cael_Aislinn: + - bugfix: Satchels and ore boxes can now hold strange rocks. + - rscadd: Closets and crates can now be built out of 5 and 10 plasteel respectively. + - rscadd: Observers can become mice once more. +2013-01-23: + Cael_Aislinn: + - tgs: Updated server to tgstation r5200 (November 26th, 2012), see https://code.google.com/p/tgstation13/source/list + for tg's changelog. +2013-01-31: + CIB: + - bugfix: Chilis and cold chilis no longer kill in small amounts + - bugfix: Chloral now again needs around 5 units to start killing somebody +2013-02-13: + Erthilo: + - bugfix: Fixed SSD (logged-out) players not staying asleep. + - bugfix: Fixed set-pose verb and mice emotes having extra periods. + - bugfix: Fixed virus crate not appearing and breaking supply shuttle. + - bugfix: Fixed newcaster photos not being censored. +2013-02-14: + CIB: + - rscadd: Medical side-effects(patients are going to come back for secondary treatment) + - rscadd: NT loyalty setting(affects command reports and gives antags hints who + might collaborate with them) + - tweak: Simple animal balance fixes(They're slower now) + CaelAislinn: + - rscadd: Re-added old ion storm laws, re-added grid check event. + - rscadd: Added Rogue Drone and Vermin Infestation random events. + - rscadd: Added/fixed space vines random event. + - tweak: Updates to the virus events. + - tweak: Spider infestation and alien infestation events turned off by default. + - tweak: Soghun, taj and skrell all have unique language text colours. + - tweak: Moderators will no longer be listed in adminwho, instead use modwho. + Gamerofthegame: + - rscadd: Miscellaneous mapfixes. +2013-02-18: + Cael Aislinn: + - rscadd: Security bots will now target hostile mobs, and vice versa. + - tweak: Carp should actually emigrate now, instead of just immigrating then squatting + around the outer hull. + - tweak: Admins and moderators have been split up into separate 'who' verbs (adminwho + and modwho respectively). +2013-02-20: + Chinsky: + - rscadd: 'Added new surgery: putting items inside people. After you use retractor + to keep incision open, just click with any item to put it inside. But be wary, + if you try to fit something too big, you might rip the veins. To remove items, + use implant removal surgery.' + - rscadd: Crowbar can be used as alternative to retractor. + - rscadd: Can now unload guns by clicking them in hand. + - tweak: Fixed distance calculation in bullet missing chance computation, it was + always assuming 1 or 0 tiles. Now distace REALLY matters when you shoot. + - rscadd: To add more FUN to previous thing, bullets missed to not disappear but + keep going until they hit something else. + - bugfix: Compressed Matter and Explosive implants spawn properly now. + - tweak: 'Tweaks to medical effects: removed itch caused by bandages. Chemical effects + now have non-100 chance of appearing, the stronger medicine, the more probality + it''ll have side effects.' +2013-02-22: + Chinsky: + - tweak: Change to body cavity surgery. Can only put items in chest, groind and + head. Max size for item - 3 (chest), 2 (groin), 1 (head). For chest surgery + ribs should be bent open, (lung surgery until second scalpel step). Surgery + step needs preparation step, with drill. After that you can place item inside, + or seal it with cautery to do other step instead. +2013-02-23: + Cael Aislinn: + - wip: RUST machinery components should now be researchable (with high requirements) + and orderable through QM (with high cost). + - wip: Shield machinery should now be researchable (with high requirements) and + orderable through QM (with high cost). This one is reportedly buggy. + - tweak: Rogue vending machines should revert back to normal at the end of the event. + - rscadd: New Unathi hair styles. +2013-02-25: + Cael Aislinn: + - rscadd: As well as building hull shield generators, normal shield gens can now + be built (see http://baystation12.net/forums/viewtopic.php?f=1&t;=6993). + - rscadd: 'New random events: multiple new system wide-events have been have been + added to the newscaster feeds, some not quite as respectable as others.' + - rscadd: 'New random event: some lucky winners will win the TC Daily Grand Slam + Lotto, while others may be the target of malicious hackers.' +2013-02-27: + Gamerofthegame: + - rscadd: Added the (base gear) ERT preset for the debug command. + - rscadd: Map fixes, Virology hole fixed. Atmospheric fixes for mining and, to a + less extent, the science outpost. (No, not cycling airlocks) + - rscadd: Fiddled with the ERT set up location on Centcom. Radmins will now have + a even easier time equiping a team of any real pratical size, especially coupled + with the above debug command. +2013-03-05: + CIB: + - rscadd: Added internal organs. They're currently all located in the chest. Use + advanced scanner to detect damage. Use the same surgery as for ruptured lungs + to fix them. + Cael Aislinn: + - soundadd: Set roundstart music to randomly choose between space.ogg and traitor.ogg + (see http://baystation12.net/forums/viewtopic.php?f=5&t;=6972) + - experiment: All RUST components except for TEGs (which generate the power) are + now obtainable ingame, bored engineers should get hold of them and setup an + experimental reactor for testing purposes. +2013-03-06: + Cael Aislinn: + - rscadd: Type 1 thermoelectric generators and the associated binary circulators + are now moveable (wrench to secure/unsecure) and orderable via Quartermaster. + - wip: code/maps/rust_test.dmm contains an example setup for a functional RUST reactor. + Maximum output is in the range of 12 to 20MW (12 to 20 million watts). + - bugfix: Removed double announcement for gridchecks, reduced duration of gridchecks. + RavingManiac: + - rscadd: You can now stab people with syringes using the "harm" intent. This destroys + the syringe and transfers a random percentage of its contents into the target. + Armor has a 50% chance of blocking the syringe. +2013-03-09: + Cael Aislinn: + - rscadd: "Beekeeping is now possible. Construct an apiary of out wood and embed\ + \ it into a hydroponics tray, then get a queen bee and bottle of BeezEez from\ + \ cargo bay. \n\t\tHives produce honey and honeycomb, but be wary if the bees\ + \ start swarming." +2013-03-11: + CIB: + - rscadd: Cloning now requires you to put slabs of meat into the cloning pod to + replenish biomass. + Cael Aislinn: + - wip: The xenoarchaeology update is here. This includes a major content overhaul + and a bunch of new features for xenoarchaeology. + - tweak: Digsites (strange rock deposits) are now much more nuanced and interesting, + and a huge number of minor (non-artifact) finds have been added. + - rscadd: Excavation is now a complex process that involves digging into the rock + to the right depth. + - rscadd: Chemical analysis is required for safe excavation of the digsites, in + order to determine how best to extract the finds. + - bugfix: Anomalous artifacts have been overhauled and many longstanding bugs with + existing effects have been fixed - the anomaly utiliser should now work much + more often. + - rscadd: Numerous new artifact effects have been added and some new artifact types + can be dug up from the asteroid. + - rscadd: New tools and equipment have been added, including normal and spaceworthy + versions of the anomaly suits, excavation tools and other neat gadgets. + - rscadd: Five books have been written by subject matter experts from around the + galaxy to help the crew of the Exodus come to grips with this exacting new science + (over 3000 words of tutorials!). + Chinsky: + - rscadd: Sec HUDs now can see short versions of sec records.on examine. Med HUDs + do same for medical records, and can set medical status of patient. + - rscadd: Damage to the head can now cause brain damage. +2013-03-14: + Spamcat: + - rscadd: Figured I should make one of these. Syringestabbing now produces a broken + syringe complete with fingerprints of attacker and blood of a victim, so dispose + your evidence carefully. Maximum transfer amount per stab is lowered to 10. +2013-03-15: + Cael_Aislinn: + - rscadd: Mapped a compact research base on the mining asteroid, with multiple labs + and testing rooms. It's reachable through a new (old) shuttle dock that leaves + from the research wing on the main station. +2013-03-26: + Spamcat: + - bugfix: Chemmaster now puts pills in pill bottles (if one is inserted). + - tweak: Stabbing someone with a syringe now deals 3 damage instead of 7 because + 7 is like, a crowbar punch. + - bugfix: Lizards can now join mid-round again. + - rscadd: Chemicals in bloodstream will transfer with blood now, so don't get drunk + before your blood donation. Viruses and antibodies transfer through blood too. + - bugfix: Virology is working again. +2013-03-27: + Asanadas: + - tweak: The Null Rod has recovered its de-culting ability, for balance reasons. + Metagaming with it is a big no-no! + - rscadd: Holy Water as a liquid is able to de-cult. Less effective, but less bloody. + May be changed over the course of time for balance. +2013-04-04: + SkyMarshal: + - bugfix: Fixed ZAS + - bugfix: Fixed Fire + Spamcat: + - bugfix: Blood type is now saved in character creation menu, no need to edit it + manually every round. +2013-04-09: + SkyMarshal: + - bugfix: Fire Issues (Firedoors, Flamethrowers, Incendiary Grenades) fixed. + - bugfix: Fixed a bad line of code that was preventing autoignition of flammable + gas mixes. + - bugfix: Volatile fuel is burned up after a point. + - rscdel: Partial-tile firedoors removed. This is due to ZAS breaking when interacting + with them. +2013-04-11: + SkyMarshal: + - experiment: Fire has been reworked. + - experiment: In-game variable editor is both readded and expanded with fire controlling + capability. +2013-04-17: + SkyMarshal: + - experiment: ZAS is now more deadly, as per decision by administrative team. May + be tweaked, but currently AIRFLOW is the biggest griefer. + - experiment: World startup optimized, many functions now delayed until a player + joins the server. (Reduces server boot time significantly) + - tweak: Zones will now equalize air more rapidly. + - bugfix: ZAS now respects active magboots when airflow occurs. + - bugfix: Airflow will no longer throw you into doors and open them. + - bugfix: Race condition in zone construction has been fixed, so zones connect properly + at round start. + - bugfix: Plasma effects readded. + - bugfix: Fixed runtime involving away mission. +2013-04-24: + Jediluke69: + - rscadd: Added 5 new drinks (Kira Special, Lemonade, Brown Star, Milkshakes, Rewriter) + - tweak: Nanopaste now heals about half of what it used to + - tweak: Ballistic crates should now come with shotguns loaded with actual shells + no more beanbags + - bugfix: Iced tea no longer makes a glass of .what? + NerdyBoy1104: + - rscadd: 'New Botany additions: Rice and Plastellium. New sheet material: Plastic.' + - rscadd: Plastellium is refined into plastic by first grinding the produce to get + plasticide. 20 plasticide + 10 polytrinic acid makes 10 sheets of plastic which + can be used to make crates, forks, spoons, knives, ashtrays or plastic bags + from. + - rscadd: Rice seeds grows into rice stalks that you grind to get rice. 10 Rice + + 5 Water makes boiled rice, 10 rice + 5 milk makes rice pudding, 10 rice + + 5 universal enzyme (in beaker) makes Sake. + faux: + - imageadd: Mixed Wardrobe Closet now has colored shoes and plaid skirts. + - imageadd: Dress uniforms added to the Captain, RD, and HoP wardrobe closets. A + uniform jacket has also been added to the Captain's closet. HoS' hat has been + re-added to their closet. I do not love the CMO and CE enough to give them anything. + - imageadd: Atheletic closet now has five different swimsuits *for the ladies* in + them. If you are a guy, be prepared to be yelled at if you run around like a + moron in one of these. Same goes for ladies who run around in shorts with their + titties swaying in the space winds. + - imageadd: A set of dispatcher uniforms will spawn in the security closet. These + are for playtesting the dispatcher role. + - imageadd: New suit spawns in the laundry room. It's for geezer's only. You're + welcome, Book. + - imageadd: Nurse outfit variant, orderly uniform, and first responder jacket will + now spawn in the medical wardrobe closet. + - imageadd: 'A white wedding dress will spawn in the chaplain''s closet. There are + also several dresses currently only adminspawnable. Admins: Look either under + "bride" or "dress." The bride one leads to the colored wedding dresses, and + there are some other kinds of dresses under dress.' + - tweak: No more luchador masks or boxing gloves or boxing ring. You guys have a + swimming pool now, dip in and enjoy it. + - tweak: he meeting hall has been replaced with an awkwardly placed security office + meant for prisoner processing. + - tweak: Added a couple more welding goggles to engineering since you guys liked + those a lot. + - imageadd: Flasks spawn behind the bar. Only three. Don't fight over them. I don't + know how to add them to the bar vending machine otherwise I would have done + that instead. Detective, you have your own flask in your office, it's underneath + the cigarettes on your desk. + - tweak: Added two canes to the medical storage, for people who have leg injuries + and can't walk good and stuff. I do not want to see doctors pretending to be + House. These are for patients. Do not make me delete this addition and declare + you guys not being able to have nice things. + - tweak: Secondary entance to EVA now directly leads into the medbay hardsuit section. + Sorry for any inconviences this will cause. The CMO can now fetch the hardsuits + whenever they want. + - tweak: Secondary security hardsuit has been added to the armory. Security members + please stop stealing engineer's hardsuits when you guys want to pair up for + space travel. + - tweak: Firelocks have been moved around in the main hallways to form really ghetto + versions of airlocks. + - tweak: Violin spawns in theatre storage now. I didn't put the piano there though, + that was someone else. + - tweak: Psych office in medbay has been made better looking. +2013-05-14: + Cael_Aislinn: + - experiment: Depth scanners can now be used to determine what material archaeological + deposits are made of, meaning lab analysis is no longer required. + - tweak: Some useability issues with xenoarchaeology tools have been resolved, and + the transit pods cycle automatically now. +2013-05-15: + Spamcat: + - rscadd: Added telescopic batons + to HoS's and captain's lockers. These are quite robust and easily concealable. +2013-05-21: + SkyMarshal: + - experiment: ZAS will now speed air movement into/out of a zone when unsimulated + tiles (e.g. space) are involved, in relation to the number of tiles. + - experiment: Portable Canisters will now automatically connect to any portable + connecter beneath them on map load. + - bugfix: Bug involving mis-mapped disposal junction fixed + - bugfix: Air alarms now work for atmos techs (whoops!) + - bugfix: The Master Controller now properly stops atmos when it runtimes. + - bugfix: Backpacks can no longer be contaminated + - tweak: ZAS no longer logs air statistics. + - tweak: ZAS now rebuilds as soon as it detects a semi-complex change in geometry. (It + was doing this already, but in a convoluted way which was actually less efficient) + - tweak: General code cleanup/commenting of ZAS + - tweak: Jungle now initializes after the random Z-level loads and atmos initializes. +2013-05-25: + Erthilo: + - bugfix: Fixes alien races appearing an unknown when speaking their language. + - bugfix: Fixes alien races losing their language when cloned. + - bugfix: Fixes UI getting randomly reset when trying to change it in Genetics Scanners. +2013-05-26: + Chinsky: + - rscadd: Tentacles! Now clone damage will make you horribly malformed like examine + text says. + Meyar: + - rscadd: The syndicate shuttle now has a cycling airlock during Nuke rounds. + - rscadd: Restored the ability for the syndicate Agent ID to change the name on + the card (reforge it) more than once. + - rscadd: ERT Radio now functional again. + - rscadd: 'Research blast doors now actually lock down the entirety of station-side + Research. ' + - rscadd: 'Added lock down buttons to the wardens office. ' + - rscadd: 'The randomized barsign has made a return. ' + - rscadd: Syndicate Agent ID's external airlock access restored. + VitrescentTortoise: + - rscadd: Added a third option for not getting any job preferences. It allows you + to return to the lobby instead of joining. +2013-05-28: + Erthilo: + - bugfix: Fixes everyone being able to understand alien languages. HERE IS YOUR + TOWER OF BABEL + VitrescentTortoise: + - bugfix: Wizard's forcewall now works. +2013-05-30: + Segrain: + - bugfix: Meteor showers actually spawn meteors now. + - tweak: Engineering tape fits into toolbelt and can be placed on doors. + - rscadd: Pill bottles can hold paper. + Spamcat: + - tweak: Pill bottle capacity increased to 14 items. + - bugfix: Fixed Lamarr (it now spawns properly) + proliberate: + - rscadd: Station time is now displayed in the status tab for new players and AIs. +2013-05-31: + Segrain: + - bugfix: Portable canisters now properly connect to ports beneath them on map load. + - bugfix: Fixed unfastening gas meters. +2013-06-01: + Chinsky: + - rscadd: Bloody footprints! Now stepping in the puddle will dirty your shoes/feet + and make you leave bloody footprints for a bit. + - rscadd: Blood now dries up after some time. Puddles take ~30 minutes, small things + 5 minutes. + - bugfix: Untreated wounds now heal. No more toe stubs spamming you with pain messages + for the rest of the shift. + - experiment: On the other side, everything is healed slowly. Maximum you cna squeeze + out of first aid is 0.5 health per tick per organ. Lying down makes it faster + too, by 1.5x factor. + - rscadd: Lids! Click beaker/bottle in hand to put them on/off. Prevent spilling + - rscadd: Added 'hailer' to security lockers. If used in hand, says "Halt! Security!". + For those who can't run and type. +2013-06-05: + Chinsky: + - rscadd: Load bearing equipment - webbings and vests for engineers and sec. Attach + to jumpsuit, use 'Look in storage' verb (object tab) to open. + Segrain: + - rscadd: Exosuits now can open firelocks by walking into them. +2013-06-06: + Asanadas: + - rscadd: Added a whimsical suit to the head of personnel's secret clothing locker. + Meyar: + - bugfix: Disposal's mail routing fixed. Missing pipes replaced. + - bugfix: 'Chemistry is once again a part of the disposals delivery circuit. ' + - bugfix: Added missing sorting junctions to Security and HoS office. + - bugfix: Fixed a duplicate sorting junction. +2013-06-09: + Segrain: + - bugfix: Emagged supply console can order SpecOp crates again. +2013-06-11: + Meyar: + - bugfix: Fixes a security door with a firedoor ontop of it. + - bugfix: Fixed a typo relating to the admin Select Equipment Verb. (It's RESPONSE + team not RESCUE team) + - rscadd: ERT are now automated, from their spawn to their shuttle. Admin intervention + no longer required! (Getting to the mechs still requires admin permission generally) + - rscadd: Added flashlights to compensate for the weakened PDA lights + - tweak: 'ERT Uniforms updated to be in line with Centcom uniforms. No more turtlenecks, + no sir. ' +2013-06-12: + Zuhayr: + - rscadd: Added pneumatic cannon and harpoons. + - experiment: Added embedded projectiles. Bullets and thrown weapons may stick in + targets. Throwing them by hand won't make them stick, firing them from a cannon + might. Implant removal surgery will get rid of shrapnel and stuck items. +2013-06-13: + Kilakk: + - rscadd: Added the Xenobiologist job. Has access to the research hallway and to + xenobiology. + - rscdel: Removed Xenobiology access from Scientists. + - rscdel: Removed the Xenobiologist alternate title from Scientists. + - rscadd: Added "Xenoarchaeology" to the RD, Scientists, and to the ID computer. + - tweak: Changed the Research Outpost doors to use "Xenoarchaeology" access. +2013-06-18: + Segrain: + - bugfix: Fixed some bugs in windoor construction. + - tweak: Secure windoors are made with rods again. + - rscadd: Windoors drop their electronics when broken. Emagged windoors can have + theirs removed by crowbar. + - rscadd: Airlock electronics can be configured to make door open for any single + access on it instead of all of them. + - rscadd: Cyborgs can preview their icons before choosing. +2013-06-21: + Jupotter: + - bugfix: Fix the robotiscist preview in the char setupe screen +2013-06-22: + Cael_Aislinn: + - tweak: The xenoarchaeology depth scanner will now tell you what energy field is + required to safely extract a find. + - tweak: Excavation picks will now dig faster, and xenoarchaeology as a whole should + be easier to do. +2013-06-23: + Segrain: + - rscadd: Airlocks of various models can be constructed again. + faux: + - experiment: There has been a complete medbay renovation spearheaded by Vetinarix. + http://baystation12.net/forums/viewtopic.php?f=20&t;=7847 <-- Please + put any commentary good or bad, here. + - tweak: Some maintenance doors within RnD and Medbay have had their accesses changed. + Maintenance doors in the joint areas (leading to the research shuttle, virology, + and xenobiology) are now zero access. Which means anyone in those joints can + enter the maintenance tunnels. This was done to add additional evacuation locations + during radiation storms. Additional maintenance doors were added to the tunnels + in these areas to prevent docs and scientists from running about. + - tweak: Starboard emergency storage isn't gone now, it's simply located in the + escape wing. + - experiment: An engineering training room has been added to engineering. This location + was previously where surgery was located. If you are new to engineering or need + to brush up on your skills, please use this area for testing. +2013-06-26: + Segrain: + - bugfix: Autopsy scanner properly displays time of wound infliction and death. + - bugfix: Autopsy scanner properly displays wounds by projectile weapons. + Whitellama: + - bugfix: One-antag rounds (like wizard/ninja) no longer end automatically upon + death + - wip: Space ninja has been implemented as a voteable gamemode + - rscadd: Space ninja spawn landmarks have been implemented (but not yet placed + on the map), still spawn at carps-pawns instead. (The code will warn you about + this and ask you to report it, it's a known issue.) + - rscadd: Five new space ninja directives have been added, old directives have been + reworded to be less harsh + - wip: Space ninjas have been given their own list as antagonists, and are no longer + bundled up with traitors + - bugfix: Space ninjas with a "steal a functional AI" objective will now succeed + by downloading one into their suits + - tweak: Space ninja suits' exploding on death has been nerfed, so as not to cause + breaches + - rscadd: A few space ninja titles/names have been added and removed to be slightly + more believable + - bugfix: The antagonist selector no longer chooses jobbanned players when it runs + out of willing options +2013-06-27: + Segrain: + - bugfix: ID cards properly setup bloodtype, DNA and fingerprints again. +2013-06-28: + Segrain: + - rscadd: AIs are now able to examine what they see. +2013-07-03: + Segrain: + - rscadd: Security and medical cyborgs can use their HUDs to access records. +2013-07-05: + Spamcat: + - rscadd: Pulse! Humans now have hearbeat rate, which can be measured by right-clicking + someone - Check pulse or by health analyzer. Medical machinery also has heartbeat + monitors. Certain meds and conditions can influence it. +2013-07-06: + Chinsky: + - rscadd: Humans now can be infected with more than one virus at once. + - rscadd: All analyzed viruses are put into virus DB. You can view it and edit their + name and description on medical record consoles. + - tweak: 'Only known viruses (ones in DB) will be detected by the machinery and + HUDs. ' + - rscadd: Viruses cause fever, body temperature rising the more stage is. + - bugfix: Humans' body temperature does not drift towards room one unless there's + big difference in them. + - tweak: Virus incubators now can transmit viuses from dishes to blood sample. + - rscadd: New machine - centrifuge. It can isolate antibodies or viruses (spawning + virus dish) from a blood sample in vials. Accepts vials only. + - rscadd: Fancy vial boxes in virology, one of them is locked by ID with MD access. + - tweak: Engineered viruses are now ariborne too. +2013-07-11: + Chinsky: + - rscadd: Gun delays. All guns now have delays between shots. Most have less than + second, lasercannons and pulse rifles have around 2 seconds delay. Automatics + have zero, click-speed. +2013-07-26: + Kilakk: + - bugfix: Brig cell timers will no longer start counting down automatically. + - tweak: Separated the actual countdown timer from the timer controls. Pressing + "Set" while the timer is counting down will reset the countdown timer to the + time selected. +2013-07-28: + Segrain: + - rscadd: Camera console circuits can be adjusted for different networks. + - rscadd: Nuclear operatives and ERT members have built-in cameras in their helmets. + Activate helmet to initialize it. +2013-07-30: + Erthilo: + - bugfix: EFTPOS and ATM machines should now connect to databases. + - bugfix: Gravitational Catapults can now be removed from mechs. + - bugfix: Ghost manifest rune paper naming now works correctly. + - bugfix: Fix for newscaster special characters. Still not recommended. + Kilakk: + - rscadd: Added colored department radio channels. +2013-08-01: + Asanadas: + - tweak: The Null Rod has recovered its de-culting ability, for balance reasons. + Metagaming with it is a big no-no! + - rscadd: Holy Water as a liquid is able to de-cult. Less effective, but less bloody. + May be changed over the course of time for balance. + CIB: + - bugfix: Chilis and cold chilis no longer kill in small amounts + - bugfix: Chloral now again needs around 5 units to start killing somebody + Cael Aislinn: + - rscadd: Security bots will now target hostile mobs, and vice versa. + - tweak: Carp should actually emigrate now, instead of just immigrating then squatting + around the outer hull. + - tweak: Admins and moderators have been split up into separate 'who' verbs (adminwho + and modwho respectively). + CaelAislinn: + - rscadd: Re-added old ion storm laws, re-added grid check event. + - rscadd: Added Rogue Drone and Vermin Infestation random events. + - rscadd: Added/fixed space vines random event. + - tweak: Updates to the virus events. + - tweak: Spider infestation and alien infestation events turned off by default. + - tweak: Soghun, taj and skrell all have unique language text colours. + - tweak: Moderators will no longer be listed in adminwho, instead use modwho. + Cael_Aislinn: + - tgs: Updated server to tgstation r5200 (November 26th, 2012), see https://code.google.com/p/tgstation13/source/list + for tg's changelog. + Chinsky: + - rscadd: 'Old new medical features:' + - rscadd: Autoinjectors! They come preloaded with 5u of inapro, can be used instantly, + and are one-use. You can replace chems inside using a syringe. Box of them is + added to Medicine closet and medical supplies crate. + - rscadd: Splints! Target broken liimb and click on person to apply. Can be taken + off in inventory menu, like handcuffs. Splinted limbs have less negative effects. + - rscadd: Advanced medikit! Red and mean, all doctors spawn with one. Contains better + stuff - advanced versions of bandaids and aloe heal 12 damage on the first use. + - tweak: Wounds with damage above 50 won't heal by themselves even if bandaged/salved. + Would have to seek advanced medical attention for those. + Erthilo: + - bugfix: Fixed SSD (logged-out) players not staying asleep. + - bugfix: Fixed set-pose verb and mice emotes having extra periods. + - bugfix: Fixed virus crate not appearing and breaking supply shuttle. + - bugfix: Fixed newcaster photos not being censored. + Gamerofthegame: + - rscadd: Miscellaneous mapfixes. + GauHelldragon: + - rscadd: Servicebots now have RoboTray and Printing Pen. Robotray can be used to + pick up and drop food/drinks. Printing pen can alternate between writing mode + and rename paper mode by clicking it. + - rscadd: Farmbots. A new type of robot that weeds, waters and fertilizes. Use robot + arm on water tank. Then use plant analyzer, mini-hoe, bucket and finally proximity + sensor. + - rscadd: Chefs can clang their serving trays with a rolling pin. Just like a riot + shield! + Jediluke69: + - rscadd: Added 5 new drinks (Kira Special, Lemonade, Brown Star, Milkshakes, Rewriter) + - tweak: Nanopaste now heals about half of what it used to + - tweak: Ballistic crates should now come with shotguns loaded with actual shells + no more beanbags + - bugfix: Iced tea no longer makes a glass of .what? + Jupotter: + - bugfix: Fix the robotiscist preview in the char setupe screen + Kilakk: + - rscadd: Added the Xenobiologist job. Has access to the research hallway and to + xenobiology. + - rscdel: Removed Xenobiology access from Scientists. + - rscdel: Removed the Xenobiologist alternate title from Scientists. + - rscadd: Added "Xenoarchaeology" to the RD, Scientists, and to the ID computer. + - tweak: Changed the Research Outpost doors to use "Xenoarchaeology" access. + Meyar: + - rscadd: The syndicate shuttle now has a cycling airlock during Nuke rounds. + - rscadd: Restored the ability for the syndicate Agent ID to change the name on + the card (reforge it) more than once. + - rscadd: ERT Radio now functional again. + - rscadd: 'Research blast doors now actually lock down the entirety of station-side + Research. ' + - rscadd: 'Added lock down buttons to the wardens office. ' + - rscadd: 'The randomized barsign has made a return. ' + - rscadd: Syndicate Agent ID's external airlock access restored. + NerdyBoy1104: + - rscadd: 'New Botany additions: Rice and Plastellium. New sheet material: Plastic.' + - rscadd: Plastellium is refined into plastic by first grinding the produce to get + plasticide. 20 plasticide + 10 polytrinic acid makes 10 sheets of plastic which + can be used to make crates, forks, spoons, knives, ashtrays or plastic bags + from. + - rscadd: Rice seeds grows into rice stalks that you grind to get rice. 10 Rice + + 5 Water makes boiled rice, 10 rice + 5 milk makes rice pudding, 10 rice + + 5 universal enzyme (in beaker) makes Sake. + RavingManiac: + - rscadd: You can now stab people with syringes using the "harm" intent. This destroys + the syringe and transfers a random percentage of its contents into the target. + Armor has a 50% chance of blocking the syringe. + Segrain: + - bugfix: Meteor showers actually spawn meteors now. + - tweak: Engineering tape fits into toolbelt and can be placed on doors. + - rscadd: Pill bottles can hold paper. + SkyMarshal: + - bugfix: Fixed ZAS + - bugfix: Fixed Fire + Spamcat: + - rscadd: Figured I should make one of these. Syringestabbing now produces a broken + syringe complete with fingerprints of attacker and blood of a victim, so dispose + your evidence carefully. Maximum transfer amount per stab is lowered to 10. + VitrescentTortoise: + - rscadd: Added a third option for not getting any job preferences. It allows you + to return to the lobby instead of joining. + Whitellama: + - bugfix: One-antag rounds (like wizard/ninja) no longer end automatically upon + death + - wip: Space ninja has been implemented as a voteable gamemode + - rscadd: Space ninja spawn landmarks have been implemented (but not yet placed + on the map), still spawn at carps-pawns instead. (The code will warn you about + this and ask you to report it, it's a known issue.) + - rscadd: Five new space ninja directives have been added, old directives have been + reworded to be less harsh + - wip: Space ninjas have been given their own list as antagonists, and are no longer + bundled up with traitors + - bugfix: Space ninjas with a "steal a functional AI" objective will now succeed + by downloading one into their suits + - tweak: Space ninja suits' exploding on death has been nerfed, so as not to cause + breaches + - rscadd: A few space ninja titles/names have been added and removed to be slightly + more believable + - bugfix: The antagonist selector no longer chooses jobbanned players when it runs + out of willing options + Zuhayr: + - rscadd: Added pneumatic cannon and harpoons. + - experiment: Added embedded projectiles. Bullets and thrown weapons may stick in + targets. Throwing them by hand won't make them stick, firing them from a cannon + might. Implant removal surgery will get rid of shrapnel and stuck items. + faux: + - imageadd: Mixed Wardrobe Closet now has colored shoes and plaid skirts. + - imageadd: Dress uniforms added to the Captain, RD, and HoP wardrobe closets. A + uniform jacket has also been added to the Captain's closet. HoS' hat has been + re-added to their closet. I do not love the CMO and CE enough to give them anything. + - imageadd: Atheletic closet now has five different swimsuits *for the ladies* in + them. If you are a guy, be prepared to be yelled at if you run around like a + moron in one of these. Same goes for ladies who run around in shorts with their + titties swaying in the space winds. + - imageadd: A set of dispatcher uniforms will spawn in the security closet. These + are for playtesting the dispatcher role. + - imageadd: New suit spawns in the laundry room. It's for geezer's only. You're + welcome, Book. + - imageadd: Nurse outfit variant, orderly uniform, and first responder jacket will + now spawn in the medical wardrobe closet. + - imageadd: 'A white wedding dress will spawn in the chaplain''s closet. There are + also several dresses currently only adminspawnable. Admins: Look either under + "bride" or "dress." The bride one leads to the colored wedding dresses, and + there are some other kinds of dresses under dress.' + - tweak: No more luchador masks or boxing gloves or boxing ring. You guys have a + swimming pool now, dip in and enjoy it. + - tweak: he meeting hall has been replaced with an awkwardly placed security office + meant for prisoner processing. + - tweak: Added a couple more welding goggles to engineering since you guys liked + those a lot. + - imageadd: Flasks spawn behind the bar. Only three. Don't fight over them. I don't + know how to add them to the bar vending machine otherwise I would have done + that instead. Detective, you have your own flask in your office, it's underneath + the cigarettes on your desk. + - tweak: Added two canes to the medical storage, for people who have leg injuries + and can't walk good and stuff. I do not want to see doctors pretending to be + House. These are for patients. Do not make me delete this addition and declare + you guys not being able to have nice things. + - tweak: Secondary entance to EVA now directly leads into the medbay hardsuit section. + Sorry for any inconviences this will cause. The CMO can now fetch the hardsuits + whenever they want. + - tweak: Secondary security hardsuit has been added to the armory. Security members + please stop stealing engineer's hardsuits when you guys want to pair up for + space travel. + - tweak: Firelocks have been moved around in the main hallways to form really ghetto + versions of airlocks. + - tweak: Violin spawns in theatre storage now. I didn't put the piano there though, + that was someone else. + - tweak: Psych office in medbay has been made better looking. + proliberate: + - rscadd: Station time is now displayed in the status tab for new players and AIs. +2013-08-04: + Chinsky: + - rscadd: Health HUD indicator replaced with Pain indicator. Now health indicator + shows pain level instead of actual vitals level. Some types of damage contribute + more to pain, some less, usually feeling worse than they really are. +2013-08-08: + Erthilo: + - bugfix: Raise Dead rune now properly heals and revives dead corpse. + - bugfix: Admin-only rejuvenate verb now heals all organs, limbs, and diseases. + - bugfix: Cyborg sprites now correctly reset with reset boards. This means cyborg + appearances can now be changed without admin intervention. +2013-09-18: + Kilakk: + - rscadd: Fax machines! The Captain and IA agents can use the fax machine to send + properly formatted messages to Central Command. + - imageadd: Gave the fax machine a fancy animated sprite. Thanks Cajoes! +2013-09-24: + Snapshot: + - rscdel: Removed hidden vote counts. + - rscdel: Removed hiding of vote results. + - rscdel: Removed OOC muting during votes. + - rscadd: Crew transfers are no longer callable during Red and Delta alert. + - wip: Started work on Auto transfer framework. +2013-10-06: + Chinsky: + - rscadd: Return of dreaded side effects. They now manifest well after their cause + disappears, so curing them should be possible without them reappearing immediately. + They also lost last stage damaging effects. +2013-10-29: + Cael_Aislinn: + - rscadd: Xenoarchaeology's chemical analysis and six analysis machines are gone, + replaced by a single one which can be beaten in a minigame. + - rscadd: Sneaky traitors will find new challenges to overcome at the research outpost, + but may also find new opportunities (transit tubes can now be traversed). + - rscadd: Finding active alien machinery should now be made significantly easier + with the Alden-Saraspova counter. +2013-11-01: + Various: + - rscadd: Autovoting, Get off the station when your 15 hour workweek is done, thanks + unions! + - rscadd: Some beach props that Chinsky finds useless. + - wip: Updated NanoUI + - rscadd: Dialysis while in sleepers - removes reagents from mobs, like the chemist, + toss him in there! + - tweak: Pipe Dispensers can now be ordered by Cargo + - rscadd: Fancy G-G-G-G-Ghosts! +2013-11-23: + Ccomp5950: + - bugfix: Players are now no longer able to commit suicide with a lasertag gun, + and will feel silly for doing so. + - bugfix: Ghosts hit with the cult book shall now actually become visible. + - bugfix: The powercells spawned with Exosuits will now properly be named to not + confuse bearded roboticists. + - bugfix: Blindfolded players will now no longer require eye surgery to repair their + sight, removing the blindfold will be sufficient. + - rscadd: Atmospheric Technicians will now have access to Exterior airlocks. +2013-11-24: + Yinadele: + - experiment: Supermatter engine added! Please treat your new engine gently, and + report any strangeness! + - tweak: Rebalanced events so people don't explode into appendicitis or have their + organs constantly explode. + - rscadd: Vending machines have had bottled water, iced tea, and grape soda added. + - rscadd: Head reattachment surgery added! Sew heads back on proper rather than + monkey madness. + - rscadd: Pain crit rebalanced - Added aim variance depending on pain levels, nerfed + blackscreen severely. + - rscadd: 'Cyborg alt titles: Robot, and Android added! These will make you spawn + as a posibrained robot. Please enjoy!' + - bugfix: Fixed the sprite on the modified welding goggles, added a pair to the + CE's office where they'll be used. + - bugfix: Fixed atmos computers- They are once again responsive! + - tweak: Added in functionality proper for explosive implants- You can now set their + level of detonation, and their effects are more responsively concrete depending + on setting. + - rscadd: Hemostats re-added to autolathe! + - rscadd: Added two manuals on atmosia and EVA, by MagmaRam! Found in engineering + and the engineering bookcase. + - bugfix: Fixed areas in medbay to have fully functional APC sectors. + - rscadd: Girders are now lasable. + - experiment: Please wait warmly, new features planned for next merge! +2013-12-01: + 'Various Developers banged their keyboards together:': + - rscadd: New Engine, the supermatter, figure out what a cooling loop is, or don't + and blow up engineering! + - rscadd: Each department will have it's own fax, make a copy of your butt and fax + it to the admins! + - rscadd: Booze and soda dispensers, they are like chemmasters, only with booze + and soda! + - rscadd: Bluespace and Cryostasis beakers, how do they work? Fuggin bluespace + how do they work? + - rscadd: You can now shove things into vending machines, impress your friends on + how things magically disappear out of your hands into the machine! + - rscadd: Robots and Androids (And gynoids too!) can now use custom job titles + - bugfix: Various bugfixes +2013-12-18: + RavingManiac: + - rscadd: Mousetraps can now be "hidden" through the right-click menu. This makes + them go under tables, clutter and the like. The filthy rodents will never see + it coming! + - tweak: Monkeys will no longer move randomly while being pulled. +2014-01-01: + Various: + - rscadd: AntagHUD and MedicalHUD for ghosts, see who the baddies are, check for + new configuration options. + - rscadd: Ghosts will now have bold text if they are in the same room as the person + making conversations easier to follow. + - rscadd: New hairstyles! Now you can use something other then hotpink floor length + braid. + - wip: DNA rework, tell us how you were cloned and became albino! + - rscadd: Dirty floors, so now you know exactly how lazy the janitors are! + - rscadd: A new UI system, feel free to color it yourself, don't set it to completely + clear or you will have a bad time. + - rscadd: Cryogenic storage, for all your SSD needs. + - rscadd: New hardsuits for those syndicate tajaran +2014-02-01: + Various: + - rscadd: NanoUI for PDA + - rscadd: Write in blood while a ghost in cult rounds with enough cultists + - rscadd: Cookies, absurd sandwiches, and even cookable dioanae nymphs! + - rscadd: A bunch of new guns and other weapons + - rscadd: Species specific blood +2014-02-19: + Aryn: + - experiment: New air model. Nothing should change to a great degree, but temperature + flow might be affected due to closed connections not sticking around. +2014-03-01: + Various: + - rscadd: Paint Mixing, red and blue makes purple! + - rscadd: New posters to tell you to respect those darned cat people + - rscadd: NanoUI for APC's, Canisters, Tank Transfer Valves and the heaters / coolers + - tweak: PDA bombs are now less annoying, and won't always blow up / cause internal + bleeding + - tweak: Blob made less deadly + - rscadd: Objectiveless Antags now a configuration option, choose your own adventure! + - wip: Engineering redesign, now with better monitoring of the explodium supermatter! + - rscadd: Security EOD + - rscadd: New playable race, IPC's, go beep boop boop all over the station! + - rscadd: Gamemode autovoting, now players don't have to call for gamemode votes, + it's automatic! +2014-03-05: + RavingManiac: + - rscadd: Smartfridges added to the bar, chemistry and virology. No more clutter! + - rscadd: A certain musical instrument has returned to the bar. + - rscadd: There is now a ten second delay between ingesting a pill/donut/milkshake + and regretting it. +2014-03-10: + Chinsky: + - rscadd: Viruses now affect certain range of species, different for each virus + - tweak: Spaceacilline now prevents infection, and has a small chance to cure viruses + at Stage 1. It does not give them antibodies though, so they can get sick again! + - tweak: Biosuits and spacesuits now offer more protection against viruses. Full + biosuit competely prevents airborne infection, when coupled with gloves they + both protect quite well from contact ones + - rscadd: Sneezing now spreads viruses in front of mob. Sometimes he gets a warning + beforehand though +2014-03-30: + RavingManiac: + - rscadd: Inflatable walls and doors added. Useful for sealing off hull breaches, + but easily punctured by sharp objects and Tajarans. +2014-04-06: + RavingManiac: + - tweak: Tape recorders and station-bounced radios now work inside containers and + closets. +2014-04-11: + Jarcolr: + - rscadd: You can now flip coins like a D2 + - tweak: Miscellaneous cargo crates got a tiny buff, Standard Costume crate is now + Costume Crate + - tweak: Grammar patch,telekinesis/amputated arm exploit fixes,more in the future + - tweak: Grille kicking now does less damage + - tweak: TELESCOPIC baton no longer knocks anybody down,still got a lot of force + though + - tweak: Other small-ish changes and fixes that aren't worth mentioning +2014-04-25: + Various: + - rscadd: Overhauled saycode, you can now use languages over the radio. + - rscadd: Chamelon items beyond just the suit. + - rscadd: NanoUI Virology + - rscadd: 3D Sounds + - rscadd: AI Channel color for when they want to be all sneaky + - rscadd: New inflatable walls and airlocks for your breach sealing pleasure. + - rscadd: Carbon Copy papers, so you can subject everyone to your authority and + paperwork, but mainly paperwork + - rscadd: Undershirts and rolling down jumpsuits + - rscadd: Insta-hit tasers, can be shot through glass as well. + - rscadd: Changeling balances, an emphasis put more on stealth. + - rscdel: Genetics disabled + - rscdel: Telescience removed, might be added again when we come up with a less + math headache enducing version of it. + - bugfix: Bugfixes galore! +2014-04-29: + HarpyEagle: + - rscadd: Webbing vest storage can now be accessed by clicking on the item in inventory + - rscadd: Holsters can be accessed by clicking on them in inventory + - rscadd: Webbings and other suit attachments are now visible on the icon in inventory + - tweak: Removing jumpsuits now requires drag and drop to prevent accidental undressing + - rscadd: Added an action icon for magboots that can be used to toggle them similar + to flashlights + - rscadd: Fuel tanks now spill fuel when wrenched open +2014-05-03: + Cael_Aislinn: + - rscadd: "Coming out of nowhere the past few months, the Garland Corporation has\ + \ made headlines with a new prehistoric theme park delighting travellers with\ + \ species thought extinct. Now available for research stations everywhere is\ + \ the technology that made it all possible! Features include:
      \n\t\t\t-\ + \ 13 discoverable prehistoric species to clone from fossils (including 5 brand\ + \ new ones).
      \n\t\t\t- 11 discoverable prehistoric plants to clone from fossils\ + \ (including 9 brand new ones).
      \n\t\t\t- New minigame that involves correctly\ + \ ordering the genomes inside each genetic sequence to unlock an animal/plant.
      \n\ + \t\t\t- Some prehistoric animals and plants may seem strangely familiar... while\ + \ others may bring more than the erstwhile scientist bargains for.
      \n




      " +2014-05-06: + Hubble: + - rscadd: Clip papers together by hitting a paper with a paper or photo + - imageadd: Adds icons for copied stamps +2014-05-16: + HarpyEagle: + - rscadd: Silicon mob types (AI, cyborgs, PAI) can now speak certain species languages + depending on type and module + - rscadd: Languages can now be whispered when using the language code with either + the whisper verb or the whisper speech code +2014-05-23: + Hubble: + - rscadd: Personal lockers are now resettable + - rscadd: Take off people's accessories or change their sensors in the drag and + drop-interface + - rscadd: Merge paper bundles by hitting one with another + - tweak: Line breaks in Security, Medical and Employment Records + - tweak: Record printouts will have names on it + - tweak: Set other people's internals in belt and suit storage slots + - bugfix: No longer changing suit sensors while cuffed + - bugfix: No longer emptying other people's pockets when they are not full yet +2014-05-28: + Chinsky: + - rscadd: Adds few new paperBBcode tags, to make up for HTML removal. + - rscadd: '[logo] tag draws NT logo image (one from wiki).' + - rscadd: '[table] [/table] tags mark borders of tables. [grid] [/grid] are borderless + tables, useful of making layouts. Inside tables following tags are used: [row] + marks beginning of new table row, [cell] - beginning of new table cell.' +2014-05-31: + Jarcolr: + - rscadd: 21 New cargo crates, go check them out! + - rscadd: Peanuts have now been added, food items are now being developed. + - rscadd: 2 new cargo groups, Miscellaneous and Supply. + - rscadd: Sugarcane seeds can now be gotten from the seed dispenser. + - rscadd: 5 new satchels when selecting "satchel" for RD, scientist, botanist, virologist, + geneticist (disabled) and chemist. + - rscadd: Clicking on a player with a paper/book when you have the eyes selected + shows them the book/paper forcefully. +2014-06-03: + Hubblenaut: + - rscadd: Added wheelchairs + - tweak: Replaced stool in Medical Examination with wheelchair + - tweak: Using a fire-extinguisher to propel you on a chair can have consequences + (drive into walls and people, do it!) +2014-06-13: + HarpyEagle: + - rscadd: Added docking ports for shuttles + - rscadd: Shuttle airlocks will automatically open and close, preventing people + from being sucked into space by because someone on another z-level called a + shuttle + - rscadd: Some docking ports can also double as airlocks + - rscadd: Docking ports can be overriden to prevent any automatic action. Shuttles + will wait for players to open/close doors manually + - rscadd: Shuttles can be forced launched, which will make them not wait for airlocks + to be properly closed +2014-06-15: + HarpyEagle: + - bugfix: Fixed wound autohealing regardless of damage amount. The appropriate wound + will now be assigned correctly based on damage amount and type + - bugfix: Fixed several other bugs related wounds that resulted in damage magically + disappearing + - bugfix: Fixed various sharp objects not being counted as sharp, bullets in particular + - bugfix: Fixed armour providing more protection from bullets than it was supposed + to +2014-06-19: + Chinsky: + - rscadd: Adds guest terminals on the map. These wall terminals let anyone issue + temporary IDs. Only access that issuer has can be granted, and maximum time + pass can be issued for is 20 minutes. All operations are logged in terminals. +2014-06-20: + Cael_Aislinn: + - rscadd: 'New discoverable items added to xenoarchaeology, and new features for + some existing ones. Artifact harvesters can now harvest the secondary effect + of artifacts as well as the primary one.
      + +
      ' + - tweak: 'Artifact utilisers should be much nicer/easier to use now.
      + +
    • Alden-Saraspova counters and talking items should work properly + now.
      + +
    • + +
      ' +2014-07-01: + Various: + - experiment: Hardsuit breaching. + - experiment: Rewritten fire. + - experiment: Supermatter now glows and sucks things into it as it approaches criticality. + - rscadd: Station Vox (Vox pariahs) are now available. + - rscadd: Wheelchairs. + - rscadd: Cargo Trains. + - rscadd: Hardsuit cycler machinery. + - rscadd: Rewritten lighting (coloured lights!) + - rscadd: New Mining machinery and rewritten smelting. + - rscadd: Rewritten autolathe + - rscadd: Mutiny mode. + - rscadd: NanoUI airlock and docking controllers. + - rscadd: Completely rewritten shuttle code. + - rscadd: 'Derelict Z-level replacement: construction site.' + - rscadd: Computer3 laptops. + - rscadd: Constructable SMES units. + - rscadd: Omni-directional atmos machinery. + - rscadd: Climbable tables and crates. + - rscadd: Xenoflora added to Science. + - rscadd: Utensils can be used to eat food. + - rscadd: Decks of cards are now around the station. + - rscadd: Service robots can speak languages. + - wip: Xenoarch updates and fixes. + - tweak: Rewritten species-specific gear icon handling. + - tweak: Cats and borers can be picked up. + - tweak: Botanist renamed to Gardener. + - tweak: Hydroponics merged with the Kitchen. + - tweak: Latejoin spawn points (Arrivals, Cryostorage, Gateway). + - rscadd: Escape pods only launch automatically during emergency evacuations + - rscadd: Escape pods can be made to launch during regular crew transfers using + the control panel inside the pod, or by emagging the panel outside the pod + - rscadd: When swiped or emagged, the crew transfer shuttle can be delayed in addition + to being launched early +2014-07-06: + HarpyEagle: + - rscadd: Re-enabled and rewrote the wound infection system + - rscadd: Infections can be prevented by properly bandaging and salving wounds + - rscadd: Infections are cured by spaceacillin +2014-07-20: + PsiOmegaDelta: + - rscadd: AI can now store up to five camera locations and return to them when desired. + - rscadd: AI can now alt+left click turfs in camera view to list and interact with + the objects. + - rscadd: AI can now ctrl+click turret controls to enable/disable turrets. + - rscadd: AI can now alt+click turret controls to toggle stun/lethal mode. + - rscadd: AI can now select which channel to state laws on. +2014-07-26: + Whitellama: + - rscadd: Added dynamic flavour text. + - bugfix: Fixed bug with suit fibers and fingerprints. +2014-07-31: + HarpyEagle: + - tweak: Stun batons now work like tasers and deal agony instead of stun + - rscadd: Being hit in the hands with a stun weapon will cause whatever is being + held to be dropped + - tweak: Handcuffs now require an aggressive grab to be used +2014-08-02: + Whitellama: + - bugfix: Arcane tomes can now be stored on bookshelves. + - bugfix: Dionaea players no longer crash on death, and now become nymphs properly. +2014-08-05: + HarpyEagle: + - tweak: Atmos Rewrite. Many atmos devices now use power according to their load + and gas physics + - rscadd: Pressure regulator device. Replaces the passive gate and can regulate + input or output pressure + - rscadd: Gas heaters and gas coolers are now constructable and can be upgraded + with parts from research + - bugfix: Fixes recharger and cell charger power draw. Rechargers draw 15 kW, wall + chargers draw 25 kW, and heavy-duty cell chargers draw 40 kW. Cyborg charging + stations draw 75 kW. + - bugfix: Laptops, and various other machines, now draw more reasonable amounts + of power + - bugfix: Machines will periodically update their powered status if moved from a + powered to an unpowered area and vice versa +2014-08-27: + Whitellama: + - bugfix: Made destination taggers more intuitive so you know when you've tagged + something + - rscadd: Ported package label and tag sprites + - rscadd: Ported using a pen on a package to give it a title, or to write a note + - rscadd: Donut boxes and egg boxes can be constructed out of cardboard +2014-08-31: + Whitellama: + - bugfix: Matches and candles can be used to burn papers, too. + - bugfix: Observers have a bit more time (20 seconds, instead of 7.5) before the + Diona join prompt disappears. +2014-09-05: + RavingManiac: + - experiment: 'NewPipe implemented: Supply and scrubber pipes can be run in parallel + without connecting to each other.' + - rscadd: Supply pipes will only connect to supply pipes, vents and Universal Pipe + Adapters(UPAs). + - rscadd: Scrubber pipes will only connect to scrubber pipes, scrubbers and UPAs. + - rscadd: UPAs will connect to regular, scrubber and supply pipes. +2014-09-20: + HarpyEagle: + - bugfix: Fixes evidence bags and boxes eating each other. Evidence bags now store + items by dragging the bag onto the item to be stored. +2014-09-28: + Gamerofthegame: + - rscadd: Hoverpods fully supported, currently orderable from cargo. Two slots, + three cargo, space flight and a working mech for all other intents and purposes. + - rscadd: Added the Rigged laser and Passenger Compartment equipment. The rigged + laser is a weapon for working exosuits - just a ordinary laser, but with triple + the cool down and rather power inefficient. The passenger compartment allows + other people to board and hitch a ride on the mech - such as in fire rescue + or for space flight. + Zuhayr: + - rscadd: Organs can now be removed and transplanted. + - tweak: Brain surgery is now the same as chest surgery regarding the steps leading + up to it. + - tweak: Appendix and kidney now share the groin and removing the first will prevent + appendicitis. + - tweak: Lots of backend surgery/organ stuff, see the PR if you need to know. +2014-10-01: + RavingManiac: + - rscadd: Zooming with the sniper rifle now adds a view offset in the direction + you are facing. + - rscadd: Added binoculars - functionally similar to sniper scope. Adminspawn-only + for now. + - rscadd: Bottles from chemistry now, like beakers, use chemical overlays instead + of fixed sprites. + - rscadd: Being in space while not magbooted to something will cause your sprite + to bob up and down. + Zuhayr: + - rscadd: Added species organ checks to several areas (phoron burn, welder burn, + appendicitis, vox cortical stacks, flashes). + - rscadd: Added VV option to add or remove organs. + - rscadd: Added simple bioprinter (adminspawn). + - rscadd: Added smashing/slashing behavior from xenos to some unarmed attacks. + - rscadd: Added some new state icons for diona nymphs. + - rscadd: Added borer husk functionality (cortical borers can turn dead humans into + zombies). + - rscadd: Added tackle verb. + - rscadd: Added NO_SLIP. + - rscadd: Added species-specific orans to Dionaea, new Xenomorphs and vox. + - rscadd: Added colour and species to blood data. + - rscadd: Added lethal consequences to missing your heart. + - rscdel: Removed robot_talk_understand and alien_talk_understand. + - rscdel: Removed attack_alien() and several flavours of is_alien() procs. + - rscdel: Removed /mob/living/carbon/alien/humanoid. + - rscdel: Removed alien_hud(). + - rscdel: Removed IS_SLOW, NEEDS_LIGHT and RAD_ABSORB. + - rscdel: Renamed is_larva() to is_alien(). + - tweak: Refactored a ton of files, either condensing or expanding them, or moving + them to new directories. + - tweak: Refactored some attack vars from simple_animal to mob/living level. + - tweak: Refactored internal organs to /mob/living/carbon level. + - tweak: Refactored rad and light absorbtion to organ level. + - tweak: Refactored brains to /obj/item/organ/brain. + - tweak: Refactored a lot of blood splattering to use blood_splatter() proc. + - tweak: Refactored broadcast languages (changeling and alien hiveminds, drone and + binary chat) to actual languages. + - tweak: Refactored xenomorph abilities to work for humans. + - tweak: Refactored xenomorphs into human species. + - tweak: Rewrote larva_hud() and human_hud(). The latter now takes data from the + species datum. + - tweak: Rewrote diona nymphs as descendents of /mob/living/carbon/alien. + - tweak: Rewrote xenolarva as descendents of /mob/living/carbon/alien. + - tweak: Rewrote /mob/living/carbon/alien. + - tweak: Moved alcohol and toxin processing to the liver. + - tweak: Moved drone light proc to robot level, added integrated_light_power and + local_transmit vars to robots. + - tweak: Moved human brainloss onto the brain organ. + - tweak: Shuffled around and collapsed several redundant procs down to carbon level + (hide, ventcrawl, Bump). + - tweak: Fixed species swaps from NO_BLOOD to those with blood killing the subject + instantly. +2014-11-01: + PsiOmegaDelta: + - bugfix: Adds the last missing step to deconstruct fire alarms. Apply wirecutters. + - rscadd: There's a "new" mining outpost nearby the Research outpost. + - rscadd: Manifest ghosts now have spookier names. + - rscadd: Adds a gas monitor computer for the toxin mixing chamber. + - rscadd: AI can now change the display of individual AI status screens. + - rscadd: More ion laws.. + - rscadd: All turrets have been replaced with portable variants. Potential targets + can be configured on a per turret basis. + - bugfix: Improved crew monitor map positioning. + - rscadd: Can now order plastic, body-, and statis bags from cargo + - rscadd: PDAs now receive newscasts. + - rscadd: (De)constructable emergency shutters. + - rscadd: Borgs can now select to simply state their laws or select a radio channel, + same as the AI. +2014-11-04: + TwistedAkai: + - rscadd: Almost any window which has been fully unsecured can now be dismantled + with a wrench. +2014-11-08: + PsiOmegaDelta: + - rscadd: Service personnel now have their own frequency to communicate over. Use + "say :v". + - rscadd: The AI can now has proper quick access to its private channel. Use "say + :o". + - rscadd: Newscasters supports photo captions. Simply pen one on the attached photo. + - rscadd: Once made visible by a cultist ghosts can toggle visiblity at will. + - rscadd: Detonating cyborgs using the cyborg monitor console now notifies the master + AI, if any. + - rscadd: More machinery, such as APCs, air alarms, etc., now support attaching + signalers to the wires. + - tweak: Random event overhaul. Admins may wish check the verb "Event Manager Panel". +2014-11-22: + Zuhayr: + - rscadd: Added the /obj/item/rig class - back-mounted deployable hardsuits. + - rscadd: Replaced existing hardsuits with 'voidsuits', functionally identical. + - rscdel: Removed the mounted device and helmet/boot procs from voidsuits. + - tweak: Refactored a shit-ton of ninja code into the new rig class. + - wip: This is more than likely going to take a lot of balancing to get into a good + place. +2015-01-09: + Zuhayr: + - tweak: Voice changers no longer use ID cards. They have Toggle and Set Voice verbs + on the actual mask object now. + - rscadd: Readded moonwalking. Alt-dir to face new dir, or Face-Direction verb to + face current dir. +2015-02-04: + RavingManiac: + - rscadd: Holodeck is now bigger and better, with toggleable gravity and a new courtroom + setting + TwistedAkai: + - bugfix: Purple Combs should now be visible and have their proper icon +2015-02-12: + Daranz: + - rscadd: Vending machines now use NanoUI and accept cash. The vendor account can + now be suspended to disable all sales in all machines on station. +2015-02-16: + RavingManiac: + - rscadd: Say hello to the new Thermoelectric Supermatter Engine. Read the operating + manual to get started. +2015-02-18: + PsiOmegaDelta: + - rscadd: Synths now have timestamped radio and chat messages. + - rscadd: New and updated uplink items. + - rscadd: Multiple AIs can now share the same holopad. + - rscadd: The AI now has built-in consoles, accessible from the subsystem tab. +2015-02-24: + Zuhayr: + - experiment: Major changes to the kitchen and hydroponics mechanics. Review the + detailed changelog here, +2015-04-07: + RavingManiac: + - tweak: You can now pay vending machines and EFTPOS scanners without removing your + ID from your PDA or wallet. Clicking on the vending machine with your ID/PDA/wallet/cash + also brings up the menu now instead of attacking the vending machine. +2015-04-18: + PsiOmegaDelta: + - rscadd: Added a changelog editing system that should cause fewer conflicts and + more accurate timestamps. +2015-04-23: + Dennok: + - rscadd: Added an automatic pipelayer. + - rscadd: Added an automatic cablelayer. + PsiOmegaDelta: + - bugfix: Shower curtains no longer lose their default color upon being washed. + - bugfix: Emergency shutters can again be examined, and from the proper distance. + - bugfix: The virus event will now only infect mobs on the station, currently controlled + by player that has been active in the last 5 minutes. + - bugfix: Laptops now use the proper proc for checking camera status. + - rscadd: Makes it possible to eject PDA cartridges using a verb. + - rscadd: Makes it possible to shake tables with one's bare hands to stop climbers. + - bugfix: Added a mass driver door in disposals to prevent trash from floating out + into space before proper ejection. + - rscadd: Rig/Hardsuit module tab - Less informative than the NanoUI hardsuit interface + but allows quicker access to the various rig modules. + - rscadd: Silicons with the medical augmentation sensors enabled now also see alive/dead + status if sensors are set accordingly. + - rscadd: Emergency shutters opened by silicons are now treated as having been forced + open by a crowbar. + - rscadd: An active AI chassis can now be pushed, just as an empty chassis can be. + - rscadd: The AI can now use the crew monitor console to track crew members with + full sensors enabled. + - rscadd: The AI now has a shortcut to track people holding up messages to cameras. + - rscadd: The AI now has a shortcut to track people sending PDA messages. + - rscadd: Multiple AIs can now share the same holopad. + - rscadd: Admin ghosts can now transfer other ghosts into mobs by drag-clicking. + - rscadd: Ghosts can now toggle seeing darkness and other ghosts separately. + - rscadd: Moving while dead now auto-ghosts you. + - rscadd: 'Two new random events: Space dust and gravitation failure.' + - rscadd: Upgraded wizard spell interface and new spells. + - rscadd: More uplink items. + - rscadd: Uplink items now have rudimentary descriptions. + Yoshax: + - tweak: Adjusts fruits and other stuff to have a minmum of 10 units of juice and + stuff. +2015-04-24: + Dennok: + - bugfix: Fixes overmap ship speed calculations. + - rscadd: Adds overmap ship rotation. + - rscadd: Added a floorlayer. +2015-04-28: + Jarcolr: + - rscadd: Added 9 new bar sign designs/sprites. + Kelenius: + - rscadd: 'Good news to the roboticists! The long waited firmware update for the + bots has arrived. You can expect the following changes:' + - rscadd: Medbots have improved the disease detection algorithms. + - rscadd: Floorbot firmware has been bugtested. In particular, they will no longer + get stuck near the windows, hopelessly trying to fix the floor under the glass. + - rscadd: Floorbots have also received an internal low-power metal synthesizer. + They will use it to make their own tiles. Slowly. + - rscadd: Following the complains from humanitarian organizations regarding securitron + brutality, stength of their stunners has been toned down. They will also politely + demand that you get on the floor before arresting you. Except for the taser-mounted + guys, they will still tase you down. + - rscadd: Other minor fixes. + - rscdel: 'The lasertag bots are now forbidden to build and use following the incident + #1526672. Please don''t let it happen again.' + - rscadd: The farmbot design has been finished! Made from a watertank, robot arm, + plant analyzer, bucket, minihoe and a proximity sensor, these small (not really) + bots will be a useful companion to any gardener and/or xenobotanist. + - tweak: 'Spider learning alert: they have learned to recognize the bots and will + mercilessly attack them.' + - rscadd: An experimental CPU upgrade would theoretically allow any of the bots + to function with the same intelligence capacity as the maintenance drones. We + still have no idea what causes it to boot up. Science! + - rscadd: 'INCOMING TRANSMISSION: Greetings to agents, pirates, operatives, and + anyone who otherwise uses our equipment. Following the NT update of bot firmware, + we have updated the cryptographic sequencer''s hacking routines as well. The + medbots you emag will not poison you anymore, the clanbots won''t clean after + themselves immediately, and floorbots... wear a space suit. Oh, and it works + on the new farmbots, too.' + PsiOmegaDelta: + - rscadd: Beware. Airlocks can now crush more things than just mobs. + - rscadd: AIs now have a personal atmospherics control subsystem. + - rscadd: Some borg modules now have additional subsystems. + - tweak: Improves borg module handling. + - tweak: Secure airlocks now buzz when access is denied. + - tweak: The mental health office door now requires psychiatrist access, and the + related button now opens/closes the door instead of bolting. + - soundadd: Restores an old soundtrack 'Thunderdome.ogg'. + - rscadd: Some holodeck programs now have custom ambience tracks. + RavingManiac: + - rscadd: The phoron research lab has been renovated to include a heat-exchange + system, a gas mixer/filter and a waste gas disposal pump. + - tweak: Candles now burn for about 30 mintutes. + Yoshax: + - tweak: Adds items to the orderable antag surgical kit so its actually useful for + surgery. + - tweak: Adjusts custom loadout costs to be more standardised and balances. Purely + cosmetic items, shoes, hats, and all things that do not provide a straight advtange + (sterile mask, or pAI, protection from viruses and possible door hacking or + records access, respectively), each cost 1 point, items that provide an advantage + like those just mentioned, or provide armor or storage cost 2 points. + - rscadd: Adds practice rounds, both .45 for Sec and Detective's guns, also 9mm + top mounted for the Saber, and for the Bulldog. + - rscadd: Adds the .45 and 9mm practice rounds to the armory. + - rscadd: Adds all the practice rounds to the autolathe. + - tweak: Adds r_walls to the back of the firing range, leaves the sides normal. + - bugfix: Fixes HoS' office door to not be CMO locked. +2015-04-29: + Daranz: + - rscadd: Paper bundles can now have papers inserted at arbitrary points. This can + be done by clicking the previous/next page links with a sheet of paper in hand. + HarpyEagle: + - rscadd: 'Added new fire modes to various guns: c20r, STS-35, WT-550, Z8, L6 SAW, + and double barreled shotgun. The firing modes work the same way as the egun; + click on the weapon with it in your active hand to cycle between modes. Unloading + these weapons now requires that you click on them with an empty hand.' + PsiOmegaDelta: + - rscadd: Portable atmospheric pumps and scrubbers now use NanoUI. + - rscadd: Two new events which will cause damage to APCs or cameras when triggered. +2015-04-30: + Yoshax: + - rscadd: Adds more items to custom loadout, including a number of dressy suits + and some other things. +2015-05-02: + HarpyEagle: + - bugfix: Neck-grabbing someone now stuns them properly. + PsiOmegaDelta: + - tweak: The spider infestation event now makes an announcement much sooner. + - rscadd: Admins can now toggle OOC/LOOC separately. + - tweak: Mice are now numbered to aid admins. + Yoshax: + - rscadd: Adds an option and verb to the AI to send emergency messages to Central, + functions same as comms console option. + - tweak: Changes comms console to only have one level of ID require, meaning all + heads of staff have what was captain access, allowing them to change alert, + send emergency messages and make announcements. + - rscadd: Adds an emergency bluespace relay machine which is mapped into teletcomms, + this machine takes emergency messages and sends them to central, if one does + not exist on any Z, you cannot send any emergency messages. + - rscadd: Adds an emergency bluespace relay assembly kit orderable from cargo for + when the ones on telecomms are destroyed. Assembly is required. + - rscadd: Adds the emergency bluespace relay circuitboard to be researchable and + printable in R&D, with sufficient tech levels. +2015-05-05: + PsiOmegaDelta: + - tweak: Grilles no longer return too many rods when destroyed (using means other + than wirecutters). + RavingManiac: + - tweak: Intent menu now appears while zooming with a sniper rifle. +2015-05-06: + PsiOmegaDelta: + - rscadd: Examining a pen or crayon now lists the available special commands in + the examine tab. +2015-05-07: + HarpyEagle: + - rscadd: Breaking out of lockers now has sound and animation. + PsiOmegaDelta: + - bugfix: The cloning computer can again successfully locate nearby cloning vats + and DNA scanners at round start. + - rscadd: Security equipment now treats individuals with CentCom ids with the greatest + respect. + - maptweak: Adds stretches of power cable around the construction outpost, ensuring + one does not have to climb over machines to being laying cables. + RavingManiac: + - rscadd: Muzzle-flash lighting effect for guns + - rscadd: Energy guns now display shots remaining on examine +2015-05-09: + Yoshax: + - rscadd: Maps in the top mounted 9mm practice rounds, .45 practice rounds, and + practice shotgun shells into the armory. +2015-05-10: + GinjaNinja32: + - rscadd: Acting jobs on the manifest will now sort with their non-acting counterparts. + All assignments beginning with the word 'acting', 'temporary', or 'interim' + will do this. + Yoshax: + - tweak: Removes sleepy chems from being cloned, adds a consistent period of 30 + tick sleep. +2015-05-11: + Mloc: + - experiment: Rewritten lighting system. + - rscadd: Better coloured lights. + - rscadd: Animated transitions. + PsiOmegaDelta: + - bugfix: As an observer, using antagHUD should now always restrict you from respawning + without admin intervention. + Techhead: + - rscadd: Voidsuits can have tanks inserted into the storage slot. + - rscadd: Voidsuits display helpful information on their contents on examine. + - rscadd: Magboots can be equipped over other shoes. Except other magboots. +2015-05-12: + Dennok: + - imageadd: New buildmode icons made by BartNixon. + HarpyEagle: + - rscadd: Masks and helmets that cover the face block feeding food, drinks, and + pills. + MrSnapwalk: + - imageadd: Added seven new AI core displays. + - tweak: Changed the pAI sprite and added several new expressions. + PsiOmegaDelta: + - rscadd: The space vine event now comes with a station announcement. +2015-05-14: + PsiOmegaDelta: + - maptweak: Should now be more evident that the brig disposal chute sends its goods + to the common brig area. + - bugfix: Cells now drain when using more charge than what is available. + - tweak: The rig stealth module now requires as much power to run as the energy + blade module. + Techhead: + - rscadd: Vox will spawn with emergency nitrogen tanks in their survival boxes. + - rscadd: Diona will spawn with an emergency flare instead of a survival box. + - rscdel: Engineers no longer spawn with extended-capacity oxygen tanks. + - bugfix: Vox spawning without backpacks will have their nitrogen tank equipped + to their back. + - tweak: The Bartender's spare beanbag shells have been moved into bar backroom + with the shotgun. + - bugfix: Portable air pumps now fill based on external/airtank pressure when pumping + in. +2015-05-16: + GinjaNinja32: + - rscadd: Rewrote tables. To construct a table, use steel to make a table frame, + then plate the frame with a material such as steel, gold, wood, etc. Hold a + stack in your hand and drag it to the table to reinforce it. To deconstruct + a table, use a screwdriver to remove the reinforcements (if present), then a + wrench to remove the plating, and a wrench again to dismantle the frame. Use + a welder to repair any damage. Use a carpet tile on a table to add felt, and + a crowbar to remove it. + HarpyEagle: + - rscadd: Adds tail animations for tajaran and unathi. Animations are controlled + using emotes. +2015-05-17: + PsiOmegaDelta: + - bugfix: Teleporter artifacts should no longer teleport mobs inside objects. +2015-05-18: + Hubblenaut: + - rscadd: Adds a light for available backup power on airlocks. + Kelenius: + - tweak: 'There has been a big update to the reagent system. A full-ish changelog + can be found here: http://pastebin.com/imHXTRHz. In particular:' + - tweak: Reagents now differentiate between being ingested (food, pills, smoke), + injected (syringes, IV drips), and put on the skin (sprays, beaker splashing). + - tweak: Injecting food and drinks will cause bad effects. + - tweak: Healing reagents, generally speaking, have stronger effects when injected. + - tweak: Toxins now work slower and deal more damage. Seek medical help! + - tweak: Alcohol robustness has been lowered. + - tweak: Acid will no longer melt large numbers of items at once. + - tweak: Synaptizine is no longer hilariously deadly. + Loganbacca: + - tweak: Changed MULE destination selection to be list based. + PsiOmegaDelta: + - tweak: Destroying a camera by brute force now has a chance to break the wiring + within. + - rscadd: Turf are now processed. This, for example, causes radioactive walls to + regularly irradiate nearby mobs. + - bugfix: Welders should now always update their icon and inhand states properly. +2015-05-22: + Ccomp5950: + - bugfix: Beepsky no longer kills goats. + - tweak: Goats will move towards vines that are 4 spaces away now instead of 1 + - bugfix: Goats will eat the spawning plants for vines as well as the vines themselves. + Chinsky: + - rscadd: Ghetto diagnosis. Grab patient, aim at bodypart you want to check, click + on them with help intent. This will tell you about their wounds, fractures and + other oddities (toxins/oxygen) for that bodypart. + - rscadd: Fractures are visible on very damaged limbs. Dislocations are always visible. + Surgery incisions now visible too. + - rscadd: Stethoscopes actually make sense now. They care for heart/lungs status + when reporting pulse and respiration now. + HarpyEagle: + - rscadd: Re-implemented fuel fires. Tweaked fire behaviour overall. + Yoshax: + - tweak: Bear traps now do damage when stood on, enough to break bones! Bear traps + can now affect any limb of a person who is on the ground, including head! Bear + traps are no longer legcuffs and instead embed in the limb they attack. + - tweak: Bear traps now take several seconds to deploy and cannot be picked up when + armed, they must be disarmed by clicking on them. They also cannot be moved + then they are deployed. + Zuhayr: + - rscadd: Massive material refactor. Walls, beds, chairs, stools, tables, ashtrays, + knives, baseball bats, axes, simple doors, barricades, so on. + - rscadd: Tables are now built via steel then another sheet on the resulting frame. + They can then be reinforced by dragging a stack of sheets onto the table. + - rscadd: Walls are built with steel for girders, then right-click the girder and + select the reinforce verb while holding a stack, then click the girders with + a final sheet. + - rscadd: Various things can be built with various sheet types. Experiment! Just + keep in mind that uranium is now radioactive and phoron is now flammable. +2015-05-26: + Atlantis: + - rscadd: NanoUI for Robotics Control Console + - rscadd: NanoUI for Supermatter Crystal - AI/Robot only, purely informational + Chinsky: + - rscadd: Meat limbs now can be attached. Use limb on missing area, then hemostat + to finalize it. + - rscadd: Limbs from other races can be now attached. They'll cause rejection, but + it can be kept at bay with spaceacilline to some point. Species special attack + is carried over too, i.e. you can clawn people if you sew a cathand to yourself. + - rscadd: Limbs that are left in open will rot in ~7 minutes. Use freezers or cryobags + to stop it. You can still attach them, but you wish you couldn't. + PsiOmegaDelta: + - tweak: Both the pulse taker and target must now remain still for the duration + of the check or it will fail. + RavingManiac: + - rscadd: Tape recorders now record hearable emotes and action messages (e.g. gunshots). + - bugfix: You can now see actions from inside mechs and closets. + Techhead: + - rscadd: Removed gaseous reagents from the chemistry system and replaced with real-world + organic chemistry precursors. + - rscadd: Hydrogen has been replaced with hydrazine, a highly toxic, flammable liquid. + - rscadd: Oxygen has been replaced with acetone, a mildly toxic liquid. Ethanol's + ink-sovlent capabilities have been copied to it. + - rscadd: Chlorine has been replaced with hydrochloric acid. It is a stronger acid + than sulphuric but less toxic. + - tweak: Nitrogen has been replaced with ammonia. Ammonia now acts as a Dexalin-equivalent + for Vox. + - tweak: Flourine has also been replaced with hydrazine in its one recipe. Flourosurficant + has been renamed azosurficant. + - tweak: Being splashed with liquid Phoron will burn eyes and contaminate clothes + like being exposed to Phoron gas. + Zuhayr: + - rscadd: Added a ghost requisition system for posibrains and living plants. + - rscadd: Added attack_ghost() to hydro trays and posibrains to allow ghosts to + enter them. + - rscadd: Prosthetic limbs are now only repairable with welders/cable coils if they + have suffered below 30 combined damage. + - rscadd: 'Surgery steps that cause no pain and have no failure wounding have been + added: screwdriver for ''incision'', crowbar to open, multitool to ''decouple'' + a prosthetic organ. Hemostat is still used to take an organ out.' + - rscadd: Using a welder or a cable coil as a surgical tool after opening a maintenance + hatch will repair damage beyond the 30 damage cap. In other words, severe damage + to robolimbs requires expert repair from someone else. + - rscdel: Eye and brain surgery were removed; they predate the current organ system + and are redundant. + - rscadd: IPC are now simply full prosthetic bodies using a specific manufacturer + (Morpheus Cyberkinetics). + - rscadd: IPC can 'recharge' in a cyborg station to regain nutriment. They no longer + interface with APCs. + - rscadd: NO_BLOOD flag now bypasses ingested and blood reagent processing. + - rscadd: NO_SCAN now bypasses mutagen reagent effects. + - rscadd: Cyborg analyzers now show damage to prosthetic limbs and organs on humans. + - tweak: Prosthetic EMP damage was reduced. + - tweak: Several organ files were split up/moved around. +2015-05-27: + PsiOmegaDelta: + - tweak: The inactive check process now respects client holder status and can be + configured how long clients may remain inactive before being kicked. + Zuhayr: + - rscadd: Unfolded pAIs can now be scooped up and worn as hats. + - tweak: Scoop-up behavior is now standardized to selecting help intent and dragging + their icon onto yours. +2015-05-30: + Atlantis: + - rscadd: Malfunction Overhaul - Whole gamemode was completely reworked from scratch. + Most old abilities have been removed and quite a lot of new abilities was added. + AI also has to hack APCs to unlock higher tier abilities faster, instead of + having access to them from the round start. Most forced things, such as, shuttle + recalling were removed and are instead controlled by the AI. Code is fully modular + allowing for future modifications. + HarpyEagle: + - bugfix: Fixes Engineer ERT gloves not being insulated. + - tweak: IV stands are no longer bullet shields. They also allow mice, drones, pAIs + et al to pass though. + Kelenius: + - tweak: AI now hears LOOC both around its eye and its core, and speaks in LOOC + around its eye. Keep in mind that you won't hear and won't be heard if there + is a wall between your eye and the target. + PsiOmegaDelta: + - rscadd: You can now review the server revision date and hash by using the 'Show + Server Revision' verb in the OOC category. +2015-06-02: + Techhead: + - rscadd: Re-adds extended capacity emergency oxygen tanks to relevant jobs. +2015-06-04: + PsiOmegaDelta: + - rscadd: AI eyes can now be found in the observer follow list. + - rscadd: Synths can now review all law modules that can be found on the station + from their law manager. + - rscadd: Synths can state these laws if desired, however this is strongly discouraged + unless subverted/malfunctioning. + - bugfix: Astral projecting mobs, such as wizards or cultists, may no longer respawn + as something else while their body lives. + Techhead: + - rscadd: Prison break event has been expanded to include Virology or Xenobiology + - rscadd: Prison break event will warn Enginering and the AI beforehand so they + can take preventive measures. + - bugfix: Disabling area power will now prevent doors from opening during the event +2015-06-05: + PsiOmegaDelta: + - bugfix: Split stacks no longer lose their coloring. + - tweak: Can no longer merge cables of different colors. + - tweak: Blobs and simple mobs now attack all external organs instead of a subset. + The overall damage remains the same but the number of fractures caused will, + in general, be fewer. + - rscadd: Spider nurses now have a chance of injecting their victims with spider + eggs which eventually hatch. If the limb is removed from the host, the host + dies, or the spiderling has matured sufficiently it will crawl out into freedom. + Medical scanners will pick upp eggs and spiderlings as foreign bodies. + Yoshax: + - tweak: Makes hyposprays start empty instead of filled with Tricord. + - tweak: Makes the special wizard projectile staffs, Animate, Change, Focus and + any future ones only usable by wizards. Also makes it so only wizards can use + spellbooks and teleportation scrolls. +2015-06-08: + PsiOmegaDelta: + - rscadd: The AI chassis now glows, with the color depending on the currently selected + display. +2015-06-09: + PsiOmegaDelta: + - rscadd: Ports /tg/'s meteor event. Meteors now appear to be more accurate, come + in a greater variety, and may drop ores on their final destruction. +2015-06-16: + Chinsky: + - rscadd: 'Updated penlights to be more of use in diagnostics, they now show following + conditions:' + - rscadd: Eye damage + - rscadd: Blurry eyes (overall slower reaction) + - rscadd: Brain damage (one eye reacts slower) + - rscadd: Opiates use (pinpoint pupils) + - rscadd: Drugs use (dilated pupils) + PsiOmegaDelta: + - rscadd: Observers can now follow both the AI and its eye upon speech. + - rscadd: Observers can now follow both observers and their body, if they ever had + one, upon speech. + - rscadd: Observers can now follow hivemind speakers if the speaker is not using + an alias or antagHUD is enabled. + - rscadd: Turret controls now glow, with the color depending on the current mode. + Techhead: + - rscadd: Converted Request Console interface into NanoUI. +2015-06-19: + HarpyEagle: + - bugfix: Prevents being on fire from merely warming mobs up slightly in some cases. + Mob fires also burn hotter. + - rscadd: Matches can now be used to light things adjacent to you when thrown. + - tweak: Made the effects of having a damaged robotic leg more prominent. + - bugfix: Robot limbs no longer cause pain messages. A reminder that you can still + check their status with 'Help Intent' -> 'Click Self'. + - tweak: Knifing damage scales with weapon force and throat protection. Helmets + only provide throat protection if they are air tight. Trying to cut someone's + throat with wirecutters and/or while wearing an armoured sealed helmet will + require several attempts before the victim passes out. + - tweak: Knifing switches on harm intent, in case you just wanted to beat on the + victim for some reason. + - bugfix: Prevents knifing bots or silicons. +2015-06-22: + PsiOmegaDelta: + - tweak: The traitor uplink no longer displays all items in a long list, instead + has categories which when accessed shows the relevant items. +2015-06-24: + HarpyEagle: + - bugfix: Fixed Tajaran name generation producing names without a space between + first and last. + - wip: Adds docking to the mercenary shuttle. Works similarly to other shuttles, + except docking and undocking is manually initiated and not automatic. A system + to approve or deny dock requests still to be implemented. + - rscadd: Toolboxes can now hold larger items, such as stacks of metal or power + cells, at the cost of having less space for other things. + - tweak: Gloves/shoes can now be worn even if you have one hand/foot missing. The + other one still has to be present, of course. The items still drop when you + first lose the hand/foot. + - tweak: Budget insulated gloves are somewhat less useless. On average, they will + stop half the damage from getting shocked, and the worst case insulation is + not as bad as it used to be. Budget gloves that are as good as regular insulated + gloves are still as rare as they were before though. + - tweak: PTR bullets are now hitscan, to make them somewhat better for actual sniping. + - maptweak: The telecoms server room now has an actual cycling airlock into it. + - tweak: Non-vital body parts will no longer take further damage above a certain + amount, and will inflict paincrit effects instead. On most humaniods the head, + chest, and groin are vital. + - rscadd: 'Engineers now spawn with industrial workboots (credit: ChessPiece/Bishop).' + - bugfix: Damaged robotic legs now more likely to have an effect. + - bugfix: Fixed bug preventing internal organs from taking damage in some cases. + - maptweak: New flavours of tables around the station. Engineering starts with more + plastic. + - bugfix: Fixed worn items not appearing in some cases. Most notably crossbows and + certain guns when worn on the back. As a side effect, laundry machines no longer + transform items. + - bugfix: Crit oxyloss now runs in game time instead of real time. So if lag is + slowing your movement the same slowdown applies to the dying person you're trying + to reach. + - rscadd: Breathmasks can now be adjusted by clicking on them in your hand, in addition + to the verb. + - rscadd: Wearing a space helmet or similar face-covering gear now prevents eating + and force-feeding food, drink, and pills. + - rscadd: Phoron in air ignites above it's flashpoint temperature and a certain + (very small) minimum concentration. Environments that have oxygen and are hot + enough, and have phoron but not enough concentration to burn will produce flareouts, + which are mostly a visual effect. + - rscadd: Adds animation when making unarmed attacks or attacking with melee weapons, + to help make it clearer who is attacking. + - soundadd: Opening an unpowered door now has an appropriate sound. + - rscadd: Ingesting diseased blood may contract the disease. +2015-06-26: {} +2015-06-30: + PsiOmegaDelta: + - maptweak: Non-general areas on Crescent are now protected by blast doors to enforce + area restrictions. Admins can operate these from the central checkpoint. +2015-07-04: + PsiOmegaDelta: + - tweak: Portable turrets now only blocks movement while deployed. + - tweak: Portable turrets are no longer invincible while undeployed, however they + have increased damage resistance in this state. + - bugfix: Crescent portable turrets should no longer act up during attempts to (un)wrench + and alter their settings. +2015-07-06: + GinjaNinja32: + - rscadd: '''Provisional'' is now also a valid temporary position prefix for manifest + sorting.' +2015-07-10: + Zuhayr: + - rscadd: Ninja now spawns on a little pod on Z2 and can teleport to the main level. +2015-07-11: + HarpyEagle: + - imageadd: Added inhand sprites for flashes, flashbangs, emp and other grenades. + Loganbacca: + - bugfix: Turrets no longer burn holes through the AI. + - tweak: Projectiles now have a chance of hitting mobs riding cargo trains. + - bugfix: Fixed visual bugs with projectile effects. +2015-07-14: + HarpyEagle: + - bugfix: Fixes wrong information being reported when analyzing locked abandoned + crates with a multitool. + PsiOmegaDelta: + - tweak: Ninjas can no longer teleport unto turfs that contain solid objects. + - tweak: Wizards can no longer etheral jaunt unto turfs that contain solid objects. +2015-07-27: + Kelenius: + - tweak: Borg shaker now works similarly to hypospray. It generates reagents that + can be poured into glasses. + - bugfix: Therefore, they can no longer duplicate rare reagents such as phoron. +2015-07-29: + Karolis2011: + - rscadd: Made tagger and sorting pipes dispensible. + - bugfix: Unwelding and welding sorting/tagger pipes, no longer delete data about + them. +2015-07-31: + HarpyEagle: + - bugfix: Fixed projectiles being able to hit people in body parts that they don't + have. This will also mean that the less limbs someone has the less effective + they will be as a body shield. +2015-08-11: + PsiOmegaDelta: + - experiment: 0.1.19 is live. + - tweak: Crew monitors now update every 5th second instead of every other. Reduces + lag and gives antags a larger window of opportunity to disable suit sensors + if they have to harm someone. +2015-08-13: + GinjaNinja32: + - rscadd: Changed language selection to allow multiple language selections, changed + humans/unathi/tajarans/skrell to not automatically gain their racial language, + instead adding it to the selectable languages for that species. Old slots will + warn when loaded that the languages may not be what you expect. + Orelbon: + - rscadd: Changed the HoP's suit to more bibrant colors and hopefully you will like + it. +2015-08-14: + HarpyEagle: + - spellcheck: Renames many guns to follow a consistent naming style. Updated and + changed gun description text to be more lore-friendly. + - rscadd: Throwing a booze bottle at something nearby while on harm intent causes + it to smash, splashing it's contents over whatever it hits. + - rscadd: Rags can now be wrung out over a container or the floor, emptying it's + contents into the container or splashing them on the floor. + - rscadd: Rags can now be soaked using the large water and fuel tanks instead of + just beakers. + - rscadd: Rags soaked in welding fuel can be lit on fire. + - rscadd: Rags can now be stuffed into booze bottles. When the bottle smashes, the + stuffed rag is dropped onto the ground. + - bugfix: Fixed eggs having a ridiculously large chemical volume. + - rscadd: T-Ray scanner effects are now only visible to the person holding the scanner. + - rscadd: Traitors can now purchase the C-20r and the STS-35 for telecrystals. + PsiOmegaDelta: + - tweak: The amount you start with in your station account is now affected by species, + rank, and NT's stance towards you. + TheWelp: + - rscadd: Bookcases are now movable/buildable/destroyable. + - rscadd: Paper can now be crumpled by using in-hand while on hurt intent. + - rscadd: Library Computer External Archive is now sortable. + Zuhayr: + - rscadd: Click a hat on a drone with help intent to equip it. Drag the drone onto + yourself with grab intent to remove it. +2015-08-15: + Kelenius: + - rscadd: Bees have been updated and are totally worth checking out (beekeeping + crate at cargo). + - rscdel: Sleeper consoles removed. All interaction is now done by clicking on the + sleeper itself. + - tweak: To put people into sleeper, you now have to click-drag people to it. Grabs + no longer work. To exit the sleeper, move. + - tweak: Sleeper now uses a NanoUI. +2015-08-16: + HarpyEagle: + - tweak: The unathi breacher is now only wearable by unathi. +2015-08-17: + PsiOmegaDelta: + - rscadd: Station time and duration now available in the Status tab. +2015-08-24: + HarpyEagle: + - tweak: Girders are now reinforced by using a screwdriver on the girder before + applying the material sheets. Use a screwdriver again instead to cancel reinforcing. + - bugfix: Mechanical traps no longer spawn in the janitor's locker. + - rscadd: Mechanical traps can now be printed with a hacked autolathe. + - rscadd: Adds armour penetration mechanic for projectiles and melee weapons. + - rscadd: Laser carbines, LWAP, and shotgun now have a small amount of armour penetration, + ballistic rifles (not SMGs) have moderate amounts, laser cannon has high armour + penetration, and the PTR mostly ignores body armour. + - tweak: 'Shotgun slugs and Z8/STS damage has been lowered slightly to accomodate + for their higher penetration. In general ballistics deal less damage but have + higher penetration than comparable laser weapons. Notable exception: X-Ray lasers + have had their damage lowered slightly but gain very high armour penetration.' + - rscadd: Energy swords now have very high armour penetration. Ninja blades do less + damage but ignore armour completely. + Kelenius: + - experiment: Click cooldowns have been removed on pretty much everything that isn't + an attack. + PsiOmegaDelta: + - rscadd: Adds the option to set the icon size to 48x48, found under the Icons menu, + along with 32x32, 64x64, and stretch to fit. + - tweak: Active AI cores now provides coverage on the AI camera network. Does not + utilize actual cameras, thus will not show up on security consoles. + - rscadd: The Dinnerware vending machine now offer both utensil knives and spoons + without first having to hack them. + - rscadd: Synths now have id cards with access levels which is checked when operating + most station equipment. + - rscadd: Station synthetics still have full station access but can no longer interact + with syndicate equipment, and syndicate borgs now start with only syndicate + access. + - rscadd: Syndicate borgs can copy the access from other cards by utilizing their + own id card module, similar to how syndicate ids work. + - rscadd: When examined up close id cards now offer a more detailed view. + - rscadd: Agent ids now offer much greater customization, allowing changing name, + age, DNA, toggling of AI tracking termination (using the electronic warfware + option), and more. + - rscadd: As AI tracking can now be enabled/disabled at will AI players should not + feel the need to hesitate before informing relevant crew members when camera + tracking is explicitly terminated. + - rscadd: Uplink menu now more organized and with new categories. + - rscadd: Now possible to cause falsified ion storm announcements. + - rscadd: Now possible to cause falsified radiation storm announcements, with expected + maintenance access changes. + - rscadd: Now possible for mercenaries to create falsified Central Command Update + messages. + - rscadd: Now possible for mercenaries to create falsified crew arrival messages + and records. + RavingManiac: + - tweak: Sound environments tweaked to feel more claustrophobic + - rscadd: Being drugged, hallucinating, dizzy, or in low-pressure or vacuum will + alter sounds you hear + - rscadd: Sound environment in holodeck will change to reflect the loaded program + Vivalas: + - rscadd: A new uplink item has been added! A briefcase full 'o thalla can now be + bought by traitors for bribes and such! + Zuhayr: + - rscadd: Pariahs are now a subspecies of Vox with less atmos/cold protection, a + useless brain, and lower health. + - rscadd: Leap now only gives a passive grab and has a shorter range. It also stuns + Pariahs longer than it does their target. + - tweak: Rewrote tiling. White floors, dark floors and freezer floors now have associated + tiles. + - tweak: Changed how decals work in the mapper. floor_decal is now used instead + of an icon in floors.dmi. + - tweak: The floor painter has been rewritten to use decals. Click it in-hand to + set direction and decal. + - tweak: Floor lights are now built from the autholathe, secured with a screwdriver, + activated by clicking them with an empty hand, and repaired with a welding torch. + - rscadd: Unathi now have minor slowdown and 20% brute resist. + - rscadd: Tajarans now have lower bonus speed and a flat 15% malus to brute and + burn. + - rscadd: Vox can now eat monkeys and small animals. + - rscadd: Tajarans can now eat small animals. + - rscadd: Unarmed attack damage has been lowered across the board. +2015-09-02: + Atlantis: + - rscadd: Converted phoron glass to borosilicate glass, adjusted heat resistances + accordingly, got rid of copypaste fire code. Fire resistance is now handled + by variables so completely fireproof windows are possible with varedit. + - rscadd: Windows take fire damage when heat exceeds 100C regular windows, 750C + reinforced regular, 2000C borosilicate and 4000C reinforced borosilicate. For + comparsions, reinforced walls begin taking damage around 6000. + Hubblenaut: + - rscadd: Adds glass bottles for Cola, Space Up and Space Mountain Wind to Booze-O-Mat. + - tweak: Some bar drink recipes have been amended to easily sum to 30 units for + drinking glasses. + - tweak: Vendors now have a product receptor for accepting goods. Opening the maintenance + painel is no longer required. + - tweak: Wrenching a vending machine is no longer a silent action. + - tweak: 'Stepup: Item placement on 4x4 grids seemed to work great. Now we''ll try + 8x8.' + Kelenius: + - tweak: Mechfab can now be upgraded using RPED, and now uses NanoUI. + Matthew951: + - rscadd: Added Vincent Volaju's hair. + - rscadd: Added Vincent Volaju's beard. + Zuhayr: + - rscadd: Added the ability for AIs in hardsuits to control suit modules and movement + with a dead or unconcious wearer. + - rscadd: Added ballistic supply drop pods. + - rscadd: Added diona gestalt random map template. + - tweak: Swapped the singularity beacon out for a hacked supply beacon. +2015-09-05: + Chinsky: + - rscadd: Made capguns into proper guns code-wise. It means you can now take people + hostage with them, stick in your mouth, and all other things you can do with + real guns but probably shouldn't. + - rscadd: Russian roulette! Fun for whole sec team! Unload some shells from revolver, + spin the cylinder(verb) and you're good to go! + HarpyEagle: + - rscadd: Shields no longer block attacks from directly behind the player. + - rscadd: Riot shields no longer stop bullets or beams (except for beanbags and + rubber bullets), however they are now more effective at blocking melee attacks + and thrown objects. + - rscadd: Energy shields block melee attacks as effectively as riot shields do. + Their ability to block projectiles is largely unchanged. + - tweak: Melee weapons now only block melee attacks. + - experiment: Two handed weapons have a small chance of blocking melee attacks when + wielded in two hands. + - rscadd: Sound and visual effects when blocking attacks with an energy shield or + energy sword. + - bugfix: Fixed dead or unconscious people blocking stuff with shields. + PsiOmegaDelta: + - tweak: Cargo now sorts under its own department on station manifests. + - rscdel: Manual radio frequency changes can no longer go outside the standard frequency + span. + - rscadd: Users with sufficient access can instead select pre-defined channels outside + this span, such as department channels, when using intercoms. +2015-09-07: + GinjaNinja32: + - rscadd: Added an auto-hiss system for those who would prefer the game do their + sss or rrr for them. Activate via Toggle Auto-Hiss in the OOC tab. + - rscadd: Auto-hiss system in 'basic' mode will extend 's' for Unathi and 'r' for + Tajara. 'Full' mode adds 'x' to 'ks' for Unathi, and is identical to 'basic' + mode for Tajara. + PsiOmegaDelta: + - tweak: 'Changed the language prefix keys to the following: , # -' + - rscadd: Language prefix keys can be changed in the Character Setup. Changes are + currently not global, but per character. +2015-09-08: + Soadreqm: + - tweak: Increased changeling starting genetic points to 25. + Zuhayr: + - bugfix: Auto-traitor should now be fixed. + - bugfix: The Secret game mode should now be fixed. +2015-09-11: + HarpyEagle: + - tweak: Made flares brighter. + - rscadd: Coffee is now poisonous to tajaran, much like how animal protein is poisonous + to skrell. +2015-09-26: + PsiOmegaDelta: + - tweak: Meteor events now select a map edge to arrive from, with a probability + for each individual wave to come from either neighboring edge. Meteors will + never arrive from opposite the starting edge. +2015-10-10: + HarpyEagle: + - tweak: Rubber bullets and beanbags now are now resisted by melee armour. + - bugfix: Fixed a couple of bugs causing phoron gas fires to burn cooler and slower + than they were supposed to. + - bugfix: Merc bombs are now appropriately explosive again. Same goes for bombs + made by toxins. +2015-10-11: + HarpyEagle: + - tweak: Fabricated power cells start uncharged. + Hubblenaut: + - rscadd: Light replacers can be refilled by clicking on a storage item. + - tweak: Light replacers now hold up to 32 light bulbs. + - tweak: Light replacers can be obtained through janitorial supply crates. + - tweak: A sheet of glass fills the light replacer by 16 bulbs. +2015-10-14: + Hubblenaut: + - bugfix: Airlock backup power test light properly offline when backup power down. + - bugfix: Empty flavor texts no longer draw an empty line on examination. + - bugfix: Material stacks now properly merge upon creation. + - bugfix: Messages for adding to existing stack appear again. + PsiOmegaDelta: + - tweak: Blobs can now spawn anywhere in maintenance, rather than picking location + from a pre-determined list. + TheWelp: + - rscdel: Removed higher Secret player requirements. + Zuhayr: + - rscdel: Removed facehuggers, alien embryos, and embryo removal surgery. + - rscadd: Xenomorph Queens (or infested surgeons...) can now add a hive node to + a victim in order to slave them to the hive. + - tweak: Xenomorph brute/burn mods were tweaked to buff them significantly. + - tweak: Alien larvae now hatch from eggs when ghosts click on them. + - tweak: Alien larvae now gain progression towards adulthood from being inside a + human with blood, which they drink. + - tweak: Alien weeds now use the vine system. +2015-10-21: + Hubblenaut: + - tweak: Bruise packs are now applied per wound, not per limb. + - tweak: Bruise packs now use a delay depending on wound severity for applying. + - rscdel: Removed instant healing ability from advanced bruise packs and ointment. +2015-10-27: + HarpyEagle: + - bugfix: When affected by pepperspray, eye protection now prevents blindness and + face protection now prevents stun, instead of face protection doing both. +2015-11-02: + Hubblenaut: + - rscadd: Adds tape for atmospherics. + - tweak: Tape graphics and algorithm changes. Looks a lot more appealing now. + - tweak: Starting and ending tape on the same turf will connect it to all surrounding + walls/windows. + - tweak: Lifting a part of the tape will lift an entire tape section. + - tweak: Mobs on help intent do stop for tape. + - bugfix: Crumpled tape does not affect tape breaking behavior anymore. +2015-11-10: + Atlantis: + - rscadd: Expanded gridcheck random event. Affected devices now show error UI and + may be restarted manually before the event ends. All Z-levels are now affected + equally. + Datraen: + - tweak: Changes standard and specific plant traits, more diverse plants. + Sligneris: + - tweak: Modified the wording of NT Default's laws. +2015-11-16: + PsiOmegaDelta: + - rscadd: Added new verb, 'Character Setup' under the Preferences tab, to allow + modifying your character settings at any time. +2015-11-19: + PsiOmegaDelta: + - tweak: The round start and auto-antag spawners can now check if players have played + long enough to be eligable for selection. +2015-11-22: + PsiOmegaDelta: + - tweak: Engineering alarm consoles now display camera alerts. + - rscadd: Adds a hacking tool that for all intents and purposes acts and works like + a multitool until a screwdriver is applied. + - rscadd: Gives full control of airlocks after 20-40 seconds of hacking. + - rscadd: The last 6-8 hacked airlocks are always accessed instantly. + neersighted: + - bugfix: Laptop Vendors now accept ID Containers (PDA, Wallet, etc). + - bugfix: Personal Lockers now accept ID Containers (PDA, Wallet, etc). + - experiment: Add /tg/-like attack overlays. +2015-12-06: + Hubblenaut: + - bugfix: Welding a broken camera will use the correct icon. + - tweak: Camera assemblies remember their tag and network from previous usage. + - tweak: Mobs on help intent will not push others that aren't. + Loganbacca: + - rscadd: Added a backend (wireless) system for communication between machinery + and other devices. + Neerti: + - rscadd: The AI can now toggle whether its hologram will move towards the center + of its view using the 'Toggle Hologram Movement' verb. + PsiOmegaDelta: + - tweak: Helmet cameras are no longer enabled by clicking the helmet, instead there + is a 'Toggle Helmet Camera' verb. + Raptor1628: + - tweak: Armory layout changed, weapons returned to static amounts. + - rscadd: New security armor and helmet sprites added. + Zuhayr: + - tweak: 'Backend change: allowed accessories to be placed on any clothing item + with the appropriate variables set.' + - rscadd: Drones can now pull a variety of things (such as scrubbers). This came + with a pulling refactor so please report any strangeness with pulling in general. + - rscadd: Drones (and any mob that can be picked up) can be bashed against airlocks + and such to use their internal access, so long as the person using them does + not have an ID card equipped. + - tweak: Rewrote fireaxe cabinets. Click with a multitool to unlock or loc, click + with a hand to open or close, smash with anything that does damage, and drag + onto your icon to remove the fireaxe. +2015-12-13: + Atlantis: + - rscadd: Added Inflatables Dispenser(ID), an item that allows rapid deployment, + transport and removal of inflatables. + - rscadd: Engineering, Construction and Crisis modules are now outfitted with ID. + - rscadd: Three boxes in engineering have been replaced by three IDs. + - tweak: w_classes of inflatables readjusted. Boxes and IDs can be carried in backpack + now. Individual inflatables are small enough to fit in pocket. + PsiOmegaDelta: + - experiment: Adds a system to allow objects to implement custom multitool interactions + in a modular manner. + - rscadd: The AI can now toggle multitool mode on/off, using the new 'Toggle Multitool + Mode' verb. + - rscadd: Cloning vats can now be connected to a cloning console by using a multitool. + - rscadd: Station alert console circuits can now be altered using a multitool, changing + which alarm types are displayed. + - rscadd: Can now select the color of a cable coil using a multitool. + TheWelp: + - rscadd: Added boardgame item for use with table-top board games. + - rscadd: Added Actors Guild, an alternate spawn that allows players to control + actors. + - rscadd: Added differing card decks, including a Tarot deck and two trading card + games. + - rscadd: Remade /TG/Station's Orion Trail arcade machine with bay-specific modifications. +2015-12-20: + PsiOmegaDelta: + - rscadd: Can now use the Antag Uplink to buy a door hacking device with endless + uses and which leaves doors unharmed, but instead needs some time to do its + work. + Zuhayr: + - tweak: Aiming has been rewritten, keep an eye out for weird behavior. +2016-01-01: + Atlantis: + - rscdel: Removed old computer3 system, most noticeable due to removal of old laptops. + - rscadd: Adds brand new modular computer system that replaces computer3. These + computers may run programs from hard drive, and one device is not limited to + one program. + - rscadd: Modular computers can be assembled manually from components printed at + RnD (Consoles mainly), or purchased (from old laptop vending machines). + - rscadd: Adds NTNet, networking used by modular computers, including an administration + console, NTNet relays, and antag programs. + - rscadd: Adds small set of programs modular computers can run. More programs will + be added in the future. + - rscadd: Various small things added, such as, data crystals (USB flash drives), + NTNRC (messaging, IRC/forum style), file sending, etc. + PsiOmegaDelta: + - tweak: Resomi, and any other humanoid mobs, can now bump doors open despite their + size. + TheWelp: + - rscadd: Microwaves can now be unanchored with a crowbar. +2016-01-08: + Chinsky: + - bugfix: Can pick up monkeys / undress resomi now properly. HELP intent for scooping, + NON-HELP for undressing. + RavingManiac: + - rscadd: Storage in backpacks, boxes and other containers is now capacity-based. + Some containers like belts remain slot-based. +2016-01-13: + Datraen: + - bugfix: Objects can now be yanked out of synthetics. + Techhead: + - rscadd: 'Added a new random event: Shipping Error - A random crate is mistakenly + shipped to the station.' +2016-01-16: + Atlantiscze: + - rscadd: SMES units now try to balance their inputs and outputs. For outputs this + means two SMESes powering the same grid will share the load by percentage. For + inputs, all SMESes inputting from one power network will split the available + power by percentage. + - tweak: 'Some minor SMES configuration changes have been made: Atmospherics SMES + now starts configured to prevent power outages when people forget about it, + engine SMESes are now configured to input/output at full rate. These are only + defaults and may be changed ingame as usual.' + PsiOmegaDelta: + - rscadd: Uplink crystals can now be converted into physical form to allow transfer + between uplink devices. + - rscadd: Each mercenary now spawn with their own private uplink, with each indivual + uplink having the same number of telecrystals as the normal traitor uplink. +2016-01-20: + Atlantis: + - rscdel: Construction robot module removed + - rscadd: Engineering robot module now contains most tools of construction robot, + primarily plasteel. RCD is not included by default. + - rscadd: Engineering Robot RCD upgrade is now buildable. This upgrade unlocks robot's + RCD. It is fairly expensive, requiring small amount of gold and silver, as well + as phoron and steel to build. + - rscadd: Floodlight upgrade added. This upgrade doubles robot's light intensity + (it will be more or less same as actual floodlight), at the cost of higher power + usage. + - rscadd: You may now install matter bin into a cyborg in order to boost it's matter + synth's maximal capacity. Better matter bin adds more capacity + - tweak: Default capacity of matter synths for engineering module tweaked a little, + since prices of reinforced walls, etc. increased recently. Steel changed from + 40 to 60 sheets default, plasteel from 10 (Construction default) to 20. +2016-01-25: + Atlantis: + - tweak: Setup Supermatter admin button now uses map markers and supports all coolant + types. +2016-01-29: + Karolis2011: + - tweak: Improved modular computer performance + PsiOmegaDelta: + - experiment: We now support tg's online changelog auto-creation. See https://tgstation13.org/wiki/Guide_to_Changelogs#Online_auto-creation. + - rscadd: Can now click held mobs, such as Pun Pun, to view their inventory. +2016-02-01: + PsiOmegaDelta: + - bugfix: ED-209s, hostile mobs, and mecha weapons should again be able to fire + without issue. + - bugfix: Agent ids can now be assigned an owner even after having been dropped + on the floor. + - bugfix: Monkey cubes can now be expanded in sinks again. +2016-02-03: + PsiOmegaDelta: + - tweak: Antagonist and special role preferences have been overhauled. Please update + these specific character preferences as they have been reset. +2016-02-06: + PsiOmegaDelta: + - bugfix: Should again be possible to resist out of chairs, beds, and welded lockers. +2016-02-07: + PsiOmegaDelta: + - rscadd: More --fun-- ion laws added. + - rscadd: Showers now splash objects on their turf with water. + - tweak: Can now expand unwrapped monkey cubes using showers, sinks, or just about + any source that applies water. +2016-02-11: + PsiOmegaDelta: + - bugfix: Items dropped by mobs that are held by another mob should no longer be + lost. + - bugfix: Items dropped inside mechs should no longer be lost. + - tweak: Changes the way loadout is handled in the character setup. + - tweak: Can no longer see loadout items restricted to a race you're not whitelisted + for (hence why you may see empty categories). + Zuhayr: + - rscadd: Added functionality for two-handed guns; these guns will give an accuracy + penalty if fired without an empty offhand. + - rscadd: Unified two-handed melee weapons with the above; while the offhand is + empty, the weapon will count as wielded. + atlantiscze: + - rscadd: Players will now be warned when selected spawn point has dangerous atmosphere, + and will be able to abort spawning and spawn elsewhere + - tweak: Supermatter no longer pulls anchored objects. To compensate, pull radius + was increased. It is currently limited by range() proc to approximately 32 tiles. + - tweak: Supermatter delamination's explosion strength reduced slightly. This will + hopefully motivate players to actually attempt repairs as it will be possible + to complete them within 1-2 hours. + - tweak: Supermatter spends more time (30 seconds compared to 10 seconds) in pulling + mode before exploding during delamination. + - rscadd: Supermatter's UI now shows "Relative EER" (Energy Emission Ratio) value + which represents how energised the supermatter is. + chinsky: + - soundadd: Surgery operations now cause sounds. +2016-02-13: + Ccomp5950: + - bugfix: Fixes slimes not hearing people (Kudos Karolis2011) + Karolis2011: + - tweak: Changed Tajarian language name (from Siik'tajr to Siik'maas) + - tweak: Changed Resomi language name (from Resomi to Schechi) + - rscadd: Added Alden-Saraspova counter sprite, making it visable. + PsiOmegaDelta: + - rscadd: Adds a reconnect button to the file menu. + - rscadd: Ghosts can now follow any movable object. +2016-02-15: + Ccomp5950: + - bugfix: Mobs will now have the correct health indicator when they die. X_X + Neerti: + - rscadd: The examination tab now includes additional information about examined + clothing and armor. + - bugfix: EMP no longer hits twice on humans. + - tweak: EMP drains powercells using the cell's current charge, and not the cell's + maximum potential charge, to ensure two blasts do not completely disable a synthetic. + - tweak: EMP hitting a prosthetic limb or organ will now do less damage. + - tweak: EMP hitting a cyborg will no longer outright stun them. Instead, they + gain the 'confused' status for a few moments, making movement difficult. In + addition, their HUD gets staticy, and their modules are forced to be retracted. + - rscadd: Stasis bags will protect the occupant from the outside enviroment's atmosphere. + - rscadd: Stasis bags can be hit with a health analyzer to analyze the occupant. + PsiOmegaDelta: + - rscadd: Sharp objects now have a greater chance of causing bleeding. + - rscadd: Can now pour reagent containers down the sink. + - tweak: Wrapped parcels now take on the size of the wrapped object. + - tweak: Security vests now only protect the torso, arms and other limbs are fair + game. + - tweak: Alters Neerti's EMP changes. + - tweak: Borgs are again stunned by max severity EMPs. + - tweak: Cells now lose a minimum amount of charge based on EMP severity, ensuring + multiple blasts will still be able to drain a cell. + Zuhayr: + - rscadd: Small species now take smaller bites/gulps from food and drink. + - rscadd: Small species are now effected by alchol and toxins twice as much. + - rscadd: blood_volume is now a species-level var and Resomi have lowered blood + volume. + - rscadd: Hunger is a species var and Resomi get hungry faster. + - rscadd: Small mobs have a reduced climb delay. + - rscadd: Resomi gain more nutrition from meat. +2016-02-18: + Daranz: + - bugfix: HUD glitches with the plant bag and cigarette packets are now fixed. + Karolis2011: + - wip: New command and communications program for modular consoles and laptops. +2016-02-22: + Datraen: + - tweak: Fragmentation grenades are no longer launchable. +2016-02-25: + Nalarac: + - rscadd: The autolathe can now print welding goggles. + PsiOmegaDelta: + - spellcheck: Punching a mech should no longer expose you to typos. + Yoshax: + - bugfix: Can again remove linoleum tiles, now with a screwdriver. + - rscadd: Can now order linoleum tiles from cargo. + - bugfix: Tajara should now react appropriately to various chemical reagents, such + as coffee. +2016-02-26: + Crazylemon64: + - rscadd: Allows lighting of smokeables using burning people. + Kelenius: + - imageadd: Additional sprites for the drying racks. + Mark9013100: + - tweak: Evidence bag boxes storage increased. + - bugfix: Fixes the RIG grenade launcher icon. + PsiOmegaDelta: + - spellcheck: Changes instances of 'prothesis' to 'prosthesis'. + Snapshot: + - bugfix: Syndicate hardsuit helmet was invisible for humans when worn + - bugfix: Balances to IPC suit cooler battery usage. +2016-02-29: + MrSnapwalk: + - rscadd: 'Adds five new hairstyles: Short Bangs, Half-Shaved Emo, Long Hair Alt + 2, Bun, and Double-Bun.' + PsiOmegaDelta: + - rscadd: Can now order white, dark, and freezer floor tiles from cargo. +2016-03-01: + PsiOmegaDelta: + - tweak: Player preferences have been overhauled. Please update your preferences, + found at "Character Setup" > "Global" > "Preferences", as they have been reset. + TheWelp: + - bugfix: Board game now properly takes things out of your hand again. + - rscadd: Individual cards now set their name and description so they are no longer + just a playing card. + - rscadd: Adds space pike as a rare carp spawn. Pikes are bigger, meaner, and will + attack anything, including other fish. +2016-03-02: + redstryker: + - rscadd: Adds hijabs as a head and loadout item. +2016-03-04: + Datraen: + - rscadd: Adds a mech-mountable flare launcher. +2016-03-18: + Datraen: + - bugfix: Harmbaton no longer causes halloss while inactive. + Kelenius: + - bugfix: Potassium and nitroglycerin explosive grenades now work. + TheWelp: + - rscadd: Added ability for carbon mobs to taste. Sensitivity varies between species. +2016-03-27: + atlantiscze: + - rscadd: Adds a new "News Browser" modular computer program, that can be used to + download and view news from the NTNet. + - tweak: APCs now react to EMPs in a different way. EMPs will temporarily disable + the APC, in a same way gridcheck does. That allows the APC to be reset using + the button in UI. Duration of EMP timer is based on severity, and a little bit + of RNG (8 - 12 minutes on high strength EMP) + - tweak: APC power cells are now partially shielded from EMPs, resulting in lower + charge loss when the power cell is in APC. +2016-03-28: + Datraen: + - bugfix: Adds a check to prison breaks that makes sure the APC is on before continuing. + atlantiscze: + - rscadd: Cyborgs and the AI now show on the crew manifest. +2016-04-01: + TheWelp: + - rscadd: Off-station antagonists now each set a faction. Primarily used with Resomi + playing merc, heist, etc. + - rscadd: Reworked Wizard to have multiple types of spellbooks, each with their + own costs, artifacts, and unique spells. + - rscadd: Antagonist that wipe equipment now give emergency gear before equipping + anything. Primarily a fix for off-station Vox antags. + - rscadd: Wizard clothing check is now conscious of species slot restrictions. (E.G. + Diona can now cast w/o sandals) + - rscadd: Added a cast verb to the IC tab. Will let people macro spell casting or + quickly cast them via auto-complete. +2016-04-05: + PsiOmegaDelta: + - rscadd: Detectives and forensic personnel now join the station with their own + CSI kit. + - rscadd: The detective's cabinet now contains a CSI kit. + TheWelp: + - tweak: Cast verb now appears/disappears depending on whether you have spells or + not. + - tweak: Corrupt Form now has a longer duration (10 seconds -> 15) + - tweak: Wizard Mark is now a cleanable entity (so soap/space cleaner destroys it) + - tweak: Mark/Recall cooldown halved. (120 seconds -> 60 seconds) + - rscadd: Fixes mind's spell list so that cloning will now properly add all the + spells. You will also keep your spells between bodies. (E.G. You are borged, + you get to keep your spells) + - rscadd: Added verb to antagonists to recieve objectives. Located in the OOC tab + and gained whenever the person becomes an antagonist. + atlantiscze: + - rscadd: Modular computers may now be damaged by gunfire, EMPs and similar threats. + This includes the computer's chassis, and components. + - rscadd: Damaged components may be repaired using nanopaste or cable coil. Damaged + chassis can be repaired with welder. You can use multitool on a component to + get diagnostic report. + - tweak: NTNet speeds increased, with advanced network cards being buffed considerably. + - tweak: Data crystals may now be disconnected without a screwdriver, via the rightclick + menu. + - tweak: You can now load paper into the nano printer, by clicking it (or the computer + it is installed in) with paper pieces. + - tweak: 'Component weights re-adjusted. For now they will have weight depending + on what device are they intended for (tablet+: tiny, laptop+: small, console:normal)' + - tweak: Modular computers now glow when turned on. Tablet has equal light intensity + as PDA, while console is comparable to a light bulb. This light is not colored. +2016-04-06: + Arctic: + - rscadd: Added wall-mounted oxygen pumps which equip internals when used. +2016-04-09: + Kearel: + - tweak: Dough now also requires water to be made. + ParadoxonKomplikon: + - tweak: The exotic seeds crate is now access restricted to xenobiologists. + PsiOmegaDelta: + - rscadd: Bedsheets can now be worn as capes. +2016-04-11: + NullSnapshot: + - rscadd: Players who are active antags can now respond to AOOC. + - rscadd: Mods have been given access to AOOC. +2016-04-14: + Datraen: + - rscadd: Manually ports /tg/station's dark click code https://github.com/tgstation/-tg-station/pull/10272 + by Razharas. + - bugfix: Microwaves no longer try cooking their components while cooking. + HarpyEagle: + - tweak: Fire extinguishers now spray a lot more water, will hopefully put out people + on fire faster. + - tweak: Fire extinguishers now make the ground wet when you use them. + Hubblenaut/HarpyEagle: + - tweak: Confused movement is a little less random. It is now easier to get to where + you want to when confused, especially while walking. + - rscadd: People running into solid objects while confused can be knocked over. + Kearel: + - bugfix: Fixes armalis x shift, again. + - tweak: Adds spellbook descriptions in book of tomes. + - rscadd: Adds ability for bears to dance. The commands dance, boogy and boogie + all work. + - rscadd: Adds ability for commanded mob subtypes to listen to the terms everybody + and everyone. + PsiOmegaDelta: + - rscadd: Can now customize the color of select set of underwear, similar to some + loadout equipment. + - rscdel: Due to new underwear names some selections may have been unset. Double-check + your character setup settings. + TheWelp: + - rscadd: Ports more of TG's slimes. Includes Pyrite, Gold, Cerulean, Bluespace + and Sepia + Yoshax: + - rscadd: Can take filled lunchboxes using the character loadout. These have a food + item, a snack, and a drink, all configurable. + atlantiscze: + - tweak: RIGs driven by AIs inside IIS now use massively less power. In other words, + the AI can walk more than few tiles without fully draining the battery. +2016-04-15: + Datraen: + - rscadd: 'Added Three New Mixed Gamemodes: Lizard, Changeling + Wizard; Intrigue, + Traitors + Ninja; Visitors, Ninja + Wizard.' + - tweak: Created a variable for latespawning antagonist templates, for customization + of autospawning antagonists in mixed game modes. + - tweak: Removed JSON encoding of the PDA Manifest list. + HarpyEagle: + - tweak: Shotgun flare illumination now lasts longer, around 3-4 minutes. + - bugfix: Fixed attack animation playing when using flashes even if the flash was + not actually used due to being broken or recharging. + - bugfix: Fixed lightswitches layering over darkness. Now only the light layers + above shadow. Lightswitch illumination is now much more subtle. + Mark9013100: + - rscadd: Paramedics, Medical Doctors, and the Chief Medical Officer can select + white webbings from the custom loadout. + - rscadd: ' Can now order a wide assortment of job gear from cargo.' + Sabess: + - rscadd: Detectives can now reskin the vintage .45 pistol. +2016-04-17: + mkalash: + - tweak: 'New voting system allows players to chose three options: high, medium, + and low' + - rscadd: Players can set individual antag roles to 'never' and will not be selected + to antag by the game mode + - tweak: Players who do not vote for the game mode, but have not selected never, + are candidates + - rscadd: The game will try the top three voted game modes before forcing extended + without revote +2016-04-18: + HarpyEagle: + - bugfix: Fixes people not going unconscious when they should. + - tweak: Cigarette boxes/cigar cases/candleboxes can now hold any tiny item, such + as pens or dice. + - tweak: Box storage almost doubled, they can now again hold up to 7 small items, + they can no longer hold larger items. + - tweak: Backpack capacity is now 22, dufflebag capacity is now 32. + - bugfix: Dufflebags now properly apply slowdown when worn on the back. As before, + they do not apply slowdown when held in hands. + - imageadd: Fixed missing dufflebag back sprites, ported them from /tg/. + - bugfix: 'Excavation kit can no longer be folded into cardboard. ' + - bugfix: Unathi knife harness can now hold more types of knives. + - tweak: Vials are now tiny items. + PsiOmegaDelta: + - rscadd: Can now prefill the loadout flask and vacuum-flask with a relevant liquid + of your choice. + - tweak: Alters the available selection of genders for different species during + character setup. +2016-04-20: + HarpyEagle: + - bugfix: Examining objects/yourself no longer triggers the gun hostage/aiming system. + Neerti: + - tweak: The toggle to shoot if the target talks on the radio defaults to off. + - bugfix: The aim intent icon now updates when clicked. +2016-04-21: + atlantiscze: + - tweak: Being crushed by door will now push you out of the door, preventing door + crush spam. To compensate, damage caused by door crushing has been increased. +2016-04-23: + Irrationalist: + - bugfix: Fixed clothing (gloves and jumpsuits) hidden from description on examination, + but are still being displayed on character anyway. + PsiOmegaDelta: + - rscadd: The pAI Universal translation module now includes the language of the + Resomi, Schechi. +2016-04-24: + HarpyEagle: + - rscadd: Items can now be positioned on tables by clicking. +2016-04-26: + HarpyEagle: + - bugfix: Rewrote how the floating animation is updated, the animation now correctly + updates when leaving space, activating/deactivating magboots, and buckling/unbuckling. + - bugfix: Examining people in crit now again indicates that they are not breathing. + - bugfix: Fixed spears giving slashing cuts and not puncture wounds. + - bugfix: Fixed wounds not bleeding when they are supposed to. + atlantiscze: + - tweak: Reverts the reduction of backpack capacities introduced few days ago. +2016-04-30: + HarpyEagle: + - rscadd: Mercenaries can now purchase several types of frag grenades for TC. + - rscadd: Mercenaries can now purchase grenade launchers for TC, comes pre-loaded + with random grenades. + - rscadd: Many guns now have an accuracy and dispersion penalty for firing with + only one hand, that roughly corresponds to the size and weight of the gun. You + will see a message upon shooting with a compromised aim. The penalty is also + affected by rapid-fire modes in the case of bullet throwers. To fire two-handed + simply ensure that your other hand is empty and usable when shooting. + - tweak: Laser cannons now slightly increased shot capacity and have increased accuracy + (better for fighting at longer ranges), can no longer fit in backpacks. + - tweak: X-ray laser gun now fires at the same pace as the laser carbine, has the + same shot capacity, but does much more damage against armoured targets, and + is slightly easier to one-hand with. + - tweak: Shotgun flares now blind over a larger area and illuminate for longer. + - tweak: Z8 does slightly less damage, has a larger magazine size, and slightly + more armour piercing. + - bugfix: Shooting a shotgun stun shell now makes the appropriate sound. + PsiOmegaDelta: + - rscadd: Adds a cable painter for recoloring both coils and laid down cables. + - tweak: Pulling items now carries a slowdown penalty, based on weight or size. + atlantiscze: + - tweak: SMESes can now be damaged by gunfire/explosions/emitters, and repaired + by welding tool. SMES that is too damaged will explode with strength dependent + on remaining charge. Damage can be seen by examining the SMES. + - rscdel: Old cell rack PSUs have been removed (and replaced). + - rscadd: New cell rack PSUs have been added. Comes with set of simple sprites (I'm + horrible spriter!), a new nanoUI that shows status of each power cell, and support + for upgrades. Better capacitors increase charging/discharging rate, better matter + bin increases max amount of cells that can be held inside the PSU (3/6/9 cells). + PSUs do not allow precise setting of input/output levels. These new PSUs act + as bridge between power cells and cables, allowing you to charge/discharge the + cells into the grid. + mkalash: + - tweak: Add antagonist vote now works midround + - rscadd: Ghosts can join a pool to be selected for off-station antag roles by add + antag votes + - rscadd: Add antagonist option added to the crew transfer vote +2016-05-04: + Irrationalist: + - bugfix: Mercenary voidsuits no longer hide gloves + - tweak: Rigs now hide masks when sealed + TheWelp: + - tweak: Readds Pariah space resistance. Their health is instead lowered by 15 (80->65) + - bugfix: Pariah stink now respects environment and if the person is a robot. + - rscadd: Pariahs will now vomit uncontrollably on occassion. + - tweak: Budget gloves now fit Vox. + - rscadd: Adds Vox organs. Now are both blue and alien. + - bugfix: Pariah will no longer have superhuman tasting capabilities. + - tweak: Vox hair can now be colored. It could always be colored using the random + button in the character setup and honestly, it isn't lore breaking so I'll let + people choose it themselves. +2016-05-05: + Daranz: + - rscadd: Mice and other small critters can now be eaten from hand. As a member + of species eligible to eat mice, scoop a mouse and click on your character with + the hand holding the mouse. The old method of eating from grab remains available + both for unscoopable and scoopable creatures. +2016-05-06: + HarpyEagle: + - rscadd: Allows AI holograms to change facing by clicking much like other mobs. + - tweak: Armor now has a chance to either block an attack or absorb a fixed portion + of damage, instead of randomly blocking either nothing, half, or full damage. + - tweak: Armor protection against explosions is similarily less random now. + - tweak: Riot, ablative, and ballistic armor is less hyper-specialized. They provide + moderate protection against other damage types now, while their protection against + their main damage type is reduced but still very good. +2016-05-07: + PsiOmegaDelta: + - rscadd: Can now buy the camera MIU from the 'Devices and Tools' category. Gives + the user access to the station camera network on the current Z-level. + - rscadd: Activating an uplink telecrystal in hand now teleports you to a random + semi-near location. +2016-05-08: + PsiOmegaDelta: + - rscadd: The antag uplink now offers .45 ammunition. +2016-05-11: + PsiOmegaDelta: + - rscadd: The Cardborg costume now disguises you as a proper standard borg. This + only fools synthetics (until they examine you), to and all other lifeforms you + will remain your silly cardboard wearing self. - Based on RemieRichard's appearance + framework from /tg/ +2016-05-14: + HarpyEagle: + - rscadd: Items can now be placed in pockets using the strip UI. + - rscadd: Lit welders can now be placed in pockets. Having a lit welder in your + pocket sets you on fire. + Raptor1628: + - tweak: Replaced standard Space Suit, AMI Hardsuit, Excavation Suit, and Anomaly + Biosuit sprites. + - tweak: Restricts all station hardsuits to Humans with the exception of the CE's + suit, which fits everyone but vox and diona, and the Unathi Breacher, which + is for Unathi. + - rscadd: Adds alternate voidsuit types and more flavorful voidsuit descriptions. +2016-05-15: + HarpyEagle: + - bugfix: Fixed lungs not rupturing in space. +2016-05-17: + Techhead: + - rscadd: Stack items now take up storage space proportional to the size of the + stack. + - tweak: Materials, rods, and tiles have had their weight class and max stack size + adjusted. + - rscadd: Stacks now let you split them in any amount instead of one at a time. +2016-05-19: + Haswell: + - rscadd: Added suit cyclers in the engineering and research outposts. + - tweak: Reworded ERT light armors and helmets to asset protection theme. + - rscadd: Added new xenobiologist's locker in xenobotany storage and xenobiology + airlock, replaces botanist's lockers. + - rscadd: Added one biohazard closet to xenobotany storage. + - rscadd: Added scientist lockers and wardrobes to R&D and misc. research. + - rscadd: Added extra Emergency NanoMeds to research areas. + - rscadd: Added one science wardronbe to the research outpost locker room, replaced + stray scientist's locker with xenoarcheologist's locker. + - tweak: Scientist's locker can now be unlocked with either toxins storage or R&D + lab access. + - tweak: Removed toxins storage access from xenobiologists. + - tweak: Xenoarcheologist's locker now uses xenoarcheology access. + - maptweak: Toxins lab now uses toxins storage access instead of R&D access. + - maptweak: Adds xenobiology and toxins storage access to misc. research. + - maptweak: Tools from botanist's lockers in xenobotany storage are moved to the + crate sitting nearby. + - maptweak: Removed one biohazard closet in xenobiology airlock, remaining closet + now hold two sets of suits. + SilveryFerret: + - rscadd: Changes the Death Alarms from announcing over Common channel, to announcing + only over Medical and Security channels. + Yoshax: + - bugfix: Processing strata floor can now be pried up with a crowbar. + - bugfix: Blue carpet can now also be removed with a crowbar, and has had it's ability + to burn and have corners restored. + - rscadd: Added shotglasses. These can contain 10 units. They have their whole contents + swalloed in one gulp. They can be produced in the autolathe or found in the + booze vending machine in the bar. +2016-05-21: + Haswell: + - maptweak: Revamped kitchen and bar areas. + Irrationalist: + - tweak: Accessories are now more 'magic' and more pleasant for non-humans to use. + - tweak: Copied gas_mask to gas_alt in masks.dmi, gas masks should not be obscure + when worn by Resomi. + - imageadd: Added Resomi sprites for 'brown webbing vest', 'black webbing vest', + 'white webbing vest' and 'webbing'. + - imageadd: Added Resomi sprites for Head of Security's trenchcoat and coat, and + Warden's jacket. Including the grey version of the detective's leather coat. + - imageadd: Added Resomi sprites for old and new armour vests and webbing vests + ('suit'-slot ones) + - bugfix: Fixed breath mask lacking a state name when worn by Resomi. +2016-05-22: + Yoshax: + - rscadd: The antag uplink now offers regular discounts on randomly items. + atlantiscze: + - bugfix: Breaking a lot of lights at once will no longer cause massive lag spikes. + This also applies to other sources of sparks. + - tweak: Malf AI Electrical Pulse ability now has a 15s cooldown to prevent spam. + - tweak: Door crush damage reduced by 25% according to feedback. + - rscadd: 'Electrical Storm event overhauled. It now occurs in three severities + and simulates actual storm. A warning will be broadcasted shortly before it + begins, and once it''s over. Duration is severity-dependent. Possible effects + include: Broken lights (as it''s now), Hacked APCs (same as when emagged), or + outright broken APCs with more severe event variants. Each affected APC will + also shut down briefly, this causes station-wide power outages until the storm + passes. Stronger storms last for longer and affect more APCs at once.' +2016-05-24: + Haswell: + - rscadd: Added internal affairs closets, both secure and non-secure variants. + - maptweak: Revamped internal affairs and forensic offices. +2016-05-25: + Daranz: + - bugfix: Food slices spawned in lunchboxes can now be actually eaten. + Haswell: + - maptweak: Minor furniture adjustments to forensics, xenobiology and xenobotany + laboratories. + - rscadd: Added backpacks to xenoarcheology lockers. + - rscadd: Added clipboards to science lockers. + - rscadd: Added roleplay effects for nicotine. + - rscadd: Cigars and cigarettes now contain nicotine. +2016-05-29: + GinjaNinja32: + - rscadd: Rewrote drinking glasses. There are now eight types of glass, and drink + appearance is based on color and the type of glass you put it in. + - rscadd: There are now 'glass extras' you can add to drinks. Straws, drink sticks, + and fruit slices (yes, all of them) all work. You can add up to two extras per + glass. Add extras by clicking the glass with the extra, remove by clicking the + glass with an empty hand while it's in your other hand. + - rscadd: Adding 'fizzy' things (soda water, cola, etc) or ice to a drink will make + it be fizzy or have ice floating in it. + HarpyEagle: + - bugfix: Fixes disarm-attack dislocation chances being so low that you were very + likely to break the targeted limb before it would dislocate. + - bugfix: It is now possible to disarm-attack with stunbatons like with other melee + weapons. Note that this means that using a stunbaton on disarm intent will hurt + people. + - rscadd: Trying to move while being grabbed will now automatically resist. + - tweak: Small mobs are no longer able to pin larger mobs. + - tweak: Resisting a smaller mob's grab is more likely to be successful. + - bugfix: Fixed being able to climb onto a larger mob while restrained, weakened, + unconscious, or dead. + Haswell: + - rscadd: Added resomi science uniform to custom loadout, xenowear section. + Serithi: + - rscadd: Adds in lavender. + TheWelp: + - rscadd: Fully implements space-bikes. They are available to heist and mercenaries. + - tweak: Reworks the effect trail system (so we don't repeat the code over and over + again.) + - rscadd: Added a system to invest spell slots to get more back. You can invest + one spellslot at a time and you will recieve two back. Sacrificing specific + items/reagents onto the spellbook will shorten the time by ten minutes. Can + be done once per investment. + - tweak: Shapeshifting damage share now spreads out the damage to roughly ten damage + chunks. Makes it less of a limb-gibber. + - tweak: Baleful Polymorph buffs the shapeshiftee's health pool to fifty, so no + longer can you get insta-killed. + - tweak: Avian Form has been renamed to Polymorph (get it?) + - tweak: Polymorph no longer strips you when you transform. + - tweak: Polymorph and Baleful Polymorph no longer share damage. + - tweak: Armalis icons are properly centered, for real this time. + Yoshax: + - tweak: Adjusting your suit sensors now displays a message to other people in range + that you did so. In addition, seeing someone else adjust someone's suit sensors + no longer informs you to what level. +2016-05-31: + Cirra: + - tweak: Changed all dollar symbols to the Thaler symbol. + SinTwo: + - rscadd: 'Four new hairstyles added: Fringetail, Sleeze, Rows, Rows 2' + Yoshax: + - rscadd: Admins can now toggle being able to hear remote LOOC. +2016-06-01: + Hubblenaut: + - rscadd: Adds new hairstyle (Ponytail 5) + Raptor1628: + - rscadd: Updated torch Z levels, map defines, and added non-ship Zs. +2016-06-02: + Haswell: + - maptweak: Reworked one of the break rooms on the research outpost into a work + area. + - maptweak: Separated xenobiology biohazard shutters from the other research division + blast doors, added controls in both xenobiology access and RD's office. +2016-06-04: + Asanadas: + - bugfix: Nar-sie no longer causes FIX ME default turfs to display. + - tweak: Cult pylons now serve as decent light fixtures. + Cirra: + - bugfix: Cyborgs can no longer toggle their lights while dead. +2016-06-05: + Cirra: + - tweak: Adjusted the protolathe material cost of all modular computer components. +2016-06-07: + Cirra: + - tweak: Research grippers can now hold mech parts. + HarpyEagle: + - rscadd: Makes laser beams and muzzle flashes stand out in the dark. +2016-06-08: + Asanadas: + - rscadd: Placed cryo pods on the escape shuttle (3 for humans, 1 for robots). Take + care of SSD personnel! + Cirra: + - rscadd: IPCs can now use the *buzz, *beep and *ping emotes. + atlantiscze: + - rscadd: Added functioning tiny atmospherics to telecommunications. + - tweak: Various server rooms and telecommunications central compartment no longer + contain supercooled atmosphere. Instead they are cooled down to 10 celsius by + an air alarm, and have normal ventillation. This air alarm will trigger a warning + at 30C, and alarm at 40C, which is also the point at which machines begin taking + damage. +2016-06-09: + Aticius: + - rscdel: Removes resomi hallucinations due to loneliness. + HarpyEagle: + - tweak: Adjusted the storage size of various items. + - rscadd: 'Added a new storage item: large boxes.' + - tweak: Increased the shot capacity of energy crossbows to 8. + - tweak: Makes deadman switches hopefully more reliable. + - tweak: Inflatable barriers are studier and more resistant to puncture. + PsiOmegaDelta: + - tweak: A backpack is now required to diguise as a borg, along with the cardborg + parts. The chosen backpack decides which borg module you'll appear to be using. + Techhead: + - rscadd: 'New Random Event: Solar Storms. Similar to a radiation storm, but anywhere + inside the station is safe. Also boosts solar panel output significantly for + the duration.' + Yoshax: + - rscadd: Added towels to the loadout. These can be worn on the head, belt or outwear + slots. You can also whip people with them for a special message and sound! In + addition, using them in-hand will produce an emote where your towel yourself + off. + atlantiscze: + - tweak: The PDA messaging server now reboots automatically after a power outage. + This reboot takes about twenty seconds. + - tweak: Minor mapping changes to wiring and areas on the station. Brig has few + sub-areas to even out the load. Research Dock is now on the research subgrid. + Master grid has few extra power lines to make it a little bit more robust against + physical damage. +2016-06-12: + Ccomp5950: + - bugfix: Objects in bags and other containers (including your hands and pocket) + will now hear speach again. This impacts radios, explosive implants, and the + universal recorder. + HarpyEagle: + - tweak: Small mobs such as monkeys and resomi no longer gain the benefits of holding + large or bulky items in two hands. + SparklySheep: + - tweak: Move delay after clicking has been removed. + atlantiscze: + - tweak: Modular computer batteries are no longer fully charged when printed by + research. +2016-06-15: + Ccomp5950: + - rscadd: Turret controllers now alert admins and logs when enabled or disabled + as well as when set to stun or lethal. + HarpyEagle: + - soundadd: Adds new gunshot sounds for most bullet using guns. + - imageadd: Adds new bullet casing icons. All bullet casings now have distinct icon + states for spent and unspent casings. + - rscadd: Adds a new energy weapon, the x-ray laser carbine. The advanced energy + weapon crate now comes with two x-ray carbines and one x-ray pistol. + - bugfix: Fixed spear damage being set to a default value. + - tweak: Adjused spear damage, fixes steel spears now do somewhat less damage than + steel baseball bats, but are sharp. + - tweak: Steel fire axes now do somewhat less damage when wielded, unwieled damage + unaffected. + - tweak: Runtime can now become friends with anyone, regardless of their initial + job. + - bugfix: Beepsky and other securitrons now react quicker when attacked or their + perp tries to run, and move at closer to a running pace. Beepsky should no longer + be so easy to outrun. + PsiOmegaDelta: + - tweak: Vermin may now breed anywhere on the station but should also no longer + spawn inside areas such as the atmospheric tanks. +2016-06-17: + Asanadas: + - tweak: Changes to round-ending deathsquad and syndicate commando load-outs to + maximize speed and minimize drag. + - tweak: Upped the pulse rifle family's general capacity, for better asset protection. + HarpyEagle: + - bugfix: Fixed shuttles causing lighting to break and leave shadowy rectangles + behind. + - bugfix: Fixed shuttle corner appearance on the asteroid. + JerTheAce: + - rscadd: CentCom Fax, Admin Prayer, and CentCom emergency messages now prompt admins + with a pleasing sound effect. +2016-06-20: + PsiOmegaDelta: + - tweak: EMPs now randomly set suit sensors, with strength affecting the probability + of which mode is selected. + - rscadd: Because suit sensors can be affected externally a multitool can now be + used to (un)lock the controls, to for example allow re-adjusting prisoner uniforms. + - rscadd: Because suit sensors can be locked the antag uplink now offers tools and + services which are able to jam suit sensors in various ways. + - rscadd: Adds random events which will garble suit sensor data. +2016-06-22: + Asanadas: + - tweak: Wall mounted Nanomed dispensers no longer require access to use. + Ccomp5950: + - bugfix: IPCs and will no longer get genetic abilities from radstorms. Also Diona. + - bugfix: Lobby folks will no longer hear Hailers + TheWelp: + - rscadd: Adds support for projectile guns to jam. + - rscadd: Adds cheap/crappy gun variants. + Zuhayr: + - rscadd: Changed the vault nuke into a self-destruct terminal. +2016-06-24: + TheWelp: + - rscadd: Adds traders and a trader process. +2016-06-25: + JoeyJo0: + - rscadd: Fixed chargers not charging anything other than cells. +2016-06-28: + Cirra/: + - rscadd: Added a chemistry gripper for Crisis borgs. + HarpyEagle: + - rscadd: Adds applying pressure to body parts to reduce bleeding. With desired + body part selected, help-intent click yourself or get an aggressive grab, then + help-intent attack with the grab item. Each person should only be able to apply + pressure to one body part on one person at a time, so choose wisely. Applying + pressure will get blood on your hands. + - rscadd: Splints and hardsuits that support broken limbs will automatically apply + pressure. + - rscadd: Wounds that require treatment (e.g. bandage) to stop bleeding will be + bolded in the examine output. Wounds that will eventually stop bleeding on their + own are not bolded. + - tweak: Rigsuits now only support limbs when online. + Haswell: + - maptweak: Added NanoMed wall vendors in engineering, security, bridge, bar, arrivals + and escape hallways, replacing mapped in medkits and medical supplies. + - maptweak: Removed one security officer locker, added one cyborg recharging station + in its place. + - maptweak: Added lights in head of security's office. + - maptweak: Added supply ordering, supply control and arcade circuit boards to tech + storage. + - maptweak: Replaced out-of-place reinforced walls with normal walls. + PsiOmegaDelta: + - rscadd: MedHUD overlays now have more stages, both for 'normal' and critical stages + of injury, for improved quick-diagnosis. + TheWelp: + - rscadd: Adds support for map-specific jobs. + - rscadd: Adds torch specific jobs. + Zuhayr: + - rscadd: Ports/adapted several kitchen machines from Apollo Station. +2016-07-03: + Snapshot: + - rscadd: Added Neural Laces which are an intented optional config togglable replacement + to the cloning system. Neural laces are a mechanical backup of a character's + memories and personality that can be exchanged between bodies. + - rscadd: Added Neural Lace Surgery mechanic which works the same way as implant + surgery. + - rscadd: Added Neural Relacing Machine which will automate the procedure above + and can be constructed through R&D. + - tweak: Health Analyzers will show if a subject has a neural lace. + - rscadd: Neural laces can be implanted in someone without a neural lace with a + 30% chance of taking over their body + Zuhayr: + - rscadd: The health indicator on the player GUI will now show a more detailed breakdown + of damage to your body. + - rscadd: Added bioprinter to Genetics and prosthetic organ fab to Robotics. + redstryker: + - rscadd: Adds evening gloves to the loadout, with the ability to tweak their color. +2016-07-06: + Ccomp5950: + - bugfix: Cleanbots will no longer obsess over dirt under doors/lockers or other + areas they cannot access. + Hubblenaut: + - rscadd: Racks will automatically align their contents. + - tweak: Tables use an invisible 8x8 grid for item placement. + - tweak: Items spawning or placed in closets will not be pixelshifted. + - tweak: Certain items will now always be placed centered (This is mostly reserved + for items with sprites too big to be handy for grid placement). + - tweak: Flips rack icon to be consistent with other sprites. + - bugfix: Sets center_of_mass for tools and chemistry reagent containers. + PsiOmegaDelta: + - rscadd: Uplink services now all spawn a proper item which can be used to trigger + the relevant effect at a desired time, as opposed to it firing immediately. + - tweak: The jammer item has been moved into the 'Devices and Tools' category. + - tweak: The jammer services have been moved into the 'Services' category. + TheWelp: + - rscadd: Adds the item_worth var and get_worth proc to obj subtypes and mob/living +2016-07-08: + Asanadas: + - rscadd: Added two pairs of forensic gloves for detectives to use, ceasing their + self-incrimination. Replacements can be found in the cargo detective crates. + TheWelp: + - tweak: Rebalances leap to respect handcuffs, ability to walk, etc. + - tweak: Pariahs HP deficit has been removed (65->100), instead they are now more + vulnerable to all types of damage. + - rscadd: Adds missing hair color flag for regular Vox. Now you can have colorful + dyed Vox hair! Within reason. +2016-07-09: + HarpyEagle: + - rscadd: Severe enough burn damage now causes one-time blood loss due to blistering + and body fluid cook-off. + - rscadd: Armor that provides 'bio' protection will now protect against the effects + of slime feeding. Slimes can still glomp you, however, and are still dangerous + even if you are wearing biohazard suits. +2016-07-12: + atlantiscze: + - tweak: Random event probabilities have been changed a bit. This is mostly noticeable + with electrical storms, which should be less common now. + - tweak: Electrical storm now shuts down APCs for longer duration which is controlled + by event severity. APCs with critical flag are now affected too, but are only + shut down for a short time in comparison to others. + - tweak: EMPs are no longer one-hit kills for AIs - APCs with critical flag take + reduced damage from EMPs, and AI's power restoration routine now resets the + APC that may have been EMPed. + - tweak: AI's power usage has been overhauled. Under the hood changes should improve + reliability a bit and take more scenarios in consideration. The power restoration + routine now provides better feedback to the AI if it fails, such as, whether + the APC is broken or only discharged, etc. + - rscadd: AI now has a Shutdown verb that can be used to reduce it's power usage + five times. This disables AI's control, cameras, and most communications as + if it was without power. This verb acts as a toggle, so it can be used again + to turn yourself back on. + - rscadd: AI now has Toggle Power Override verb that can be used to disable power + saving mode when it loses APC power. This results in much faster discharge of + internal capacitor, but allows you to operate as if you were powered. Can be + toggled at any time. +2016-07-13: + HarpyEagle: + - tweak: Voidsuits and cyber suits are now more shock resistant, now roughly between + hardsuits and thick clothing. +2016-07-14: + atlantiscze: + - tweak: Shield generator configuration has been tweaked. Shield generators upkeep + power is reduced considerably (stationwide shield is approx. 1.1MW at full strength). + Shields still use a lot of power when regenerating. + - tweak: Shield capacitors now act as actual capacitors. Their power storage is + 2 GJ, and maximal input 4MW, as opposed to 8MJ/400kW it was now. + - tweak: Shield generator+capacitor UI now displays in kilowatts and megawatts instead + of watts where applicable. +2016-07-17: + TheWelp: + - tweak: Reduces fireloss cost of casting Dyrnwyn (30->10) + - tweak: Reduces investment time (30 minutes -> 15) + - tweak: Entangle is now a hand-spell. + - rscadd: Humans can now use the *vomit emote, which causes them to vomit. +2016-07-18: + PsiOmegaDelta: + - rscadd: The antag uplink now offers a shield disrupter in 'Devices and Tools' + category. Handy for when that hull shield gets in your way. + - rscadd: Once an emergency response team has been successfully dispatched, as opposed + to simply requested, the emergency shuttle cannot be called for 30 minutes. +2016-07-22: + Daranz: + - bugfix: FixOVeins can now be used for attaching robotic organs (such as neural + laces) in organic patients. Follow the same procedure as with normal organ transplant. + Rymdmannen: + - rscadd: Added department specific rubber stamps for cargo and warden. + - maptweak: Replaced 'small rubber stamp' with corresponding new ones in cargo area + and warden's office. + - maptweak: Placed a 'DENIED' stamp in captain's office. + - spellcheck: Renamed ''quartermaster's stamp'' to ''quartermaster's rubber stamp''. + Snapshot: + - rscadd: Moved airlock electronics, brig doors, portable canisters, and cargo computers + over to TGUI + - tweak: Cargo ordering computers have been completely reworked. Both the supply + and ordering computer have been merged into one which can be logged into or + out of by a crew member with cargo access. The computers will allow only one + computer to be logged in as a register at a time and orders cannot be placed + without a register active. + - tweak: The cargo ordering system has been tweaked to allow requests even when + there are not enough points available so that cargo can queue items into their + cart at their discretion. Items moved to the cart can be demoted back to requests + as well. + - rscadd: The cargo computer now allows crew members to print a receipt of their + requests for their onw use. + - soundadd: Added sounds for printing from the cargo computer for more ambient sounds. + - experiment: The cargo computer will quietly beep whenever a successful ui button + press is completed. This is an experimental test to see if more ambience can + be added without becoming too much of an annoyance. + atlantiscze: + - rscadd: Adds maintenance braces. These can be printed by research and used to + lock down an airlock. Braces can be removed with paired keycard or maintenance + jack tool (also available from research). Braces prevent the airlock from opening + via any means, and absorb a lot of damage until they break off, protecting the + airlock. +2016-07-23: + PsiOmegaDelta: + - tweak: Some antag uplink weapons now come with ammunition (and a container to + hold them) and their price and description has been updated accordingly. + - tweak: Buying random items from the antag uplink will no longer give you weapons + without relevant ammunition, or ammunition for weapons you may not have. +2016-07-25: + Superbee29: + - rscadd: Ghosts can now see the power in a cable when examining it. +2016-07-29: + Raptor1628: + - tweak: Replaced Tactical Armor sprites and stats. Overall less protective. + - rscadd: Adds new gas mask sprite. + - tweak: Adjusted helmet and armor values. Helmets match their armors a bit more, + but are usually more protective. + - tweak: Adjusts armored vests for the torch and splits ballistic/ablative armor + into vest and full-body versions. + atlantiscze: + - tweak: Add Antagonist vote can no longer be freely called by players. It can still + be called by admins, or as an alternative to crew transfer. + - tweak: Add Antagonist is no longer an alternative to crew transfer during Extended + gamemode. The intention is to keep that gamemode antagonist-free, as it was + originally intended. + - rscadd: Players in the lobby will now see which antagonist types were added to + the game. This is displayed below the gamemode's name in the Lobby tab. +2016-08-01: + HarpyEagle: + - rscadd: Emagged and traitor synths can no longer be locked down, except by physically + cutting the lockdown wire (merely pulsing will not work). + TheWelp: + - rscadd: Certain races can now swallow objects whole by using the disarm intent + and aiming at their mouth. + - rscadd: Vomitting now shoves out all the things in your stomach. + - rscadd: Adds support for projectile vomitting being an ability of a species. +2016-08-02: + Haswell: + - rscadd: Modules installed within a hardsuit will now be listed when examining + the hardsuit control module while being held or worn, if the maintenance panel + is open. + Minijar: + - rscadd: Upgrades anomaly isolation to be able to contain pretty much any dangerous + anomalies with boroscillate windows and blast doors. + PsiOmegaDelta: + - rscadd: Ion storms now also affect unslaved borgs, but not drones. + Zuhayr: + - rscadd: Prevented xenomorphs from taking shrapnel or breaking limbs. Buffed non-queen + xeno weed health regen. Remember to rest to not take a heal penalty. + - rscadd: Prevented weeds from entangling species with the NO_SLIP flag. +2016-08-06: + Zuhayr: + - rscadd: Added status display icons for green, blue and delta alerts. + - rscadd: Status displays now have coloured lights for alert icons. + Zuhayr, GinjaNinja32, and Snapshot: + - rscadd: Implemented full body prosthetics. Full Body prosthetics (FBPs) allow + replacement of the entire body with cyborg components and replacement of internal + organs with synethic or assisted counterparts. Players can create a FBP character + by selecting full body in the limbs section of character preferences. + - rscadd: FBPs gain the benefits of a stronger body and no longer requiring breathing, + but are prone to overheating much like IPCs and can take pressure damage in + space. If you play an FBP, be sure to wear a suit and cooler! + - rscadd: IPC monitor screens are now a seperate object in the loadout menu. IPCs + can select a variety of other heads from other prosthetic manufacturing companies + to change their head and body appearance. + - imageadd: IPC monitor screens have an object sprite that's synced to their mob + sprite. + - tweak: Rebalanced IPC brute and burn modifiers due to the introduction of FBPs. + These settings may be tweaked again in the future after gameplay has been conducted. +2016-08-07: + Asanadas: + - bugfix: 'Brings an end to the deadly feud between two of the Exodus''s mascots: + Pun pun, and Officer Beepsky.' +2016-08-08: + Haswell: + - tweak: Emitters can now be locked using IDs with engine room access while it's + on or off. + Techhead: + - rscadd: Ghosts can flicker lights when the round is spooky enough. +2016-08-11: + Haswell: + - tweak: Engi-Vend and Robco Tool Maker machines can now be used by atmospheric + technicians. +2016-08-15: + Asanadas: + - rscadd: Neural laces can now be destructed and created in a proper research lab. + PsiOmegaDelta: + - rscadd: Invented supermatter grenades and made them available to certain sets + of antags. + - rscadd: The antag uplink now allows you to also buy x1 grenades, in addition to + the x5 sets, with some markup. + TheWelp: + - rscadd: Adds ability for merchants to fast buy via cash using a banking system. + - rscadd: Adds ability for players to sell things to merchants. They will only take + things they like. +2016-08-18: + Haswell: + - tweak: The autopilot on the escape shuttle can no longer be overridden during + crew transfers while on blue alert or lower. It can only be overridden during + an evacuation, or during an alert level higher than blue. + Karolis2011: + - rscadd: Added whole map capture tool, only accessable by admins. +2016-08-22: + Asanadas: + - rscadd: The Exodus robotics lab has a newly installed Robotech deluxe (we found + it out in the shed). Also, a new light switch. +2016-08-26: + Asanadas: + - rscadd: Dug out an old engineering vending machine and added it to the engineering + workshop. + Soadreqm: + - rscadd: Made tape recorders use removable 10-minute cassettes instead of 60-minute + internal storage. + TheWelp: + - rscadd: Adds four new traders, a robot trader, a pet trader, a replica trader, + and a prank trader. + - rscadd: Adds unique items (and a bot) for the traders to sell. + - rscadd: Adds missing item worth values to the list. + - tweak: Unique NPCs now stay around for twice as long. + - tweak: Tweaks Hostile mob AI, so that if they have no faction at all, they will + target nobody. + - tweak: Spawner grenade can now set variables (using a list) upon spawning whatever + it spawns. +2016-08-28: + PsiOmegaDelta: + - tweak: Telecrystal amount increased from 25 too 100 with uplink costs adjusted + accordingly, all to allow even more price differentiation. + - tweak: A five pack of grenades is now 20% cheaper than buying them one at a time. + atlantiscze: + - tweak: Power cell no longer use magical charge units. Instead they are rated in + WattHours. For example, a cell with rating of 1000 will be capable of providing + 1000 watts for one hour. (or 2000 watts for half a hour, etc.) + - tweak: In general this means that a power cell with rating of 1000 will hold MUCH + more energy than it held before. To balance this out, power cell capacities + have been reduced considerably. When these two changes add up the cells last + for approximately same time as they used to. + - tweak: As part of this change, higher grade power cells have became a bit more + rare. Research can still fabricate them in bulk, but they are much rarer from + random spawns, and no longer available from vending machines. Vending machines + provide standard cells instead. EngiVend can be hacked to provide few high capacity + ones. + - tweak: Vending machines no longer shoot objects at people when malfunctioning. + They merely shudder and dump the item on the ground. This should make the random + event a little bit less annoying. + - tweak: Space heater's default temperature setting is now 20C (changed from 50C), + which is the default station temperature. It can still be changed via the UI + when the panel is open. +2016-08-29: + Zuhayr: + - rscadd: Added /vg/ direct-action ventcrawling. You will now crawl through the + actual pipe network, a step at a time. Have fun. +2016-08-30: + Haswell: + - rscdel: Atmospheric technician is now unavailable for general play. + - rscadd: Alt title 'Atmospheric Technician' is now added to engineers. + - tweak: Engineers now have all the accesses atmospheric technicians previously + held. + - tweak: Tweaked job selection screen to properly indicate which jobs aren't available + to play as. + Kelenius: + - tweak: Cultists don't need to research words anymore. + - tweak: Astral journey's damage over time lowered to sane levels. + - tweak: Changeling revive, when the timer is up, will now give you a verb that + revives you, allowing you to choose when to get up, instead of doing it immediately. + - tweak: Changelings will always get DNA, species, and languages together, be it + via absorbtion, DNA sting, or hive channel. + - tweak: Changeling transform and change species was merged. + - tweak: Changelings no longer display gender in changeling chat. +2016-09-02: + Techhead: + - rscadd: Medical splints can now also be applied to hands and feet (in addition + to arms and legs). + - rscadd: For those that miss the old functionality, ghetto splints have been added. + These can be crafted with a roll of tape and a metal rod and can only splint + arms and legs. + atlantiscze: + - tweak: Converts few other things over to work with the recent CELLRATE change. + This fixes various issues where battery life of some things (drills, etc.) was + very short, while some other things had power cells with very large capacities. + - tweak: Hardsuits and Mechas now use energy in joules rather than Wh (this fixes + Ninja suit, among others). Various exosuit tools now have rebalanced power usage. + Energy based exosuit weapons use energy on per-shot basis, ballistic weapons + use single massive spike when fabricating a new magazine. + - tweak: Minor power-related changes to exosuit modules. Energy cost of some offensive + modules increased a bit. + - tweak: Added short cooldown for teleporter module to prevent spamming. + - tweak: Added power usage to various industrial/science modules (anomaly scanner, + various drills, etc.). + - tweak: Increased mounted RCD power usage by a lot (matter fabrication is very + power demanding process). + - tweak: Powersink module is limited to 120kW transfer rate, and is slower (30kW) + when used on APCs with enabled interface lock. Furthermore, when draining from + APC it first tries to take energy from the grid, before resorting to taking + it from the cell. + - bugfix: APCs drained by a ninja no longer get stuck on 0% charge, and instead + recharge themselves as usual. + - rscadd: Repair capability of upgraded cyborg rechargers now also works on IPCs + and FBPs. + - tweak: If the cyborg recharger is upgraded enough, it will be capable of rebooting + (and eventually repairing) destroyed modules, for some extra power. +2016-09-03: + Haswell: + - rscadd: Added a fashion vending machine in the locker room for snowflake loadout + items. + - rscadd: Added more SMES coils and circuitboard to supply packs. + - tweak: Adjusted price of SMES coil. + Superbee29: + - bugfix: Changeling transformation (of itself and others via sting) no longer causes + organ rejection. + - bugfix: IPCs can no longer be stung by changelings. +2016-09-07: + Chinsky: + - rscadd: Added a hawaii shirt to loadout accessories. Can be attached to clothing + like suit jackets etc. Can also be found in mixed wardrobes. + Cirra: + - rscadd: Spiderlings now have a unique sprite specific to the type of giant spider + they will become. + Kelenius: + - rscadd: Ninjas now have access to a PDA that has an empty uplink (for exploitable + information). +2016-09-09: + Daranz: + - tweak: If you crack open an amputated limb and later reattach it, you will now + have to cauterize it after reattachment. + Haswell: + - tweak: Reduced wallet capacity, added more items that can fit in wallets. +2016-09-10: + Cirra: + - rscadd: Resomi now process reagents twice as fast. + - tweak: Moved all Resomi organs to the chest, apart from the brain and eyes. + Kelenius: + - rscadd: Xenoarcheology code has been partially redone. + - tweak: Pick set will now sort the picks inside it. + - tweak: Removed useless random numbers from GPS coordinates in various places. + I'm sure we have not lost the arcane knowledge of rounding 500 years into the + future. + - tweak: Picks renamed to show their excavation depths. + - tweak: Suspension generator's power use lowered. + - tweak: Suspension generator's different field types removed. By the way, remember + that they can suspend any item and even mobs. + - tweak: Archeology belts and pick sets can now hold small pickaxes. Pick sets still + only have 7 slots. Brushes fit on your ears. + - tweak: Empty rock drop rate reduced. + - tweak: Empty rock renamed from 'rock' to 'small rock' so you can tell if you are + clicking on a turf or an item when hovering over it. + - tweak: Empty boulder spawn rate reduced. + - tweak: Tape measuring is a bit faster. + - tweak: Scanner now shows the lowest and the highest depth of the find (highest + is depth + clearance) for easier calculations. Ideally, you need to hit exactly + the lowest spot. Less ideally, hit anywhere between higest and lowest. Hit below + lowest and you have a chance to break the find. + - tweak: You can now use a brush to clear strange rocks. Welder uses less fuel for + that than before. + - tweak: Anomaly analyser's report made a bit easier to read. + - tweak: Anomaly locater will now also locate normal finds. + - bugfix: Gas masks will now correctly spawn as archeological finds. + - bugfix: Digsites will now properly contain several (4-12) turfs in a 5x5 radius. + Be careful when digging near your finds. + - bugfix: Suspension generator will now correctly turn off (qdel issue). + - bugfix: Archeology overlays won't disappear when the icon is updated (e.g. when + mining next to it). + - bugfix: Archeology overlays won't overlap each other and will properly disappear + when you mine out a find. + - bugfix: Some spawning oddities were fixed. + - bugfix: Checks for whether you get a strange rock or a clean item were fixed (previously + it always gave you clean item where it should have been rolling a random number). + - bugfix: Can no longer get rid of any item by putting it into evidence bag and + bag into core sampler. + - bugfix: CO2 generator effect now has a type. + - bugfix: Phoron generator effect will now always generate phoron, not sometimes + phoron and sometimes oxygen. + - tweak: You can now lit smokables with cigarettes and cigars. + - tweak: You can now explode welder tanks with all flame sources (cigarettes, lighters, + candles, igniters, etc). + PsiOmegaDelta: + - tweak: The impaired Resomi vision is now represented by the oxygen overlay rather + than the welding overlay. + - tweak: Vision impairment from wearing a welding mask now stacks with nearsightedness + due to now being two separate effects. + - tweak: Species and individual specific nearsightedness now stacks, i.e. a nearsighted + Resomi won't be aided at all to the same degree by the standard prescription + glasses as other species would be. + - tweak: Glasses can now have varying degrees of prescription. +2016-09-11: + PsiOmegaDelta: + - rscadd: Equipment that doesn't check a specific id card for access now checks + the collective access of all id cards in both hands and the id slot. Among other + things such equipment includes doors. +2016-09-14: + Cirra: + - bugfix: Nurse spiders should now correctly have a chance to implant eggs on attack. + Zuhayr: + - tweak: Ninja cloak now only renders you invisible to the player; right-click will + show you, and your inhands will still render. +2016-09-15: + Cirra: + - rscadd: Service grippers can now hold straws and sticks. + Haswell: + - rscadd: Added coin mint to the mining outpost. + - rscadd: Borosilicate (phoron) glass can now be made with the mineral processor. + atlantiscze: + - rscadd: Created new AI restorer program, by default available on research consoles. + Also added a new hardware piece that acts as connection between intellicard + and a computer (laptop and console only). The new program allows AI restoration, + as well as simple law modifications. It can also be used to purge malfunctioning + AI's laws correctly. This program can only work on intellicarded AIs, that are + placed in the computer itself. The program can be run/used by anyone, but requires + head of staff level access to download from NTNet. + - rscdel: Removed old AI integrity restorer console +2016-09-16: + atlantiscze: + - rscadd: Added camera monitoring program to modular computers, that can be run + on consoles, laptops and tablets. Most mapped in consoles come with this program + preinstalled. + - tweak: Due to removal of old consoles (telescreens were part of these consoles), + entertainment monitors were replaced with civilian modular console where applicable. + This console can be used to access the entertainment channels. + - rscdel: Removed old camera consoles, including circuit boards and other related + things. +2016-09-17: + Chinsky: + - rscadd: Some suit jackets and hawaii shirts can be toggled between buttoned/open + states with a verb. + Zuhayr: + - rscadd: Added a reset slot button to chargen. +2016-09-18: + PsiOmegaDelta: + - rscadd: All staff should now be able to access the Secrets menu. Each category + handles its own permission checks.. + - rscadd: Administrators and moderators can now review admin PMs and attack logs + from the Secrets menu, see the new Investigation category. +2016-09-19: + PsiOmegaDelta: + - rscadd: Ghosts now have a 'Teleport to Coordinate' verb. +2016-09-21: + Chinsky: + - rscadd: Ghosts AND AI eyes can travel zlevels again with Move Upwards/Down verbs. + - rscadd: Humans can too, with either working jetpack or wearing magboots and near + a wall (climbing). Don't try in gravity-working areas though, you'll still drop. + Haswell: + - maptweak: Readded missing blast shutters on mercenary shuttle and Skipjack. + - maptweak: Removed random steel floor tiles. + - maptweak: Added random coin spawns. + PsiOmegaDelta: + - maptweak: There are now more rechargers placed around the station. + - maptweak: Added fire fighting equipment in the library and port research maintenance + areas. + - maptweak: The engineering washroom now has two entrances. + atlantiscze: + - tweak: Vastly increases amount of water held in fire extinguishers and water tanks. +2016-09-23: + PsiOmegaDelta: + - rscadd: The antag uplink now offers energy guns in the 'Highly Visible and Dangerous + Weapons' category. + Szunti: + - bugfix: Acids, plant-b-gone etc. kill weeds instead of growing them. Sugar grows + them instead of killing. +2016-09-25: + Chinsky: + - rscadd: Can now pick color of labcoat in loadout menu, replacing separate preset + colored coats. My condolences to those who had preset ones. + Haswell: + - maptweak: Added lots of random spawns in maintenance, replacing most old mapped + in items. +2016-09-26: + atlantiscze: + - tweak: Malfunctioning AI ability Basic Encryption Hack now lists station APCs + first. Off-station APCs (that do not contribute to CPU generation) are appended + to the bottom of the list. + - rscdel: Airlock brace keycards have been removed. + - tweak: Airlock braces when held inhand can be accessed and configured as an airlock + electronics circuit board. Instead of brace keycards they can now be unlocked + by swiping an ID with configured access (or by using maintenance jack). Configuring + the brace has no access requirement, but it can't be configured when installed + on an airlock. +2016-09-30: + Kasuobes: + - rscdel: Removed IR emitters until they are fixed and don't kill servers. +2016-10-03: + Asanadas: + - bugfix: In-game record editing (security and medical) will now respect the same + character limits as it does in the character-setup panel. No more accidentally + massacring those long records! + Haswell: + - rscadd: Added station date to status tab. +2016-10-06: + Chinsky: + - rscadd: Can now use chopped off arms/hands to leave fingerprints on things. Keep + it in your active hand, and its fingerpints will be used. + Datraen: + - tweak: Skrell are now more resistant to various chemicals, more susceptible to + pepperspray. + Haswell: + - tweak: Drone laws have been revised to exclude non-interaction clauses to promote + RP, but retains non-interference intent. Treat and respect them as actual players. + - tweak: Reworded corporate law skill to cover broader areas. Includes SolGov law + and general legal knowledge. + Inforsaken: + - rscadd: Radio Distortion is now linear and uses more than just the * character. + PsiOmegaDelta: + - tweak: If playing a hidden game mode, i.e. Secret, staff now see the actual game + mode in the Lobby. + Raptor1628: + - rscadd: Added a lot of items to the random maintenance spawns. + - tweak: Reduces metagame potential in the money briefcase description. +2016-10-08: + Ferracio: + - rscadd: Name and species can now be selected for newly-constructed FBPs. + - tweak: Removed 'system instability' readout from robot analyzer due to the targets + being immune to 'system instability'. + - rscadd: Added ability to create full-body prosthetics by adding a robot head to + a robot torso. + - tweak: Robotic heads and torsos can now be manufactured with brands. + Konater: + - imageadd: Added some hairstyles for Resomii that n00b created. + TheGreyWolf: + - rscadd: Added Sign language, which can be selected from character setup. + blazerules: + - imageadd: Added a new Emo hair style, one that doesn't cover the eyes. +2016-10-10: + Levyafan: + - rscadd: Added research tape to excavation closets and xenoarchaeology lockers. + - rscadd: Added optical meson scanners to miner lockers. + - rscdel: Removes optical material scanners from miner lockers. Those were useless + anyway. + - maptweak: Mapped in a second suspension generator, some racks, and a rag to the + research outpost. + - maptweak: Mapped in a soft drinks vendomat and a coffee vendomat to the mining + outpost. + PsiOmegaDelta: + - tweak: Objects are now layered using both planes and layers. Visual layering issues + are expected, please report them except if you're running a client older than + 510 in which case you have to update first. + - tweak: The 'Show Server Revision' verb should now be more copy-paste friendly, + in terms of adding the info to issue tickets, and now also includes the major + client version. +2016-10-13: + Hugo14453: + - rscadd: Added golden soap. + Lorwp: + - maptweak: Fixed Firing Range Camera from being named 'Medical Station'. Changed + Cameras in firing range to 'East' and 'West' Respectively +2016-10-16: + Asanadas: + - rscadd: The Mental Health office has been slightly renovated! Psychiatrists and + the other jobs who reside in the Mental Health office of the Medical Bay will + find more pills readily available in their closet, and a few tidier paperwork + items within easier reach. + - maptweak: The Head of Security and Warden lockers now spawn with a generic NT + helmet. + - tweak: The Head of Security's dermal implant now has the same armor values as + a generic NT helmet. + LorenLuke: + - rscadd: Added a toggle to the ninja's self-destruct. Default starting is 'off'. + - tweak: Adds a delay and visible messages (and now a blinking effect!) after the + self destruct is activated. + PsiOmegaDelta: + - rscadd: Staff with sufficient rights can now edit global variables using the 'View + Global Variables' verb. + TheGreyWolf: + - rscadd: Added the tacticool turtleneck to the custom loadout. +2016-10-18: + Mo_Bros: + - imageadd: Adds new icon for compressed gas warning signs. +2016-10-21: + Broseph Stylin: + - rscadd: Added HUD aviators to the loadout. They're restricted to security, and + can toggle between HUD and flash protection modes, but won't offer both at once. + Chinsky: + - rscadd: Added floating camera thing for Journalists, in the library office nook. + It acts like a portable security camera on Thunderdome network. Can also send + audio on Entertainment radio channel. +2016-10-23: + Broseph Stylin: + - rscadd: 'Added a few new items to the loadout: Various ties, a black vest, stethoscope + (medical only), a black suit jacket, three hazard vests, and a cigar case.' + Chinsky: + - rscadd: Added hotkeys for target zone selection. Ctrl+Numpad[number] or just Numpad[number] + in hotkey mode. Make sure to have NumLock enabled. Numpad8 is head-eyes-mouth + (it cycles through those), 4-5-6 are right arm/hand-chest-left arm/hand (cycles + again), 1-2-3 are right leg/foot-groin-left leg/foot(you know the drill) + Ithalan: + - bugfix: Added missing anomaly scanner pad to research outpost's cell A. + - maptweak: Added a health analyzer to the research outpost lab so researcher can + monitor their test subject monkeys. + - maptweak: Removed an oddly placed lightbulb on the exterior surface near the research + outpost. +2016-10-29: + Lorwp: + - maptweak: Added Emergency Wall Mounted Oxygen Tanks to Most suitable External + Airlocks. You can breathe from them using a Mask Attached to them. + Mark9013100: + - rscadd: Gives the Science, Night Vision, Tactical, and Material Goggles action + buttons. +2016-11-01: + Broseph Stylin: + - rscadd: Prescription medical and security HUDs have been added to the loadout. + PsiOmegaDelta: + - tweak: Mercenaries now begin with proper boots, gloves, and belts. +2016-11-02: + Broseph Stylin: + - rscadd: Added a few dresses to the loadout. + Mark9013100: + - rscadd: Adds black softcaps. Can be found in black wardrobes and custom loadout. +2016-11-03: + Broseph Stylin: + - tweak: Most loadout items with multiple variants can now be found under lists + in their respective categories. This change WILL mess up your saved loadouts, + so be sure to redo them. + Siegdermaus: + - imageadd: Adds a new icon for turret and blast area caution signs. +2016-11-04: + ColaFiend: + - rscadd: Added new welding masks available in the gear loadout for engineers and + roboticists. +2016-11-06: + Asanadas: + - tweak: Added a moderate delay to the opening and closing of robotic maintenance + hatches. No more quickscope-cellsniping. + - bugfix: Can no longer run away from a robot while removing its MMI and allow the + process to succeed. + - bugfix: Fixed a one-pixel mistake in one of the robotic maintenance step images. + Broseph Stylin: + - tweak: Most loadout items with multiple variants can now be found under lists + in their respective categories. This change WILL mess up your saved loadouts, + so be sure to redo them. + Datraen: + - tweak: Skrell now have mild darksight. + - tweak: Skrell now prefer slightly warmer temperatures. +2016-11-08: + atlantiscze: + - tweak: Blobs are now considerably more resistant to energetic weapons, be it handheld + lasers, energy guns, or even emitters. An emitter is still useful to suppress + the blob a bit, but one emitter shouldn't be capable of outright killing the + blob. + - rscadd: Blob has a relatively small chance to grow secondary cores. These cores + are considerably weaker, have lower health, but still help spread the blob a + bit more. + - tweak: Emitter power usage increased (30kW to 100kW). While it is still possible + to run one with PACMAN, you have to keep it on overload. + - tweak: Reinforced walls are now considerably more resistant against projectiles + of all kinds, be it emitters, handheld weaponry, or anything else. Regular walls + are unaffected. An emitter is still useful if you need to burn through one, + but expect to wait - it needs over fifty pulses for a plasteel reinforced wall. + - tweak: Details on the above. Reinforcement is calculated from the material that + is used to reinforce the girders when building the wall. Weak materials such + as wood have 0% reduction in taken damage. Most basic materials have 50% or + so. Steel is decent material with 80% reduction. Plasteel is very good with + 90%, and titanium is the best with approx. 92% reduction (though it has lower + overall health) + - rscdel: Removed bubble shield generators, hull shield generators and shield capacitors. + Also removed shield disrupter. + - rscadd: Added a replacement advanced shield generator, that has a combined function + of a capacitor, and both shield generators (hull shielding is toggleable). This + shield generator must be built and once constructed is immobile (but can be + deconstructed again). These generators are fully configurable, have better hull + shielding that doesn't block shuttles, mass drivers and others, and have different + energy system. Damage will drain the shield's energy directly. + - rscadd: Added Shield Diffusers. Two variants exist - floor mounted and handheld. + The handheld variant can be purchased from traitor uplink, and runs on an internal + cell. The floor mounted variant layers under floor tiles and is APC powered. + These diffusers dissipate shields in adjacent tiles (+ shaped pattern). The + generator can be set to try to counter these, in which case each diffuser causes + major EM strain on the shield. + - maptweak: Added two shield generator circuit boards and two shield diffuser circuit + boards into tech storage. +2016-11-09: + Irrationalist: + - bugfix: Unathi and Tajara can now spawn and show preview with gloves included + in outfit of [HIGH] selected job + - tweak: '/obj/item/clothing/gloves has new proc: cut_fingertops - for easier adminbus' + atlantiscze: + - rscdel: It is no longer possible to ventcrawl through scrubbers. +2016-11-14: + Datraen: + - tweak: Removes a large portion of camera bloat. + TheGreyWolf: + - rscadd: Adds sweaters in all the rainbow's colors and more to the custom loadout. + Zuhayr: + - rscadd: Restored scrubber crawling, made them weldable. +2016-11-16: + Legius: + - bugfix: Made the holdout pistol not turn invisible when unloaded with a silencer + attached. +2016-11-17: + Legius: + - maptweak: Added a airlock access button to the exterior of the Dormitory airlock. + - maptweak: Moved the meter covering the second radiator pump so it no longer covers + the pump. +2016-11-18: + Datraen: + - tweak: Global announcer now has access to engineering channel. + - tweak: Supermatter now uses the global announcer. + - bugfix: Supermatter now sends out integrity alerts. + Legius: + - bugfix: The cryotubes on the shuttle and at centcomm are no longer death traps. +2016-11-22: + Broseph Stylin: + - tweak: Waistcoats and suspenders are now accessories and no longer suit items. + Their loadout entries have been changed as well. + PsiOmegaDelta: + - rscadd: There is now a character preference, Ghost Follow Links, to toggle between + short and long follow links. + atlantiscze: + - rscadd: The AI can now speak most languages that are available to station races. +2016-11-28: + Finalsong1: + - tweak: Changes the Vat-Grown Human economic modifier from 5 to 10. + Haswell: + - maptweak: Adjusted armory layout and inventory. + Irrationalist: + - bugfix: Fixed stun-batons being unuseable by synthetics due to hitcost increasing + each (de)activation + - bugfix: Fixed stun-batons not properly updating their icons + Kelenius: + - bugfix: Ghosts can now hear whispers. + - bugfix: Ghosts can now hear people who are EVA. + Runa Dacino: + - rscadd: Made Resomi security smocks available for detectives. + TheGreyWolf: + - rscadd: Added department ponchos to the custom loadout. + - rscadd: Added department and normal winter coats to the custom loadout. + - rscadd: Added a colorable scarf to the custom loadout. + - rscadd: Added lockets to the custom loadout. + - rscadd: added the formal outfit to the custom loadout. +2016-11-30: + Finalsong1: + - tweak: Changed the armor values for specialist vests, reinforcing that they're + designed to be used against that specific damage type. + - rscadd: Added the ability to order a practice laser carbine crate from cargo. + LorenLuke: + - rscdel: Got rid of the awful singletank code. + - rscadd: 'Created new singletank construction and disassembly code (see below): + Single Tank devices must be wired before having assemblies attached.' + - tweak: Single tank devices are single use only with their igniters. The igniters + create a small bit of heat to get fuel to its burn temperature (126C). + - tweak: Added relief valve to air tanks. They now trigger leak logic at over 173C + or leak pressure. Can be welded shut to prevent leakage. + - tweak: Single Tank devices must be wired before having assemblies attached. + - tweak: Air from rupturing/exploding tanks now merged into environment instead + of deleted. + - tweak: Explosion radii based on pressure, gas amount, and volume of rupturing + vessel. + - bugfix: Assemblies can now be used when attached. + PsiOmegaDelta: + - rscadd: 'New Ion law: Lawbound Synths may now have to communicate with the crew + in a random language other than Galactic Common.' + Zuhayr: + - tweak: The gibber is now called a meat grinder, since that's what it is. + - tweak: Eating a human organ or limb is now done in the exact same manner as any + other food. If you try to eat a limb, though, it will not be usable in a transplant, + for obvious reasons. + - tweak: Human organs now fit into the reagent grinder. +2016-12-03: + ForFoxSake: + - bugfix: Fixed a possible href exploit allowing any living player to speak any + language. + - bugfix: Organic beings can no longer speak Encoded Audio Language, although they + can still understand it just fine. + - tweak: Positronic brains can now speak Encoded Audio Language. + - tweak: Station manufactured Full Body Prosthetics can now speak Encoded Audio + Language. + Haswell: + - tweak: Renamed advanced voidsuit to advanced engineering hardsuit. + - tweak: Advanced engineering hardsuit now comes with in-built magboots and insulated + gauntlets that also fit Tajara and Unathi. + - tweak: Added more things that fit on the EVA hardsuit and advanced engineering + hardsuit's chestpiece. + Lorwp: + - tweak: Replaced Shoes in Engineering and Atmospherics Wardrobes with Workboots + Meyar: + - rscadd: The loadout limit has been upped to 10 from 5. + TheGreyWolf: + - rscadd: Added ability for cargo to order a firefighter closet under the engineering + tab. + - rscadd: Added Siik'Tajr as a native Tajaran sign language. + - rscadd: Towels are now in the athletic lockers in the fitness room by the holodeck. + Zuhayr: + - tweak: Ported Prometheans from Polaris, replacing slime people. + - tweak: Added water reagent interactions for Prometheans equivalent to acid. +2016-12-05: + FTangSteve: + - wip: RootSpeak is now split into a local and a global variant. For now the global + acts as a hivemind. + - bugfix: Diona nymphs now can only speak the local variant of rootspeak + Nero-07: + - rscadd: Changed the default option from 'Get random job' to 'Return to lobby' + if your preferred job is already taken. Should only affect new characters + Runa-Dacino: + - rscadd: Added ability to build press cameras to roboticist + atlantiscze: + - rscadd: 'Adds a new modular computer program: Classic Arcade, which is a computer + variant of the arcade machine, minus the prizes.' +2016-12-08: + Chinsky: + - tweak: Mecha sleepers do not KO victimes anymore. + - tweak: You can leave mecha sleepers like normal ones, by walking out. + Cirra: + - rscadd: Lawed synthetics (Borgs + AI) can now understand but not speak sign language. + Datraen: + - tweak: False walls no longer vent up and down. + FTangSteve: + - bugfix: Creatures without eyes can no longer be flashed. + Finalsong1: + - rscadd: Added a few more leather items to the botany biogenerator. + - rscadd: Replaces mead's sugar requirement with honey. Adds the ability to make + rum with mead's old recipe. + - rscadd: Surgical aprons are now available from the loadout. + Haswell: + - rscadd: Added a chemical hair remover. Also works on feathers, horns, anything + keratin-based. + Kel: + - tweak: Blobs can't spawn new blob cores within 2 tiles of an existing one. + - tweak: Secondary blob cores now look different. + - tweak: Removes message for attacking the blob to cut down on spam. + - tweak: Adds attack animation for attacking the blob. + Kelenius: + - tweak: Slimes will always imprint on those who feed them to avoid long streaks + of bad luck. + - tweak: 'RNG removed from the feeding: slimes now always get 20 nutrition per 5 + clone damage.' + - tweak: Slime nutrition drain reduced. + - tweak: Added a small delay between the slime latch and the first damage dealt. + - tweak: Changed how slimes react to damage. Slimes that are attacked with something + will sometimes be shaken off their victims (chance is force * 5 - anything with + force or 20 or above is a guaranteed shake-off). + - tweak: Disarming a slime or wrestling them off now has a chance to disorient them + for a moment. Throwing them off with a weapon doesn't do that. + - tweak: Water will make slimes lose their target, stop feeding, and will disorient + them for a moment on the first application (they will not be stunlocked and + repeated applications have no effect). + - tweak: Slimes now twice as weak to water - PLEASE remember that spraying them + more than once is a waste, the water is already on them and killing them. + - bugfix: Fixed a bug where slime's nutrition was always maxed out when they fed, + causing them to evolve and split instantly. + - bugfix: Slimes now guaranteed to have unique numbers. + - bugfix: Fixed an issue with monkey cubes not deleting in sinks. + - bugfix: Fixed a bug where a slime's location sometimes wouldn't update while they + were feeding. + PsiOmegaDelta: + - maptweak: Adds a new maintenance tunnel network below the station. It can be accessed + by one of 4 elevators and various ladders, assuming one has the access to enter + maintenance in the first case. + - maptweak: Atmospherics has been moved down to this maintenance level. + Runa-Dacino: + - rscadd: Added rolling pin and knife to service/butler borg modules. + - rscadd: Added ability to use the All-in-One grinder(Chemistry, Kitchen, etc.) + to cyborg/android/robot. + TheGreyWolf: + - tweak: Changed Resomii minimum age to 15 years old. + atlantiscze: + - rscadd: SPACE Magazine - Issue 5 is now available in the news browser program + - rscadd: To reduce clutter, the news program now hides older news articles. They + can be shown by toggling a button. + - tweak: News articles now use better data compression, therefore the files are + about 50% smaller. +2016-12-09: + Asanadas: + - rscadd: Surgery cyborgs get an update! Now with tramadol synthesizers, an upgraded + scalpel, a special organ manipulator, and a roller bed module. + - rscadd: Research cyborgs now possess an upgraded laser scalpel. + - rscdel: Surgery cyborgs no longer have a mini fire extinguisher. + - tweak: Cryo tubes, the genetic DNA scanner, and the advanced body scanner now + (also) operate with mouse-drop, instead of grab-put only. Useful for cyborgs. + - bugfix: The infamous sleeper mystery buckle bug has been fixed as a result. + Mark9013100: + - tweak: Gives rainbow gloves unique mob sprites. Credit to ChangelingRain. + PsiOmegaDelta: + - experiment: Sounds are now heard from 14 tiles away by default, rather than 21. + If the station becomes too quiet this can be adjusted. + - soundadd: New sounds added for when electrifying the door or rising and dropping + bolts. Requires adjacency to hear but ensures some foreplanning is needed to + remain stealthy. + - soundadd: The airlock close sound is now different from the airlock open sound. + - soundadd: Changes the airlock-blocked sound and reduces the range at which it's + heard. + sabiram: + - tweak: Fixed errant pixels in black jumpskirt icon, and genericizes description. + - rscadd: Added color selectable jumpskirts, available in loadout. +2016-12-11: + Kelenius: + - tweak: Health scanners now show radiation. + Techhead: + - tweak: The occupants of bodybags can now be scanned without opening them using + health scanners, similar to cryobags. +2016-12-13: + SiegDerMaus: + - rscadd: Added the ability to craft zip guns in game. Zip guns will also have their + own sprites and won't have to borrow the sawn off shotgun's anymore. + TheGreyWolf: + - rscadd: Added the ability for organ printers to also print out limbs. + sabiram: + - tweak: Adjusted crew manifest; shaft miners are now in the Cargo department, Quartermaster + and Cargo Techs are no longer in the civilian department. + - rscadd: Added color selectable hoodies to the loadout menu. + - bugfix: Fixes the sheet snatcher not collecting items on click. +2016-12-15: + Legius: + - bugfix: Shields produced by anomalies are now visible again and use the new shield + graphics. + Nero-07: + - rscadd: The cargo console now keeps track of how many points you earn during the + round and can print an overview showing what you did to get them. + TheGreyWolf: + - rscadd: Added new prosthetics sized for Resomi. +2016-12-26: + Cirra: + - rscadd: Added a preset combat cyborg which admins can spawn. + LorenLuke: + - bugfix: Keeps people from just using 'resist' to escape from nets instantly. + - tweak: Makes resist time random between 5 and 9 seconds to exit net. + - tweak: Sets net fabricator cooldown to 10 seconds (greater than max net resist + time). + - rscadd: Makes nets fade away even if not resisted out of after 15 processing_objects + ticks. + - tweak: Makes it so that netted people cannot use items (and shoot/baton you while + 'restrained' by the net) until freed. + PsiOmegaDelta: + - rscadd: Resetting a character slot now requires confirmation. + - rscadd: Character saves are now per map. + SiegDerMaus: + - rscadd: Adds a new non-lethal weapon. For now, it will remain adminspawn only + for testing, it may be mapped into the armoury later. + TheGreyWolf: + - rscadd: Mousetraps are now orderable from cargo. +2016-12-29: + Chinsky: + - rscadd: Added some hints for filthy civilian scum. Gosh, some people + - rscadd: You can click on [WRONG BRANCH KIDDO] type messages to get info on what + branch/rank is right for this job. + - rscadd: All open jobslots can be seen again in latejoin, but if you try to pick + one with wrong branchrank, you get message about it with hints. + Cirra: + - rscadd: Added a unified radiation system. Radiation is lessened by obstacles, + and distance. + - rscadd: Added a geiger counter for measuring radiation levels, which can be found + in certain vending machines and radiation closets. + Kelenius: + - bugfix: Monkey cubes won't hang the server for a second or so each. Now it's only + about 0.2 seconds each. + Legius: + - maptweak: Added missing emergency shutters to command section. + Meyar: + - experiment: Removes cloning boards from being player accessible without admin + intervention. + Nero-07: + - rscadd: Ported the defibrillator from tg. + PsiOmegaDelta: + - rscadd: Ghosts are now able to follow a much wider variety of things, not merely + mobs, and the entries are a bit more detailed. Inspired by a similar implementation + by Kelenius. + atlantiscze: + - rscadd: Show server revision verb now also lists which map is being used. + - rscadd: Skill descriptions in character setup now contain more detailed information + on differences between varying skill levels. + - tweak: Command, Cooking and Botany skills are now secondary. Engines skill is + no longer secondary. Existing character setups shouldn't be affected, but it + is still advised to check that your skills are set correctly. + - tweak: The skills in character setup have been reordered a bit. +2016-12-31: + HarpyEagle: + - bugfix: Doors leading to open elevator shafts now require a little more effort + to open. + Kelenius: + - rscadd: Station dwellers have re-discovered the ancient art of spraying contents + of fire extinguishers directly at people, instead of floors around them. You + need to be at help intent and click the mob with the extinguisher to do it; + other intents still make you attack. + Loneguyfly: + - rscadd: Changes Taj blood to be visually distinctive from human blood. + Nero07: + - rscadd: Added a program to modular computers, that can be used to create/edit/delete + digital warrants. Also added a mobile device named 'holowarrant', that can be + used to sync up with the central warrant list and display these warrants in + the field. + Ravenxales: + - rscadd: Add toggleable safety for compressed matter implant, to prevent inadvertant + usage and facilitate storage. + - bugfix: Fix compressed matter implants that are placed in storage from destroying + the storage with itself inside. + Redstryker: + - rscadd: Adds a blue resprited version of Latex gloves called Nitrile gloves. They + can be found in the sterile glove box and on the loadout. + - rscadd: 'Added three different hairstyles: Undercut, Coffee House Cut, and Parted + Fade' + sabiram: + - rscadd: Added hotkeys for moving up and down z-levels. The hotkey for moving upwards + is ,(COMMA), and the hotkey for moving downwards is .(FULL STOP) +2017-01-04: + Cirra: + - rscadd: Re-enabled the radiation storm event + - rscadd: Radiation collectors now work with general radiation, as well as singulo-specific + pulses. + - rscadd: The engineering module now has a geiger counter. + - bugfix: Humanoid mobs will no longer ignore radiation levels below 5Bq. + - bugfix: Blast doors now properly block radiation. + HarpyEagle: + - tweak: Burn damage causes by lasers results in less blood loss. + - tweak: Laser protection offered by many types of armour given a modest boost, + bringing laser protection up to match bullet protection in most cases. + - rscadd: Laser beams have a chance of dealing internal organ damage much like brute + damage. + Kelenius: + - experiment: Bot AI has been overhauled, hopefully for the better. + - experiment: Navigation beacon (and, therefore, patrol) code has been changed; + please report any issues with bot patrolling. + - tweak: Mulebots can't be hacked for speed anymore. They move at moderate speed. + Safeties can still be disabled. + - tweak: Floorbots don't try to fix space anymore; instead they will remove broken + tiles. They can be configured to cover platings, too. + - tweak: A farmbot has been added to the garden, and a floorbot to engineering storage. + Loneguyfly: + - rscdel: Removes the silence and paralyze effects from deathsting. The ability + will now only cause jittering and an injection of lexorin. + LorenLuke: + - bugfix: Can now throw held people again. + - rscadd: Clicking a grab while in help intent downgrades the grab a step. + Minijar: + - rscadd: Changes the colour of unathi blood. + Redstryker: + - rscadd: Added a colorable hair bow to the loadout. + - rscadd: 'Added three facial hairstyles to be used for Humans: Mutton Chops, Mutton + Chops and Moustache, and Walrus Moustache.' + - tweak: Made all of the medical bags have blue crosses on them instead of green + crosses. + - rscadd: Added messenger bags variants for all of the jobs. They can be selected + from the character setup. + - rscadd: 'Added four colorable underclothes: long john tops and bottoms, tube top, + and long undershirts.' + Runa-Dacino: + - tweak: Changed stack recipes to spawn product in hands when possible, otherwise + spawn on the ground.. + - rscadd: Enables the text replacer that makes verbs such as *aflap use visible + gender for all *verbs instead of using 'its.' + - bugfix: Fixes preset emotes to write himself and herself instead of heself and + sheself. + Techhead: + - rscadd: Brings back the evil to evil vending machines. However, their throwing + arms aren't as good as they used to be, so if you don't walk up to them, you + should be fine. + TheGreyWolf: + - rscadd: Upped the damage from 5 to 10 brute possible per limb when falling down + a z-level. +2017-01-06: + Hubblenaut: + - tweak: Hydroponics vendor and biogenerator offer full bottles of fertilizer. Prices + and amount available adjusted to accomodate. + Redstryker: + - tweak: Changed the sprites of the biosuits to have gloves and boots. Gives them + the appropriate inventory flags to cover gloves and shoes. + - rscadd: Added toeless workboots. Added them to the loadout. + - rscadd: Added athletic shoes. Added them to the loadout with the ability to color + them. + - rscadd: 'Added the following hoodies to the loadout: NanoTrasen, Space Mountain + Wind, Mariner University, and Ceti Techical Institute.' + - tweak: Changed the 'Mars University Lunchbox' to the 'Mariner University Lunchbox'. + - tweak: Gave boots and gloves to the normal and Resomi variation of the radsuits. + Runa-Dacino: + - bugfix: Fixes pain messages giving errors saying emote 'me' doesn't exist + - tweak: Changed generic 'their' to use visible gender for aforementioned pain messages. + Soadreqm: + - rscadd: Alter procedure for dismantling broken, bolted doors + - rscadd: Made the fire axe more robust against doors. + Zuhayr: + - rscadd: Added a constructable improvised coilgun and two adminspawn railguns. + Credit goes to Siegdermaus for the icons and the commission. No, I'm not going + to tell you how to build it - that's the fun. +2017-01-08: + Cirra: + - tweak: Changed the radiation storm event's end message to indicate that radiation + will take time to decay. + Redstryker: + - soundadd: Added four sounds that are randomly played when bones break. + - rscadd: Added a hanging skeleton model as a furniture item for all your spooky + needs. + sabiram: + - rscadd: The Chief Medical Officer now has maintenance access on the Exodus. +2017-01-11: + Chinsky: + - rscdel: Removes Pun Pun's naked ass. Little pervert was wearing assless jeans + under that hawaii shirt the whole time, fixes them to cover the buttbits properly. + - rscdel: Removed hallucination part of SM delamination event. + Cirra: + - imageadd: Added a new set of PDA sprites. + Hubblenaut: + - tweak: Doubles power for rechargers and wall rechargers. + - tweak: Raises power for cell rechargers from 40 kW to 60 kW. They will still recharge + quickest. + Kelenius: + - tweak: Brand intelligence event now tells you the name of the original machine. + Original machine will now swear more often to make it easier to find. The event + also ends (fixing all machines) when the original machine's shooting is disabled, + not only when its speaker is off. + - rscadd: A customizable tablet has been added to loadout - remember that better + parts use more power. + Lorwp: + - rscdel: Removed Stunbatons from Medbay + - maptweak: Reorganized the Paramedic's Station + Minijar: + - rscadd: Adds Uzi, Deagle, .38 revolver,Combat shotgun and a sawnoff shotgun to + the uplink. As well as appropropriate ammo. + - rscadd: Adds all of the above ammo types to the autolathe. + Nero07: + - rscadd: Dead people now keep processing reagents for 15 seconds after they died + Redstryker: + - rscadd: Added colorable flats to the loadout. + - tweak: Adds defined role variables to the Torch loadout in order to reduce clutter. + - tweak: Fixes the dark red jumpsuit to reflect it actually having a belt on. + TheGreyWolf: + - rscadd: Restricted Resomi prosthetics to limbs only. No more Resomi FBP. + - rscadd: Changed the resomi white smock to instead be colorable. + Zuhayr: + - tweak: The limb damage indicator on the HUD now uses local limb pain, not traumatic + shock. + - tweak: custom_pain() (used in surgery, moving bones, etc, to make a pain message) + now increases pain on the limb calling it. In other words, non-anesthetised + surgical pain now has a purpose other than giant red text. + chinsky: + - experiment: SM delamination no longer causes hallucinations, but has bigger explosion. +2017-01-16: + Hubblenaut: + - tweak: Can now click on turfs with trash bags and similar to quick-gather everything + on it. No longer pixelhunting for cigarettes and bullets. + - bugfix: Buckets and other reagent holders will no longer simply be put into the + janitorial cart's trash bag. + Kelenius: + - rscdel: Resomi FBP construction made physically impossible, STOP MAKING THEM. + Same for Diona and IPCs. + Ravenxales: + - bugfix: Allow protected roles (heads, IAA, etc.) to be converted to faction antags + (cult and rev) mid-round + - bugfix: Make implants work properly again (can configure triggers, etc.). + - bugfix: Made turbolift doors more robust. Small mobs will be displaced, large + mobs will make the lift give up and reopen. + RedStryker: + - bugfix: Added the skeleton stand file to the Baystation12.dme. + Redstryker: + - rscadd: The sterile mask can now be toggled down and up like breath masks. + - tweak: Refactored the pull down mask verb and proc. + TheGreyWolf: + - rscadd: Made Resomi sprites for the scarf. + - rscadd: Fixed so people can once more have mechanican eyes and heart. + atlantiscze: + - tweak: All modular computers now support a tesla link, allowing them to run off + an APC. This includes tablets. + - tweak: Both tablet presets from custom loadout now have a tesla link by default. + - bugfix: Tesla link now also works for laptops when they are closed. + - tweak: Size of tesla link and intellicard slot reduced, which means they can now + actually fit into tablets. +2017-01-18: + Finalsong1: + - rscadd: Adds a piloting skill. + Haswell: + - tweak: Clicking on worn or held boots containing a concealed blade will now draw + the blade out directly, similar to gun holsters. + - tweak: Masks that can be pulled up/down now have action buttons for toggling. + Kelenius: + - bugfix: Fixed issues where you were unable to turn the bots on and off when you + should have been. Farmbot specifically. + - tweak: Synthetics can always control all bot settings. + - tweak: Synthetics and anyone who opens the bot's panel (screwdriver) can toggle + bot safeties, giving it a 'temporal' emag effect that can be fixed in the same + way. Emags break them permanently, but this is obvious when the panel is open. + RedStryker: + - rscadd: Added glowsticks in green, blue, red, orange, and yellow. Work similar + to flares, but burn twice as long and half as bright. Can be found in the YouTool, + party equipment, and random drops. + - soundadd: Added sounds that play when the cheap lighter is turned on and when + the Zippo is lit and turned off. + - bugfix: Changed the name of the long john shirt icon_state so that it can actually + be used. + TheGreyWolf: + - rscadd: Added a new coat to the custom loadout for Resomii. +2017-01-19: + Chinsky: + - bugfix: When reattaching limb, hemostat finish step is REQUIRED now. On the other + hand, limbs are now properly reattached without leaving cut-away status forever. + - tweak: For bone gel steps you can use duct tape now. Screwdrivers aren't used + anymore. Also reworded messages there to be less awkward. + Hubblenaut: + - rscadd: Added icons for the energy gun's shock firemode + - bugfix: Fixes items appearing in the wrong hand. + Ithalan: + - bugfix: Fixed spawning of wrong version of the medical hardsuit in medical. + RedStryker: + - rscadd: 'Added track pants and track jackets in the following colors: white, green, + red, and blue. Added a track jacket for the normal track pants. Added the jackets + to the loadout.' + Redstryker: + - rscadd: Added flannels. It is on the loadout with the color selection datum. It + can have its sleeves rolled up, be buttoned, or be tucked in and any combination + thereof. + - rscadd: Added high tops. Added them to the loadout. +2017-01-21: + Hubblenaut: + - tweak: Floor painting reappears when putting on new plating. + Kelenius: + - rscadd: New cult gamemode is in. Refer to https://wiki.baystation12.net/Cultist + for the updated guide. + - rscadd: Added beekeeping equipment to garden. + - tweak: Open space in engineering is now covered with lattices. + - bugfix: Space vent in toxins is no longer blocked. + Redstryker: + - rscadd: Added cigarette packet 'microlore'. Background information that can be + found in the examine tab. + TheWelp: + - rscadd: Adds universal action HUD element. + - rscadd: Moves spells to new action HUD. + - rscdel: Removes mind transfer. +2017-01-24: + Kelenius: + - tweak: Ghosts can't use their abilities in holy places (non-defiled chapel or + anything touched by holy water) anymore. + - tweak: Confuse rune doesn't blind people, only blurries their vision. It still + stuns as before. + - tweak: It takes longer to unlock tear reality rune and ghost abilities. + - bugfix: Many cult-related bugfixes. + SiegDerMaus: + - rscadd: Added swords for Torch dress uniforms. + Yoshax: + - rscadd: Adds drop pouches that are functionally the same as the various types + of colored webbing, but look different. Are available in loadout and can be + found in webbing crates. +2017-01-28: + HarpyEagle: + - rscadd: Defibrillators will now notify when the patient cannot be revived due + to excessive blood loss. + Kelenius: + - rscadd: Can now configure headset by click-dragging it to screen, similarly to + PDA. + - bugfix: Alien suit sprites have been fixed, as were inhands. + RedStryker: + - rscadd: Added microlore to some soda/drink containers. +2017-02-01: + Ace McLazer: + - tweak: Updated generic colored poncho look, tweaked all to look more human-shaped. + Changed Resomi ponchos, too. + Cirra: + - rscadd: Added a new alloy, Osmium-Carbide Plasteel. It is physically weaker than + plasteel, but is more resistant to heat, and is made like plasteel but with + added osmium and extra carbon. + Haswell: + - maptweak: Reduced Torch map sizes from 255x255 to 200x200. Admin Z is now split + into two. Reduced world initialization time by about 2 minutes. + Hubblenaut: + - bugfix: Fixes mob icons not updating when blood is washed off. + Kelenius: + - tweak: Garden got most of their plants back. The only plants exclusive to xenobotany + now are ambrosia (blame chinsky), kudzu (too dangerous), plastellium (useless), + alien seeds, and randomly-generated ones. + - tweak: Seed storages now start with 30 of each seed type, not 2 or 3. + - rscadd: Xenobotany now starts with 30 of each type of alien seeds (previously + only available from fossils) and 10 random seeds. + PsiOmegaDelta: + - tweak: Climbing ladders now takes 2 seconds. As a side-effect climbing can now + also be aborted by moving away. + - tweak: Anyone near the destination ladder are now also made aware that someone + is (potentially) about to arrive. + SiegDerMaus: + - rscadd: Adds one new haircut, a chin-length bob. + Zuhayr: + - rscadd: Added haywire rounds for shotguns and some calibers of small arms. + - tweak: You now need to target head/eyes/mouth when trying to slit a throat. + - rscadd: Added tendons and tendon repair. Tendons can be severed by cutting brute + damage or via a grab (similar to cutting a throat) and if cut will render the + limb unusable. Hands, feet, arms and legs have tendons. + - rscadd: Added arteries, replacing the previous internal bleeding implementation. + Functionally identical to the internal bleeding of yesteryear including repair + surgery. + - tweak: As a result of the above, internal bleeding is now static per limb and + cannot be treated via bicaridine and inaprovaline overdose. + - tweak: It is no longer required that the skull and ribcage be opened to repair + internal bleeding or eye damage. A retracted incision is still required. + - rscadd: Adminhelps now have a TAKE button that allow an admin to claim it, and + inform the adminhelper that someone is on the case. + sabiram: + - tweak: Split the Command department on the Torch into Heads of Staff and Command + Support. + - tweak: Moves the Exodus cargo team to Supply, the bartender, gardener, chef and + janitor to Service, and Internal Affairs to Support. + - rscadd: Added the command, support, service and supply departments to the ID computer. + Added the support, service and service departments to the manifest. +2017-02-06: + Cirra: + - rscadd: Bluespace tiles created by the Supermatter Cascade will now spread between + z-levels. + Datraen: + - rscadd: Added a gene-specific mode for the Floral Somatoray. + - tweak: Plant controller now generates the mask/tag list used by the centrifuge, + rather than generating it on ui_interact. + Hubblenaut: + - bugfix: Forensic tools (and other items) will no longer be used when putting in + backpacks or on tables. + - tweak: Taking forensic samples will first take evidence, then leave your own fingerprints/fibers. + - rscadd: Added click-and-drag function to forensic tools to take evidence where + you previously couldn't. + - rscadd: Allows chest drawers to store forensic samples. + Kasuobes: + - tweak: Suit storage units now hold magboots and air tanks. + - tweak: Voidsuits can now toggle installed helmets via action button when worn. + Kelenius: + - rscadd: Fossil plants can now be fed to seed extractor to get one random seed. + - rscadd: Placed mining flags now have have a glowing fringe, visible in the dark. + - rscadd: Plush toys added to loadout. + - rscadd: Resomii 'nearsightedness' is now correctly prevented by equipment that + blocks bright lights, not prescription glasses, and goes away in the dark. + Lorwp: + - tweak: Change's Brig Officer's holobadge box to have Master At Arms Holobadges + - tweak: Allow Security Messenger Bags to be able to spawn in Security Lockers + - tweak: All Security have Work Gloves in their lockers now + PsiOmegaDelta: + - rscadd: Admins can now delete specific obj instances from the VV menu, not only + all of the same type. + - bugfix: Power monitors now list all powernet sensors belonging to the current + and connected Z-levels. + TheWelp: + - rscadd: Adds the Vox weapon the Slugsling + - bugfix: Fixes launchers not playing a sound on firing. + chinsky: + - bugfix: Fixes surgery openness stage not applying gory overlay. Gore is back. +2017-02-07: + Cirra: + - bugfix: Radiation from the Supermatter delaminating should now properly affect + all connected z-levels. +2017-02-10: + Asanadas: + - tweak: Scrubbers now scrub N2O and Phoron by default. + - maptweak: The corners of Escape Pods 3 and 4 should now no longer appear to lead + to space. + - tweak: Officer swords should now look good from all angles. + Haswell: + - tweak: Mop buckets and janitor carts can now be climbed over. + Nero07: + - rscadd: Added communications functionality to AI holopads. To use, stand on a + holopad and click it. Make a new holocall and select the target pad from the + list. The targetpad will light up, emit a sound and inform nearby players about + the incoming call. To pick it up, just click the pad. The caller is projected + above the holopad and can talk to/emote with all people in view of the holopad. + To end the call, step off the holopad. The call can also be ended from the other + side by clicking the active holopad. +2017-02-12: + Essbie: + - rscadd: 'Added new cocktail and recipe: Ship''s Surgeon.' + HarpyEagle: + - bugfix: Fixed bluespace jump lag. + - bugfix: Fixed latejoins during bluespace jump not being affected by it. + - bugfix: Fixed being able to enter/leave the vessel zlevels during bluespace jump. + - rscadd: Moving in straight lines during a bluspace jump is now more difficult. + - tweak: The amount of toxin damage gained from low blood levels is now limited + to around 18. + - bugfix: Various defibrillator fixes. + - bugfix: Difference between the two cult ghost whisper verbs should be clearer + now. + - bugfix: Meteors no longer destroy floors or anything else that doesn't block their + movement. + Haswell: + - tweak: Removed ghost verb from AI and pAI due to overlapping function with wipe + core and wipe software verbs. + Nero07: + - bugfix: Added a busy signal so you can't call already active holopads, which led + to message spam. + - bugfix: Makes holopads actually function and fixes a few runtimes associated with + them. + TheGreyWolf: + - tweak: Made it so only unbranded, NT and Resomi specific prosthetic brands can + be made during gameplay, chargen not changed. + Zuhayr: + - tweak: Bleed-out rate now depends on pulse rate and size of bleeding limb. + - tweak: This means that potassium chlorophoride, which stops the heart, and inaprovaline, + which now slows the heart, are both suitable for emergency treatment of bleeding. + - rscadd: Cautery surgery with no preceeding steps will now cauterize a cut artery + in a stump. + - tweak: Arterial bleeding and stumps are now more informative about where the bleed + is. + - tweak: Arterial sprays can now splatter/blind people and use the correct icons. +2017-02-14: + Haswell: + - rscadd: Added waist packs that can be worn around the waist or on the back. They + can be found in custom loadouts under utility. + atlantiscze: + - rscadd: Added modular telescreens - wall mounted modular computers that are comparable + to laptops in terms of hardware restrictions, and tablets in terms of software + restrictions. Few of those have been mapped in, more can be built. + - tweak: Large amount of under-the-hood improvements and tweaks. + sabiram: + - rscadd: Added subtypes of meat for cows, goats and chickens. They all act the + same way. + - rscadd: Added crates containing beef, goat meat, chicken meat, eggs, and milk. + - tweak: Increased the price of the livestock crates so that it is much more economical + to order the produce you want instead of a live animal. +2017-02-15: + RedStryker: + - bugfix: Allows department-specific messenger bags to be used. + lorwp: + - rscadd: PAI's can now speak EAL, if they have a Universal Translator' + sabiram: + - rscadd: Adds some new hairstyles. For the Torch, Short Hime and High and Tight + are approved for all Sol personnel; Grande Braid and Fringetail are approved + for the Expeditionary Corps only. All new styles are freely available to all + civilians. + - tweak: Adjusts luminosity on a few hairstyles to correct desaturated spots. +2017-02-18: + Haswell: + - rscadd: Added boxes of headsets to the Torch XO locker. + Lorwp: + - rscadd: Added Trendy messenger bags to all Job Lockers + sabiram: + - rscadd: Added modular laptops to the utility loadout menu. +2017-02-21: + Asanadas: + - bugfix: You now require an under-clothing (such as a jumpsuit) to wear things + on your belt. No more PDA in your boxer waistband. + - bugfix: Mushroom soup can now be made with a sane ingredient combination. + Chinsky: + - rscadd: Accounts with biggest profits or losses are now announced in round end + summary. Get dat greentext. + - tweak: Surgery changes. Cry, medical. + - rscadd: Self-surgery is legal now. It was possible via a bug, it's a feature now. + - rscadd: As a side effect, you don't have to lie down to be operated on. It is, + however, a very bad idea unless it's basic steps like incision etc. Success + chance will drop for delicate steps. + - rscadd: Instead of randomly doing nothing, rollerbeds / tables are factored into + surgery success chance calculation. + - rscadd: 'Said success chance: surgery steps now can fail even if you don''t move + / drop tools etc. Ideal scenario is ''sober surgeon not in pain operating on + another person who is lying on an optable''. Deviations from that add chance + of failure. Some steps are more robust, some are more delicate. As a rule of + a thumb, if you have to touch innards, that''s delicate. If you perform internal + organ surgery on yourself while sitting on a table piss drunk, nearly passing + out from pain and also being blind, it''s not going to go very smooth.' + - rscadd: Shock will advance fast when being surgery'd on, so take it slow or take + some pills. + Haswell: + - maptweak: Destroyed the cloning lab on Exodus and all technology related to it. + atlantiscze: + - rscadd: Added forced-shutdown verb to modular computers, reachable via rightclick + menu. This is equivalent of pressing the Shutdown button in the UI, and is mostly + intended to be used when UI bugs out and regular shutdown isn't available. + - rscadd: Added Supermatter Monitoring program, available on all devices. It provides + various information on the supermatter engine. It is fully variable, and capable + of working with multiple supermatter crystals at once (for those enterprising + engineers among you). + - rscadd: Among other information, the supermatter monitor program shows engine + core EPR value. This value is best kept between 1 and 2, and shows real amount + of coolant in the core (in standard canisters worth). Normal EPR with two canisters + in each loop is roughly 1.5 + - rscdel: Rightclick open/close laptop verb no longer exists for laptops. Use alt-click + instead. +2017-02-24: + Chinsky: + - rscadd: PI now spawns with a badge, Journalist with a camera. Also added tape + recorder to custom loadout. + Cirra: + - soundadd: Added several new sound effects. These include fire extinguisher cabinets, + internals activation, flashlight/flare activation, air alarm breach detection, + and more. + - soundadd: Added ambient sounds to Thermo-Electric Generators. + - bugfix: Braces can no longer be removed from an airlock by deconstructing the + airlock. + - bugfix: Pipes will now correctly burst if the internal pressure is too high. 0-16.9MPa + is safe, 17-20.9MPa has a chance of bursting, and 21MPa+ will burst instantly. + - maptweak: Osmium-Carbide Plasteel walls have been mapped into the incinerator. + It should now be safe to use the incinerator, as a result. + Crushtoe: + - imageadd: 'Two new pAI chassis types: The Mushroom and the Corgi Puppy. Finally, + we can have our pAIs join the Mushroom Plague.' + Haswell: + - tweak: Antag preferences now default to never instead of low. + Runa-Dacino: + - rscadd: Adds ability for the player to change the name and description of ninja + voidsuit to assist in ninja gimmicks + - rscdel: Removed references to the spider clan from ninja voidsuit. + TheWelp: + - rscadd: Adds a integrated circuit printer to the R&D lab. +2017-02-26: + Chinsky: + - tweak: Holowarrant projectors now autosync when clicked in hand instead of having + to use verb manually. + - tweak: You can swipe ID at the holowarrant to authorize it now. + Crushtoe: + - imageadd: New external airlock and mail sign sprites. + Datraen: + - bugfix: Language sanitation now checks for species second languages in addition + to whitelist status. + Haswell: + - rscadd: Added crossfire gamemode, mercenary + raiders. Requires 25 readied players + and at least 6 antags to start. + Hubblenaut: + - rscadd: Newschannels now show the number of times they have been viewed. + TheWelp: + - rscadd: Adds an advanced integrated circuit radio. Lets players send commands + and id_tags. +2017-02-28: + Haswell: + - rscadd: Added Siege gamemode, mercenary & revolution. Requires 20 readied players, + 5 antags. + - rscadd: Added Unity gamemode, revolution & wizard. Requires 15 readied players, + 5 antags. + - tweak: Made Conflux votable, cult & wizard. Requires 15 readied players, 5 antags. + - tweak: Made uprising votable, cult & revolution. Requires 20 readied players, + 6 antags. + - rscadd: Added small energy gun variant, small size with 4 shots and reduced lethal + damage. + - rscadd: Added gun cabinet variant with small energy guns. + Nero-07: + - bugfix: Fixed holopads and tested them a bit more extensively. Should work as + expected now. + Techhead: + - tweak: Torch medical has been reorganized, full changes follow. Check your job + settings on medical characters. + - tweak: Senior Physicians are now simply Physicians, and the job is limited to + officers. + - tweak: Physicians are now Corpsmen, with updated alt-titles, including the new + Medical Technician and Field Medic titles. + - rscadd: A unique outfit for Fleet Field Medics. + - tweak: Medical Assistants are now Medical Contractors, with two slots. Medical + Resident title is gone. + - rscdel: The dedicated Virologist slot is gone, now part of Medical Contractors. +2017-03-07: + Chinsky: + - bugfix: Fixes not being able to bring up undress menu on help intent. + - tweak: You scoop up resomi/monkeys/nymph on GRAB intent now, not help. Was annoying + in surgery etc. + - rscadd: Can now put accessories on people via strip menu. Click on the clothing + item with accessory in hand to attempt to. + - rscadd: Can now pick which accessory to remove in stirp menu. + - rscadd: Explosive implants now can be triggered by remote signaler signals. Change + frequency and code in implantpad that now comes in the box with implant. + - rscadd: Explosive implants now complain on radio when they are exposed in surgery + (after retractor step for skin/ribs). Can set message in implantpad. + - rscadd: Added thicc rig to merc base. It has bit more slowdown, but more armor + overall. + Haswell: + - tweak: Improved movement smoothness with /tg/ movement code. + - tweak: People now spawn with random hunger levels between hungry and satiated. + - tweak: Reduced amount of satiety from eating by 66%. + - tweak: Ghosting messages now show where the player is ghosting from. + Hubblenaut: + - rscadd: 'Adds new haircut: Ponytail 6.' + Techhead: + - rscadd: Added a black tie outfit to the uniform vendor for civilians. + - rscadd: You can now pin medals to your service and dress jackets. + - rscadd: As a bonus, you can also put armbands on labcoats. + TheWelp: + - bugfix: Fixes circuit printer being a computer recipe instead of a machine + - rscadd: Adds ability to deconstruct an assembly and gain a protolathe recipe for + it. + - bugfix: Fixes circuit printer not having a max cap on metal. + - bugfix: Fixes certain activators not being respected when there are multiple of + them. Fixes debugger not sending activator data. + - rscadd: Adds accelerometer circuit, which lets you detect motion (and how much). + - rscadd: Adds simple locomotion circuit, which uses activators alone to control + itself. + - rscadd: Adds ai-controlled circuit. Lets ai inside itself use arrow keys to activate + certain pins. + - rscadd: Adds tile sensor, which detects items/mobs on a tile when pulsed. + atlantiscze: + - experiment: Removed bunch of NarSie's summon effects. Should considerably help + performance. + - tweak: Cult walls now have non-reinforced type, that is used when cultifying non-reinforced + walls. + sabiram: + - rscadd: Standard and research magnetic grippers can now hold modular computer + hardware. + - rscadd: Research module robots now have access to wirecutters. + - rscadd: Replacement tubes for spotlight fixtures are now available in the autolathe + and in most light tube boxes. + - rscadd: Added a new black leather satchel to the backpack selection menu. +2017-03-12: + Asanadas: + - maptweak: The Morgue now has emergency shutters. Also, more emergency shutters + spread around the infirmary. + Chaoko99: + - imageadd: Added a unique sprite for anesthetic pumps. + Cirra: + - rscadd: Pipes with exposed ends (such as those that result from a pipe bursting) + will now leak their contents into the air. To stop a pipe from leaking, attach + an endcap to the end. + - rscadd: Added Stasis Clamps to engineering vending machines, devices which can + be attached to a pipe and turned on in order to halt the flow of gas through + that pipe. Useful for sealing off sections of pipe so you can make changes without + leaking. + - rscadd: Added and mapped in Automated Shutoff Valves, which will automatically + close if their internal pressure gets too low, to limit the damage caused by + main-loop leaks. Click on an AS Valve to reset it. + Datraen: + - rscdel: Removed the hunger section of movement code. + - tweak: Doubled the rate of nutrition degradation. + - tweak: Raised the starting nutrition values. + - tweak: Reset the rate of nutrition degradation to the default value. + Hubblenaut: + - rscadd: Adds alt-click shortcut for initiating test-fire. + - rscadd: Examining the teleporter console will reveal its current destination and + accuracy. + - tweak: Teleporter accuracy does no longer automatically reset after five minutes. + - tweak: Teleporter accuracy resets after locking in to a different destination. + sabiram: + - rscadd: You can now alt-click a PDA to remove an ID. +2017-03-14: + Haswell: + - rscadd: Added ion pistols, 8 shots no AOE, normal size, can be worn on belt and + holstered. + - rscadd: Added taser carbines, 10 shots, heavy taser and heavy shock beams, large + size, can be worn on belt and back. + - rscadd: Added stun rifles, 12 stun shots, huge size, can be worn on back. + - tweak: Reinvented pulse weaponry. They now function as burst fire laser weapons, + dealing less damage per shot but with higher damage potential than their laser + counterparts. Most effective at medium ranges against non-armored targets. + - rscadd: Added pulse rifles. 36 pulse shots, high damage. Huge size, can be worn + on back. + - rscadd: Added pulse carbines, 24 pulse shots, medium damage. Large size, can be + worn on back and belt. + - rscadd: Added pulse pistols, 21 pulse shots, low damage. Normal size, can be worn + on belt and holstered. + - maptweak: Adjusted security and emergency armory contents. Added more guns. + - tweak: Added pulse weapons to uplinks. + Unknown: + - bugfix: Stasis Clamps should now function correctly when placed next to a pump, + valve, or other pipe machinery. +2017-03-26: + Asanadas: + - tweak: Orange shoes (as well as jumpsuits of all kinds) no longer are capable + of doing damage. + - rscadd: 'Added new drug/medicine: Noexcutite. Useful to eliminate jitteriness + in patients. 1 Oxycodone, 1 Dylovene.' + Chaoko99: + - rscadd: Crisis borgs can now pick up pills. + - rscadd: Science borgs can now pick up tanks, tank transfer valves, and various + other assembly items. + - imageadd: Replaced the old [CAUTION] Canister with a cleaner sprite. + - imageadd: Added a hazard stripe overlay for people to add to new canister sprites + in DM. + - imageadd: Added new phoron sheet sprite. It is orange now. + - imageadd: Added a new icon state for the admin spawnable crystal. + - tweak: Most solid phoron and phoron-based objects are orange now. Please report + old pink/purple phoron sprites on the git repo, tag @chaoko99 in the description. + - tweak: Uncommented the phoron-based object flashing code. Phoron based objects + will now combust when on a turf over 200c. + Chinsky: + - tweak: Tabling is no longer instant. Wait till aggressive grab is done upgrading + before do it (whe blue thingie is done filling). + - rscadd: Can now click yourself with cig to take a drag on it. + Haswell: + - tweak: Renegade guns now all fit in backpacks, provided there's room in there. + - tweak: Duct tape now repairs supermatter. + - rscadd: Added flashdark device, basically a flashlight that cloaks you in darkness + instead of light. Available in uplinks. Pair with thermal scanners for fun. + Hubblenaut: + - bugfix: Fixes whitespace cropping when writing on paper or using the circuit debugger. + Ravenxales: + - tweak: Fix many strings to respect the Torch environment. + RedStryker: + - tweak: Added new lore-consistent clothing items for NanoTrasen personnel. + Techhead: + - rscadd: Moves Junior Enginner to a Crewman alt-title, accompanied by the new Junior + Corpsman. + - tweak: Increased Crewman slots by one and removed age restriction. + - rscadd: Gave Raiders their very own frequency. Hopefully, no more filthy mercs + listening in on your distinguished matters of commerce. + TheGreyWolf: + - rscadd: Added uniform, dress and formal uniform for Resomii from unused sprites. + memescope: + - tweak: Gave the Scientist, RD, Senior Researcher and Research Sssistant access + to formal clothing in the loadout. + - tweak: Divided pants into formal and casual pants and put them into different + selections in the loadout. + mkalash: + - rscadd: Admins can now globally and individually mute AOOC. + - rscadd: Added a stun revolver to the NT guard lockers. + - rscadd: The Torch will now receive a report at the beginning of the round listing + the current system, the next system, and any nearby planets. +2017-03-31: + Asanadas: + - tweak: The holodeck theater's clothings have been changed to holo-chameleon equipment. + Have fun with more dress-up options! + Cirra: + - maptweak: Removed the Pulse Rifle from the emergency armoury, and replace it with + a marksman energy rifle. + Datraen: + - bugfix: Updates mechs to be able to interact with ID cards in wallets. + Leshana: + - bugfix: Fix rooms holding pressure when exposed to space. + RedStryker: + - tweak: Added new lore-consistent PDA, Locker, and Action Figure sprites for NanoTrasen + items. + - rscdel: Removed science armband. + - tweak: Recolored research tape to white. + Sin2: + - tweak: Added new lore-consistent airlock sprites to Research. + Unknown: + - imageadd: Replaced the energy sword and double saber sprites with those from TG. + - imagedel: Removed the Sord and Sord inhands. +2017-04-01: + Haswell: + - rscadd: Added singularity grenades. Works just about as well as you imagine. +2017-04-06: + Broseph Stylin: + - rscadd: Added a colorable and a horrible bowtie to the loadout, available to all + non-military roles. Icons by LorenLuke, slightly altered. + - rscadd: Skirt versions of the dress uniforms are now available for all SCG branches + in the uniform dispenser. + - bugfix: Officer's variants of the dress uniform will now show up correctly in + the dispenser. + Chaoko99: + - imagedel: Removed unused reagent container sprites. + - tweak: Removed the toy sunflower, replaced with another flower that functions + identically, but can accept reagents other than water. + - spellcheck: Added punctuation to wizard spells, and adjusted some of the shouts + to something a human being could actually say consistantly. + CountAlex: + - tweak: Added deluxe version of electronic cigarette to loadout. + - rscadd: Added electronic cigarettes and replaceable cartridges to cigarette vendors. + Electronic cigarettes come in three options; the deluxe option will later be + added to loadout. +2017-04-10: + Asanadas: + - maptweak: Flipped beach in the holodeck so you don't have to walk through holowater + to get on the holosand. + - maptweak: Added a computer console to the Security equipment storage. Now Masters + At Arms can do their job a little better. + - experiment: A changeling's deathsting now gives a message to the surrounding area. + Cirra: + - tweak: Overmap-related consoles can now properly be repaired. + - tweak: Overmap event groups are now slightly more common, and slightly larger + in size. + - experiment: The Torch now uses the Overmap system. This involves a 'system map' + which can be flown around, with away sites scattered on the map. + - tweak: The flow of fuel through the HE pipes in the SM chamber can be controlled + via an adjustable pressure gate in the Engine Room. The higher the 'Target Pressure', + the faster the thrusters will regain fuel faster after a burn, and the lower + the SM's output. + - rscadd: Added a fuel tank port of atmospherics, and all the necessary piping for + overmap. + - rscadd: Converted the four thruster areas on the vessel into engine nacelles. + It is possible to switch between direct injection and combustion, via buttons + located in the engine monitoring room. Each mode has its own advantages and + disadvantages. + - rscadd: Modified the SolGov Pilot job, so they can properly pilot the Torch. + - rscadd: Added randomly placed events to the overmap. + - maptweak: The Calypso, Aquila and Guppy are now overmap-capable, and can travel + to away sites on the same overmap tile. + - maptweak: Added Helm and Engine control consoles to the bridge, and Engine controls + to engineering monitoring and the fuel bay. + Datraen: + - bugfix: Aliens can choose their corresponding xenowear once again. + Haswell: + - tweak: Lots of things are made climbable. + Pobiega: + - rscadd: Added fuel pipes, manifolds, caps, etc. + - rscadd: Made pipe dispensers dispense fuel pipes. + RedStryker: + - tweak: Separated the NT tunic into an accessory. There is a polo below the tunic. + That polo is on the loadout. + - tweak: Changed the color of the NT worksuit. + - rscadd: Added a NT executive suit for the NTL. Also in RD's locker. + - tweak: Changed many things in Research from purple to NT red. +2017-04-14: + Asanadas: + - tweak: Master At Arms gets an extra jobslot, bringing it up to 4 in total. + Pobiega: + - rscadd: Added new per-map admin fax destinations. + - rscadd: Admins can now pick between the NT and the solgov logo when sending adminfaxes. +2017-04-19: + Asanadas: + - tweak: Master At Arms badges are now available from the security vendor. + - rscdel: Staff of change has been removed from the wizard's arsenal. + - bugfix: Uniform Vendors should no longer break horribly when you hit them with + a PDA (or anything that isn't an ID). + Chaoko99: + - tweak: Buffed blob, it will now attempt to spread about 20% more often. Lowered + laser resistance of a blob to compensate. + - tweak: Blobs are now totally opaque. This can be countered with optical material + scanners. + - rscadd: 'Blobs can now trip camera alarms. Beware: You won''t be able to use cameras + to find them, if you are not quick!' + - rscdel: Removed slimes from the pet merchant's options. + Ithalan: + - tweak: Collected robotics and infirmary surgical tools into surgical kits + - tweak: Updated surgical kit sprite and description and upped capacity to 14 slots + to allow nanopaste and laser scalpels/IMS to be stored in it too. + Nero-07: + - tweak: Increases starting TC for antags to 130 (was 100). + Orelbon: + - soundadd: New sound plays when the emergency pods unlock. + - rscadd: Added New AI Status Display. + Unknown: + - tweak: Made the mech rechargers use an alpha layer instead of the default grey + tiles. +2017-04-24: + Chaoko99: + - rscadd: 'Added Level3.mod (AKA: title1.ogg), by VScratch? as lobby music.' + FTangSteve: + - rscadd: Adds two inflatable doors to every fire closet. + Orelbon: + - tweak: Glasses and goggles have updated sprites. + RedStryker: + - tweak: Recolored the kidneys and liver to look more realistic. + - imageadd: Added a stomach sprite for later use when stomachs are coded. + Sbotkin: + - rscadd: Added more cooling units for Engineering and Expedition Prep EVA. +2017-04-29: + Chaoko99: + - tweak: Made it slightly less infuriating to speedmix the allies cocktail. (Changed + recipe from vodka and martini (Gin and vermouth) to Vodka Martini and Martini. + - rscdel: Removed highlanders and all references to their antag type. + - tweak: Upped the cost of a flashdark in the uplink from 16 to 32. + Ithalan: + - rscadd: Detached organs now show if any attached child organs have decayed + - bugfix: Organs no longer decay under conditions where their parent organ isn't + decaying. + Orelbon: + - maptweak: Emergency armory has been revamped. + ProfligateShampoo: + - rscadd: Added the ability for characters with the Cook, Bartender or Passenger + (i.e. Botanist) job to select botanical gloves in their loadouts. + TheWelp: + - rscadd: Adds vox scrap armor, armor made from pieces of metal fused together. + - bugfix: Fixes equippable items ignoring inability to equip if warnings are disabled. + mkalash: + - tweak: Added distance to Sol to roundstart report, as well as replaced random + planets with actual overmap system info. +2017-05-02: + Chaoko99: + - imageadd: Made the Resomi sonar ping contrast a bit better to most sprites. + - tweak: Changed the defib failure messages. Now it is less likely to lie outright + to you, and medical will no longer need to know the ancient defib rituals. The + machine will tell them the fix instead. + - tweak: Defib units now start with an APC power cell (Down from advanced) for R&D + to replace as the round goes on. The APC cell will be able to shock the patient + five times before needing to recharge (Down from ten.) + - tweak: Halved the power consumption of the mobile suit sensor jammer. + Orelbon: + - bugfix: Cameras in emergency armory should have proper alarm links now. + - tweak: Evacuation sound should no longer give you tinnitus. + - tweak: Reduced the amount of guns in sidearm cabinets to 3 from 4. Reduced amount + of guns in personal sidearm cabinets to 4 from 6. + - rscadd: Added a combined arms cabinet with 3 energy guns and 2 personal. + - maptweak: Changes the sidearm cabinets in safe rooms to personal ones. Removes + sidearm cabinet in Brig Officer's office. Replaces sidearm cabinet in bridge + with a combined arms cabinet. + - rscadd: New sprites for Fire and Medical wall closets. + - bugfix: Fixes a bug that failed to update the medical wall locker sprite when + it got emmaged. + RedStryker: + - rscadd: Adds a lot of hairstyles. +2017-05-06: + Ornias1993: + - rscadd: Added anesthetics pump above main surgery operating table + - rscadd: Added Nanomed above health monitoring console + - rscadd: Added Medical intercom at the south-west corner beside general intercom + - rscdel: Removed Nanomed above Main surgery operating table + - rscdel: Removed medical intercom above ealth monitoring console +2017-05-07: + Ornias1993: + - tweak: Changed genetic damage scanner output to state genetic damage instead of + improper cloning +2017-05-09: + Asanadas: + - maptweak: Robotics control consoles have been added to the Bridge, and the Engineering + monitoring room. + - tweak: The Chief Engineer has robotics access. It's part of his job, you know. + Sbotkin: + - rscadd: Added a Military Police armband. +2017-05-13: + Asanadas: + - rscadd: Tajarans now have access to cultural veils. Tajarans will spawn with the + default, and job-specific veils with the proper HUD elements are available in + the loadout tab under Xenowear. + - rscadd: Added 5 new hairstyles to Tajarans. Ported from Polaris (ported from Aurora). + Chaoko99: + - rscadd: Added the large RCD cartridge to the autolathe. + - tweak: Halved RCD cartridge prices. + - rscdel: Removed a forced usage of passive wording in examine poses. ([Pronoun] + [Pose], instead of [Pronoun] is [Pose].) + Datraen: + - tweak: Ports soft lights featured in other servers. + Hubblenaut: + - bugfix: The hull wrap mode of the shield generator will now actually cover the + entire ship. + Orelbon: + - soundadd: Added new AI voice sounds. + - tweak: Lowered the volume on the AI voices. + Ornias1993: + - bugfix: Medical veil now selectable by medical contractor. + - bugfix: EAL, Sign language, and emotes will no longer use autohiss + - bugfix: Chapel Maintenance airlock, now needs maintenance access to open. + PsiOmegaDelta: + - rscadd: Can now set your desired FPS level under Character Setup > Global + RedStryker: + - tweak: Added the Science radio frequency to mining borgs. + TheWelp: + - rscadd: Lets AI controlled circuits to use the assembly's inputs via a verb. + - bugfix: Fixed AI controlled circuits not being moved correctly. +2017-05-18: + Chaoko99: + - rscadd: Made the engine input pumps more cryo-clamp-able. + - bugfix: Moved the maintainance deck saferoom APC. + Hubblenaut: + - tweak: Lubed floors can be cleaned with water. + - bugfix: Wet floors make a comeback after three months of stealthy disappearance. + Orelbon: + - rscadd: New sprites for the ion rifle. + - rscadd: New sprites for the stun carbine. + - bugfix: small eguns should now have the right sprites for east and west. + Ornias1993: + - bugfix: Oxygen_pump and Anestethic_pump, now correctly checks if the mask slot + is blocked + - rscdel: removed on click application to user of Oxygen_pump and Anestethic_pump + - tweak: Oxygen_pump now gives out Breathmasks instead of gasmasks + - tweak: anestethics_pump now gives out Medicalmasks instead of gasmasks + - bugfix: Maintenance hatch and replacing tanks works now on Oxygen_pump and Anestethics_pump + - tweak: removed organic requirement for removing the oxygentank of Oxygen_pump + and Anestethic_pump + - bugfix: UI of oxygen_pump and Anestethics_pump works now + - rscadd: AI can now click to open UI of oxygen_pump and Anestethics_pump + - rscadd: Added the Anestethics Mask for the Anestethics_pump + - rscadd: Added the Emergency Mask for the Oxygen_pump + - spellcheck: Fixed brusies typo on Torch Holodeck disclaimer + RedStryker: + - rscadd: Added boxes of armbands for emergencies to the heads of the Security, + Medical, and Engineering departments. + - tweak: Allowed a few more roles to use flats. + - rscadd: Added many new clothing items as accessories. + - tweak: Changed the color of the cheongsam to allow it to use the color gear tweak. +2017-05-20: + Chinsky: + - rscadd: All toys guns are now fitted with red bits on the barrel so you can visually + tell them apart! Very safe! Fun for whole family! + - rscadd: Can use wirecutters on toy revolvers to snip those off. It also changes + examine name to 'revolver' instead of 'toy gun'. In case you didn't know, those + are proper guns and you can hold people hostage with those. Just saying. Do + not try at home. + Cirra: + - tweak: Attempting to place an airlock brace without setting an access requirement + now informs you, and asks for confirmation. + Orelbon: + - rscadd: Added inhand sprite for stun rifle. + Ornias1993: + - bugfix: Everyone including military can now take sunglasses from loadout. +2017-05-23: + Asanadas: + - tweak: Maintenance Drones now require an account of age 3 days or greater. + Chinsky: + - tweak: Bunch of virus changes. Buckle up, kiddo. Praise Nurgle + - rscadd: Adds Space Cold event. Spawns a harmless virus that can be treated with + cold medicine. Unless you're irradiated and it mutates to kill everyone I guess. + - rscadd: Adds space cold medicine (dextra-something) to white first aid boxes. + Can also be made by mixing paracetamol+sugar. Eating it will stop weak viruses + symptoms from manifesting. + - rscadd: Humans now have crude immune system simulation. Keeping your immunity + high makes it easier to shrug off viruses, extremely low (15% and less) immunity + can get you random space cold-level infections. Get lemons for boosting it, + spaceacilin ruins it. It recovers to norm over time. + - tweak: Spaceacillin now ODs at 15u instead of 30u. + - tweak: Spaceacillin now metabolizes faster. It was 60+ minutes for 15u, 30 minutes + now. + - tweak: Spaceacillin boosts immune system effective rating. It acts as a multiplier + to natural one, from 1x at none in blood to 2x at OD threshold (15u), and you + can go higher if you don't mind ODing. Also if natural immunity is lower than + the boost, boost would just replace it. + - tweak: Spaceacillin has three stages now. Below 10 units it acts kinda like now, + blocking badness 2 virus effects. Virus would still progress though, but effects + won't fire. It's enough for any random event virus effects. + - tweak: Above 10 units it would completely stop progression of badness 2 viruses + and stop effects of badness 3 - which is usual stuff ou get from viro labs. + Again, clock will still be ticking. Also at this stage it starts lowering your + natural immunity value. + - tweak: And then, there's OD. OD stops badness 4 (e.g. Gibbingtons) from manifesting, + and stops ticking of lower viruses. It screws your immune system even stronger + too. + - tweak: It's also not 100% protecting you from infection now. 15u and above give + old 100% protection, scaling with lower value in blood. + - tweak: Some tweaks to virus annoyningness. Hard delay between firings (25-40 seconds + between message-only syndromes), emote syndromes (groaning, moaning, screaming) + are now single syndrome to make it rarer. Internals actually stopping you from + spreading viruses. No airborne viruses in vacuum. + - tweak: As an unrealated bonus, first aid (white and fire) boxes now have paracetamol + bottles because damn it's easier to score opiates than that. + - tweak: Oh also remember how when you graft yourself Tajaran arms it kills you? + Not when your immunity is floored. Just saying. + Orelbon: + - maptweak: Tech storage has been moved to deck two, where the abandoned officers + mess was located. The officers mess has been moved into the previous location + of tech storage. +2017-06-03: + Ace McLazer: + - rscadd: Added Towels to Sweatmax products. In all kinds of colors! Ported from + Polaris. + Albens: + - maptweak: Added a new Bridge + - rscadd: Added a Bridge Officer's locker, and 'Standard' Tablet/Laptop that spawns + on the Bridge. + Cirra: + - rscadd: As a failsafe, the maintenance hatch on a cyborg/android/robot will now + unlock upon death, allowing easier recovery of the brain inside. + Hubblenaut: + - rscadd: Added coffee pots and carafes, available in the dinnerware vending machine. + - tweak: Hot drinks now have vapor on them. + Orelbon: + - maptweak: Engineering locker room and storage have been tweaked. + SiegDerMaus: + - rscadd: Adds a new magnetic flechette weapon, available via uplink. + Sunsar: + - tweak: Made light bulbs a bit brighter. Engineering should be less of an eyestrain + now. + ZeroBits: + - rscadd: Added Barbecue Sauce as a Condiment. + - tweak: Changed the mailroom flaps to airtight flaps. + - rscadd: Added a second mop to custodials. + - rscadd: Added rings to the loadout selection. +2017-06-06: + Asanadas: + - rscadd: High jittery levels will now cause heart damage. + - rscadd: Individuals with robotic hearts will no longer suffer from jitters. + Ithalan: + - rscadd: Added turtleneck sweater as accessory. +2017-06-11: + Asanadas: + - rscadd: There's now a neat lore splash window which will spam all new accounts + under 7 days old. Read it! + Chaoko99: + - tweak: Made Digital Valves removable. + Hubblenaut: + - rscadd: Digital warrants can now be archived, so they don't have to be deleted. + - rscadd: Security gets automatically notified on new warrants through their HUDs. + - tweak: Improved the digital warrant interface. + Leshana: + - tweak: Optimized the unified radiation system. Made the radiation cutoff level + configurable. + - bugfix: Standing still won't save you from radiation storms. + Ravensdale - original work by anewbe: + - bugfix: Removed the exploit by which you could gain cargo points by ordering plastic + crates. + - rscadd: Upped cargo point gain by 50%. + Unknown: + - maptweak: Atmoshperics has been edited to make it easier to change and modify + pipes. + ZeroBits: + - rscadd: Added Independent Language. + - rscadd: Added signet rings, which act as stamps and rings, and can be personally + claimed by clicking them in-hand + - tweak: Rings are now compatible with the material system, and can be made via + sheets. + - bugfix: You can no longer clip rings like gloves, and all species except Diona + can wear them now. +2017-06-17: + Asanadas: + - bugfix: No longer will you be able to freely pass onto upright tables by moving + onto them from a tile which has a flipped table. + Chaoko99: + - rscadd: Added a mass-defile cultist rune. Buyer beware; it may kill you. + - rscadd: Cult tiles play a snazzy animation on creation. + - rscadd: The soulstone shard now notifies the player when it is full, asks if you + wish to release the spirit within. + - rscdel: Removed Manifests from the cultist repertoire. + - rscdel: Removed defile giving cultist levels. + - tweak: Changed the values for cultiness (The value which controls spell levels). + You will need to either recruit 10 cultists, or perform 10 sacrifices to unlock + Nar-Sie. + - tweak: Nerfed cultist robes. Buffed cultist voidsuits. The latter of which is + still impossible to obtain. + - bugfix: Made the restricted/protected/blacklisted roles for cultists torch-compatible. + - bugfix: Fixed construct and familiar spells. + - rscdel: Removed Vox Pariah. + Chinsky: + - rscadd: Can now rig assemblies/devices(e.g. radio signalers) to trigger when crate + is opened. Click wires on open crate, then click with assemblies. It would trigger + when opened next time. Use wirecutter to unrig. + - tweak: AI cores got new step in construction. You need to swipe an ID with Upload + access (or emag) to hook them into the systems. + - rscadd: Added rubber masks and suits to party crate. Dress up as war hero or SCG + secretary or a naked tajara like you always wanted. + - tweak: Made SHOCK mode on tasers literally useless, ruining security gameplay. + Does bit less burn damage, and much less straight up stun damage. Not 'better + tase mode' anymore. + - bugfix: Fixed their primary function actually never working. If you hit arm or + hand with the beam you can disarm someone (even diona, even robbit, pain reception + doesn't matter). If you hit leg, they might drop, higher chance for foot. + Hubblenaut: + - bugfix: Manifold pipes show up properly on t-ray scanners now. + - bugfix: Space lube now properly disappears. + - tweak: Can now put items in vendors by using click and drop, thus allowing screwdrivers, + multitools and similar. + - tweak: Space heaters will now first attempt to draw power from the local APC. + sabiram: + - rscadd: Research module robots now have access to a welding tool. +2017-06-19: + Chinsky: + - tweak: Speed now matters when flying into meteor field. Still - 25% the meteors, + below 0.3 - 60% of usual, normal otherwise until above 3 speed, where you start + getting double the fun. Also if ship is moving most meteors will fly in from + front and sides. + - tweak: Changes spess dust event. It used to be a single wave of quasi-meteors + that exploded for a bit before dying. There were no further waves until you + left and came back. Now waves keep coming ~twice a minute. Dust itself is now + a pile of micrometeors - basically space bullets. It wouldn't do a lot of damage + to the hull, but can break windows and makes EVA pretty damn dangerous. + - tweak: SCG had mastered the secret art of 'background check'. CO and XO are no + longer be eligible for roundstart antag roles on Torch. Can still be converted + in round + - bugfix: As a side effect, they aren't going to get rev'd anymore, that was a bug. + ZeroBits: + - rscadd: Added the ability to have multiple loadouts per character. + - rscadd: Added magic invisibility ring and reagent rings. + - tweak: Rings are now a child of clothing rather than gloves in order to appease + code gods. + - tweak: Gloves can now be worn over rings (much like magboots with shoes). + - rscadd: Added coffee cups to the loadout selection. + - rscadd: Added threebread, blueberries, pancakes, and two new flavors of ice-cream. +2017-06-30: + Chaoko99: + - tweak: Poppies now contain tramadol. + - bugfix: Fixed the phrasing in the set-pose verb. + Chinsky: + - rscadd: NT has sent some more testing supplies. Nothing to see really. RDs can + find details in a super secret folder in their office. Others - do no peek, + ok. + - tweak: Surgery now produces normal wounds instead of snowflake 'open incisions'. + Do not be alarmed, do not bandage those if you plan to continue surgery, clamp. + If incision was made with scalpel, you'll be able to cauterize it, healing a + lot of damage. + - tweak: Skull/ribs surgery changed, now you just need to use the saw to crack em. + Fractures count as being open too. Retractor steps for ribs etc are gone, use + normal bone repair surgery aferwards. + - tweak: Coincidently you can just rip them apart with cut wounds to get access + to innard surgery steps. It takes much more damage than surgical incisions though. + - tweak: Bones now fracture when damage is taken rather than from existing damage. + Meaning if you fix bones, they won't refracture immediately without taking damage. + - tweak: You don't need to crack open the bones to get shrapnel now. If you can + see it on examine, you can take it out with just a retracted incision. + - rscadd: Added new surgery step - disinfecting wounds. You can use sterilizine + or high proof booze, in spraybottles/droppers/bottles/glasses/buckets. Works + same as ointment. + ParadoxSpace: + - rscadd: Adds darksight to space adapted humans + Ravensdale: + - tweak: Cultists now speak in the cult tongue when activating runes instead of + their default language. Done in case a changeling cultist ever becomes a thing. + - rscdel: Removed special human kabobs and burgers. Lumping all items that are 'red + meat' together. + - tweak: Adjusted AI tracking verbs. AI will now have a more difficult time tracking + specific people depending on method and if person has their face concealed. + - tweak: To bring some consistency for the above, also adjusted how names appear + on mobs that have some sort of face covering or a face that is... not there. + Zucchinsky: + - rscadd: Beeg medical changes. Like holy crap. Get a crash course on https://wiki.baystation12.net/index.php?title=Zuhmed_Guide + - rscadd: Death now occurs when brain dies. Brain's health replaces overall 'health' + - rscadd: Death is now FINAL, baring relacing. Don't let that brain die. + - rscadd: Crit now exists as flatlining, the heart failure, or as fancily 'asystole'. + It happens when heart is damaged, not enough blood or oxygen in blood, or high + levels of shock. + - rscadd: In crit you do the usual gasping thing and take brain damage. USE CRP + or defib to revive em. If they die before you crack ribs, you hadn't tried hard + enough. + - rscadd: '''Toxins'' damage is now overall organ failure, basically sum of organ + damage. Poisons will try to destroy liver and kidney first, and will damage + the rest after those two are down. Some poisons go straight for vitals. Liver + will heal self until it''s too damaged.' + - rscadd: '''Suffocation'' damage is now used as modifier to your blood levels. + If you don''t get enough air, you get effects of low blood basically.' + - rscadd: Defibs now restart failed hearts instead of reviving dead. Also named + differently now. + - rscadd: Most scanner readouts are changed now. Instead of damage values they report + vitals (pulse/blood pressure/brain activity) and general state of damage. + - rscadd: A D R E N A L I N E. When you take a good chunk of damage at once (15 + or more in one hit) you generate bit of adrenaline reagent according to damage + taken. It acts like strong painkiller / pulse raiser for a tick or two, becoming + weaker after that. + - rscadd: FBPs and IPCs now have batteries in their chests. They have HYPERCELLS + and drain when they stand (unbuckled) or move around (double drain then). + - rscadd: Sleepers now have stomach pumps, same as filtering but for ingested stuff. + - rscadd: Cultists yo - sacrifice rune now works on someone in asystole rather than + full braindeath. Knives now count for all steps needed to cut out the heart, + and cult runes count as surgery spots. Just sayin'. + - rscadd: Bunch of chems is different now. First off, none 'reduce' toxins damage, + aside from peridaxon cause tht's organ damage now. + - rscadd: Peridaxon only treats brain damage if it's not too severe. Get Alkysine + otherwise. + - rscadd: Alkysine will only work if brain is fully oxygenated, so refill blood + and air first. + - rscadd: Dylovene removes toxic reagents from blood. + - rscadd: Dexlaine fools brain into thinking you got at least 50% of air you needed. + For Dex+ it's 80%. + - rscadd: Cryox/Clonex also have Dex/Dex+ effect respectively. + - rscadd: Inapro prevents suffocating while in asystole, slows pulse down (which + slows bleeding a bit) and has mild painkiller effect as it did. +2017-07-06: + Chaoko99: + - tweak: Added a full belt to engineering lockers. + - tweak: Removes all (direct) references to Metroids from our codebase. Not being + sued is nice. + - imageadd: Replaced our RPED sprite with /TG/'s, and added a little animation atop + that. + Chinsky: + - rscadd: Can now scoop corgis up, like cats or nymphs etc. + - rscdel: Can also use them instead of sausages in microwave to make hotdogs. Geddit, + hehehe hot dogs. Riot. + - tweak: GUPpy, Calypso and Aquila now can share destinations, as long as they can + fit. + - rscadd: Excavation prep closets now have BLUESPACE FLARES. You can activate those + in a nice open spot to create a new navpoints for shuttles (ones mentioned) + to go to. + - rscadd: Exploration shuttles (Calypso/Guppy/Aquila) now can share destinations + (with some other shuttles too). + Heptagon49: + - tweak: Replaced the synthetic lung sprites with something more realistic/futuristic. + - rscadd: Added artificial and assisted lungs to the loadout menu. + Hubblenaut: + - rscadd: Coffee cups are now available across the ship. + - tweak: Coffee cups now have reagent fill states. + - bugfix: Fixes glass of cup of tea. + thasc: + - bugfix: Ghosts can hear binary chatter again. +2017-07-09: + Chaoko99: + - tweak: Made it so a butterfly knife spawns in your hand instead of on the floor + when completed. + Chinsky: + - tweak: Bluespace jump effects have changed. Engineers found that some duct tape + got unstuck because of a WD40 leak, so they fixed it. Now you can't zoom through + the walls, and visibility is a bit better. You also don't get confused forever, + just for a minute or so. There are some... unforseen side effects, but they + seem harmless. A word from Chief Tech (before his disappearace) - KEEP IT REAL. + Hubblenaut: + - rscadd: Gives holowarrants their own handheld item. + - tweak: Holowarrants will now broadcast updates on warrants instead of security + HUDs. + - tweak: Authorizing a warrant using the holowarrant will now broadcast a message. + ParadoxSpace: + - rscadd: Unathi across the universe have been informed of new lore changes, and + can now be a maximum age of 260. + Ravensdale: + - bugfix: Exosuit/mecha pilots can once again operate airlocks from the safety of + the cockpit + mkalash: + - tweak: Replaced adminhelps with a ticket system. +2017-07-14: + Atlantiscze: + - tweak: Max pressure on omni filter/mixer output is now capped at approx. 7500kPa + - tweak: Atmospherics pressure tanks can now be set to output up to 15000kPa + Heptagon49: + - bugfix: Changes the recipes for Methylphenidate and Antidexafen so they no longer + overlap. Methyl now requires lithium instead of hydrazine, and antidexafen now + requires carbon instead of sugar. + - tweak: Lowered the max damage of internal organs, except for the brain and cortical + stack. + - tweak: Prosthetic internal organs are now stronger then regular organs. + - tweak: Kidneys are actually important now. You will slowly take toxin damage if + they are missing or busted, same as the liver. + - imageadd: Changed the sprites for the prosthetic liver and kidneys. + - rscadd: Prosthetic lungs half the toxin damage taken from breathing bad air. + - tweak: Made assisted organs slightly worse. + Hubblenaut: + - tweak: Air shutters will not be automatically opened by a clearing air alarm when + it would be dangerous to do. + ParadoxSpace: + - rscadd: Unathi across the galaxy have realised the implications of having tails, + and now use them to attack instead of their legs. + atlantiscze: + - rscadd: Can now order OCP and plasteel from cargo. Furthermore, 10 and 50 sheet + crates are available for some more expensive sheet types, with 50 sheet crates + being more cost efficient. + mkalash: + - tweak: Replaced tgui ticket panel with an autoupdating basic Topic() one + - rscadd: Added time stamps to messages on the ticket panel, and a measure of how + long an unanswered ticket has been open + - rscadd: Added a PM button to the ticket panel + - tweak: Adminhelping with an open ticket will either send another adminhelp to + the same ticket, or PM one of the assigned admins if there are any + - bugfix: No more sanitation weirdness in ticket panels + - tweak: A ticket is no longer created anyway if an admin cancels sending a PM to + someone who didn't have a ticket + - bugfix: Fixed admins being able to create tickets for logged out players + - bugfix: Fixed mods and trialmins being unable to use the ticket panel +2017-07-24: + Hubblenaut: + - tweak: If a cycling airlock is already near the target pressure, pressing the + buttons will toggle the doors instead of making it reenter the cycle process. + - bugfix: Fixes blood splatters reappearing when lifting or putting floor tiles + down. + PsiOmegaDelta: + - rscadd: Species may now be restricted from selecting certain branches, ranks, + and occupations as according to lore. + Ravensdale: + - maptweak: Changed the colours of the pipes in atmosia to follow older color 'codes. + SiegDerMaus: + - rscadd: Added uniforms for Miranians for future events.. + TheWelp: + - rscadd: Allows Vox to be used in character setup. They are still restricted rule-wise + as they were before. +2017-08-01: + Ace McLazer: + - rscadd: Added A grunt emote for the grumpy. + - tweak: Tweaks Medibot statement for accuracy. + - imageadd: Adds Renegade AntagHUD Icon. + - imageadd: Swaps Medical belt Icon to blue + Crushtoe: + - rscdel: Removed transformation sting. + FTangSteve: + - bugfix: Fixes dionaea jitter. + - bugfix: Fixes dionaea limb regen. + - rscadd: Adds species based footprints when barefoot. + - rscadd: Gives GAS the ability to move over gaps or stop fall damage based on air + pressure. + - bugfix: Fixes some bugs with the GAS cloaking and stance switching. + - bugfix: Fixes damage overflowing max limb damage being negated. + - tweak: Makes wounds on limbs more realistic by letting them overflow max damage. + - rscadd: Adds ability for limbs to be injured irreparably, requiring amputation + or removal. + Heptagon49: + - imageadd: Adds everyone's favorite hotdog-based meme to the AI icon list. Now + contains 2% real corgi flavor! + Hubblenaut: + - rscadd: Replaces flashlights in Security with maglights. + - tweak: Removes security HUD sunglasses from lockers and makes them available in + loadout instead. + - tweak: Personal lockers now display their owner's name in their name. + - rscdel: Removes the box of military police armbands from CoS' locker. + - rscdel: Removes the box of solgov police badges from the Brig Officer's locker. + - bugfix: Lockers reset all random pixelshifts of their contents. +2017-08-07: + Atlantiscze: + - rscadd: Added ability to ban devices from the NTNet network, through the administrative + utility program. + - rscadd: Security cyborgs now get access to warrant program + - rscadd: Engineering cyborgs now get access to supermatter monitor program + - rscadd: Mining cyborgs now get access to supply management program + - tweak: Holowarrant now checks for access when authorising, similar to how the + program does it. + - rscadd: 'Added new program to the modular computer framework: NTNet Access Decrypter. + This program is available for download on all emagged devices, but relies on + ID card slot hardware. When executed it slowly (takes about 3-6 minutes, depending + on the device''s CPU) hacks the network and when finished adds a random access + to the ID. ID must be kept inside the device while running. Can be repeatedly + used to get multiple accesses. Has chance of yielding access that''s already + present on the ID, and therefore will do nothing wasting some time.' + Broseph Stylin: + - rscadd: Added weight lifting machines and punching bags. They provide no mechanical + benefits, and will deplete your nutrition as they're used. The weight machine + has 3 setting which can be changed with a wrench. You must be on harm intent + to use the punching bags. + - maptweak: Remapped the Deck 3 abandoned office, near EVA Storage, into a gym. + Cirra: + - bugfix: Fixed an exploit which allowed for the creation of infinite metal, using + the circuit printer. + CrimsonShrike: + - rscadd: 'Added new accesory slot: insignia' + - rscadd: Allowed more accesories on dress and service jackets. + - rscadd: Security vests now come with stripes to hang badges and other similar + insignia accesories. + - rscadd: Detective coat has now a slot for the badge too. Gone are the days of + flashing suspects to show your identification + - rscadd: Colonial Marshals have now learned to keep their badges visible aswell. + - bugfix: Emaged light replacers will now properly place explosive lights. + Datraen: + - rscadd: Adds directional states for softlight overlays. + - bugfix: Fixes lights on rotated views. + FTangSteve: + - bugfix: Fixes bug that stopped wounds from healing. + - bugfix: Fixes bug that made brains not take damage from low blood unless they + already had damage. + - bugfix: Fixes bug that made moderate blood loss damage your brain until death. + - tweak: Makes the irreparable point twice the limb cutoff threshold instead of + equal to it. + - tweak: Prevents vital external organs from being irreparable, instead they go + to critical. + - tweak: Updates advanced scanners with new wound severity levels. + - tweak: Smooths the dexalin and dexalin plus effectiveness curves. + - bugfix: Fixes pulling grabs when the affected person can't move. + - bugfix: Fixes GAS being able to use advanced tools when nabbing. + - bugfix: Fixes grabs with the ladder_carry ability carrying people up ladders. + - tweak: Stops GRAB_NAB base grabs from throwing people. + - bugfix: Allows GAS to remove lights by hand. + - bugfix: Moves GAS eyes below the lighting layer. + - bugfix: Stops mice from pushing crates, lockers, etc. + - tweak: Stops mobs from using pull to move larger mobs (grabs still work). + Heptagon49: + - rscadd: Adds the ability to toggle locks on secure lockers and crates with alt-click. + - rscadd: Adds the ability to open and close fire extinguisher cabinets with alt-click. + - rscadd: Adds the ability to rotate chairs with alt-click. + - rscadd: Adds the ability to change reagent amount tranfer with alt-click. + - tweak: Lowers the odds of vending machines going absolutely ballistic. + - imageadd: Adds a new robot sprite to the security module selection. + Legius: + - bugfix: Sign Language is no longer displayed to clients who are unconscious or + asleep. Probably. + PsiOmegaDelta: + - rscadd: Players with custom AI displays can now have multiple entries, should + they desire. + - rscadd: Players with custom AI displays can now freely select between their custom + and available displays. + - rscadd: Players with custom AI displays no longer have to supply the crashed/dead + AI state. + - rscadd: Traitor/Malfunctioning AIs now have access to additional AI displays. + SierraKomodo: + - rscadd: Added berets that allow a custom color to be set to the loadout menu. + - bugfix: fixed transparent pixels in white beret sprite. + TheWelp: + - rscadd: Adds deity follower tracking and better deity eye in general. + - rscdel: Removes need for deity floors and respective spell. + - rscadd: Nar-Sie zombies will automatically get all of their blood filled when + zombized. + - rscadd: Nar-Sie zombie's breathe will convert faster. + - bugfix: Fixes nar-sie blood forge being automatically unlocked. + nearlyNonexistent: + - rscadd: Added vending machine to the code that contains dice, cards and related + toy type items. One is in the mess hall. + - maptweak: Adds paper for civilians in the mess hall and lounge. Removed a stool + in the mess hall to add the vending machine. +2017-08-12: + Atlantiscze: + - rscadd: Cyborgs can now manipulate IV drips and chemistry grippers can now hold + blood packs. + - rscadd: Improved some SMESes around the station - mainly the Engine SMES. + - rscadd: Shuttles now have a SMES with single transmission coil in them. Primary + input is the main grid, secondary input is a PACMAN generator. + - rscdel: Removed stashes of phoron from the shuttles (they can operate without + generators now) + - bugfix: Fixed bug which caused shuttles to be remotely powered even after cable + connection was severed by jump + - tweak: Rewired SMESes in engine SMES room. Engine - Core SMES can now be charged + from main grid, for example through solars. + - rscadd: SMES and PSU units can now have more than one input terminal at once. + Broseph Stylin: + - tweak: Changed access requirements aboard the Aquila. Helm and Secure Storage + remain as Aquila-specific access, but all other areas have been made SCG Crew + or all-access. + - tweak: Changed sidearm cabinet access requirements. Only line officers, the RD, + the SEA, and the Brig Officer can unlock them now. + Chaoko99: + - bugfix: Makes title1 run at roundstart. + Crushtoe: + - maptweak: Added a First Deck Lounge in the Observation Bubble. + Devildabeast: + - rscadd: Defines an armed role for the Loadout, which includes all jobs that are + allowed to carry weapons from round start. + - rscadd: Adds Scientist and Researcher to semi-formal roles. + - tweak: Frontier clothes are now its own separate item instead of a formal outfit + and can be worn by non-military roles. + - tweak: Holsters can now be selected by armed roles. + FTangSteve: + - rscadd: Added a paramedic alt title for medical contractor. + - rscadd: Added a admin debug verb that lets you see a health summary, same as the + advanced scanner in medical. + - tweak: Makes splashing solutions and using eye droppers only work when not on + help intent. + - tweak: Makes dylovene more effective to help with liver damage and recovery from + severe damage. + - bugfix: Fixes necrotic internal organ surgery. + - bugfix: Changed how toxins work so they now are effective. + - bugfix: Alcohol is once again potentially damaging. + - bugfix: Increases processing accuracy for liver and kidneys. + - bugfix: Radiation now does damage again. + - rscadd: There is now a popup after taking enough brain damage as a stand-in for + clone memory disorder etc. + Heptagon49: + - rscadd: Adds a 1% chance for a diona nymph to pop out when you activate a vending + machine. + - imageadd: Adds a few vending animations. + - tweak: Changes the NutriMax icon from the nutrimat to the pre-existing, but unused, + nutri. + Superbee29: + - tweak: Telecommunications servers no longer know the exact race of a speaker. + TheGreyWolf: + - rscadd: Mechanical and assisted kidneys and livers are now available in character + setup. + TheWelp: + - rscadd: Adds two new Nar-Sie phenomena. + - rscadd: Adds two generic feats involving power generation. + - tweak: Communication phenomena can now be used on non-cultists. We will see if + this is a good change. + - tweak: Tweaks a few of the phenomena names to be more apparently phenomena. + - tweak: Buffed Nar-Sie's power costs (reducing them). + nearlyNonexistent: + - rscadd: Cardemon instructions! Now you can actually play those weird pokermon + cards rather than just look at them. +2017-08-19: + Atlantiscze: + - rscadd: Re-adds on-join announcements to all ranks. + - tweak: Most jobs are announced on relevant departmental frequency (if they have + one). During red alert all jobs are announced on main frequency. + - tweak: Canisters now once again use NanoUI, instead of tgui. Performance on some + devices should be considerably better. + - tweak: AI can once again track people by clicking their name from radio messages, + even when their face is obstructed, assuming they are at least wearing a matching + ID. + Chinsky: + - tweak: Slimetoxin. Slimetoxin changed. Instead of pop and go slimeficiation it's + now a life threatening process. Slime toxin metabolizes slowly, and deals fair + bit of toxins damage. For every unit or so metabolized, it mutates one limb. + Once every limb mutated, there's a 10% every tick to fully mutate into a slimegirl. + If you're lucky, you might mutate right before death and that'd heal your all + wounds! That' a great idea! + Devildabeast: + - rscadd: Adds a cyborg recharging station to the Auxiliary Head. + - rscdel: Removes toilet from said Head. + FTangSteve: + - tweak: Adds more signals letting someone know they have toxin damage and giving + them a chance to get help. + - tweak: Adjusts how often internal organ damage messages are displayed. + TheGreyWolf: + - rscadd: Added hoods to standard hoodies. + tlc2013: + - tweak: Updates the Lobby and Nuclear Explosion cinematics to be more Torch-y. + Special thanks to 50_n00b for the art. +2017-08-23: + Broseph Stylin: + - tweak: The Body Scanner console and IV drips are no longer dense and can now be + walked through. + Chinsky: + - rscadd: Air analysers now have verb to be toggled into advanced mode. It displays + gas properties like specific heat and molar mass. + - rscadd: Air analysers can also now be used on pipes and various atmos machinery + to inspect the contents. + FTangSteve: + - tweak: Makes it easier to recover people from severe radiation damage. + - tweak: Puts a limit on recovery time for surgery with peridaxon, two minutes after + death the organ will no longer be savable. + PsiOmegaDelta: + - rscadd: Underwear is now handled as actual items. + - tweak: Your own underwear can be removed using the 'Remove-Underwear' verb. + - tweak: You can remove others underwear through the strip-menu. + - tweak: To put on underwear, on yourself or someone else, click the target mob + with the underwear in your active hand. + - tweak: The wardrobe now offers a limited quota of underwear if replacements are + needed. + - tweak: You can increase this quota by returning underwear items. + TheGreyWolf: + - rscadd: Tattoos are now available in character setup. + ZeroBits: + - bugfix: Manuals now point to the correct wiki pages. + - tweak: Cleaned up and organized manual files. + - rscdel: Deleted redundant manual that pointed to the same page as another. + Zuhayr: + - rscadd: Diona nymphs can now pick up and carry a small item. Use the drop_item + command or the Home key to drop it. This can also be used to remove your hat. + - rscadd: Losing your head is no longer necessarily lethal, unless you're the kind + of fat nasty trash who has a brain or other vital head organ. + chinsky and mkalash: + - rscadd: 'A randomly generated exoplanet of one of the following for types is now + available for away missions:' + - rscadd: Grassy exoplanets, lush with (probably dangerous) flora and fauna, but + not much else + - rscadd: Snowy exoplanets, like grassy but colder and with less life + - rscadd: Desert exoplanets, rich with minerals below the surface, which is covered + with dangerous quicksand + - rscadd: Mountainous exoplanets, one of the three other options, but also covered + with surface minerals + - tweak: Additionally, the airlocks of the three shuttles aboard the Torch now cycle + to the external atmosphere. + nearlyNonexistent: + - tweak: Fixes the inability to make enchiladas by making popcorn require salt. + Enjoy your salted popcorn. + sabiram: + - bugfix: Maintenance drones now once again take damage and recieve alarm notifications. +2017-08-27: + Chinsky: + - rscadd: Added a ton of usless gasses. Overall fireball planets should be slightly + more rare now + - tweak: Lighters now have fuel storage inside, and will shut down if it's empty. + Can refill at any welder fuel tank. + - rscadd: Can now dig graves planetside. Use shovel on ground to dig a pit. Can + place grave markers with wooden planks. + - experiment: When you speak now, your first name is replaced by your rank in messages. + Only affects those with military rank and wearing ID with it. + FTangSteve: + - rscadd: Adds insulated gloves for nabbers. + - rscadd: GAS can now be chemists and engineers.. + Minijar: + - bugfix: Fixes holosigns to appear above doors + atlantiscze: + - rscdel: Removed Turrets Focus Enhancer malf AI hardware, it is obsolete now. + - rscdel: Hack Camera replaced with Reset Camera. No longer allows camera upgrades, + this has been shifted to Machine Upgrade. + - rscadd: Added Quantum Knowledge Databank malf AI hardware. On use it advances + all research by one level. Single-use. + - rscadd: Added T5 Machine Upgrade ability, behind Machine Overload. Right now only + works on APC, SMES, Turret, Turret control, Camera. It is easily expandable + to any machinery in the future. + - rscadd: Adds four new abilities in a new passive tree. T1 prevents intellicard + transfers (toggleable), T2 removes BSOD/lockout from APCs, but reduces CPU generation + (toggleable), T3 prevents hack failures, and allows you to complete system override + silently and T4 prevents fax/emergency messages from going through. +2017-08-30: + Chinsky: + - rscadd: Health analyzers, advanced scanners and suit sensors will now report blood + oxygenation instead of just how well it flows in general. + - rscadd: If you go near an edge of exoplanet, you get warped around, kinda like + in space. Don't get lost, nerds. + - rscadd: Lush planets now have some drillable minerals too - some coal with a small + chance of diamonds or uranium. + - rscadd: Movie titles music now uses lobby music preference toggle to see if it + should play to you. + Crushtoe: + - maptweak: The derelict is no longer complete trash. There's actual rooms and plenty + of loot to loot, too! + - rscadd: Added random spawns for hostile mobs on the Derelict. Now the good loot + has a guardian pike/carp/viscerator. + FTangSteve: + - bugfix: Updates GAS to properly use the bloodmed system. + - bugfix: GAS eyes are no longer vulnerable to phoron in the air. + - bugfix: Fixed bug with humans not taking oxyloss after two minutes of not breathing. + - tweak: GAS now store more dexalin. + - tweak: Updates unit tests to include GAS. + - tweak: Updates unit tests to work with adjusted oxyloss system. + Minijar: + - tweak: Changes blue alert to orange + - rscadd: Replaces the bluespace artillery cannon with a prototype RUST fusion reactor + for engineering to experiment with. + - tweak: Edits the RUST manual to fit the new setup. + PsiOmegaDelta: + - experiment: Overhauls how reagents are identified, affecting both chemistry and + food. Due to the large scale of these changes more or less subtle bugs may have + crept their way in. + ThatOneGuy: + - rscadd: Can now play as the Explorer Department if you are a EC member. If a complete + failure, up for removal. + - rscadd: Calypso remapped for more cargo space and crew area. Bathroom and Cryo + deleted. + TheGreyWolf: + - rscadd: Fixed up pathfinder and explorer loadout. +2017-09-03: + Earthcrusher: + - bugfix: The electrified arm (e-magged/traitored Engineering borg module) now behaves + like a stun baton. It can be toggled on/off. + - tweak: Activating the electrified arm will now cause the borg to glow a faint + blue, giving away that they are using it. + - imageadd: Added a unique sprite for the electrified arm. + Kelenius: + - tweak: Pulling a knife out of your boot or putting it in no longer makes a message. + Minijar: + - bugfix: Adds atmospheric systemst the rust chamber + - bugfix: fixes the rust airlock + - bugfix: Removes accidental vacuum flooring + ParadoxSpace: + - rscadd: Adds Selenian, a lunar language for those who still hold onto that silver + spoon. + - rscadd: Adds Spacer, a language of Dutch origin for non-landlubbers. + - rscdel: Took Tradeband out back. + dryerlint: + - rscadd: Added ability to put paper bundles directly into paper bins and nano-printers. + - rscadd: Clicking on paper while holding a paper bundle now adds the paper onto + the bundle. + - rscadd: Added new type of crate - the paper refill crate - filled with 30 blank + papers. Intended to be used for refilling bins and printers. + - maptweak: Placed paper refill crate in Deck 1 Maintenance near the Conference + Room. +2017-09-08: + Chinsky: + - rscadd: Calypso is dead, new shuttle is here in same role - Charon. + - rscadd: Can now hide custom loadout items that are not allowed for your job. The + button's in top of loadout menu. Makes browsing less of pain for those with + lots of restrictions. + - rscadd: Wildlife will now respawn if more than half is killed off. Beware. + - rscdel: Added new type of planets - settled ones. Full of xenoarch-filled garbage + piles and hostile robots. + Cirra: + - bugfix: Protein is no longer present in food items which aren't supposed to contain + it, such as skrellsnax. + CrimsonShrike: + - bugfix: Stacking machine will now stack materials again. + FTangSteve: + - tweak: Updates engineering contractor to have access to atmos, EVA, etc. + Kelenius: + - tweak: Defile counts towards rune unlock again, at a rate adjusted for Torch. + - tweak: Mass defile rune won't kill you with bloodloss when you draw it more than + once (cost lowered from 80 to 20). + - bugfix: Soulstones should work properly now. + Minijar: + - rscadd: Adds pilot voidsuits to the Calypso along with a cycler. + TheGreyWolf: + - rscdel: Removes the Zhan-Khazan outfit from the loadout (Taj relevant only). + - rscadd: Added a NT pilot specific voidsuit, currently none are mapped in. + Zuhayr: + - tweak: R-UST backend/manual changes. +2017-09-13: + Chinsky: + - rscadd: Changed way lung damage affects people. Instead of straight up oxyloss, + it now makes you require higher oxygen pressure - so you can work around it + with high pressure internals. Of course it's not 100% failsafe, as blood coughing + and breathing stops still remain. + - rscadd: Inapro does more things now. It can heal brain damage up to 60, and also + slows down brain damaging a general, more effective at higher oxygenation. + - rscadd: Health analyzers report brain damage a bit different now. They don't report + damage that will self-heal without meds. New stage 'minor brain damage' covers + range that can be healed with inapro. Rest are more or less same. + - rscadd: Painstuff tweaked around, should generally see slightly less instant KOs + from lethal damages. + FTangSteve: + - tweak: Makes it so breathing heat or cold will hurt your lungs more than making + your head explode. + - rscadd: Electricity now shocks many parts of your body in a line to the ground + rather than just your hand. + - tweak: Species with an open circulatory system now don't get cut veins or arteries. +2017-09-23: + Atlantiscze: + - tweak: Pulling a knife out of your boot or putting it in produces a message once + again, but only if you are adjacent to the person. + Chinsky: + - rscadd: Can remove rolling end credits with Stop End Titles verb in OOC tab. + FTangSteve: + - rscadd: GAS now are flammable. + - rscadd: Lasers can catch flammable mobs on fire. + - rscadd: GAS no longer are cut by small sources of cuts (they are bruised). + - rscadd: GAS no longer are cut by slithering over glass. + - rscadd: Being on fire now burns immediately and isn't based on body temperature. + - rscadd: Adds an autolathe to robotics. + - rscadd: Adds lightswitches to chemistry, the galley, and robotics. + - tweak: Adjusts some lights so lightswitches make those rooms dark. + ZeroBits: + - rscadd: Activated the Solar Storm random event, which roasts anyone who's EVA + at the time. + - tweak: Added rad-shielding to the bunk room so you can stop dying while AFK, also + added rad-shielding to the saferooms. + - tweak: Tweaks lottery chances. + - tweak: Allows admins to choose whether or not to make an announcement when they + toggle gravity from the secrets panel. + atlantiscze: + - tweak: Walls and similar dense objects are now much better when protecting against + radiation, especially at higher levels. + - tweak: AI integrity restorer program will now upload map's default law set instead + of NT default. + - tweak: Cyborgs can now click ladders to climb. AIs can now click ladders to move + their view to different Z. +2017-09-28: + Banditoz: + - maptweak: Adds tintable windows to the Robotics Surgical Theater. + Broseph Stylin: + - rscadd: Added an Exploration department-specific voidsuit. It has the same stats + of an excavation voidsuit. + - rscadd: Added Exploration department-specific colored uniforms and PDAs. + - rscadd: Added lockers for the Pathfinder and Explorers. + - maptweak: An Exploration Equipment area which can only be accessed by the Exploration + department has been mapped on Deck 4 Aft. + Chinsky: + - rscadd: Pulse now affects blood circulation. Lower pulse effectively lowers it + and vice versa. + - rscadd: Extremely high pulse risks damaging the heart. Shouldn't be a lot, but + it's there. + - rscadd: As you lose blood oxygenation, your pulse tries to rise to compensate. + Thready (>250) pulse will cause a cardiac arrest. + - rscadd: Inaprovaline tries to bring pulse to normal levels, either up or down. + It also prevents thready pulse. + - rscadd: Heart stopping is slightly less 100% surefire, so if you manage to get + heart restarted it might beat for few ticks first. + - rscadd: You no longer need lungs/mouth to give CPR, but you will only do the heart + bit. Checks still apply for mouth-to-mouth. + - rscadd: Shock stage stars rising earlier now (30 damage vs 50) and can go bit + higher than usual. + - rscadd: Painkillers speed changed. Now they ramp up slower if ingested, but stay + longer. Opposite if injected. + - rscadd: Tramadol and oxcodone injectors added to medical vendomats (and tramadol + ones to hacked firstaid vendomats). + - rscadd: Adds some goodies to survival boxes - inapro injector, food and light. + - rscadd: Changed how tramadol/oxycodone work a bit. They now have period for setting + in and wearing off, gradually ramping power up/down. Those are short, ~20 seconds + to reach max + - rscadd: Mixing those with alcohol is now as bad idea as it's supposed to be - + increased liver damage and respiratory depression (harder time beathing) await + you + - rscadd: Inaprovaline helps against breathing effects of both mixing and ODing. + - rscadd: There's now some effects based on how much you consume over time, rather + than single dose. Effects stat at 15u with some slowdown and chance to start + slurring, ramp up from there, with major slowdown and slurring after OD-worthy + doses is metabolized. + - rscadd: Also ODing on those will give you even MORE painkilling effect! At a small + cost of suffocating most likely, and don't even try doing that AND booze. + - rscadd: Ships now have sensors. Overmap is dark by default, with known sectors + emitting some light. Dust/rocks/ion block visibility. You can control the sensor + with console(s) on the bridge, its power setting sets how far it will shine. + Higher settings use /huge/ mounts of power so don't leave it running on those. + Sensors also cannot run in non-vacuum. + - rscadd: Some improvements to helm console - now shows ETA to next grid, can set + max speed for autopilot. + - rscadd: Engines are now buildable - there's circuitboards for them in Tech storage. + - rscadd: Merchant prices are now slightly less wack, they use actual procs for + deciding them, instead of selling containeres full of stuff at price of container + only. + - rscadd: Mineral scanners now store survey data, currently useless aside from penile + comparsions. + - rscadd: New away mission - a drifting empty ship. Can be restored to fly around + on its own like Torch. + atlantiscze: + - tweak: Cyborgs can now unwrap packages by clicking them.. + dryerlint: + - tweak: Autolathes can now print cable coils. They are under the Devices and Components + category. + sabiram: + - bugfix: Cerulean, pyrite, bluespace and sepia slimes now drop the correct slime + core. + - rscadd: Added a jumpsuit with colour selection to the loadout, replacing the list + of presets previously available. + - rscadd: Added a new feminine jumpsuit with colour selection to the loadout. + - rscadd: Added a service uniform skirt for Expeditionary Corps, available in the + uniform vendor. + - rscadd: The clerical module robot now has access to the basic and denied rubber + stamps. Additionally, their hacked item is now the chameleon stamp. + - rscadd: The service department has been split. The Sol Pilot, Pathfinder and Explorer + are now in the Utility department, with their own department radio. The hotkey + for the utility department is 'y'. Bartender, Cook, Janitor and Crewman remain + in the service department. +2017-10-03: + Broseph Stylin: + - rscadd: Added some code by Techhead that allows for accessories to have and transfer + armor values to the item they are attached to. + - rscadd: Added a modular armor system based around a common plate carrier and accessories + that attach to it. + - maptweak: Replaced the armor vests and arm guards found inside the Emergency Armory + with equivalents using the new modular armor system. + Chinsky: + - rscadd: Shrapnel is less deadly now. Tiny items don't jostle around anymore. They + still prevent wounds they're embedded in from healing. + - rscdel: Conductive things embedded in body will heat up in EMP, dealing damage + depending on their size and EMP severity. + - rscadd: Brainwashing implants! Well, kinda. XO now has a box of 'imprinting' implants, + that can be set to a list of instructions, and will remind about those to whoever + is implanted with it. Latest word in grimdark on-job training. They're not binding, + just reminders. + - rscadd: Now the fun part is their abuse - when victim has mindbreaker in blood + and implanted with those, implant wires deep enough to fool host that he actually + believes these. Think borg laws. You can get the kit in uplink too, bundled + with a dose of mindbreaker + - rscadd: Can now emag practice carbines to get lethal lasers out of them. They'll + turn useless after 3-6 shots so bring a lot! Costs an emag charge. + - rscadd: Not having enough air in lungs will prevent you from talking efficiently. + If you don't have air at all, you might use remaining air in lungs for one message. + If you're just not getting enough, you'll be stuck whispering. Long messages + might come out garbled. + FTangSteve: + - rscadd: Added a push back disarm attack for GAS. + - rscadd: Added examine text and a message for GAS stance. + - rscadd: Adds in some of the GAS event things like the threat display and associated + sounds. + - rscadd: Cutlets can now be added to the organ printer as well as full slabs of + meat. + - rscadd: Adds a few cameras to hangar and to exploration with a network for each. + PsiOmegaDelta: + - tweak: Converts the machine, mob, and obj processes to subsystems. + SierraKomodo: + - tweak: Changed wording of maintenance drone laws from 'do not interfere' to 'do + not interact' to better fit the spirit of the law and staff policy. +2017-10-10: + Atlantiscze: + - rscadd: Completely overhauls crew records. Large text fields now support paper + tag formatting. Records are now accessed through a computer program. Everyone + can see generic fields (name, job, rank, ..), specialized fields become visible + depending on your access. + - rscdel: Removed old record computers of all kinds, removed PDA modules for crew + record viewing. + Banditoz: + - maptweak: Mapped in a camera to Bridge's solar control. + Broseph Stylin: + - tweak: All armor-containing lockers now have a 50% chance to contain a modular + armor equivalent to the older armor vests. + - tweak: All armor crates from Supply have been altered to contain modular armor + rather than the older vests. + - rscadd: Plate carriers and storage pouches for them have been added to the loadout, + priced at 1 and 2 points respectively. Only roles already issued armor can obtain + them. + Chinsky: + - rscadd: Added doorbell pager button. Press one and it will ping all PDAs of relevant + department people! There's one in Medical Cargo lobbies each. + - rscadd: EC ranks have been changed, you'll probably need to update your char settings. + Only 3 enlisted ranks now, slightly less officer ones. + - rscadd: 'SUPER IMPORTANT: EC cannot longer be SEA. Also since they don''t have + O2 equivalent, Pathfinder can be either O1 or O3.' + - rscadd: Can now rename alien creatures! All exoplanet animals start as 'alien + creature', and you can use a Name Alien Species verb to rename them when you + see 'em. Name can't be changed afterwards so don't go too silly. Random generated + one is suggested when you use that verb too. + - rscadd: All computers now come with a word processor, NanoWord. Lets you edit + TXT files, with paper preview and markup help + CrimsonShrike: + - rscadd: Ports openspaces. Now open turfs will show whatever is down below. + Crushtoe: + - rscadd: Added the antibody analyser, a new way for virology to contribute to the + crew. Finding new antibodies from curing diseases grants 45 cargo points per + when scanned, allowing up to 1170 points on the furthest end assuming RNGesus + is very merciful. + - maptweak: Mapped in an antibody analyser into the virology lab. + - rscdel: Removes the Chemist as its own job. + - rscadd: Chemist is now an alt-title of Medical Contractor. + Devildabeast: + - rscadd: Gives the SEA Emergency Armory access. + - rscadd: Master Chief Petty Officers and Master Gunnery Sergeants can now be SEA. + FTangSteve: + - tweak: AI drones can no longer use non-drone langauge. + - tweak: Drones can no longer push or pull items larger than medium. + - bugfix: Mechs can now fall and go down stairs. + - rscadd: If a mech falls on you, it does a heck of a lot of damage. + - tweak: Makes hats optional. + - bugfix: Fixes space vine events. + - rscadd: Makes vines spread across z levels. + - tweak: Balances spreading vines. + Quardbreak: + - rscadd: Now you can look up and see out what's going on there. + dryerlint: + - rscadd: Added two Marshalling Wands to the Deck Technician's locker. They light + up and help you visually signal stuff. + mkalash: + - rscadd: Added a net gun. It and a bandolier full of net shells is located in the + Charon storage area. + - rscadd: Added stasis cages for transport of alien fauna without having them suffocate, + located in expedition storage. + - maptweak: Refitted xenobiology to support changing the atmosphere of animal pens. + sabiram: + - rscadd: Keys can now be held in wallets. + - maptweak: The derilect laboratory in the research wing has been refitted into + a break room with public office space. + - bugfix: Personal AI system radios now work once again. + - maptweak: The executive officer's office has been redesigned. + - rscadd: Head of staff offices have been fitted with modular computer consoles. + - rscdel: As the records have been integrated into modular computers, the laptop + on the bridge previously adjacent to the security and medical records consoles + has been removed. + - rscadd: Heads of staff, the Senior Enlisted Advisor and the Bridge Officers have + been leased modular tablets. The BO's are available in their lockers. + - rscadd: The commanding officer and executive officer now have special pens. +2017-10-14: + Broseph Stylin: + - rscadd: Added Marine Corps service uniform skirts. + - rscadd: Added desert boots. Available in the same places as and statistically + equal to jungle boots. + - rscadd: Added Fleet fatigues as an alternate utility uniform. + - tweak: Fleet security and Field Medics now spawn with fatigues instead of coveralls. + - rscadd: Added earrings to the loadout, found in the Earwear section. They're unrestricted, + but can only be worn by humans (subspecies included) + - rscadd: Added a Master at Arms brassard to the loadout. + - tweak: Changed the Military Police armband to a brassard. + Chinsky: + - rscadd: Electrical storms now can be blocked by shields. They have special mode + for it. Keep in mind that they will be taking damage while event is running. + - rscadd: Overmap events (meteor, dust, electrical storm) do not happen randomly + now. + - rscadd: Number of overmap events increased. Asteroid fields now spread over wider + space but have gaps in them. + - rscadd: Hitting edge of overmap will not warp you around to the opposing edge. + Space is around after all. + - rscadd: Away missions no longer glow on overmap, you have to find them now. Planets + are still visible due to sheer size of signature. + - rscadd: Changes to Torch's speed. Now default delay between moving is higher - + 20 seconds vs 12, but speed affects it much more, e.g. at 5 speed you will move + pretty much continuously. + - rscadd: Shuttles have different ranges now. Charon (1) can go to away missions + in adjacent grids, Aquila (2) one tile further. Travel time is multiplied by + the distance. + Cirra: + - rscadd: 'Added a new, more expensive type of 14.5mm ammo, for the anti-material + rifle: APDS. Less damage, but far greater armour penetration.' + - rscadd: Projectiles can now cause internal damage, including organ damage and + severing arteries. Bullets cause more than energy, with x-ray lasers being inbetween + the two. + - tweak: Renamed 5.56mm ammo to 7.62mm and vice versa, to be more consistent with + their damage values. + - tweak: Matebas now use .50 ammo, while revolvers have had their damage reduced + slightly. + - tweak: .45 rounds now do 21.5 damage instead of 20, while 10mm bullets now do + 23.5 instead of 25. + Orelbon: + - rscadd: Consoles now have ambient noise when turned on. + comma: + - tweak: Department of Swag has determined that Torch is 60% clothes by volume. + This was rectified. Now uniform vendors will only dispense 1 (one) item of each + type per person. Don't lose your pants kids. + sabiram: + - rscadd: The Pathfinder now has a special machete with premium fittings, and machete + sheaths have been added to the Pathfinder and Explorer's lockers. + - rscadd: Job bans can now be applied to jobs from the command support, exploration, + service, and supply departments. +2017-10-21: + Broseph Stylin: + - tweak: Holsters and webbing/bandoliers/drop pouches can now be worn together. + - rscadd: Added customization options for modular armor to the loadout. + - rscadd: Added leg guards as an armor module. + - tweak: replaced all static armor spawns with their modular equivalents. + Chinsky: + - rscadd: Planets now have some alien landmarks to find and rub your face on. + - rscadd: Added winter coats for all branches. Can be found in uniform vendors next + to ushankas. + - tweak: Made vent hum bit less of earbleed, made ambience bit lower and rare in + general, try reenabling it. + Datraen: + - rscadd: Allows for labels to be applied to condiment containers. + ParadoxSpace: + - rscadd: Adds eyepatch variants of the Sec, Med, and Meson HUDs, as well as a non-HUD + variant for those missing exactly one eye. + - tweak: Flipping eyepatches (and HUDpatches) is now a verb. + - rscdel: Kills the standard cloth eyepatch for military roles. HUDpatch still works + for them. + TheGreyWolf: + - rscadd: Added toeless jackboots to the EC and civie branch uniform vendor for + the xenos. + TheWelp: + - rscadd: Added a deity hud element that shows your current phenomenas. + - tweak: Reduced D-Nar's blood costs to half. + - tweak: Made it so that a deity's power can never go below 0. + ZeroBits: + - rscadd: 'Added three new strength brackets for the R-UST: 9x9, 11x11, and 13x13. + For the engineers who have 51 extra fuel injectors and way too much free time.' + - tweak: Changed the sprite of the R-UST to look cooler. + dryerlint: + - rscadd: Added queuing functionality to modular computer software downloader. + sabiram: + - rscadd: Added herbal liquor. + - rscadd: Added a new cocktail, the Ibn Batutta, consisting of 2 parts herbal liquor + and 1 part orange juice, with mint as the catalyst. + - rscadd: Added a new cocktail, the Magellan, consisting of 1 part wine and 1 part + premium whiskey, with sugar as the catalyst. + - rscadd: Added a new cocktail, the Armstrong, consisting of 2 parts beer, 1 part + vodka, and 1 part lime juice. + - rscadd: Added a new cocktail, the Zheng He, consisting of 2 parts black tea and + 1 part vermouth. +2017-11-01: + Chinsky: + - tweak: Changed way hallucinations are. Now some things will give you strong ones, + some milder, it's not always same. + - tweak: Most of old hallucinations effects are replaced. New ones are supposed + to be more mindfucky. + - tweak: Synaptizine, Paroxetone and Citalopram help lowering frequency of hallucinations, + and to clear them out faster once whatever causes them is dealt with. + - tweak: Changed lobby music selection, lowered lobby music sound overall. Should + be less ear-gore and fresher now. + Cirra: + - bugfix: Stasis Clamps actually work now. + CountAlex: + - rscadd: Adding new map for overmap list - abandoned supply base. + - rscadd: Adding new map for overmap list - planetside location - frozen with breathable + atmosphere - with pod crashlanding and survior's story. + CrimsonShrike: + - bugfix: Fixed stick messages not showing. + - rscadd: Sticks can now be sharpened using edged sharp tools. + - rscadd: Added morgue access to Forensic Technicians. + - rscadd: Added GAS-poking stick and recipe per request of the more suicidal crew + members. + Devildabeast: + - tweak: Deck Officers can now be E-8 and O-2. + FTangSteve: + - tweak: Robotic organ surgery now needs the hatch screwed back down after it's + closed with a crowbar. + - rscadd: Adds the ability for IPCs to choose whether they are shackled and a lawset + in character setup if they would like. + Heptagon49: + - rscadd: A hologram's color will now vary depending on what kind of holopad is + projecting it. + - imageadd: Added a unique sprite for long-range holopads. + - spellcheck: You now step onto a holopad instead of stepping unto one. + - rscadd: You can now tell if a person's face is disfigured just by looking at them. + TheGreyWolf: + - tweak: Restricts a few more tattoos and prevents xenos from picking normal tattoos. + - rscadd: Added black, blue and red pens, hand labeler, clipboards and destination + taggers to the autolathe. + ZeroBits: + - tweak: moved away sites to away subfolders. + - tweak: You can now disassemble bare plating by first damaging it with a welder + (or bomb) then prying it up with a crowbar. + sabiram: + - rscadd: Added two new alert levels to the Torch map. + - rscadd: Code Violet for major medical emergencies. + - rscadd: Code Orange for major engineering emergencies. + - rscadd: Code Red now has a unique sound on activation. + - tweak: Code Blue alert should now only be used for major security emergencies + and not as a general readiness state. + - tweak: Code Red alert should now be used as a general high alert when the situation + is more severe than or would warrant two of the standard department alert statuses. + - bugfix: Chemical grenades (cleaner, metal foam, etc) now work properly again. + - tweak: Security module robots' stun batons now consume much less of their cell + per hit. + - rscadd: Anyone with bridge access can now lock the holodeck into its current state + in the console interface. + - rscadd: The Pathfinder now has a box of Exploration department encryption keys + to distribute if they choose. + - tweak: As part of the SolGov staff well-being initiative, cigarette supply to + their installations have been restricted. Vendor prices have increased to match + the limited supply. + - rscadd: Added more e-cigarette flavour cartridge types to vendors, including ones + to fill with your own flavours, and added empty e-cigarette cartridges to autolathes. + - maptweak: Wall lockers with cardboard, wrapping paper and destination taggers + have been added to the kitchen, hydroponics and the research and development + lab. + sicktrigger: + - rscadd: Ship sensors will now heat up and eventually take damage at higher settings + (they can be repaired with a welder). Their power usage has also been significantly + reduced. + tlc2013: + - rscadd: Added the Corporate and Service lawsets to IPC shackles. + - rscadd: IPCs now have four new monitors. Nothing special... except for a space + screensaver. +2017-11-04: + CountAlex: + - rscadd: Adding new map for overmap list - smugglers den located inside asteroid. + Tlc2013: + - rscadd: IPCs now have two bonus language slots. + sabiram: + - rscadd: As follow-up to a recent study concerning the trend of people more readily + following leaders with shiny revolvers, the Commanding Officer and the Executive + Officer have each been supplied a Webley style .44 revolver as their personal + side arm. + - rscadd: Added the .44 revolver to the traitor uplink. + - rscadd: Added .44 ammunition to the autolathe. Rubber is always available, and + lethal is available after hacking. + - rscadd: You can now alt-click revolvers to spin the cylinder. +2017-11-10: + Chinsky: + - rscadd: Can now put clothes on skeletor models. + - rscadd: Can rename skeletor models with pen. + Heptagon49: + - tweak: Lowered the chances of a Doona popping out of a vending machine from 1% + to 0.1%. + - bugfix: Made the outer windoor of the sci checkpoint all-access. + - tweak: Added an outer windoor to the RnD desk. + - rscadd: Chem dispenser now has a visual indicator when it has a beaker loaded. + - bugfix: Pill bottles loaded into the chemmaster now get filled. + - tweak: Tweaked uniform vendor so that it'll no longer eat your clothes. + Hubblenaut: + - bugfix: Fixes brig cell timers not connecting to windoors/mounted flashes. + Orelbon: + - maptweak: Science entrance has been edited & science has been made more open. + - maptweak: Medical has been remapped to be more efficient and increase workflow. + Rebruiza: + - rscadd: Individuals with the "Floorlength Braid" hairstyle now occasionally trip + on their hair. + Tlc2013: + - rscadd: Added the legendary CRT Test screen to IPC monitors. + mkalash: + - rscadd: All gloves that are available in the load out now have pre-modified versions + in the xeno load out. + - rscdel: Removed parapen, parasting, and the stun talisman. + sabiram: + - tweak: Maintenance drones now have spray bottles instead of soap. The cleaner + refills in chargers. + - rscadd: Hyposprays have been upgraded and now use removable vials instead of a + internal storage. + - tweak: Voice changers available in the upload now have chameleon mask functionality. + - rscadd: Holsters have been added to the gun cabinets. + - rscdel: Holsters have been removed from the bridge officer and Sol pilot's lockers. + - tweak: Gun cabinets now have a chance to spawn a small e-gun instead of the full + sized variant. +2017-11-11: + chaoko99: + - bugfix: Puts some jackboots in all the security lockers. Your feet will no longer + be cold. + mkalash: + - tweak: Welding tool sizes have been rebalanced. Namely, the industrial welding + tool is now too large for a tool belt. + - rscadd: To balance this out, engineers can now easily carry spare welding fuel + cartridges found in the welding locker and hot swap them out, actually increasing + the welding capacity of the typical engineer. + - bugfix: Experimental fuel tanks now automatically refill, as intended. + - rscadd: The experimental welding tool can now be produced in rnd. +2017-11-19: + Casper3667: + - tweak: Passengers (the job) can now use corporate uniforms. + - rscadd: NT corp uniform is now available in the loadout. + Chinsky: + - tweak: Ordering gun crates now requiers elevated alert level, Blue for small ones, + Red for big guns. + CrimsonShrike: + - rscadd: Now catwalks can be built above plating. + - tweak: Reinforced floor now requires 1 steel sheet instead of 2 rods. + - rscadd: Added catwalks. Can be built by using rods on existing lattice. + - bugfix: Fixed lattice icons on openspace turfs. + Hubblenaut: + - rscadd: The telecomms broadcaster, relays, station bounced radios and intercomms + now broadcast to all connected z levels. + - rscadd: Adds a relay circuit board to the telecomms storage. + - rscdel: Removes relay rooms and replaces them with maintenance. + Orelbon: + - rscadd: Ghosts can now click on non-modular consoles and see their UI. + Rebruiza: + - tweak: Cable coils no longer do damage when thrown. + - tweak: Cable coils are now "ITEM_SIZE_NORMAL", instead of "ITEM_SIZE_SMALL". This + means that they no longer fit in pockets, but rather has to be in a larger container + or off the side of a toolbelt, as intended. + SamSamsonthe3rd: + - bugfix: Can now build ED209 with plate armor. + Serveris: + - rscadd: Added the WT45 pistol. + - tweak: Line Officers now spawn with said in their lockers, rather than energy + guns. + Zero-Bits: + - tweak: '"Library Improvements. Removed Adult Category, made USBN usable."' + atlantiscze: + - rscdel: Cyborgs can no longer be self-destructed through the remote console. + - rscadd: Cyborg's precise position is now displayed on the console instead. + - rscadd: The console now offers you an option to send direct message to a cyborg. + This message is independent on telecommunications and range. + chinsky: + - tweak: Humanoids able to vent-crawl can now bring select articles of clothing + and carry items which are not too big. + comma: + - tweak: Propellant in fuel bay changed, instead of plasma it's CO2 now. Thrust + should be more or less same, but less eternal fires and more space for engies + to increase said thrust. + dryerlint: + - rscadd: Added fuel port object. When mapped into shuttles (like Charon or GUP) + it gives them a finite fuel reserve, which must be refilled with phoron. + mkalash: + - tweak: You can now place crowbars in security belts. + sabiram: + - rscadd: Added the pry bar, a smaller crowbar, to the autolathe. + - tweak: The damage values of tools have been adjusted. + sabirm: + - rscadd: Added a supply crate containing ammunition for the executive heads' revolvers. + - tweak: The rubber ammo crate now contains two rubber .45, two flash .45, and two + rubber .44 magnum magazines on the Torch map. + - tweak: As part of the Great Gun Experiment, all ammunition is now hidden in the + autolathe. + sick trigger: + - rscadd: Ghosts can now Check-Radiation. + sick-trigger: + - rscadd: Ghosts will now be informed of the contests of examined closets/lockers. +2017-11-20: + sabiram: + - rscadd: Added a disguised syringe gun to the loadout. Comes complete with four + cartridges and four syringes. Chemicals not included. +2017-11-22: + Cirra: + - tweak: Radiation is now relevant again, due to material radiation resistance being + lowered. + SierraKomodo: + - rscdel: Removed xenophage and cortical borer from the list of add antagonist vote + options until these antag types can be fixes. + atlantiscze: + - tweak: Communication outages are overall less common. + - tweak: Communication outage has only 75% chance to affect each particular machine, + therefore with some luck, enough machines may remain functional to get at least + some working frequencies. The hub, broadcaster and receiver have 10% chance + to be affected, as they are critical for the whole telecommunications system. + - tweak: Increased chance of ion anomaly being announced. There is still a small + probability of the anomaly occuring silently. + - rscadd: It is now possible to reset EMP/ion/random event affected telecommunications + machinery with a multitool through the UI. The UI also shows a timer until automated + reset. + dryerlint: + - rscadd: Added fuel ports to Charon and GUP. They will consume fuel and eventually + run out + - rscadd: Added small refueling room to Hangar, for anyone with Supply Warehouse + access +2017-11-23: + Casper3667: + - tweak: Fixes up balaclava and half-gas mask sprites for taj. + - rscadd: Adds new shoes for taj called caligae. + CountAlex: + - rscadd: 'Away mission map: Damaged and abandoned Planetary Shield Orbital Station' + Dukica: + - rscadd: Added the braided beard facial hair style. + Orelbon: + - bugfix: Ghosts cant griff with jetpacks anymore. +2017-11-24: + CrimsonShrike: + - rscadd: Added Hydrogen canisters to supply request list. + Dukica: + - rscadd: Added new hairstyles. + FTangSteve: + - tweak: Add SCG Police tag to CoS carrier + - tweak: upgrade CoS armour plate + Kelenius: + - tweak: Camera networks have been sorted in an other that makes more sense. + mkalash: + - tweak: The welding pack is now too large for backpacks. + - rscadd: You can now attach welding tools to welding packs via drag drop. + - rscadd: Welders now show an overlay of what fuel tank is attached, if any. + - tweak: Fuel cartridges are now welding fuel tanks. + orelbon: + - rscadd: New sprites for the 2x1 white airlock. +2017-11-25: + Kelenius: + - tweak: Teleporters don't need to be test-fired anymore. + sabiram: + - tweak: The XO now has unrestricted access to the Aquila. +2017-11-26: + CrimsonShrike: + - bugfix: '"Fixes openspaces above shuttles retaining image of the floor."' + chinsky: + - tweak: Melee attacks will now always hit targets with the Help intent selected. + comma: + - rscadd: Added EC directives plaques on Bridge/Charon/Exped Prep/walls near flags + in cryo etc. Their tl;dr is go explore instead of twiddling thumbs. + sabiram: + - rscadd: Added purple, orange, green and red carpets. + - rscadd: Added blue, blue and silver, purple, orange, green and red carpet tiles + to the supply computer. + - tweak: Changed the brown and blue carpet icons to match the new ones. +2017-11-28: + Casper3667: + - rscadd: Adds new taj security voidsuit sprites from Serveris. + FTangSteve: + - rscadd: makes item slowdown impacted by species strength + - tweak: changeling transform now takes time with a progress bar based on mob_size + difference + sabiram: + - rscadd: Vials can now be placed in bandoliers. +2017-11-29: + Chinsky: + - tweak: Meteor mode now progresses a bit faster on difficulty scale, and can produce + bigger waves in the end. + CountAlex: + - rscadd: Adding new map for overmap list - raided casino ship. + Orelbon: + - rscadd: Self Destruct Sequence Has been revamped. + - rscadd: Keycard device can now be used to get the nuke code. + - tweak: Keycard device now waits 3 seconds for someone else to swipe. + - rscadd: The vault has been replaced by the self destruct room on deck 1. + - tweak: The engineering supply room was moved into the side of the hallway on deck + 1. + - tweak: The vacant office was moved to behind the self destruct room. + Spookerton: + - bugfix: Fixes cyborgs being unable to repair doors. + Techhead0: + - tweak: Removes age gate from Janitor + - tweak: Changes crewman alt-tiles to "Trainee" instead of "Junior" + Zero-Bits: + - tweak: Ports the Library to the Modular Computer System + sabiram: + - rscadd: You can now drink from buckets and beakers by clicking with the HELP intent. + Clicking with HARM intent splashes/spills. + - rscadd: 'Added new scrub and surgical cap colours to random spawns and loadout: + white, lilac, teal, and heliodor.' + - rscadd: Added colour selection to scrubs and surgical caps in the loadout. + sick trigger: + - rscadd: Finalizing a matchmaking connection now informs the other player. +2017-12-01: + Casper3667: + - rscadd: Deck officer, pathfinder and explorers now got binoculars in their lockers. + CountAlex: + - tweak: Changed Biogenerator UI to nano-ui instead of basic HTML. + Dukica: + - rscadd: Added 3 new masculine hairstyles (Slick, Average Joe, Messy) + sabiram: + - maptweak: Added an AI holopad to security processing. + - maptweak: The XO once again has access to an AI holopad in their office. + - rscadd: Suit jackets, suit pants, baggy suit pants, and athletic shorts are now + colour-selectable in the loadout. + - maptweak: 'Added some cameras to the infirmary: one in the operating theatre, + and two in the main treatment centre.' +2017-12-02: + FTangSteve: + - tweak: new sprites for nabbers + - rscadd: can shift equip overlays on per species per slot per direction basis + sabiram: + - rscadd: Added a black pocketbook to the backpack selection. + - rscadd: Added a few dresses. The short dress is available in the loadout with + colour selection. Dresses in two styles and four colours are now available in + the uniform vendor for formal occasions for civilians. +2017-12-03: + BlueNexus: + - rscadd: Added a new creature, which can be found on certain away missions +2017-12-04: + Orelbon: + - tweak: Remapped the Lounge + Zero-Bits: + - bugfix: '"Fixed library program UI and bookbinder linking."' + sabiram: + - tweak: Sunglasses now apply a screen overlay when worn. + - tweak: A makeshift duct tape blindfold can now protect your eyes from welders, + if you don't mind welding blind. + - balance: All HUDs and other glasses types with electrical components are now vulnerable + to EMP, and will disorient you and turn the HUD off when hit. Neither of the + effects are permanent, and you can turn your kit back on right away. + - balance: Any glasses type with night vision no longer has flash/welder protection, + or is otherwise vulnerable to flashes or welders. + sabiram & chinsky: + - rscadd: The tobacco plant can now be grown, with a couple mutates. + - bugfix: Electronic cigarettes should no longer be more harmful than regular cigarettes. +2017-12-06: + PsiOmegaDelta: + - tweak: Character Setup - Some backpacks now have additional setup options. + sabiram: + - rscadd: Added a black pocketbook to the backpack selection. +2017-12-07: + BlueNexus: + - tweak: Slightly buffed "Mehren" + Casper3667: + - tweak: Taj can no longer use zeng-hu or veymed prosthetics or body. + CountAlex: + - rscadd: Added Oxygen regenerator device for Atmospherics. Device takes from an + input pipe CO2 and slowly feeds O2 to an output pipe and drops chunks of coal + on the top tray of the machine. + FTangSteve: + - rscadd: Add new emotes for nabbers. + atlantiscze: + - tweak: AI can now hack multiple APCs at once, assuming it has enough CPU power + to begin the hack. AI can use abilities while hacking an APC (the hacking task + has been completely isolated) + - tweak: AI can now use its abilities during system override. On torch the override + takes quite a long time due to larger amount of APCs, and during this period + the AI is otherwise very vulnerable. + - tweak: Failed advanced encryption hack now offers you to retry the hack without + having to copy-paste/write the message again. This should make the ability a + bit more comfortable to use. + dryerlint: + - rscadd: Added nuclear football (secure briefcase with disk, pinpointer, instructions, + and laptop) + - maptweak: Removed nuke disk and pinpointer from CO's office, replaced with nuclear + briefcase. Added pinpointer to Bridge Storage. + sabiram: + - balance: Flashes have been reworked when attacking humanoid targets. + - balance: Instead of stunning for 20 seconds, they will stun for up to 7 seconds, + and blur vision and confuse for up to 18 seconds. + - balance: Flash stun duration for silicons has been reduced from 10-20 seconds + to 8-12 seconds. + - tweak: The area-of-effect attack for flashes now blurs the eyes of those affected, + in addition to flashing them. + - rscadd: Flashes can now have varying effects by type. + - tweak: The flash used in robot construction is now weaker than the base flash, + but breaks just as often, instead of every time its used. + - tweak: The spray projectile fired from peppersprays now moves much faster and + their capacity has been increased from 4 shots to 6. + - tweak: Pepper spray now incapacitates for an additional 2 seconds. +2017-12-08: + Banditoz: + - tweak: Overmap is now a lot more hostile. + dryerlint: + - rscadd: Added the SolGov flag, a variant of the existing flags, but with SolGov + logo on it. It is found in Exploration Storage. +2017-12-09: + Casper3667: + - tweak: The taj species blurb in char setup has been updated. + sabiram: + - rscadd: A more gentle carp event has been added to the overmap to supplement the + more dangerous version. The event icons with three carp are the more dangerous + schools. + - rscadd: Space carp can now be encountered on the overmap. + - rscadd: Ion clouds have condensed in the vicinity of the ship and can be collided + with on the overmap. +2017-12-10: + sabiram: + - rscadd: Added a few different colours to the satchel and pocketbook selection + in character setup. +2017-12-11: + Orelbon: + - maptweak: Xenobotany Has been remapped for space and usability. + - maptweak: Xenoarchiology lab has been moved to the Petrov. + - maptweak: Misc Lab is now a circuit lab and a small chemical testing chamber. + - maptweak: A chemistry station & toxins have been added to the Petrov. + Techhead0: + - rscdel: Science wing and channel has been reverted back to purple. + dryerlint: + - tweak: Flags can now be placed on any terrain/turf, except for space +2017-12-12: + BlueNexus: + - tweak: Nerfed the .50 pistol fire rate and recoil. + Hubblenaut: + - rscadd: Atmospheric pumps can be toggled by alt clicking. + - rscadd: Carafes and implanters are now available in the autolathe. + - bugfix: Implants are now trackable across connected z-levels. + Kelenius: + - tweak: Merchant now has two slots. + mkalash: + - tweak: Spacemen no longer pin their IDs to their skin when they roll down their + jumpsuits. + sabiram: + - tweak: Mounted flash effect changed from 20 seconds of knock down to 6 seconds + of knock down followed by a further 10 seconds of stun - a total of 16 seconds + of useful disable - followed by a further 8 seconds of confusion. + - tweak: Flash and flare cartridges now inflict more agony damage. + - rscadd: Flash and flare cartridges now blur the vision and disorient those within + their flash ranges - tiles adjacent to the explosion for flashes, and two tiles + adjacent for flares. +2017-12-13: + Techhead0: + - tweak: Vey-Med prosthetics are now restricted to humans only. Zheng-Hu is now + restricted to humans and IPCs. +2017-12-14: + Casper3667: + - rscadd: Vox gas masks are now available for vox in the loadout. + sabiram: + - rscadd: Control+Alt clicking a PDA will now toggle the flashlight. + - rscadd: Control+Alt clicking closets and lockers is now a shortcut to the toggle + open verb. + - tweak: AI door electrification shortcut moved from Alt-click to Control-Alt-click + to remove conflict with Alt-click inspecting the turf. +2017-12-15: + IsdatAfamas: + - rscadd: '"Added a small ship as an overmap location."' +2017-12-16: + sabiram: + - rscadd: Added new varieties of smokable to the smoking vendor. +2017-12-17: + BlueNexus: + - tweak: The WT45 now fires slightly slower, and is more accurate. + - tweak: The Mk58 now fires slightly faster, and is less accurate. + - tweak: Revolvers fire slightly slower, in general. + - tweak: Adjusted fluff for several firearms + - rscadd: The CO's revolver has been replaced with an autorevolver. + ParadoxSpace: + - bugfix: Diona now properly regenerate organs and limbs. +2017-12-19: + Casper3667: + - rscadd: Surgeon borgs now have defibrillator. + - rscadd: Crisis borgs now have medical tape. + - rscadd: Engie borgs got atmos atmos tape. + - rscadd: Security borgs now have a megaphone module. + TheWelp: + - rscadd: Reworks early game deity. No longer have to dole out spells and you regenerate + power 100% faster. +2017-12-27: + BlueNexus: + - spellcheck: Renamed the 9mm machine pistol to the 9mm submachine gun + - bugfix: Fixed the WT45's empty icon not showing + Broseph Stylin: + - rscadd: Added colored helmet covers matching the plate carriers. Available in + the loadout. + Casper3667: + - rscadd: Taj are now forced to have Siik'maas. + Chinsky: + - rscadd: Added some sekrit documents to CO/SCGR offices in sealed envelopes. Don't + really affect anything, just fluff. Moved RD's secret memo to an envelop in + his office too, put a copy on Liason's desk. + CountAlex: + - tweak: Turns casino liner into actual overmap ship with a small shuttle. + - rscadd: Adding new map for overmap list - hidden deep inside asteroid slavers + base. + Kelenius: + - rscadd: Hydroponics now has bees and space for bees. And some chemical machinery. + Orelbon: + - tweak: Laser carbine has 10 more damage and +2 accuracy. + - tweak: Taser carbine now has 12 shots, +1 accuracy and looses its 10 armor penetration. + - tweak: Stun rifle now has 10 shots, +1 accuracy,+10 armor penetration,+5 burn + damage and looses 10 agony. + - tweak: Stun revolver now has 6 shots and 50 agony. + - tweak: Ion weapons shouldn't be horrible anymore, they now activate their emp + no matter what they hit. + - tweak: The rifle now has a max range of 2, and the pistol a max range of 1. + - tweak: Ion pistol max shots lowered to 6. + ParadoxSpace: + - rscadd: Added a regeneration mechanic to Unathi. This works on nutrition. + - rscadd: Unathi now get hungrier faster, and enough hunger starts to give you toxin + damage. + sabiram: + - bugfix: Mounted flashers will no longer permanently scramble ghosts' movement. + - rscadd: Added missing eye blurring effect to mounted flashers. + - tweak: Maintenance and construction drones now move faster. + - bugfix: Lockers can once again be welded shut. + - rscadd: Clicking a drinking glass with a spoon will now call the room to attention. + Just be careful. + tlc2013: + - rscadd: Ported over three IPC screens from Polaris. I think we're done there. +2018-01-03: + ParadoxSpace: + - experiment: Removes the AI from the job list for two weeks. + TheWelp: + - rscadd: Adds band-aid fix to deity spam via cooldowns. Will add graphical indicator + to show what the cooldown is later. + - rscadd: Modifies phenomena near structure logic to include all deity structures, + not just altars. +2018-01-04: + CountAlex: + - rscadd: Adds away mission map - Mobius Rift. +2018-01-05: + CountAlex: + - rscadd: '"Adds engineering program for monitoring shield generators."' + PsiOmegaDelta: + - tweak: Can now adjust (almost) all prefix keys. These are used for language selection, + emoting, etc. See Character Setup > Global > Prefix Keys +2018-01-06: + Casper3667: + - tweak: The CSA now has the crime scene kit in their locker. + - bugfix: Forensic is yet again capable of using the dna search function in records + and can also edit pictures in records. + Devildabeast: + - rscadd: Adds one Crime Scene Analyst slot to Security. They are a forensic contractor + job that are NOT responsible for law enforcement. +2018-01-07: + comma: + - tweak: Adds gauze roll to emergency survival boxes + sabiram: + - tweak: As a cost-cutting measure, all Sol uniforms are now cut from the same cloth. + Armour values have been genericised. + - rscdel: Sol uniform hats no longer provide any armour. + - maptweak: The hydroponics base away site has been updated. + - experiment: As part of AI removal testing, an additional robot slot has been added. + - rscadd: Command hardsuit control modules have been added to the EVA storage on + the bridge deck. + - tweak: Changed CE hardsuit values to sync somewhat with new these modules. + - rscadd: Added a ring bell to the holodeck boxing ring. +2018-01-08: + Casper3667: + - rscadd: Taj now have several new capes! + - rscadd: Cameras can now be found in the loadout. + Chinsky: + - rscadd: Shuttles now need proper docking codes set in their console, or the docking + won't initiate. + - rscadd: Codes can be found in CO's orders, or by using multitool on docking controllers. + You can also hit the button on docking controller from inside to initiate docking. + - rscadd: There is also a program that shows status of all docking ports and their + codes, can be used to remotely let people dock if they're waiting outside. + Techhead: + - rscadd: You now receive pain-flashes for all pain sources. + - bugfix: Possibly fixes an infinite paincrit bug. +2018-01-09: + Devildabeast: + - rscdel: Removes SolGov Pilot. + - tweak: Gives Bridge Officers access to pilot the Aquila and Guppy and accompanying + access. + - tweak: Bridge Officers now have the Pilot's headset. + - rscdel: Removes SolGov Pilot's locker from the Pilot's Lounge. + - rscadd: The Pilot's Qualification Pin is now an item in the loadout for Bridge + Officers who want to flash their fancy training. + Zero-Bits: + - tweak: Cult walls are just normal creepy now instead of super edgy. +2018-01-10: + CountAlex: + - rscadd: Adds away mission map - SEV Icarus irradiated crashsite. + Heptagon49: + - bugfix: Adds a hydrogen tank sprite, among others, for the transfer valve. + Kelenius: + - rscadd: Syringes can now inject people in body bags and cryo bags. + LorenLuke: + - rscadd: Added/changed alt-titles for engineering contractor. + ZeroBits: + - imageadd: '"Hydrogen now has its own canister and tank sprites"' + - spellcheck: '"TX on monitoring computers is now PH, as it should be"' + - tweak: '"Omni Filter and Omni Mixer throughput increased to match pressure regulator"' + - tweak: '"Flamethrower now uses Hydrogen"' + - tweak: '"Phoron canister made slightly more expensive via supply"' + - tweak: '"Hydrogen canister made slightly more expensive via supply"' + - tweak: '"Filters and Mixers can now handle Hydrogen"' + - tweak: '"Supermatter monitoring program and gas sensors can now detect Hydrogen"' + - tweak: '"Overmap shuttles now use Hydrogen by default"' + - rscadd: '"Added purchasable crates of portable Phoron and Hydrogen tanks. Cheaper + than a full canister, but with far less volume."' + - maptweak: '"The SM reactor is now set up for CO2 by default"' + - maptweak: '"The SM reactor now has a Phoron gatherer so you no longer shoot that + valuable Phoron out into space."' + - maptweak: '"Nitrogen is no longer available directly in the SM room (it never + meets energy or safety needs anyway)"' + - maptweak: '"The fuel Bay is now filled with Hydrogen (rocket fuel) instead of + Phoron (the supposed most valuable substance in the universe)"' + - maptweak: '"Most of the Phoron tanks and canisters on the map have been replaced + with Hydrogen. R&D and Engineering each retain one canister."' + - maptweak: '"The Phoron resevoir in atmos has been replaced with a hydrogen resevoir."' + - maptweak: '"The incinerator now uses Hydrogen instead of Phoron. You''re just + burning stuff, you don''t need to do it with gaseous money."' + - maptweak: The Supermatter core is no longer filled with N2 by default. + comma: + - balance: Attacks against legs and heads are now more likely to miss. + tlc2013: + - rscadd: Added sandals to the loadout selection. Because those weren't there before, + apparently. +2018-01-11: + chaoko99: + - bugfix: Synths can no longer fill mechfabs with their matter synths. + rainbowEscapist: + - rscadd: Adds the alt title 'Trainer' to the Passenger loadout. +2018-01-12: + Chinsky: + - tweak: Cryobags, cryo and general stasis changes. Main point is that stasis is + no longer binary on/off, it doesn't stop life ticking, just slows it down (usually + a lot). It chemical processing is slowed down too, so sometimes bigger stasis + is not better. + - tweak: Cryo. Being very cold now provides stasis on its own - and cryo is easiest + way of doing it. At 80K, it applies 20x stasis factor (life ticks once in 40 + seconds instead once in 2). + - tweak: Cryo chemless healing was slowed down a bit. It also no longer magically + multiplies chems in beakers by 10x. Cryox/clonex adjusted to work at same efficiency + with this change. + - tweak: Cold damage in cryo is now prevented by clonex or cryox, not cryopod itself. + On one hand you now NEED to have it in beaker if you care about patient, on + another - you don't need cryopod if you have those and sufficiently cold place. + - tweak: Cryobags. Cryobags no longer last forever. Their power drops every 5 minutes + - examine to see current. It starts at 20x and loses 25% every time, so 20x + to 15x to 11x in 10 minutes and so on. Will drop into nothingness at ~40 minutes + mark. + - rscadd: Stasis will make you drowsy, and at higher stasis settings you will fall + asleep eventually (15x or higher). + - rscadd: 'Sleepers can into stasis too! They have three settings: none, 3x and + 5x.' + FTangSteve: + - tweak: Changeling now can only get nabber DNA with direct absorption. + Hubblenaut: + - tweak: RCON program no longer shows SMES units and breakers offsite the Torch. + - tweak: Alarm monitoring program no longer shows alerts offsite the Torch. + - bugfix: Fixes deck four fore dock. + Sbotkin: + - tweak: RCA, Shield Generator and Emitter crates now require engine access. + TheTrollDoctor: + - rscadd: Adds the MedHUD Visor item to loadout. It's a ~stylish~ MedHUD reskin + accessible for Medical roles. + sabiram: + - rscadd: Added advanced flash, smoke grenade, and metal foam grenade launcher hardsuit + modules. + - tweak: The captain's hardsuit now has an AI container, advanced flash and smoke + grenade launcher. + - tweak: The XO's hardsuit now has an advanced flash and smoke grenade launcher. + - tweak: The CE's hardsuit now has a metal foam grenade launcher. + - bugfix: The rig mounted RCD's use cost has been reduced from 100,000 to 300. + - bugfix: The correct voidsuits can now be found in command EVA. +2018-01-14: + Hubblenaut: + - bugfix: Fixes the horrible mess of pipes that was xenobiology. + LorenLuke: + - rscadd: Adds timestamp to PDA messages. + Orelbon: + - tweak: Consoles have been resprited. + comma: + - tweak: Chemist is now its own job slot. Medical Contractor slots lowered by one. + - rscdel: Removed Mortician because you don't get more useless than that. + sabiram: + - bugfix: Autolathes now function as normal. + - tweak: Bridge Officers now additionally have basic explorer access. +2018-01-15: + Techhead: + - tweak: A survey of medical supplies found the size of pill bottles woefully inadequate. + Larger pill bottles with more pills have been issued. +2018-01-16: + CountAlex: + - tweak: '"Refactoring corpse spawners."' + chaoko99: + - rscadd: Lasers and muzzle flashes now illuminate their surroundings. + - tweak: Beams are not visible quite as long due to vast optimizations in how they + are rendered. + - tweak: Muzzle flashes will now appear over lighting, and do not last nearly as + long. + - tweak: Bullets now fly more smoothly towards their targets. + - bugfix: Fixes a bug that caused the L6 SAW to load an empty sprite when closed + without a box magazine inside. + comma: + - tweak: Overmap size has been decreased. + - tweak: Number of overmap events has been decreased. + - tweak: Potential number of away missions has been decreased. + - bugfix: Ashtrays now empty their contents when thrown. + - tweak: Torch now starts at a random location on the overmap +2018-01-17: + Banditoz: + - maptweak: The GUP airlock now works. + Chinsky: + - rscdel: After yet another PR fiasco over field executions, Marine contingent is + no longer allowed on Torch. Those not under active investigation are offered + a transfer to Expeditionary Corps if they want to participate in the mission. + Earthcrusher: + - tweak: Thanks to the tightening of SCG industrial safety guidelines, you now must + be on harm intent and wait a few seconds before blowing up a fueltank with a + lit welder, lighter, or other handheld source of flame. + chaoko99: + - rscadd: cloaked mobs (ninjas and whatnot/Mehren) can now be spotted via T-ray. + - bugfix: Lasers will no longer fail to disappear during bluespace jump. +2018-01-18: + Chinsky: + - tweak: Modular computer programs were patched to allow more abuse. Now they use + the access of user who started them, instead of constantly checking for current + user's. + Orelbon: + - bugfix: Suit storage units now check for access. + - tweak: Suit storage units don't drop items when the powers fails anymore. + - tweak: Suit storage units can now be pried open when they are powered off and + not locked. + - tweak: Suit storage units can now dispense items when they are offline. + 'author: PrismaticGynoid': + - rscadd: Adds the ability to 'crawl' to an adjacent turf by click-dragging yourself + to it, after a delay. This can be used to move while unable to stand. You can + also do this with other movable objects, if you really wanted to. + - tweak: Conscious mobs lying on the ground can now buckle themselves to chairs/beds. + This includes people missing legs. + chaoko99: + - rscadd: Plasma cutter is now a gun, instead of a fancy drill. +2018-01-19: + Sbotkin: + - maptweak: The Pilot Lounge has been replaced with the Pathfinder's Office. + - maptweak: The NT pilot's voidsuit has been moved to the Petrov, with the cycler. + Techhead: + - rscadd: Corpsman and Engineers have been granted access to the hangar to help + them go on expeditions. Or help with the inevitable injuries and damage from + returning expeditions. You know, whichever. +2018-01-20: + Sbotkin: + - tweak: Changed required players for cult and deity from 5 to 10. +2018-01-21: + Orelbon: + - rscadd: Modular consoles now have colored keys per program. +2018-01-23: + Devildabeast: + - rscadd: Added a maglight to the Security Guard's locker. Yay. + comma: + - rscadd: Sharp things are now better at cutting plants, doing double damage. +2018-01-24: + Chinsky: + - tweak: Expeditionary Corps paygrades were adjusted - Explorers are now E3, Senior + Explorers are now E5. Brings Explorers more in line with 'default' rank of other + branch(es), Crewman/PFC. + - tweak: 'Senior Explorers: can no longer be Janitors, Masters at Arms. Can be Brig + Officers, Deck Officers, Senior Engineers.' + - tweak: 'Explorers: Can be Corpsmen, Forensic Techs.' + - rscadd: Can now use IV bags to give IV to people - drag it onto them to start. + Only works when bag is held in hand by someone. + - rscadd: Can now use syringes to change contents of IV bags. + - tweak: IV bags now hold 120u instead of 200u. Their size is dynamic - tiny item + when empty, turning into normal sized (doesn't fit in pockets etc) when over + 60u inside. + - rscadd: Can now set transfer rate of IV drips with a verb. + - tweak: Blood bags in medical and orderable crates were replaced with NANOBLOOD. + The normal blood was just not as efficient with size/transfer rate changes. + Using NANOBLOOD nets you more or less same re-blooding speed. + FTangSteve: + - tweak: Bioprinter will now print species-specific internal organs if they are + available + Novacat: + - spellcheck: Fixed capitalization issue with Radiant Aura + - rscadd: Added telepath (mRemoteSay) contract to all spellbooks + - tweak: Added 1 point to all spellbooks + - rscadd: Added Teleport, Cure Light Wounds, and Noclothes to all spellbooks that + lacked them + - rscdel: Removed Mage Armor from Standard spellbook, and Cure Light Wounds from + Cleric spellbook + - tweak: Swapped Focus staff for Scrying orb in Cleric book + - rscadd: Added X-ray contract to Battlemage book, parrot transformation to Druid + book + - rscdel: Removed Student spellbook + - tweak: Made staves slightly smaller, so that they are more portable + - rscadd: Overhauled cure spells to be more effective + - tweak: Reduced cost of Spatial's magic missile to 1 + - tweak: Boosts healing spells ability to purge radiation + - tweak: Fixes sacrifice self-damage + Sbotkin: + - rscadd: Adds mounted cooling units, available in all hardsuits. +2018-01-25: + chaoko99: + - bugfix: Attacks will no longer phase through dead or otherwise incapacitated slimes. + - tweak: Slime surgery is generally faster and now supports researched scalpels + and incision managers. +2018-01-26: + Casper3667: + - bugfix: Torso tattoos now works! + CrimsonShrike: + - rscadd: You can now move down onto turfs containing climbable atoms (tables, machinery). + chaoko99: + - imageadd: Removed paint drips from door sprites and doubles their framerates. +2018-01-27: + Casper3667: + - rscdel: Taj curly, housewife, victory curls and finger curls hairstyles have been + removed. + CountAlex: + - tweak: '"Lowered the temperature at which a mob receives lung damage from -13C + to -30C."' + Orelbon: + - rscadd: New glass door sprite. + chaoko99: + - rscadd: Added a parallaxing background space that changes colors every round. +2018-01-28: + Casper3667: + - rscadd: There are new bandanas in the loadout that can be worn on the head and + over the mouth. Old bandanas are still available in the loadout. + Devildabeast: + - rscadd: Adds the decorated harness, an Unathi-exclusive accessory complete with + two dueling knives, to the loadout. + - tweak: Changed the dueling knife to a piss-weak variation of the kitchen knife. + - tweak: Changes scarves to be allowed for semi- and formal roles in the loadout. + Sbotkin: + - tweak: Several loadout access tweaks. More things for civilians and pilot's pin + for the CO, XO, and Pathfinder. +2018-01-30: + Chinsky: + - tweak: Shuffled around EC uniforms. SERVICE uniform is now a thing of its own, + NOT a mix of utility+service. DRESS uniform is now service uniform + dress jacket + + gloves. + - tweak: R&D lab refluffing. No longer 'Research', it is now called 'Fabrication' + Lab. You are not 'discovering' things anymore. You are using high-tech fabricator + that uses self-learning matrix to direct nanobots. Problem is, IT KEEPS GETTING + MEMORY CORRUPTION. You are re-training bots by letting them practice on less + complicated things before they can tackle more challenging blueprints. + Devildabeast: + - tweak: Gives the NanoTrasen badge to the NanoTrasen Liaison in their backpack; + removes it from the NT formal outfit. + chaoko99: + - tweak: Trash bags are no longer denied from holding the nuke disk. Try and figure + that one out. +2018-01-31: + CountAlex: + - rscadd: '"Adds away mission map XCV Ahab''s Harpoon."' + Memescope: + - rscadd: Added new hairstyles, some ported from Eris. + - tweak: Low Bun back sprite tweaked. + - tweak: Half-Shaved Emo renamed to Long Side Emo. + chaoko99: + - rscadd: The T-Ray scanner now can be toggled via an action button. + - bugfix: Lasers now exist long enough that the game is likely to actually render + them most of the time. I blame our tickrate. + comma: + - rscadd: '"Added Fleet patches for their respective Fleets of origin to loadaout. + Check https://wiki.baystation12.net/Defence_Forces#The_Fleet for more deets"' +2018-02-01: + Dukica: + - rscadd: Adds new hairstyles and beards. + FTangSteve: + - rscadd: '"Upgrading to aggressive or initiating normal grab now enters struggle + if victim isn''t on help intent."' + ZeroBits: + - bugfix: '"Heat Exchange Pipes can now be properly constructed."' + - tweak: '"Heat Exchange Junctions will now exchange heat."' +2018-02-02: + FTangSteve: + - tweak: '"Nabbers now have hue shifted sprites available"' +2018-02-03: + Hubblenaut: + - bugfix: Fixes plating being dark when prying off floor tiles. + Sbotkin: + - tweak: Added kitchen access to bartender and bar access for chef. + - rscadd: Added a bar locker. + - maptweak: Added actual bar stools to the bar. + - maptweak: Removed wall-mounted safe from the bar. + 'author: FTangSteve': + - tweak: Makes struggle grab state shorter and causes confusion to make resisting + grabs more difficult + chaoko99: + - bugfix: You can now crawl through vents without worrying about carrying reality + (The skybox) in your body! Squeek! +2018-02-04: + Hubblenaut: + - bugfix: Fixes alert monitors being red for away mission alerts. + - bugfix: Fixes nonmodular atmos/alert consoles showing away mission alerts. + Sbotkin: + - rscadd: Polarized windows are now buildable. Click a reinforced one with a cable + coil. + - rscadd: Their IDs are changeable as well, use a multitool on windows and buttons. + Techhead: + - bugfix: Antag preferences default to Low again instead of Never. Relatedly, your + preferences will now longer display Never when they haven't actually been set + as such, fixing a bug causing unwilling players to be drafted for antag status. + TheTrollDoctor: + - rscadd: Gives Engineering Contractor, Medical Contractor and Research Assistant + access to the hangar. +2018-02-05: + Hubblenaut: + - bugfix: Camera alarms get cleared upon repair. + PsiOmegaDelta: + - tweak: Labels that have been attached using a hand labeler will now be remain + even if the name changes. + - rscadd: Attached labels can now be removed using the "Remove Label" verb in the + "Object" category. + sabiram: + - bugfix: Corrected chemist slot loadout issues. + - bugfix: NanoTrasen security staff can now use their provided holobadges. +2018-02-06: + Hubblenaut: + - rscdel: Removes Captain's spare ID card. + Sbotkin: + - tweak: Supermatter hallucination does not affect people without eyes or with synthetics + eyes. +2018-02-07: + Hubblenaut: + - bugfix: Fixes windows not visually connecting. + Sbotkin: + - tweak: Adds the medical channel to the roboticist's headset +2018-02-08: + Devildabeast: + - rscadd: Added the alternate titles of "SolGov Ombudsman" and "Inspector General" + to SolGov Representative and "NanoTrasen Representative" and "NanoTrasen Executive" + to the NanoTrasen Liaison. +2018-02-09: + Casper3667: + - rscadd: The utility uniforms (EC, general and EC skirt) now looks better on taj. + Additionally so does the welding helmet. +2018-02-11: + ZeroBits: + - tweak: '"Dark Floor Tiles can now be made with steel."' +2018-02-12: + Hubblenaut: + - tweak: There is now an announcement when the rampant brand intelligence was successfully + gotten rid of. + - tweak: The origin vending machine now shoots a lot more aggressively. + - tweak: Blinking red light on a vending machine now means that it shoots. + - bugfix: 'Hacker event: Hacker was destined to always lose. Fixed.' +2018-02-13: + CountAlex: + - rscadd: '"Adds away mission map - Lar Maria."' +2018-02-16: + Techhead: + - rscadd: Adds a new matchmaking relation, Childhood Friend. It'll only pick people + from the same home system with the same approximate age. + - tweak: Served Together now prefers to match people with others in the same branch. +2018-02-17: + sabiram: + - tweak: The mounted plasma cutter found on hardsuits has been converted to a projectile + weapon, like the stand-alone item. + - balance: The hardsuit mounted plasma cutter's ammo capacity has been reduced to + 4 from 10. +2018-02-19: + Techhead0: + - bugfix: PDAs and Air Alarms should now detect exotic gases a little better. Phoron + is now counted as an exotic gas for these purposes. + sabiram: + - balance: Stun weapons are now much less effective against simple animals, such + as carp. +2018-02-22: + Hubblenaut: + - bugfix: Fixes gravity event bringing people to fall in areas that do not usually + have gravitation. + chaoko99: + - rscadd: Ctrl clicking a table will flip or unflip it. +2018-02-25: + Hubblenaut: + - bugfix: Fixes the handheld teleporter only working as expected when adjacent to + teleporter hub. + - bugfix: Fixes the ref2name converter only working when adjacent to target. + - tweak: Medical scanner integrated circuits now work in vision range. + - bugfix: Fixes ducttape not being able to be picked up. +2018-02-26: + Banditoz: + - rscadd: Dog tags now have useful information on them upon spawn, including branch, + religion, and blood type. +2018-02-27: + sabiram: + - rscadd: The null rod can now purify cult floors in addition to walls. + - balance: The null rod's damage has been reduced. + - tweak: Maw creatures, ghost dogs, faithless and shades are now take additional + damage from the null rod. + - tweak: The null rod is now the null sceptre, a normal sized item. +2018-03-03: + LorenLuke, TheTrollDoctor, ChaosAlpha, sabiram: + - rscadd: Humans with sufficiently long hair can now tie their hair into different + styles using the 'Tie Hair' verb in the IC category. + mkalash: + - tweak: Infections get worse much more quickly (from ambient to acute in five minutes, + acute to septic in 10 minutes) + - tweak: Antibiotics take longer to work and infections acute and above require + antibiotics and rest to cure. +2018-03-04: + Banditoz: + - tweak: The shield generator's emergency shutdown function is now hidden behind + a hackable wire. + - tweak: Cut down the shield generator's emergency shutdown time by 50%. + - tweak: The EMP from the emergency shutdown scales with current charge--and is + guarenteed to happen. + Hubblenaut: + - rscadd: The access decrypter now allows the user to choose an access code instead + of picking one by random. + sabiram: + - rscadd: Some simple_animals, most notably humanoid enemies, can now escape nets. +2018-03-05: + Banditoz: + - rscadd: The Chaplain's locker now has a bible. + Novacat: + - tweak: 'Advanced First Aid Kit: Swaps inaprovaline autoinjector for assorted pill + bottle.' + - tweak: 'Burn First Aid Kit: Adds three ointment kits, swaps inaprovaline autoinjector + for tramadol autoinjector' + - tweak: Oxygen first aid kits now contain inaprovaline pill bottle, dexalin pill + bottle, and four inaprovaline autoinjectors + - tweak: Toxin first aid kits now contain a dylovene pill bottle, three hyronalin + pills, and four autoinjectors of dylovene + - tweak: Autoinjectors are now the same size as syringes + - tweak: Emergency Oxygen/Nitrogen Tanks now start off full + - tweak: Regular Nitrogen tank starts off at the same level as oxygen tanks + - tweak: Paracemetol's painkiller effect increased from 25 to 35 + Sbotkin: + - maptweak: The D2 Teleporter and the Custodial Closet are swapped. + - maptweak: The Drone Bay's door access is changed to robotics and no longer bolted. + chaoko99: + - rscadd: Research goggles now readoff research levels, as well as an item's matter + contents. When used to examine reagent containers (Beakers, burgers, bloodbags), + it will read off the contents. But . . . + - bugfix: get_reagent() no longer returns a given reagent's path. + thefrostycoder: + - rscadd: Languages that you can understand will now be named when they are spoke. + (Ex. ' enunciates in Selenian') +2018-03-06: + thefrostycoder: + - bugfix: Fixed random paint drips on doors. +2018-03-08: + chaoko99: + - tweak: Most bots will now render below a human. + - rscadd: Floorbots will now assume the colors of the toolboxes used to make them. + - imageadd: Added a Syndicate floorbot. Sadly, he is not evil. + - imageadd: Advanced trauma medibot added. + - bugfix: Cleanbot works now. +2018-03-10: + Rebruiza: + - soundadd: APC's now play a satisfying sound when they run out of power. + - soundadd: Maintenance now has ambience. + - soundadd: Fire alarms now have a new sound. + - soundadd: Airlocks and bolts now have a new sound. + - soundadd: Blast doors now have a new sound. + - soundadd: Suit storage units now have a new sound. + - soundadd: Lockers now have a new sound. + - soundadd: Touching metal walls now have a new sound. + - tweak: The sound of tube lights turning on is now louder. + Techhead0: + - rscadd: You can now temporarily reseal damaged spacesuits with duct tape. Either + click on the suit itself, or target the chest and click on a mob wearing a spacesuit. + But be warned, further damage will tear off the patch. + TheWelp: + - rscadd: Adds a temporary effect object to make spells look prettier. + sabiram: + - rscadd: The Sol Representative and the NT Liaison have been provided a fancier + pen in their PDA for writing their important documents. +2018-03-11: + Devildabeast: + - rscadd: Adds a Morpheus Cyberkinetics uniform to the loadout. +2018-03-12: + chaoko99: + - rscadd: Cremation now takes time. Doing so with a live subject inside will cause + it to rattle around violently. You monster. + - rscadd: You can now resist out of a crematorium on a short timer. You may also + eject someone from a crematorium from outside it on a similar timer. + - bugfix: Crematorium now uses a glowing sprite when active. + - imageadd: Changes the crematorium and morgue slab sprites to something cleaner. +2018-03-13: + chinsky & sabiram: + - rscadd: Belts and towels can now be worn on the belt slot, even with no clothing + equipped. + mkalash: + - rscadd: Added secure energy guns, which require registration to a user and are + locked to stun without additional per-mode authorization. Secure small energy + guns replace security's tasers. + - rscadd: NTsec now also get a shock mode for their revolvers, which is also locked + behind command authorization. +2018-03-14: + Banditoz: + - tweak: Everyone is now able to use dog tags. + Devildabeast: + - tweak: Off-Duty is now a separate role from Passenger, and is allowed to wear + Service and Dress uniforms. + mustafakalash: + - rscadd: You can now deface people's heads by targeting it with help intent and + using a pen, crayon, or lipstick -- even if it's no longer attached. Heads with + shoulders below them can be gentrified using a shower, or in a sink otherwise. + - bugfix: You can no longer apply lipstick to things without lips. + sabiram: + - rscadd: The King of Goats now has a chance to enter a 2nd phase in combat. +2018-03-15: + Devildabeast: + - tweak: Forensic Technicians can now be Civilian Contractors. + - rscdel: Private Investigator has been removed as an alternate title from Passenger. + afterthought: + - bugfix: The Odysseus syringe gun can now synthesize reagents. + - bugfix: Slipping out of mechas during gravity failure fixed. + sabiram: + - maptweak: The pens that previously spawned in the CO and XO's offices now spawn + in their PDAs, instead. +2018-03-17: + Sbotkin: + - tweak: Makes thick clothes to protect from changelings' stings. + - tweak: Makes buosuits thick. +2018-03-20: + Banditoz: + - rscadd: You will now be thrown around while on a shuttle if you aren't buckled. + Devildabeast: + - bugfix: Corrects a typo in the code, gives the Contractor Forensic Technician + the correct badge, and gives them additional items in the loadout. +2018-03-21: + Chinsky: + - tweak: Non-broken ribs/skulls now protect the internal organs a bit. + - tweak: Bullets no longer damage internal organs twice. As an effect organ damage + from bullets is lowered significantly. + Hubblenaut: + - rscadd: Adds the Disciplinary Board Room. + mustafakalash: + - bugfix: Using resist to unbuckle yourself no longer temporarily breaks your hands. +2018-03-22: + Chinsky: + - bugfix: Mass-spectrometers now actually display names of reagents. + Crushtoe: + - bugfix: For the very first time, toggle-hub-visibility works. + Devildabeast: + - rscadd: Adds a uniform for Skinner Catering and a pin for the Free Trade Union + to the loadout. + afterthought: + - bugfix: Various borg gripper fixes, including self-upgrading, cooking, APCs, and + mecha + chaoko99: + - rscadd: Xenophage cultists are now a feature-- They are allowed to ventcrawl with + tomes, robes, and swords. Also monkies I guess. + mkalash: + - rscadd: You can now toggle off showing end titles. + mustafakalash: + - rscadd: Staff now have the ability to mark variables to easily view them in an + auto-updating panel. + sabiram: + - imageadd: Secure energy guns are now visually distinct. +2018-03-24: + Atebite: + - rscadd: Telecommunication servers now have tagging rules which determine the radio + channel name and color for a given frequency + sabiram: + - rscadd: Hardsuit rig modules damaged by EMP can now be repaired with nanopaste. +2018-03-25: + Devildabeast: + - rscadd: Adds a gyroscooter, a subtype of the space bike. + - maptweak: Adds a gyroscooter to the Research Director's office. + TheWelp: + - tweak: Tweaks zombie turn rate. Should be non-impossible. + - bugfix: Fixes zombie consume. + sabiram: + - rscadd: Wall mirrors are now containers, and contain some things. + - tweak: F6 is now msay instead of asay for staff. +2018-03-26: + Banditoz: + - rscadd: Add the ability to rename a bible, or change its icon. + - rscadd: Add new bible sprites from tlc2013. + Devildabeast: + - tweak: Allows Dionaea to select Forensic Technician at chargen. + - tweak: Makes the Roboticist a hybrid role between Engineering and Medical and + gives them access to medical items in the loadout. + Earthcrusher: + - rscadd: Adds a package wrapper synthesizer. + - tweak: Clerical borgs now include a package wrapper synthesizer and destination + tagger. + - tweak: Clerical borgs now have a "clerical gripper", not a "paperwork gripper", + and can pick up small-sized packages. + - tweak: Clerical borgs now include the Supply channel, in addition to Service. + - tweak: The destination tagger will now give feedback when selecting a destination. + - bugfix: Back-end adjustments to how package wrappers and synth grippers are handled. + FTangSteve: + - tweak: changes injury specific medical kit contents to medical pouches. + - tweak: advanced medical kits are now purple. + - rscadd: adds small emergency medical pouches that require no medical training + to use. + - maptweak: adds new medical items around. + - tweak: adds medical pouches to nanomeds + TheGreyWolf: + - bugfix: Armor pouch colors can now be properly selected from loadout. +2018-03-27: + Atebite and Cakey: + - rscadd: Ironing equipment to get those unbecoming wrinkles out of your uniform... + or your crewmates + - bugfix: Washing machines no longer eat clothes +2018-03-28: + Cakey: + - imageadd: Fleet service and dress uniforms have been re-sprited to take on a navy + blue theme. Fleet uniforms have now been split into three categories, with lower + ranks recieving a sailors uniform rather than the non-commissioned officer's + coat. + - bugfix: Fixes service and exploration uniforms sharing the same datums. + Devildabeast: + - rscadd: Adds a forensic belt to the Forensic Technician's locker. + - maptweak: Changes the Forensics door from glass to regular. + Earthcrusher: + - tweak: The jukebox has been resprited. + - rscadd: New tracks added to the jukebox music selection; some have had their names + corrected. + sabiram: + - soundadd: The Emperor of Goats now comes complete with his own battle themes. +2018-03-29: + Bill-Luxe: + - rscadd: Ported railings from the Europa. You can now create it by using a different + material sheets. + Cakey: + - maptweak: Deck 4 has been re-worked. Supply now has a bigger warehouse and the + escape arms have been moved forwards. + - maptweak: Added the very important laundry room on deck 4, with ironing boards + soon to come. All washing machines outside of the laundry room have been purged. + - maptweak: Added green pens to liason and spare offices. +2018-03-30: + PurpleMartinJCK: + - bugfix: Fix medical crate sprites, adding back to storage.dmi + - tweak: Add pouch spawns to small medical random spawn + - tweak: Add trauma kit to medical kit spawn + - bugfix: Fix pouch names in venders + - rscadd: Add new pouch supply crates +2018-04-01: + Chinsky: + - tweak: Liver damage change. Now when it's not working right, it doesn't apply + staright up damage (only for alcohol), it builds up ammonia in the blood up + to toxic levels. Better get those scrubbers going. + - tweak: Kidneys are doing similar thing, but with potassium. + - tweak: Potassium now raises pulse, dangerously so over 10u. + - tweak: Bananas now have bit of potassium in them. + Devildabeast: + - rscadd: Ports Grayson Arms prosthetics from Polaris. + - rscadd: Ports robolimb optics from Paradise. + - tweak: Vox can no longer be selected as a species when building an FBP. + - tweak: Morpheus prosthetics are no longer restricted to IPCs. + - tweak: The Morpheus Alt. head is now the default and the Monitor is a subtype. + afterthought: + - bugfix: PDAs with medical access once again have a handheld medical scanner scanner + program. +2018-04-02: + Chinsky: + - rscadd: Finally swaps old stinky blood in Medbay for NANOBLOOD(TM). Use wisely. + - rscadd: Increased immersion. + - experiment: To further immerse you in your character, you now need to blink manually + if you have organic eyes. There's helpful messages to remind you of that now. + - experiment: To help new players acclimatize to our high RP standards, helpful + hints have been added, shown when you perform ceratin actions to guide to maximum + RP path. + - experiment: As an experiment, different kinds of guns can now be selected in custom + loadouts in Utility section. Everyone can get holsters too now. Spare ammo is + not included. + sabiram: + - balance: Wizards can no longer teleport to non-station Z levels. +2018-04-03: + Dukica: + - rscadd: With the addition of a fancy new, tentacular helmet, the Skrell can now + use the Rescue Module (Medical RIG) suit! + sabiram: + - maptweak: Added The Orb, a mining focused away site. +2018-04-04: + Devildabeast: + - maptweak: Adds a mech recharger to the Security Armory. + afterthought: + - bugfix: Fixes roller bed SSD bug. + chaoko99: + - bugfix: T-rays actually work on ninjas now. + - tweak: Portable atmospherics devices will now work off an APC if available. + mustafakalash: + - tweak: The Torch will once again always spawn on an asteroid. + - tweak: Changes occupation settings from a cycle to a list. +2018-04-06: + Devildabeast: + - tweak: Allows the Roboticist to select medical webbing vest, medical drop pouches, + and the medical poncho in loadout. + PurpleMartinJCK: + - rscadd: Wizards now have a spell that lets them make a long-lasting portal to + away sites. +2018-04-07: + sabiram: + - tweak: Wire brushes are no longer as effective a melee weapon as a pickaxe. +2018-04-08: + Chinsky: + - rscadd: Can now pick EC Directives as shackles for IPC. + chaoko99: + - tweak: Crawling now occurs by clicking a turf. + - tweak: Crawling is now significantly faster. + - bugfix: You can no longer drag other people, forcing them to crawl. +2018-04-09: + Devildabeast: + - maptweak: Adds green pens to the SolGov Representative's and NanoTrasen Liaison's + offices. +2018-04-10: + ParadoxonKomplikon: + - tweak: '"Exotic seeds do not contain certain reagents, such as alcoholic drinks, + anymore."' + - tweak: '"Exotic seeds'' production time is now generally shorter than before."' +2018-04-11: + CakeQ: + - maptweak: Replaces the conference room on deck one with a briefing room. + - maptweak: Added a table/shutter combo intbetween the captain's mess and briefing + room for the chef's use. + FTangSteve: + - rscadd: Makes breathing far more relevant + - rscadd: CO2 buildup is now potentially dangerous and must be scrubbed + - rscadd: Tank sizes have been adjusted and will need to be refilled more often +2018-04-12: + chaoko99: + - soundadd: 'C4, timers, and nukes will now make an ominous beeping noise. spriteadd: + Porta-nuke resprited, uses the porta nuke sprite from TG.' +2018-04-13: + FearTheBlackout: + - maptweak: Moves exosuit tracking beacon crate to Robotics Maintenance + chaoko99: + - bugfix: Crawling works while lying down again. + - bugfix: Crawling no longer functions in space. +2018-04-14: + Cajoes: + - rscadd: Added a lube variant called oil, comes in jugs of 100 units, dispensable + from robotics vendor. + - rscadd: Added beer and ale cans to the alcohol vendor. + - rscadd: Added lava lamps and office toys to the misc. supply menu. + - rscadd: Added fish meat and a big bag of salt to the kitchen. + - tweak: Changed contents of some drinks. + Cakey: + - imageadd: Adds new floor tile sprites. + - imageadd: Adds new floor decals. + - rscadd: Adds several new floor tile types to litter the station with. + Chinsky: + - rscadd: Can now use grab on EC plaques to display Directives to people. Forcefully. + PurpleMartinJCK: + - rscadd: Adds species based darkvision + - tweak: Tweaks light falloff calculations + sabiram: + - tweak: Species with better than average night vision are now more vulnerable to + flashes. +2018-04-15: + Chinsky: + - rscadd: Can use pill bottle on self aiming at mouth to quick-pop a random pill + from it. Yum. + HetNeSS: + - bugfix: Expedition storage area layout fixed. All lights should be connected properly + now. + - maptweak: Sorted out the expedition storage inventory. Piping, maint door location + adjusted. + Sbotkin: + - maptweak: Removed excess stuff (extra tools, consoles) from the forensic technician's + laboratory. + - rscdel: Removed excess tools from the forensic technician's locker. + sabiram: + - tweak: The automatic transfer vote called at 3 hours has been changed. The 'Continue + the Round' option will now extend the round by 30 minutes instead of 1 hour. + - tweak: The default type of robot in character select is now 'robot', a positronic + unit, as opposed to 'cyborg', which has a human brain. + - tweak: Robots with a computer chip based brain are now referred to as 'drones'. +2018-04-16: + Cakey: + - maptweak: The mess hall has been re-shuffled to allow for the cook to have more + of a presence. + Sbotkin: + - maptweak: The Chief of Security's Office is remapped. + - maptweak: The Board Disciplinary Room no longer has attributes of a high secure + area. +2018-04-17: + Banditoz: + - maptweak: More newscasters have been mapped throughout the Torch. + Sbotkin: + - maptweak: The Brig Officer's office is remapped. + Zuhayr: + - tweak: Xenomorph brute resistance, movement speed and and armour have all been + significantly adjusted. Be on the lookout for xenos being nerf OP and report + issues to the tracker. + afterthought: + - tweak: 'Skills are now selected on a per-job basis under Occupations. Warning: + current skill data will be lost!' +2018-04-18: + Banditoz: + - tweak: Non-living players may no longer cast votes of any kind during crew transfer + votes. + Cajoes/BloodyMan: + - rscadd: Ports TG Cigarette Paper code + - tweak: added four more cigarettes to cigarette packs + - tweak: gave a use for existing filter and cigarette paper icons + - rscadd: added icons for, lollipops, gum, nicotine gum, rolled cigarettes, filter-boxes, + gum-boxes, cookie-packs and spitwads + - rscadd: added icons made by Woah Hold There Buddy, (tobacco packs, chewing tobacco + packs,) + - rscadd: added chewable category, reskinned cigs you equip, chewing tobacco, lollipops + and gum added + - rscadd: added recipes for using the rolling papers to make cigs using dried plant + matter or pre-packed tobacco + - rscadd: added onmob animation for chewing gum (but not for nicotine gum) + HetNeSS: + - tweak: Added a capability for surgeon borgs to pick up an IV packs with their + organ gripper module. +2018-04-19: + chaoko99: + - rscadd: Fire extinguisher may now accept fluids from all forms of reagent containers + (HCL dispensers, capsaicin dispensers, coolant tanks, fuel tanks etc.) and spray + them at EXTREMELY low levels of efficiency (100 units a spray, wasteful for + most things.) Firefighter extinguishers may also accept in the same way. BEWARE. + - tweak: Water may now cool down to 20c when sprayed (Includes grenades, for example.), + with a diminishing return below 60c. + - rscadd: Like the above, coolant may be used to cool areas, best saved for phoron + fires or traitoring, because it's extremely efficient and may dip an area to + just a little over 0 kelvin if you're not careful. + - tweak: Extinguishers will fire multiple puffs of reagents instead of three sprays + at the exact same time. More or less consequence of a performance change. + comma: + - tweak: Replaces most eguns with secure variants. Swipe ID to register. + - tweak: Secure guns get all modes unlocked if it's Red Alert + - tweak: CO's revolver was moved out of locker into a display case +2018-04-20: + Sbotkin: + - maptweak: The Forensic Technician's office is remapped again, a lab added. + - maptweak: It's now possible to access the morgue as the fortech. + TheWelp: + - rscadd: Adds Spellbound Servants. Powerful minions of wizards, each with their + own gimmick and theme. + - rscadd: Implements two mutations, nobreathe and spaceres, in conjunction with + the spellbound. + chaoko99: + - rscadd: hydroponics trays, covers, and plump helmets have been re-sprited. + - tweak: Plump helmets are now repeatedly harvest-able, but require a high amount + of nutriment to sustain. You only harvest the 'helmet' of the plump helmet, + as well. + - tweak: Hydro trays will default to 5 lumen lighting for their covers +2018-04-21: + HetNeSS: + - maptweak: Morgue has been split up to two sections - "Morgue" and "Autopsy". Autopsy + - area created. + - imageadd: Autopsy - area icon added + - rscadd: Two sliding doors added to separate the morgue from the autopsy zone. + Morgue or Medical access level required on each one. Autopsy atmospherics controller + added. Morgue - lightswitch, APC added. +2018-04-22: + Banditoz: + - rscadd: You can now export ore scanner disks inside of crates on the supply shuttle + for some extra supply points. + BlueNexus: + - rscadd: Plasteel combat shields have been added to the emergency armoury, replacing + the unused biosuit closet. + Chinsky: + - rscadd: Adds color picker mode to floor painter (which is renamed to paintgun). + - rscadd: Can now hit APCs with heavy big things to unlock them. Doing so risks + breaking them completely. + - rscadd: Being in pain, not seeing properly, or being confused will now affects + accuracy of your attacks. + HetNeSS: + - maptweak: A survellance camera had been installed - D3 mess hall - galley. + sabiram: + - tweak: Stun electrode projectiles fired from stun revolvers now move faster. +2018-04-23: + Chinsky: + - rscadd: Supply crates now have secure variants of guns. + - rscadd: Unsecure guns can be ordered with contraband crates. + Sbotkin: + - tweak: Bridge Officers' got helmets and correct tablet computers. + sabiram: + - bugfix: Fixes red alert being available in the command and communications program. + - bugfix: Red alert once again may only be set through the keycard authentication + devices (small white and black panels on walls) found in officers' offices and + on the bridge. + - rscadd: Red alert now only be cancelled using the keycard authentication devices. + - tweak: Admins are now provided jump links in the 'has forced open an emergency + shutter' message. +2018-04-24: + Chinsky: + - tweak: Skill costs and free skillpoints amounts were severely tweaked, check your + allocations since they're most likely invalid now. + - tweak: Tweaks to some medicines' OD effects. + - tweak: Paracetamol and cold medicine now do not apply organ damage, but still + prevent natural healing when you OD. + - tweak: Inaprovaline, being brain soothy chem, makes you slower and sometimes slur + and get drowsy when you OD (60u folks). + - tweak: Bicaridine, on top of usual toxic effects, now has a chance to heal arterial + bleedings! But at the same time it blocks blood flow, lowering blood circulation + by 20+% (depends on how much did you go past the OD threshold). + HetNeSS: + - tweak: Magnetic grippers are now capable of grabbing deuterium and tritium ingots + as well. + comma: + - rscadd: PDAs are now modular computers. +2018-04-25: + BloodyMan: + - rscadd: Blending tofu now yields an egg substitute for vegan baked goods. + afterthought2: + - bugfix: Skill system saving ACTUALLY works correctly again. + - bugfix: Skill system saving works correctly again. +2018-04-26: + BlueNexus: + - bugfix: Uplink-bought railguns no longer explode + Chinsky: + - tweak: Lung popping condition changed. Now it only happens when pressure changes + (both internal and external), not constantly when you're in vacuum. Pressurized + suits prevent popping by reducing external pressure difference impact. +2018-04-27: + afterthought2: + - bugfix: Crisis borg splints now work. +2018-04-29: + Chinsky: + - tweak: Moved explorers gearup room to where that gross quarantine thing was. Previous + location is now an unused room + - tweak: Moved bunch of crap from explorer lockers onto the racks and tables. + - tweak: Explorer access now opens the room where anomaly containers/stasis cages + are, the one with the drill. + - tweak: Gave bunch of random crap to explorers in the gear room - glowsticks, cameras. +2018-04-30: + Banditoz: + - rscadd: Cyborgs get a secure energy gun (replaced taser rifle) which can be granted + lethal mode by a console, or red alert. Silicons cannot set it for eachother, + or themselves. +2018-05-03: + afterthought2: + - bugfix: Irreparable organs can no longer be healed by any means. +2018-05-04: + HetNeSS: + - tweak: Bandolier's can now also hold pills, pill bottles, papers, pens, photo's + and marshalling wands. + sabiram: + - rscadd: Added a pathfinder hardsuit module to exploration suit room. + - maptweak: Fixed several issues in the exploration storage rooms. + - rscadd: Added illumination grenades, which generate a bright, wide light when + detonated. Added illumination grenade crate to supply under miscellaneous category. + Added hardsuit illumination grenade module. +2018-05-05: + afterthought2: + - rscadd: Scanner modules added for modular computers. Available (job-depending) + on spawn, and also from supply crates. + - rscadd: 'The scanners are: paper, medical, atmos, and reagent. You can have at + most one at any time. Compatible with all computers, but only the paper and + atmos scanners will do anything when in a console.' + - rscadd: Scanner program added for modular computers, which interfaces with scanners. + Can view and save scan results, which may be edited with NanoWord. + - tweak: If a scanner and a nanoprinter is installed, the printer can now only be + refilled with blank paper. + - bugfix: The tax program should no longer produce duplicate copies or unexpected + behavior. +2018-05-06: + TheGreyWolf: + - bugfix: The MAA alt title is now fixed to not exist. + afterthought2: + - rscadd: 'The crisis borg module comes with a stasis bag rack, which can hold 3 + body bags or stasis bags. Starts empty to avoid exploits: go find your own.' + - tweak: Borgs now fold up roller beds by clicking and dragging, like everyone else. + - tweak: Borg interactions with ironing boards while having the roller rack equipped + are similar to humans (they still can't iron, though). +2018-05-07: + Chinsky: + - rscadd: Can now use multitool on secure guns to disable tracker. Prevents gun + from firing, but won't report its coordinates to the force auth program. + - rscadd: Makes emagged secure guns not show up too. +2018-05-08: + afterthought2: + - bugfix: Borgs and AI are given emails after name selection. Emails are updated + on name change. + - bugfix: Borgs and AI can read emails from the "Email Client" in the Subsystems + verb. The email administration program can still be accessed by AI but has been + moved to "Email Administration." +2018-05-09: + afterthought2: + - tweak: CE and CMO get job-appropriate scanners on their PDAs now. + - tweak: Modular computer scanners can now be printed via protolathe. + - tweak: Hitting a modular computer with a paper bundle puts it in the printer. + To scan, separate the bundle. + - bugfix: The chemist's pda scanner is fixed. +2018-05-10: + chaoko99: + - soundadd: Cleanbots now make cute little beeps when active and functioning. +2018-05-15: + Banditoz: + - rscadd: Added a new gamemode, fathless; a mix between cult and deity (also known + by some as godcult.) + Cakey: + - maptweak: Moved alll checkpoints to be positioned in more key areas. B-deck and + deck one checkpoints are now connected via ladder. All checkpoints now have + the ability to cut-off certain sections of the hallways for flow control. + - maptweak: Brig officer now has a disposals bin. + - maptweak: Emergency armory has been altered to have 3 carbines and 3 e-guns as + opposed to the 2:3 loadout to match the rest of the E-ARM. + - maptweak: Brig armory has been altered to have 4 e-guns as opposed to 3 to match + the rest of the armory. + Casper3667: + - rscadd: Vox now spawn with their air filter gas mask. + Dukica: + - rscadd: 'Enabled ponchos, aprons and hazard vests for GAS to wear. rstweak: Some + typos were cleaned up.' + Miraviel: + - bugfix: You can now use sign language even if you are muzzled. + afterthought2: + - tweak: Very damaged heads will be marked as "critical" rather than "irreparable" + on scanners, and can be healed even past max_damage threshold. + - rscadd: Adds a deck management program, which gives some information on shuttle + movements. + - rscadd: Adds flight plans, which can be filed via this program by those with shuttle + flight access. + - rscadd: If the flight plan includes a roster, the members on the roster can be + summoned via automatic comms announcements or batch-emailed. + - rscadd: Adds other reports that supply can file about shuttle missions after the + mission has departed/returned. + - rscadd: Adds a stripped-down report viewer program, currently mostly useful for + viewing emailed reports. + chaoko99: + - rscdel: Reverted a change that made it impossible to draw/fill plant reagents. + You may now make your tomato grenades again. + tlc2013: + - bugfix: Fixed certain Spellbound Servant equipment not having the proper icons, + or - at worst - having no icons at all. +2018-05-16: + Banditoz: + - maptweak: Remaps the Petrov toxins lab to be more intuitive to use. + - tweak: Powered crossbows have been buffed. You don't need to draw back as much, + and it takes less time to do so. +2018-05-17: + afterthought2: + - tweak: The deck management program will now allow you to queue up scheduled missions, + rearrange their order, and delete them. Once started (i.e. once the shuttle + departs) the active mission is finalized and can no longer be deleted or moved + around, but can still be renamed. + - tweak: Deck management announcements are now a bit less spammy and let you choose + an area other than the shuttle to meet. + - tweak: One more report has been added, a post-mission summary. + - bugfix: Crew record access issues fixed. + chaoko99: + - tweak: Emergency shield generators now cover an entire screen. Power draw per + shield unaffected. +2018-05-18: + Cakey: + - maptweak: Adds railings to all stairwells. + Chinsky: + - tweak: PDAs and ID cards no longer have whole name and job in their item name. + - tweak: When examining people, you will see a linkie to see their ID. That will + give you name/job if you're nearby, or show you the window with full info if + you're adjacent. + sabiram: + - rscadd: Blast doors and shutters can now be damaged by hitting them with sufficiently + powerful items. + tlc2013: + - rscadd: Added a recolorable kimono to the loadout selection. +2018-05-19: + PurpleMartinJCK: + - rscadd: add new nabber organs + - rscadd: flesh printer can now print nabber organs + - rscadd: low blood can force nabbers out of nab mode + - tweak: crushing and shredding now decloak nabbers + - tweak: lower some nabber brute resistance in favour of natural armour + - tweak: encases all external nabber organs in carapace + afterthought2: + - tweak: Those with heads access now have more access to Deck Management. + - bugfix: Access issues with supplementary Deck Management reports should be resolved. +2018-05-20: + afterthought2: + - tweak: Headsets start with a free encryption key slot now. +2018-05-21: + afterthought2: + - tweak: Cryo tubes use up chemicals ten times faster. Effective healing rate remains + unchanged. + - tweak: Genetic damage is healed ten times faster in cryo tubes. + - bugfix: The organ printer now prints visible organs. +2018-05-22: + Banditoz: + - rscadd: Borgs can now lock and unlock their own panel. + Cajoes: + - rscadd: Snix, HotFoods and Lavatory vending machines and hid them on the map. + - tweak: All snack food relative paths are now absolute paths. Nobody noticed nor + cared. + Cakey: + - maptweak: Consoles have been rotated to match how they should be. + chaoko99: + - rscadd: Added a light-toning system, lights will color dynamically to what color + they emit. + - rscadd: Fingerprints will no longer magically phase through gloves. + - tweak: Robolimbs don't make fingerprints anymore. + - bugfix: Thick gloves actually use thickmaterial. +2018-05-23: + Banditoz: + - bugfix: Destroyed portable turrets are now climbable. + TheWelp: + - rscadd: Adds a new deity menu free of uplink structure. + - tweak: Some deity store items now increase in price the more you buy them. (E.G. + Conjuration) + - rscdel: Remove Godvision. + afterthought2: + - bugfix: Fake crew announcements should use ID card data now. + - bugfix: Antag preferences being reset to low should be fixed. If you continue + experiencing this issue, please submit a new bug report. +2018-05-24: + Alex6511: + - bugfix: Fixed "3" being printed when placed on a surgery table. + chaoko99: + - bugfix: Lights aren't super dark anymore. Blame Chaoko99 for being blind and not + noticing the difference during testing. + - bugfix: Fixes weird sprite bugs for broken and burnt lights. +2018-05-25: + PoZe: + - rscadd: Added oxygen candles as an item. They are one-time emergency item that + is used to fill 2-3 tiles of depressurized environment + afirpo: + - maptweak: Added an access button to icly cycle between Exterior and Interior fusion + core chamber. + afterthought2: + - bugfix: Crew records will now correctly display things like ' and " in-game. +2018-05-26: + HetNeSS: + - maptweak: The fore docking port on deck four had been widened in size, as the + main docking port be probably should. + - maptweak: Remodelled the Mercenaries gamemode transport shuttle, to suit the extended + docking bay, as well as for more beefy and physics-justifiable look. + - bugfix: '"Northeast of First Deck" and "Northwest of Fourth Deck" waypoints swapped + places (aka fixed)' +2018-05-27: + Casper3667: + - rscadd: Tajara can now use normal gloves and claw attacks can't be used when wearing + gloves. +2018-05-28: + Cajoes: + - tweak: New fax machine icon. +2018-05-30: + Alex6511: + - tweak: Amputation text is now larger for the surgeon performing the amputation + Banditoz: + - bugfix: The rapid taser cooling module (now called the rapid weapon cooling module) + upgrade now works. +2018-05-31: + afterthought2: + - rscadd: the report editor can now print reports and export them to text files. + - rscadd: the report editor can download new (blank) reports from NTnet. A few of + the forms from the wiki can now be chosen in this way. +2018-06-01: + Banditoz: + - rscdel: Hand teleporters have been removed from teleporter rooms. + - maptweak: Teleporter beacons have been removed from some high security areas onboard + the Torch. + - maptweak: A teleporter beacon has been added to NanoTrasen's miscellaneous research's + test chamber. + sabiram: + - tweak: Off-duty ID cards are now visually distinct and can no longer be modified. +2018-06-02: + afterthought and chinsky: + - rscadd: 'The "Medicine" skill now influences interaction with some medical objects: + syringes, defibrillators, sleepers, handheld scanners, full body scanners, IV + drips, and splints.' + - tweak: Full body scanners now store scan data. Use the menu options to print, + erase, or scan/re-scan. + - tweak: IV drips now take a short time to hook up. +2018-06-06: + afterthought2: + - tweak: Off-Duty is no longer a separate job, but an alt-title of Passenger. You + no longer spawn with ranks in uniform if selecting off-duty. + chaoko99: + - tweak: Books and papers may now be 2x as long. This was changed to make it so + records could be longer, without the skeleton taking up half the usable text. +2018-06-07: + Cajoes: + - rscadd: Added new visors for Tajaran to shield their eyes with. Available exclusively + in the xeno portion of the loadout screen. + - rscadd: Added Hot Food showcase to manage kitchen's output. + - rscdel: Removed Lavatory Essentials Vendor on Deck 2 due to [redacted]. +2018-06-08: + TheGreyWolf: + - bugfix: Press tags can now actually be taken by the press. + Zuhayr: + - rscadd: Added methyl bromide, a fumigant gas that kills spiders. + - rscadd: Added bromide, a toxic reagent, from which can be derived a liquid form + of methyl bromide. Methyl bromide kills spiderlings and egg sacs when injected. + - rscadd: Added algae to hydroponics. Algae produce liquid bromide and gaseous methyl + bromide. + - rscadd: Added an interaction to optables that will automatically put someone lying + on top of it to sleep with no need for N2O or painkillers. + - rscdel: Removed N2O pumps as being both redundant and buggy. + afterthought2: + - rscadd: The slowdown for pulling (i.e. ctl-click) stuff is now affected by the + "Athletics" skill. + - tweak: Bigger/stronger species pull things faster. + - rscadd: Pulling stuff generates adrenaline, depending on "Athletics" skill. This + may raise your heart rate. Pulling for a long time without breaks with low skill + may give you the jitter effect and minor heart damage (won't kill you). +2018-06-09: + Banditoz: + - tweak: The T-Ray scanner is now faster, has an increased range of 7x7, and is + now without the flicker effect. + sabiram: + - tweak: Gyroscooters now shield their pilot from 5% of projectiles, down from 40%. + - tweak: Gyroscooters are now slightly slower. + - tweak: Attempting to move a bike or gyroscooter while stunned will now eject you. +2018-06-10: + Banditoz: + - maptweak: The Aquila has been divided into areas, and remapped a bit. + - rscdel: The Aquila's death trap has been removed. +2018-06-11: + BlueNexus: + - tweak: Increased TC costs for railguns + Chinsky: + - tweak: Now for ghetto EVA the size of thrown thing matters. Tiny things give you + ~10% chance of direction change, with 'normal' sized things having 90%, guartanteed + above. + afterthought2: + - rscadd: Throwing "huge" items (e.g. roller beds, backpacks, certain guns, rigs, + jetpacks) or normal sized mobs without "Basic" skill in "Athletics" will briefly + weaken you (and the items won't go far). + - rscadd: Thrown items don't go as far and have less speed/force if you have lower + "Athletics" skill. + - rscadd: The weightlifting machine at the gym has more weight levels. Having high + "Athletics" means you can lift more. If you try lifting way more than you are + capable of, you may hurt yourself. + sabiram and Cakey: + - rscadd: The bird temple on the mining map has been redesigned and now houses the + fountain of youth. +2018-06-12: + Broseph Stylin: + - rscadd: Added rucksacks to Character Setup. They function exactly the same as + backpacks. + afterthought2: + - rscadd: Lactate is a reagent that increases heart rate, causes generally harmless + shortness of breath, and slows movement. After processing a large amount of + lactate, mobs may experience temporary jitters. + - tweak: Instead of producing adrenaline, pulling produces lactate. + - rscadd: Robots can now interact with storage items like boxes and bags. + chaoko99: + - bugfix: Trays will now adequately notify you of not being able to be placed in + bags. +2018-06-13: + Cakey: + - imageadd: New wall sprites have been added. + - imageadd: New door sprites have been added. + - imageadd: New window sprites have been added. + - imageadd: New grille sprites have been added. + - rscadd: Airlocks are now paintable. + - rscadd: Window frames have been added, which connect to walls for that aesthetic + look. + - rscadd: Airlocks can now be painted using the airlock painter. + - rscadd: Added paint presets to the paintgun. + - maptweak: The Torch has been modified to use window frames instead of just windows. + - maptweak: Maintenance has been given more catwalks. + - maptweak: Added binoculars to security checkpoints. + ZeroBits: + - tweak: Material Grinders have been reworked to allow different reagent quantities + and multiple reagents when grinding material sheets + Zuhayr: + - tweak: Gas inhalation effects are now reagent-based. Gases create reagents inside + the body, which then apply effects. This means that gaseous phoron exposure, + for example, needs to be treated with dialysis/dylovene, as it fills your guts + up with liquid phoron. + - tweak: The poison_type var on species datums is now poison_types, and determines + which poison gasses show you the toxins UI indicator, rather than which ones + cause poisoning. The actual effects of poisonous gasses is determined by the + reagent value (as per dexalin being injected into a vox, etc.). This really + shouldn't impact anything for the average player, except that chlorine and nitrogen + dioxide (not N2O, for clarity) are now actually poisonous. + - tweak: Helium now makes your voice squeaky. Very important feature. + - tweak: Xenon is now functionally the same as N2O, including the following note. + - tweak: N2O now causes giggling, confusion, dizziness and occasional passing out + at high dosages, rather than instant and immediate knockout. Still useful for + riot control and now flooding it into distro isn't a round-ender. You might + even be able to use it without admins shouting at you! Refer to the optable + neural suppressor PR for a replacement method to sedate people for surgery. + - tweak: Finally, as a sidenote, Bogani will actually be poisoned by oxygen and + chlorine will have a visible overlay now. + afterthought2: + - rscadd: Experienced in Chemistry allows you to see scannable reagents in a held + beaker/container. + - rscadd: Professional in Chemistry allows you to see all reagents in a held container. + - tweak: Science goggles give more precise volume readings at higher chem skill. +2018-06-14: + ElRobusto: + - tweak: Cuts the Vox space suit movement penalty by half. + TheWelp: + - rscadd: Adds two currently admin-only races, the Starborn and the Blueforged. + Will be available in future deity form. + - tweak: Tweaks Shadow species death to not cause runtimes. +2018-06-15: + Banditoz: + - tweak: The cyborg manual now has all the current cyborg modules. + - tweak: The Supermatter guide shouldn't lead engineers to delaminate the engine, + now. + ParadoxSpace: + - rscadd: Adds two new IPC/FBP chassii, Morpheus Mantis and Ward-Takahashi Economy. + - tweak: Grayson, W-T Economy, and Xion are now available at the roboticist fabricator. + afterthought2: + - rscadd: The chem grinder is dangerous to use at "Unskilled" in Chemistry and will + lose some ingredients depending on skill level. + - rscadd: The chem dispenser will give inaccurate amounts of ingredients or add + extra contaminating ingredients when below skill "Trained" (in Chemistry or + Cooking, depending on dispenser) Can be slightly dangerous. + - rscadd: The chem master now has two modes. "Quick" will move the correct amount + of ingredients from beaker to buffer, but also add contaminants (depending on + skill). "Thorough" will only move the desired ingredient, but incur losses (depending + on skill). Skill checked is Chemistry for chem master, Cooking for Condimaster. + - rscadd: Moving ingredients from buffer to waste or beaker acts like on "Quick" + mode. +2018-06-17: + ParadoxSpace: + - rscadd: Adds bowman type headsets to all non-service departments. + - rscadd: Adds unique pilot, miner, corpsman, and explorer headsets. + - rscadd: Adds tacticool Syndicate headsets to mercs. + - rscadd: If tcomms is down or unavailable for whatever reason and you have a shortwave + radio in your pocket, your headset will now automatically transmit through it. + It still cannot do department channels. +2018-06-18: + Chinsky: + - tweak: Some loadout items are now restricted by branch instead of jobs. Some are + restricted by both. You might experience sudden loss of swag on next spawn, + check your setup. + TheWelp: + - rscadd: Adds various starlight specific spells for use in future deity form. + - tweak: Adds two new flags for targeted spells to filter via faction. + - tweak: Adds more effects for some spells. + afterthought2: + - rscadd: adds the instruct verb. A character with basic leadership and experienced + skill X can instruct a character in X from Untrained to Basic. Has a 15 minute + cooldown to use; buff lasts all round; max of three buffs on any person. The + target has to be close and there's a short timer during which neither party + should move. + chaoko99: + - rscadd: Adds a fully reusable backstabbing mechanic, used by butterfly knives + and switchblades. +2018-06-19: + Kurgis: + - tweak: Changed the brain loss Impedrezine inflicts to allow it to kill a person. + Miraviel: + - rscdel: 'Removed the time restriction on the following jobs: Explorer, Corpsman, + Deck Technician, and Scientist.' + - maptweak: Reorganized the kitchen cabinet and the crates in the Medical Storage + (the big bag of salt and the defibrillator are no longer blocking everything + else). + - maptweak: Removed the anaesthetics closet from the Medical Storage. + comma: + - tweak: XO now gets a box of spare headset keys instead of box of XO headsets + - rscadd: Bowman headsets can hold 3 keys instead of 2 + - rscadd: BO Bowman headsets hold 4 keys +2018-06-20: + BlueNexus: + - balance: Railguns have been rebalanced to fill the niche of an anti-armour or + sniper type role. + - balance: All railguns now suffer a substantial penalty when fired one-handed. + - balance: The basic railgun projectile no longer stuns, and does less damage. + - balance: All railguns which accept steel rods as ammunition now use the basic + projectile. + - balance: The TCC railgun's (available in the traitor menu) ammo capacity has been + reduced from 10 to 6. + - balance: Substantially increased firing delay on all semi-automatic coilguns and + railguns. + - balance: Holding or stowing a railgun now slows you down more. + Chinsky: + - rscadd: EVA skill now has mechanical effects. + - rscadd: Space slipping chance is affected by EVA skill. Bit higher at unskilled, + lesser with skill, no slipping at experienced. + - rscadd: Flooring when entering gravity from space is now not guaranteed at Basic + skill or more. Doesn't happen at Professional skill. + - rscadd: At Unskilled and Basic skill, jetpack can sometimes go wrong way. Not + that bad if you notice in time and have fuel to turn back. + - rscadd: At Professional skill you go faster when in space with a jetpack. Zooom. + - tweak: Skills now affect surgery. Trained or Experienced (depending on what you're + trying to do) skill is needed to ensure step won't fail. Professional skill + will offset various penalties (not proper optable, improvised tools etc) a bit. + Time of step is affected by Anatomy skill too. + - tweak: Some other skills help with some steps, e.g. Trained Forensics offsets + penalty for incisions, and Complex Devices skill is used instead for robotic + organ steps, with Electrician and Construction helping with simple limb repair + steps. + Chisnky: + - experiment: Melee weapons now have different attack cooldowns, generally with + smaller weapons being faster, bigger slower. Normal sized weapons are baseline, + having same attack cooldown as they did. + - experiment: Material weapons further tweak their attack cooldown based on material + used. + afterthought2: + - rscdel: The leadership skill has been removed. Check your characters' skill allocations. + - tweak: The instruct verb works like before, but no longer requires leadership + skill to use. + chaoko99: + - bugfix: You may no longer spam the skeleton as hard as you could before. + - bugfix: Wall painters no longer hit walls when used. + - bugfix: Energy axes will no longer anchor when dropped. + - bugfix: Candles will now last about 30 minutes. + - bugfix: Bucklers can now block any projectiles that aren't bullets, as suggested + intent in their code. + - rscdel: You may no longer worry about reagent contamination in a soft drink dispenser, + only unintended reagent amounts. + - rscadd: You may light an unlit candle with a lit candle that isn't in your hand. + - rscadd: Optimization pass on Geiger counters, and a few effect systems (Smoke + and sparks) + - rscadd: Underwear may now go into washing machines. Still can't be bloodied, but + at least you can do that now. For you weird people who roleplay showering! + - tweak: Rags may now clean more than just blood. More importantly, they show their + progress bar when cleaning. +2018-06-21: + Chinsky: + - rscadd: Close Combat now has ingame effects. Mostly chances to hit in melee. + - rscadd: Disarm chances now both affected by skills and anything tha affects melee + accuracy (being blind, being confused, blurry eyes, being in pain etc). + - rscadd: Most fancy grab moves (jointlocks, dislocations, tendons cutting) were + locked away behind Trained skill in CQC. + afterthought, sabiram: + - maptweak: The hydroponics station away site has been converted into an exoplanet + site. +2018-06-22: + Banditoz: + - tweak: Borgs have had their overall health doubled. + - tweak: Borgs also have had their armour plating component health doubled. + - tweak: Borgs are now more resistant to EMP, and lose less cell charge per EMP. + Cakey: + - maptweak: The Torch has been modified to use a wider variety of flooring types + and decals. + - maptweak: Added a door button to the XO's office. + - rscadd: Added plated catwalks, which can be constructed by placing monotiles on + catwalks. + Chinsky: + - rscadd: Botany skill now has ingame effects. + - rscadd: Without at least basic skill, you can screw up when planting or weeding + trays. You'll also be unable to recognize pests and weeds from useful things. + - rscadd: Exotic seeds (all random variations) need trained skill to avoid screw + ups like that. + - rscadd: Trained skill is also needed to handle xenobotany machines, otherwise + you'll be prone to wasting your samples really fast. + - rscadd: Experienced and professional levels of skill reduce degradation of samples + in xenobotany machines. + - experiment: Constantly fixing brain is no longer the pro strat anymore. + - rscadd: When fixing very damaged (broken level or more) organs in surgery, their + max health is lowered. + - rscadd: Brains get their health lowered /always/ if oxygenation is below survival + level (30%). Better fix cause of damage first, if you don't want to do permanent + damage. + - rscadd: Forensic skils now have ingame effects. Without at least basic skill, + you leave slightly more fingerprints on things, and you will leave prints when + trying to evidence bag things. + - rscdel: You need Trained skill to use evidence collection things and forensic + machines. At higher skill you work microscope faster. + - rscadd: Offstation antags (and traider) can now become ALIUMS! + - rscadd: Their bases have 'alien monolith' somewhere, which turns you into a humanoid + alien of unknown species. + - rscadd: Remember to implant the spawned translator implanter if you're planning + on talking to people. + afterthought2: + - rscadd: Having Basic finance gives the Appraise verb, which allows you to estimate + the value of items you are holding or have equipped (found in the IC tab). Higher + skill levels give more accurate assessments. + - tweak: The financial skill has a large effect on your starting cash. + - tweak: Higher financial skill gives you better deals from traders. + - rscadd: Using virology machines without sufficient virology skill may get you + or your friends infected. For curing purposes, "Trained" negates this effect, + but for doing splicing and mutations, "Experienced" or "Professional" may be + needed. + - rscadd: The printout from the virus analyzer may have missing or erroneous information + if you lack "Experienced" in virology. Quality of information improves with + skill. +2018-06-23: + afterthought2: + - bugfix: The microscope should now work properly again. + - bugfix: The magic missile wizard spell now works. It inflicts small burn damage + and a substantial disable. + - rscadd: Additional reports have been added to the Report Editor. +2018-06-24: + Chinsky: + - tweak: Handheld radios now have batteries and use power to transmit. You'll have + ~50 transmissions worth of power from one cell. When charge is getting low, + message might become garbled. Radios can be recharged in standard rechargers. + Heptagon49: + - bugfix: Screwdrivers no longer open airlocks upon attack. + Rowtree: + - tweak: Character creation faction/citizenship/religion/home system choices have + been updated. +2018-06-25: + Heptagon49: + - rscadd: You can now alt-click on pipes and disposal pipes to rotate them. + - bugfix: Unathi now have exploration voidsuits, and can now use the exploration + suit cycler. + Spookerton: + - tweak: Zombie abilities now tell you when they can't be used, why, and how long + is left on their cooldown, instead of failing silently. + - bugfix: Zombies can no longer consume or death_breath while incapacitated. + - balance: Zombies can only death_breath once per minute instead of once per second(!). + - tweak: Zombie consume now completes at the same rate as its cooldown, preventing + multiple consume actions being active at once. + - bugfix: Zombie consume no longer allows the user to be the target. + - balance: Zombification doesn't magically replace robot parts + - balance: Zombification organ health bonus is x3 instead of x5, but organ break + threshold is 75% instead of 50% + - balance: Zombie toxin urn reduced from 120u(!) to 10u. + - tweak: Zombie toxin now guarantees conversion for a 5u or greater dose. + - balance: Zombie toxin has a flat per process 20% chance to convert so long as + the current + historic amount of reagent in the victim (ie, the total dose at + one time) is more than 1u. + - balance: Zombie death_breath now only creates 2u instead of 5u. This means a victim + should usually take about 15 tox and have two 20% chances to be zombified if + a single zombie breathes on them. Zombies can work together to push a victim + over the 5u mark and instantly zombify them. + - balance: Zombies cannot re-zombify themselves for a free rejuv. + - tweak: observers cannot circumvent voting checks + afterthought2: + - tweak: Robotics surgery uses the Complex Devices skill now to compute delay. Hardsuit + removal uses the EVA skill. + - bugfix: Constantly escaping from grabs regardless of skill should be fixed. + sabiram: + - tweak: The standard bulkhead paint colour is now in the presets for the paint + gun. + - maptweak: Added a few small ruin sites to make exoplanets a little more detailed. + zaredman: + - rscadd: Added Advanced Trauma Kit and Advanced Burn Kit crates that can be ordered + from Cargo. 6 ATK or ABK for 30 points. + - rscadd: Adjusted cost of Medical Crate to 70 supply points to be more appropriate + when compared to other crates like Stability kit crates. +2018-06-26: + Cakey: + - maptweak: Following several reports of Torch crew being admitted to the infirmary + due to headaches the Torch has been refurbished once again to iron out any kinks + left over from the flooring construction work. + - imageadd: New floor sprites have been added. + - imageadd: New wall-mounted sprites have been added for fire alarms, air alarms, + APCs and intercomms + Chinsky: + - rscadd: Adds volcanic exoplanets. Very few plants and animals, but loads of minerals. + Don't walk in lava tho, use catwalks, Luke. + chaoko99: + - rscadd: Resprited some beekeeping items for the sake of consistency and ease of + use. +2018-06-27: + Chinsky: + - rscadd: Weapons skill now has mechanical effects, hide yo children hide yo wife. + - rscadd: Gist of it is if you don't have at least basic training, you're a hazard + to people. You can point and fire, but safety can be a bitch. + - rscadd: Speakig of safety, help intent doesn't prevent firing now. Safety is now + an explicit toggle, can switch it with Ctrl-Click on the gun or with a rightclick + verb. + - rscadd: Higher values of skill give some buffs to accuracy, and unlikely events + of jamming, also let you perform better when in pain. + - rscadd: Professional skill also has bonuses when using scoped rifles. + - rscadd: Weapons skil cost was changed too. Trained and higher are more expensive + now, with Experienced and Professional being as costly as medical skill. MAAs + start at Trained now to give them headstart. + Spookerton: + - tweak: adds insulated gloves to engineer lockers + afterthought2: + - tweak: Starting cash has been increased. Higher financial skill still gives substantially + more money. +2018-06-28: + Banditoz: + - rscadd: Saferooms can now be bolted and unbolted via the keycard authentication + device. + - rscadd: If there is an impending delamination, supermatter delamination, or escalation + to red alert, saferooms will unbolt. + - maptweak: The button to toggle the saferoom bolts have been moved inside of the + saferoom, and can now be operated by all. + Cakey: + - imageadd: Windows have been resprited. + - imageadd: Wall signs have been modified to fit the new walls. + CrimsonShrike: + - tweak: Moves crawling onto regular movement, fixes crawling while hurt. + Heptagon49: + - bugfix: After hearing about the capture of key operatives, Clan [NAME NOT FOUND] + decided to up the ante and improve the explosive power of their ninja suit's + deadman's switch to ensure that their agents either complete their mission or + die trying. Have fun. + sabiram: + - tweak: Catwalks now act as floors do with regards to clicking to move pulled objects + onto them. +2018-06-29: + Cakey: + - tweak: Replaced the fake lava on volcanic exoplanets with actual, real lava. + afterthought2: + - tweak: MMIs cannot be inserted into non-synthetic mobs. + - tweak: Flesh limbs cannot be attached to synthetic mobs. + - tweak: Robotic limb attachment now uses the devices skill. +2018-06-30: + Earthcrusher: + - tweak: Weaker mobs such as Artificers can now smash doors and windows, albeit + not as quickly as stronger mobs. +2018-07-01: + Chinsky: + - rscadd: Added anti-rad pouches to engineering. Also replaced detox injector engies + get in survival box with anti-rad one. + - rscdel: Removes mapped boomboxes from engineering. Nice try, but you'll have to + do with random spawnpoints as everyone. + - rscadd: Adds deployable SCG flags to Pathfinder lockers. They require Pathfinder + access to pop up. Don't do anything, just fluff. + Heptagon59: + - imageadd: Due to reported ill fits and high amounts of chaffing, SolGov has reissued + their line of uniforms, now with form-fitting features! EC Uniforms now have + unathi specific icons. + Hubblenaut: + - bugfix: The teleporters will no longer send people to nullspace when the beacon + does no longer exist. + sabiram: + - balance: Blink, teleport and ethereal jaunt can no longer be cast while incapacitated. + - tweak: Holographic items created by the holodeck can no longer be deconstructed. + - rscadd: Added the lodge exoplanet ruin site. + - tweak: Increased the cost of the hydrobase exoplanet ruin site. + - bugfix: Fixed incorrect accesses on various air alarms. +2018-07-13: + Alex6511: + - balance: The CoS Locker no longer contains a taser + - balance: The Brig Officer Locker no longer contains a small energy gun. + - tweak: The CoS locker now has a hand labeler in line with the Brig Officer. + Cakey: + - tweak: The Pathfinder job is now Ensign only + - rscadd: 'Belts have been overhauled to have holster slots on certain belts. These + holsters function the exact same way as uniform holsters do. imgadd: Certain + belts now show what their contents are on their icons.' + - rscadd: Added general and general holster belts, used by command, bridge officers, + and supply. Holds general office supplies, tablets, and stamps as well as other + various supply equipment. + - maptweak: Uniform holsters have been removed in favor of belt holsters, however + they can still be found within the loadout menu. + - tweak: Uniform holsters have been modified to use the same slot as webbings to + counter being able to carry two holstered weapons. + - rscadd: Plated catwalks can now be serviced using a crowbar to access anything + underneath. + Chinsky: + - rscadd: Piloting skill now has ingame effects. + - rscadd: Taking Torch's helm without at least Trained skill can make Torch go not + exactly where you want it to go. At Professional, passing meteor fields is less + painful. + - rscadd: Shuttles require different level of skill. Guppy is no-skill, Charon and + Aquila need at least Basic. For purposes of skill, pilot is whoever tells it + to move in console. + - rscadd: If pilot's skill is insufficient, you can end up in wrong place. Also + travel time is affected by skill. + - tweak: Drastically lowers amount of loot-having junk piles on garbge planets. + They have visual cues though so you don't need to try and rummage though literally + every pile. + - tweak: Xenoarch finds no longer yield sheets of steel and claim it's a mysterious + thing. They now mostly drop alium alloy, that has random material properties + each round. Any material weapons you find will be made of it too. + - rscadd: Garbage planets now have radiation sources scattered around. + CrimsonShrike: + - tweak: Roboticist now has access to their own maintenance airlock again. + Heptagon49: + - bugfix: Due to pending discrimination lawsuits, Nanotrasen has upgraded the cryosleepers + onboard the SEV Torch with automatic wheelchair dispensers. Disabled characters + now spawn with wheelchairs. + Miraviel: + - rscadd: Added the "Detach IV Drip" verb under the Object tab. + - tweak: Left-clicking an attached drip will now first detach the patient and only + then it will remove the beaker. Drag and drop still works! + - tweak: The Hot Foods Display machine now accepts and dispenses utensils. + - imageadd: IV drips now have a slightly bigger container sprite and a wider warning + light, for better visibility. + - imageadd: Advanced first-aid kits are now purple in hands too, as opposed to being + red. + Orelbon: + - rscadd: The self-destruct will now begin detonating explosions randomly on the + ship when it reaches its cutoff point. + Sbotkin: + - tweak: Emergency Response Team officially is a part of the SCG Fleet now. + Spookerton: + - bugfix: Paper bundles bundle correctly. + - tweak: Carbon copy paper is now default named "sheet of paper" instead of "paper", + the same as regular paper. + TheWelp: + - rscadd: Adds the ability for holy water to deconvert god cultists and the ability + for the null rod to stop phenomenas (by hitting an altar) + - tweak: Nerfs like 90% of deity items and phenomena costs. This may be heavy handed + or too much. Feel free to complain. + Zuhayr: + - tweak: The Pull Punches verb has been renamed to Switch Stance. + - tweak: Nabber stance switching behavior now replaces pulling punches for them. + - tweak: Nabber nabbing is now achieved by trying to grab someone rather than a + verb. + afterthought2: + - tweak: Almost all maint airlocks now require maint access. + - tweak: Trainee crewman alt-titles have been replaced by separate jobs. + chaoko99: + - rscadd: A ping button for checking your ping has been added to the "file" tab. + sabiram: + - bugfix: Fixes being unable to ignore OOC. + - balance: Machinery may no longer be controlled by the staff of animation; its + maximum charges have been reduced from 10 to 5, and its recharge time increased. + - balance: Wizard familiar transform spell recharge time increased to two minutes + from ten seconds. + - balance: Wizard familiars can no longer transform while incapacitated. + - balance: A percentage of damage taken in a familiar animal form is now mirrored + to the familiar's human form. + - bugfix: Simple animals controlled by a client can once again damage humans. Don't + kick that suspicious goat. + - rscadd: Added functionality for edged weapons to cut wires after a short delay. + Any conductive objects will also shock you! + - tweak: At the same time, clicking wires with ordinary conductive objects will + no longer shock you. + - tweak: Reconfigured access requirements for tactical equipment in the loadout. + - tweak: Sol personnel may no longer select green or tan plate carriers, UBACs or + pouches. + - tweak: Expeditionary Corps personnel additionally may no longer select navy blue + equipment. + - tweak: The King of Goats group encounter has been updated. + - rscadd: The King of Goats can now imbue his attacks with elemental damage for + a short time. + - rscadd: The King of Goats can now rarely knock over its enemies with its attack. + - tweak: The King of Goats will now only yield the golden fleece to those who slay + it in its final form. + zaredman: + - rscadd: Added spare penlights and a linen bin to the lower medical storage. + - rscadd: Expanded medical locker room to fit a washing machine and table with recharger. + - rscadd: Some adjustments to maint immediately by Medical's locker room. +2018-07-14: + Cakey: + - tweak: Dionae may no longer fill in as research director among Nanotrasen staff, + as the board of directors felt they weren't evil enough to push the Nanotrasen + agenda. + - maptweak: Added the volleyball court and cafe to the holodeck. + ChaosAlpha: + - tweak: Engineering robots can now collect cables regardless of the currently selected + color of their synthesizer + - tweak: Robots can now pull-drag (by clicking on an adjacent turf while pulling + something) + Spookerton: + - bugfix: Visible & audible messages should no longer stack an extra prefix for + every connected ghost +2018-07-15: + PsiOmegaDelta: + - rscadd: It is now possible to adjust the playspeed of boomboxes using a screwdriver. + sabiram: + - maptweak: Added some lights to dark spots in hallways around research, chemistry + and the D3 ladders, the main hallway through D2 maint from the stairs/elevator, + and the medbay. + - maptweak: 'The greedy NT guards are now only provided with one chair for their + window desk. imgadd: Changed the intercom icon to be more in line with what + it used to be. Dark frame, green console.' +2018-07-16: + Heptagon49: + - bugfix: Dionaea can now regrow limbs again. + sabiram: + - tweak: Changed the changelog header and credits. +2018-07-17: + Cakey: + - rscadd: The shuttle pilot role has been moved to Exploration. + - rscadd: The prospector role has been moved to Supply. + - rscadd: Two new pilot helmets have been added to the game, one generic and one + NT variation (Sprited by Chinsky). + CrimsonShrike: + - tweak: Implant surgery is now possible for robotic limbs. +2018-07-18: + Earthcrusher: + - rscadd: With a bit of research into Data and Illegal technologies, the Roboticist + can now print an uncertified robot module. What could it possibly do? + TheWelp: + - rscadd: Spells now require you to not be incapacitated (handcuffed, stunned, etc). + afterthought2: + - rscadd: Antag skills are now chosen in-game. Off-station antags get basic in everything + and can select 4 skills at trained, 2 at expert, and 1 at master. On-station + antags get their selection from jobs, and in addition get 3 at trained and 1 + at expert. (malf is unchanged). Once the skill selection is submitted, it can't + be undone without admin intervention. + - tweak: The Show Own Skills verb looks a little different now. Antags can use it + to select skills. + za_redman: + - rscadd: Fixed incorrect req_access for E-Arm lockdown shutter. + - rscdel: Removed biohazard locker in D1/Medical Locker room. The multi-suit locker + in the basement, the two in maint, and the one in viro remain. + - rscadd: Added additional Medical Contractor locker in D1/Medical Locker room. + - rscadd: Adjustments to Contractor Locker contents to bring them more in line with + Corpsman Lockers. +2018-07-19: + CrimsonShrike: + - tweak: Swabbing people wearing gloves should now attempt to swab said gloves instead + of swabbing their evidence-free hands + - tweak: Forensics locker will once again contain a security belt for those who + feel the need of carrying their gear. + - tweak: Restrained, unconscious or otherwise restricted suspects can no longer + keep avoiding swabbing + Ithalan: + - bugfix: PDA medical scanner now works on body bags and stasis bags like the regular + health analyzer, and uses user medicine skill level + - rscadd: Medical belts can now also hold body bags, stasis bag and emergency medical + pouches + Spookerton: + - tweak: SCGR no longer has an unfitting alt title that implies they do something + they don't. + - tweak: SCGR can no longer download and use power RCON. + Zuhayr: + - rscadd: Diona nymph and diona gestalt eyes glow in the dark. + - rscadd: Diona nymphs can no longer grow into adults by themselves. Instead, they + need to merge with two other nymphs, then call a vote with Call Gestalt Vote. + - rscadd: Diona nymphs are now capable of headbutting seeds out of seed vendors, + planting them, harvesting them, removing dead plants, eating pests and refilling + water. Chirp. + - rscadd: Diona nymphs now have a proper UI. + sabiram: + - rscadd: Plastic flaps can now be constructed with plastic sheets. + - rscadd: Plastic flaps can now be unsecured with a wrench, and then destroyed with + a screwdriver. Use a wrench to re-bolt them. + za_redman: + - rscadd: Gives Chef of Security access to the Hangar. + - rscadd: Adds exit button to hangar door. +2018-07-20: + Heptagon49: + - rscadd: A short blurb on the current alert level now appears on the title screen. + sabiram: + - rscadd: Added spy v. spy (autotraitors and renegades) to game mode selection and + secret. + - tweak: Law enforcement (security officer, warden, HoS) and the Captain may no + longer be renegades at round start. + - tweak: Reduced the force of the magnum pistol's melee attack from 14 to 9. +2018-07-21: + sabiram: + - tweak: Command rig suit helmet cameras are now found on the Command network. + - tweak: Mining rig suit helmet cameras are now found on the Supply network. + zaredman: + - rscadd: Introduces Office of Civil Investigation and Enforcement agents to replace + Colonial Marshals. + - rscdel: Removes all references to Colonial Marshals and replaces it with the Office + of Civil Investigation and Enforcement. +2018-07-22: + Devildabeast: + - rscadd: Adds optics for the Hephaestus Alt. head. + Unknown: + - rscadd: ' Removes three of the four monkey cube boxes in virology and replaces + them with a stok cube box, neaera, and farwa cube box.' + sabiram: + - maptweak: Those with shuttle helm access may no longer access the supply office. +2018-07-23: + Ithalan: + - bugfix: Map function in crew monitor program no longer craps out after drawing + first tracked crew member + - bugfix: Suit sensor jammer methods have been updated to be useful for new medical + system + - bugfix: Synthetic hearts and species without a cardiovascular system no longer + generate misleading pulse readings on the crew monitor + - rscadd: crew monitor program icons now change to indicate if there is a crew member + in medical distress, based on pulse and blood oxygenation + - tweak: layout of crew monitor program has been tidied up a bit so that each datatype + aligns nicely. +2018-07-24: + Cakey: + - tweak: EC and Fleet crew may now fill in as shuttle pilots. + - maptweak: Added a pilots locker within the expedition prep room. Pilots now have + access to both supply and the expedition prep room. + - tweak: Added a pilot-specific access type. + CrimsonShrike: + - rscadd: Forensics skill now allows for the detection of possible evidence on examination. + - tweak: Forensics skill is now cheaper at higher levels. + zaredman: + - rscdel: Removes mention of Colonial Marshals in holowarrants and replaces it with + OCIE; format change. +2018-07-25: + Chinsky: + - tweak: Telecomms relays power usage is upper /considerably/ when used off-ship. + Expect to drain Charon in 10 minutes when you switch it on. + - tweak: Having Trained or above Close Combat skill gives bonus to parry chance + with weapons (even ones that don't parry normally). + - tweak: Melee accuracy is now affected by size of the weapon - smaller than 'normal + sized' weapons are more accurate, bigger are less accurate. Some weapons have + individual bonuses/penalties (e.g. swords are bit more accurate for their size, + toolboxes are less) + - tweak: Material weapons now get damaged on parry much like when attacking, and + can shatter depending on material. + afterthought2: + - tweak: Check your skill loadout; it may have been reset! + - tweak: Skills outside your job and not in the general, organizational, or service + categories (minus pilot) are no longer selectable above "Trained" level. + - tweak: Some head roles had skill point allocations reduced. Engineers' skill points + have been brought in line with contractors (increased). Brig Officers' starting + skills brought in line with MaA. +2018-07-27: + Cakey: + - tweak: Senior Engineers, Deck Officers and Brig Officers may no longer be E5s. + afterthought2: + - rscadd: Constructing things with stacks of material now uses the construction + skill. Higher skill is needed to use more advanced materials or to make more + elaborate items. + - tweak: Construction time is modified by construction skill. + sick trigger: + - rscadd: Diona can now 'Jump-to-next-nymph' to cycle between their nymphs after + splitting. +2018-07-28: + Devildabeast: + - tweak: Shuttle Pilots can now be rank E-6 as Fleet. + - tweak: Shuttle Pilots now have EVA access. + - maptweak: The Shuttle Pilot can now access the Ready Room. + - tweak: Shuttle Pilots can now select the pilot pin in the loadout. They can also + now select the EC cap if they're EC. + - bugfix: The EC Shuttle Pilot no longer spawns with service uniform. + - tweak: The Shuttle Pilot now gets a regular pilot headset and a bowman headset + in their locker. + - tweak: Shuttle Pilot is now defined as a SolGov role. +2018-07-29: + CrimsonShrike: + - tweak: APC lights now brighter. + Spookerton: + - tweak: maintenance drone laws tweaked to read more goodly. + - tweak: mdrone laws tweaked to not imply that mdrones are intelligent, because + they're not. + - tweak: mdrone laws include not interfering with people while trying to do your + job, roomba. +2018-07-30: + Devildabeast: + - bugfix: The SEV Torch's Heads have had ventilation introduced to the stalls in + order to prevent unwanted suffocation. +2018-08-01: + Devildabeast: + - tweak: Corpsman now has the alt-title of "Nursing Assistant" instead of "Nurse". + afterthought2: + - bugfix: APC, fire alarm, and air alarm frames should once again show up as buildable. + - tweak: Faction, citizenship, and home system character creation choices have been + updated. + zaredman: + - rscadd: Added a MIA (Missing in Action) option to crewmember status choices. +2018-08-02: + Cakey: + - maptweak: The brig has been moved to deck one. Deck three has been adjusted to + be further enforce it being the habitation deck. + - maptweak: Added the Commissary, an on-ship store run by supply and service crew. + - maptweak: Moved the pathfinder's office to deck four. + - maptweak: Moved the bluespace drive to deck two. + - maptweak: Moved the observation bubble, diplomatic quarters and vacant office + to deck three. + Devildabeast: + - rscadd: Adds a PCRC suit, a more formal variation of the PCRC uniform, to the + loadout under Corporate Uniforms. + Hubblenaut: + - tweak: Brig cell timers will notify Security over Sec HUDs when expiring. + zaredman: + - rscdel: Replaces double doors to Xenobio, Viro, D2 Maint, D3 Old Brig, Conference + Room, Engineering hard storage, and NT Labs with normal doors. +2018-08-03: + Hubblenaut: + - tweak: All Heads are now able to authorize warrants using the holowarrant projector + regardless of their Security access. +2018-08-04: + sabiram: + - tweak: The mercenary shuttle is now less easily vented by destroying a single + r-window. + - bugfix: Hardsuit rig modules now check properly access for those attempting to + use them. +2018-08-05: + Hubblenaut: + - bugfix: Bridge Officers can once again access their lockers. + - bugfix: SCGR can once again access the bridge. + zaredman: + - rscadd: Allows IPC and Skrell to be Brig Officer. +2018-08-06: + Cakey: + - maptweak: Bearcat has been tweaked slightly to allow for better repair opportunities. +2018-08-07: + Devildabeast: + - maptweak: Removes a catwalk from the Utility Down in the deck 1 substation room. + - maptweak: Adds scrubbers to the toilet stalls on deck 3 to prevent CO2 buildup. + - rscadd: Adds a new branch known as "SolGov Employee"; the SolGov Representative + and OCIE Agent have been moved under it as ranks. + - tweak: SolGov loadout items, including SolGov berets, awards, and hat, can now + be worn by all SolGov-affiliated branches.. + - tweak: Updates the sprites for the Hephaestus Alt. head optics. + Zuhayr: + - rscadd: Added sushi and sashimi. Slice fish or meat into strips, then use them + on rice. Also accepts egg and tofu. + nearlyNon: + - maptweak: Moves notice board between main mess hall doors, removing the window. + RIP. + - maptweak: Adds a holopad to the holodeck, so the AI can hang out there. + - maptweak: Expands holodeck door to be two tiles wide, to prevent bottlenecking. + - maptweak: Adds a newscaster to the vacant office. +2018-08-08: + Devildabeast: + - bugfix: Allows FT to be contractor again for real this time. + - bugfix: Allows FT to be played as Contractor again. + - bugfix: SCGR can now wear most loadout items again. + Nearlynon: + - bugfix: Fixed missing pipes + wires in holodeck. + - maptweak: Adds 2 paperbins to deck 3 in the mess and lounge respectively. + nearlyNon: + - rscadd: Eight balls, able to be bought from the vending machine in the mess. Ported + from TG. "Will the CMO be useful today?" "Not likely." + - rscadd: Add bells; can be made with any material. Ring by clicking with intents + other than grab; grab picks up. Shatters if you hit someone with it! + - maptweak: Distribute bells throughout desks. + sabiram: + - tweak: The Booze-O-Mat menu has been reordered; vessels at the top, followed by + bottles, followed by ready drinks, followed by mixers, and ending with glass + accessories. + - tweak: Added a bottle of mint oil to the Booze-O-Mat for mixing. +2018-08-09: + Flatty: + - rscadd: You can now change icon scaling method in the "Icon" menu on top left! + Zuhayr: + - rscadd: Skrell now appear neutrally gendered to non-Skrell. Use the headtail length + descriptor to specify your secret squid gender. + - rscadd: Vox now have neck markings to show importance to other vox. +2018-08-10: + TheWelp: + - rscadd: Adds the Lost Souls, the remnants of souls sucked into the Starlight Gateway + (for future deity mode). + - rscadd: Added the ability for god cultists (and lost souls) to be able to hear + through the pylons like the deity can. + nearlyNon: + - bugfix: ALL MATERIAL WEAPONS ARE NO LONGER INSANELY FRAGILE. +2018-08-11: + Devildabeast: + - rscadd: Adds Observatory and Field Operations patches to the loadout. + nearlyNon: + - maptweak: Replace the crowbars in medical storage with prybars, which makes more + sense and was requested in the Little Things thread. + - tweak: Added multipens to loadout. + - bugfix: Saves diona from their impending death in holodecks & when preparing to + go to the ship as off-vessel antags. + - bugfix: Fixed grammar on diona nodes. "You plant the diona notes" no more. + sabiram: + - rscadd: Boomboxes now have adjustable volume. + - tweak: Boomboxes can no longer be placed in backpacks. + - tweak: Boomboxes now have a chance to break each time they're turned on. +2018-08-12: + Cajoes: + - rscadd: Added flood lamps (portable) to supply offerings. +2018-08-13: + Hubblenaut: + - bugfix: The diffuser bypass mode on the shield generator will now work on already + active diffusers. + - bugfix: Fixes the shield generator's atmosphere containment mode. + PsiOmegaDelta: + - rscadd: Admins can now alt-click possessed mobs to efficiently kill them. + afterthought2: + - rscadd: The SM monitor readings will fluctuate with some errors at Trained in + Engines skill and below (max 40%, 20%, and 5% at Untrained, Basic, and Trained). + At master they'll be like previously. + - rscadd: Turning on the emitter will recompute its efficiency (i.e. power) to a + lower random value, depending on skill. + - rscadd: Examining the SM at Expert skill will give some information about its + integrity. At Master, it will give a guesstimate for the EER. +2018-08-14: + sabiram: + - rscadd: The shaker now really acts like a shaker, and must be interacted with + to mix its contents (click it in hand). + - maptweak: The bar, mess hall, captain's mess, and cold storage rooms have been + redesigned. + - tweak: Iced tea is no longer sweet. + - tweak: Added sweet tea. 3 measures of iced tea + 1 measure of sugar. +2018-08-15: + Sbotkin: + - tweak: Allows shredding of fingerprint cards. + Zuhayr: + - rscadd: Numerous new ores spawn on the asteroid. They can be compressed into bricks + and ground up for reagents. + - tweak: The ore processor has been rewritten and will happily eat anything containing + metal or other substances, and can then fart them out as sheets. + - rscadd: All material sheets now fetch a price from the supply drone, not just + plat and phoron. + - tweak: As a result, the prices of all materials have gone up to a minimum of their + resale cost. Steel is 60 credits now, for example. + - tweak: The recipe of plasteel is now steel + platinum (put the steel back through + the unloader) and the recipe for osmium-carbide plasteel is plasteel + osmium. + afterthought2: + - rscadd: Hacking without the electrical skill is harder now. + - rscadd: If you are unskilled in electrical, hacking will randomize the wire positions + (not meanings) each time you open the screen. If you are basic, you'll get some + possible duplicate colors/omitted colors, with smaller probabilities. + - rscadd: If you pulse a wire below trained skill, you have (progressively smaller) + chances of pulsing the wrong wire. If you are untrained, you may randomize wire + positions for everyone else trying to hack the thing. + - rscadd: If you cut/mend wires below trained skill, you may cut/mend some extra + wires by accident. + - rscadd: If you try to place a remote signaler with low skill (trained or lower), + you might place it on the wrong wire, and then have a hard time removing it. + - rscadd: A new "Examine" option has been added to the hacking menu. Below experienced + it doesn't do much. On experienced one or two wires will be identifiable on + examine, while at master most will be. Less effective for "secure" objects with + randomized wiring. +2018-08-16: + IsdatAfamas: + - rscadd: Added an away site. It has a few slots open to join as a survivor. + - rscadd: See https://forums.baystation12.net/threads/ctis-research-ship-missing.6790/ + for lore info. +2018-08-17: + Cajoes: + - tweak: flood lamps now start in the off position + - tweak: green ink pens are now greener + - tweak: washing machines now more in line with graphic style of server + - tweak: toys and plants now use less unused animation frames, reducing overhead +2018-08-18: + IsdatAfamas: + - maptweak: Added polarized windows to robotics. + - bugfix: CTI ship should spawn correctly now. + Zuhayr: + - rscadd: Added Tritonians, an uwhitelisted human subspecies. +2018-08-19: + Devildabeast: + - tweak: All Marine Corps uniforms and items have been renamed to reflect the SCG + Army, removing all references of the Marines. + - rscadd: Adds an array of Army outfits, spawnable by admins. + - tweak: The Marine (now Army) PT uniform is now black instead of green. +2018-08-20: + IsdatAfamas: + - bugfix: Various fixes implemented for SRV Verne. Overall should be far less deadly + as an away mission. + nearlyNon: + - tweak: You can now select a bible from the loadout. + sick trigger: + - rscadd: Ghosts can now 'Scan-target' to analyse the thing they're following. +2018-08-22: + Cajoes: + - rscadd: Napalm and Napalm B recipes. Sticky burny goo. + - tweak: relabeled old napalm recipe to phlogiston. Makes heat. And little else. + Same as old napalm. + Cakey: + - rscdel: Removed Tajarans from the server. + Hubblenaut: + - bugfix: Fixes cable coils spawning in tool belts having old vibrant color. + - tweak: Tool belt cable colors are now completely random. + IsdatAfamas: + - bugfix: Some more CTI ship fixes. + Sbotkin: + - tweak: Allows shredding of fingerprint cards. + TheWelp: + - rscadd: 'Imports TG''s circuit updates: ICs now requires power to operate. IC + printer is now hand-held and can copy & print assemblies fully.' + - rscadd: Adds new ICs. + Zuhayr: + - rscadd: Numerous new ores spawn on the asteroid. They can be compressed into bricks + and ground up for reagents. + - tweak: The ore processor has been rewritten and will happily eat anything containing + metal or other substances, and can then fart them out as sheets. + - rscadd: All material sheets now fetch a price from the supply drone, not just + plat and phoron. + - tweak: As a result, the prices of all materials have gone up to a minimum of their + resale cost. Steel is 60 credits now, for example. + - tweak: The recipe of plasteel is now steel + platinum (put the steel back through + the unloader) and the recipe for osmium-carbide plasteel is plasteel + osmium. + afterthought2: + - rscadd: Hacking without the electrical skill is harder now. + - rscadd: If you are unskilled in electrical, hacking will randomize the wire positions + (not meanings) each time you open the screen. If you are basic, you'll get some + possible duplicate colors/omitted colors, with smaller probabilities. + - rscadd: If you pulse a wire below trained skill, you have (progressively smaller) + chances of pulsing the wrong wire. If you are untrained, you may randomize wire + positions for everyone else trying to hack the thing. + - rscadd: If you cut/mend wires below trained skill, you may cut/mend some extra + wires by accident. + - rscadd: If you try to place a remote signaler with low skill (trained or lower), + you might place it on the wrong wire, and then have a hard time removing it. + - rscadd: A new "Examine" option has been added to the hacking menu. Below experienced + it doesn't do much. On experienced one or two wires will be identifiable on + examine, while at master most will be. Less effective for "secure" objects with + randomized wiring. + nearlyNon: + - rscadd: Inducers. Make them in science. They're a TGstation item, you can charge + anything that uses a battery with them. Almost. Screwdriver to remove and replace + its battery. + - rscadd: Cyborg integrated version of the above, using the borg's internal battery, + and a failsafe on it. + - rscadd: IPCs and FBPs are now adversely affected by ion storms. They will be confused + and have blurry vision as their system partially resets to remove ionospheric + corruption. To avoid this, hide out in a saferoom or shuttle, or the dorms or + such. + - rscadd: Prescription science goggles can now be selected from loadout. +2018-08-23: + CrimsonShrike: + - bugfix: Oxygen regenerators should no longer get stuck trying to get or output + gas. +2018-08-24: + Chinsky: + - tweak: CO2 is no longer poisonous. Just non-breathable. Should make Bearcat a + walk in the park. + - tweak: Added CO, which /is/ poisonous. + - tweak: PACMANs that run on plasma now produce some CO, around a mole per 40 seconds, + so make sure you open the window (or turn on scrubbers) before using. + SierraKomodo: + - tweak: Makes NT Security Guard HUD icons purple instead of red. +2018-08-25: + Cajoes: + - rscadd: added supply crate for wrapping paper + - tweak: toned down the toner and floodlamp crates + Textor: + - rscadd: Sleepers, cryo tubes, full body scanners, full body scanner control consoles, + and operating tables can now be constructed. + - rscadd: The aforementioned machine boards are now researchable and printable at + the protolathe. + - rscadd: Added the ability to drag-and-drop players to cryo pods. + Zuhayr: + - rscadd: The General character generation tab has been split between Background + and Physical. + - rscadd: The faction/species/homeworld backend has been completely rewritten. + - tweak: Check your species, faction and homeworld settings as well as the new 'culture' + option under Background. +2018-08-26: + Heptagon49: + - rscadd: You can now rotate unwrenched computer frames via context menu or alt-click. + - imageadd: Added directional icons for computer frames. + nearlyNonexistent: + - rscadd: Two new IPC monitor screens, one an obvious parody of the original Doom, + the other Tetris. +2018-08-28: + Cakey: + - rscadd: Added the Secure Energy Revolver to the CO and XO's closets, replacing + their respective energy guns. + CrimsonShrike: + - rscadd: Oxygen regenerator board added to circuit printer. + nearlyNonexistent: + - tweak: Chameleon kits no longer shapeshift back to normal (and psychadelic) when + EMPed. +2018-08-29: + SierraKomodo: + - rscdel: Removed Floorlength Braid hairstyle + nearlyNonexistent: + - tweak: Press drone can now take photos. + - tweak: Cameras stay off after taking a photo. + - tweak: Photo albums can be taken from the loadout, along with a roll of photo + tape. +2018-08-30: + Chinsky: + - tweak: Sensor console now grants much further viewrange on the map. + Textor: + - rscadd: You can now build light switches and window tint switches with a steel + sheet. + - rscadd: 'To build: use a screwdriver on the frame. You can also use a screwdriver + to disassemble them.' + - bugfix: Fixed issue with converting new-style reinforced windows to electrochromatic + windows. You can use a cable coil on them to convert them properly now. + - tweak: Modified how window tint switches interact with multitools. You can now + set the window ID with the multitool. You can also set the window ID by using + a multitool on the electrochromatic window. +2018-08-31: + Miraviel: + - rscadd: Added 10 more targeted emotes! Use them as *salute fullname. + Textor: + - bugfix: GAS have now been adequately trained by Xynergy on the proper use of stairs. + They will no longer hover above them, afraid to go down. + - bugfix: GAS no longer have their tracheae rupture in low pressure environments. +2018-09-01: + Banditoz: + - tweak: Light frames can now be placed in the actor's area. + Cakey: + - tweak: APLU circuits can now be printed by default. + MO_oNyMan: + - maptweak: Added missing cameras to forensics office, evidence storage and briefing + room + - maptweak: Added a recharger on d4 security checkpoint + - maptweak: Forensic technician can now access morgue from the front door + Textor: + - bugfix: The supermatter monitor no longer cares about delaminating supermatter + crystals not on board the Torch. Those other crystals must suffer silently, + now. + nearlyNonexistent: + - rscadd: Ports Polaris's synthetic eye color changing. IPC, synthetic human, and + Adherent eyes are now RGB. Properly covered by display monitors too. + sabiram: + - tweak: People wearing most hardsuits are now able to be handcuffed. +2018-09-03: + CrimsonShrike: + - bugfix: Fixes pulling circuit checking for its own position and not its holders + Sbotkin: + - maptweak: Replaces strategic reserve of laptops in the infirmary with consoles + and telescreens, where needed. + afterthought2: + - rscadd: Makes exterior airlock assemblies buildable (need Basic skill). + sabiram: + - tweak: The force authorisation and docking management programs now must be run + on suitably powerful equipment, namely a laptop or a console. + - tweak: Increased tech cost of the teleporter console circuitry. + - maptweak: Moved research and development circuit boards into secure storage. + - maptweak: Added more APC and airlock circuits to tech storage. +2018-09-04: + Chinsky: + - rscadd: 'Added a new event: Maintenance Drones Uprising.' + - rscadd: It spawns hostile versions of maint drones in maintenance. They will not + attack anyone they perceive as synth. + CrimsonShrike: + - tweak: Medical circuits now largely inform of severity instead of exposing internal + values. Adapted medical integrated circuits to brainmend. + nearlyNonexistent: + - maptweak: Security now has prybars instead of crowbars. + - rscadd: You can now flip blindfolds up, and start with one from your loadout. + Tape ones can't be flipped as they're not made of cloth. Blindfolds from loadout + are colorizable. + - rscadd: One new AI hologram. + - tweak: Clippy is no longer malf only. +2018-09-05: + nearlyNonexistent: + - rscadd: 'New items intended for antags to steal; several secret documents that + spawn in the SCGR''s office, the conference room, and the NTL''s office. Gotta + collect them all! (Disclaimer: only 3/6 spawn in a game.)' +2018-09-06: + nearlyNonexistent: + - tweak: Water now lasts a minute on the ground, to make it more useful to have + wet floor signs. For reference, space lube is 10 minutes, and the cult spell + is 6 minutes. +2018-09-07: + Textor44: + - bugfix: Surgeons can no longer create magical floating limbs by attaching hands + and feet to a patient lacking an arm or leg. +2018-09-08: + Textor44: + - rscadd: Adds the savage hunter (male and female) clothing for Unathi civilians + in the loadout under xeno wear. +2018-09-09: + FTangSteve: + - rscadd: simple mobs now take different damage from different unarmed attacks + Textor: + - tweak: Staff now take tickets when they hit the "PM" button in the ticket panel. + - rscadd: Adds the ability for admins to change the end credits slightly. + Textor44: + - bugfix: Catwalks can now be cleaned by mops and soap by simply clicking on them. + Janitors everywhere rejoice at having to do less work. + - tweak: Soap now takes a longer time than a mop to scrub floors. Janitors everywhere + grumble at having to take longer at doing their job. + - tweak: Soap no longer can be used to knock people over by dragging them onto it. + Janitors everywhere are sad they can no longer prank people as easily. +2018-09-10: + CrimsonShrike: + - tweak: Signallers no longer give visible or audible feedback that they received + data. There's circuits for that and frankly we were all thinking of killing + the roboticist. + - rscadd: New filter circuits, so that you can discriminate properly + - bugfix: Fixed hypoinjector circuit not injecting + Zuhayr: + - rscadd: Added the ability to carve graffiti into some walls and floors with sharp + objects like screwdrivers. + - rscadd: Being a slog now has long-term consequences. +2018-09-11: + Cajoes: + - rscadd: Some new cargo items, boxed snack foods for refilling vendors, etc. (canned + bread does not go into Galley-!) + - rscadd: Added new cargo order tabs and orderable items. Galley, Custodial, Exploration, + Non-Essentials, etc. + - tweak: Rearranged existing cargo tab contents to something resembling logic. Floor + tiles go into Flooring food supplies to the galley, costumes and hats into Non-essentials, + etc + - rscdel: 'Removed the Tabs: Reagents, Miscellaneous and Hospitality tabs as they + ended up empty once the re-ordering was complete and no longer served a function.' + - rscdel: Crate of Boxes, Crate of Empty Reagent Cartridges, Ripley APLU Circuitboard + Crate + Chinsky: + - bugfix: Fixes microscope always treating partial prints as complete. End of golden + age of forensics. + - rscadd: New forensic evidence type - trace DNA. Left on unfinished food, glasses + people drank from, cig butts and gum wads. Collected with swab kits, investigated + in DNA scanner. + - rscadd: Grabbing, pulling, and hitting people unarmed now will wrinkle their uniform/suit + and leave fingerprints. Usual protections against prints apply there. + CrimsonShrike: + - bugfix: Demultiplexers should have data set correctly now. + ParadoxSpace: + - rscadd: Tritonians now handle water better. They still cannot breathe it, so be + careful, okay? +2018-09-19: + Chinsky: + - rscadd: Added ANFO, a fertilizer+fuel explosive. Mix any of fertilizers (EZ-nutriment, + Left 4 Zed or Robust Harvest) with welder fuel to make it. Add aluminium for + more oomph if you can get it. + - rscadd: To actually make it boom, you need ANOTHER explosion first. A weak explosion + will pretty reliably activate <60u, strong <120u, devastating for more. If it + wasn't strong enough, it can still trigger part of reagent. + - rscadd: Due to related changes, any container holding welder fuel can now explode + if caught in an explosion, though don't expect much oomph. + - rscadd: Added ability to manipulate tape recorder tapes. + - rscadd: User wirecutter to cut tape, use tape on tape to join them. + - rscadd: You can get loose tape out by clicking tape inhand. Join them to put back. + Master forensics techs will be able to tell if it was tampered with. + - rscadd: Tape recorder now have a single wire that starts playback when pulsed. + - rscadd: Adds vinegar reagent. Can be made from ethanol or apply juice by applying + universal enzyme as catalyst. + - bugfix: Adds mayo. Can be made from egg yolk and vinegar or lemon juice. + - tweak: Adds alternative soy sauce recipe. Now it can be made with 5u Soy Milk + + 5u Vinegar + CrimsonShrike: + - rscadd: 'New instruments are now available through supply. rscdelete: Removed + old piano and old violin,' + Zuhayr: + - rscdel: Removed NanoTrasen rank. You can use the contractor rank to get access + to science roles now. Play whatever company you like. + - tweak: The Torch has unionized under the Torch LLC Corporate Union. You can get + a union card in loadout and the Corporate Liaison is now the Workplace Liaison, + with Corporate Liaison and Union Representative available as alt titles. Worker's + rights! + sabiram: + - rscadd: Added missiles for admins to throw at the ship. +2018-09-22: + Aticus: + - imageadd: Adds a new, female-centric hair style for Unathi. The Frills Strike + Back. + Neon1ight: + - rscadd: Added the Xenolife Technician job. It is a crew research position, allowing + EC players to be part of the research department. ICly, it specializes in xenobiology/xenobotany. + Zuhayr: + - rscadd: Education is now a selection in your background tab. Jobs are restricted + to certain minimum educations. You will likely need to change your background + tabs for all characters who work jobs other than Passenger. + - rscadd: Doctorates and medical degrees in the education system modify your record + and ID name to 'Dr. Foo, MD' or 'Dr. Foo, Phd'. + - tweak: Skrell will no longer present as hive minds on their ID and crew records. + - rscadd: Mops can now mop up shallow fluids. + - tweak: Hydrogen fires should no longer result in biblical floods. + - tweak: Floods should now clean up filth decals properly. +2018-09-24: + Cajoes & ChaosAlpha: + - rscadd: mobs now tip over when slipping or resting + Chinsky: + - rscadd: Can now put items into forensic microscope for scan, instead of using + tools on it first. Clicking on microscope with evidence bag puts item inside + too. + - rscdel: Removed alium-turning monolith from trader base. + CrimsonShrike: + - rscadd: Adds some more feedback to augments. + Miraviel: + - rscadd: Added a normal headset to the pilot locker and bowman headsets to corpsman, + medical contractor, physician lockers. + Zuhayr: + - tweak: Graffiti now requires you to be on help intent. +2018-09-26: + Zuhayr: + - tweak: Noticeboards can be built out of wood, dismantled with a wrench, and rearranged + with a screwdriver. + - rscadd: Papers on noticeboards will persist round to round. + - rscadd: Sticky notes can be ordered from cargo and will also persist round to + round. + - rscadd: Mods can now view a list of all persistent data. Admin can use this list + to destroy it with prejudice. + - rscadd: Relatedly, you can now be jobbanned from Graffiti. + nearlyNonexistent: + - rscadd: Science can now print bluespace syringes and cryostasis syringes. Inject + people with more chems at once (20u each; 60u total) or inject them with water/potassium. +2018-09-27: + CrimsonShrike: + - tweak: Rigs can now be hacked after lifting wire cover with a screwdriver. + - tweak: Rig modules and cells are now removed with wrench. + ParadoxSpace: + - rscadd: Adds the Yeosa'Unathi subspecies, their language, their faction, and their + attack. Also gives Yeosa glowing eyes. + - tweak: Lowers how hungry Unathi are at the expense of slower healing. + - bugfix: Fixes issue with tail attack messages. + - bugfix: After much debate as to whether Yeosa count as Unathi, the Expeditionary + Corps have finally allowed Yeosa to wear Unathi cultural clothing from the loadout. + - rscdel: Unathi can now no longer manually toggle on and off involuntary processes + like self-healing. + Textor: + - maptweak: Bridge Deck - Captain's quarters' light switch is moved so that you + are no longer likely to remove the light tube when turning the lights on. + - maptweak: Deck 1 - Xenoflora and Miscellaneous labs are now brighter. This should + allow for scientists to actually see the things they work on. Robotics now has + solid doors. Privacy windows are no longer thwarted by looking through the door-windows. + Added a window to the mech bay side to compensate for the lack of visibility + from that direction due to the door no longer having a window. Door to storage + next to robotics actually opens for the roboticist now. Removed power cable + to nowhere in deck 1 starboard fore maintenance. Swaps the filing cabinet and + table in the morgue so that the paper bin, folder, and pen are actually accessible + when someone is working in there. + - maptweak: Deck 2 - Adds a shield diffuser at the edge of the old brig border so + trash will stop being stuck behind the shields when ejected into space from + the trash room. The shield should no longer block the airlock in deck 2 starboard + mid maintenance due to wall unevenness. + - maptweak: Deck3 - Adds a second mineral bath to deck 3 cryogenic storage wardrobe. + Moves photocopier and shredder in office so that they can both be used normally. + - maptweak: Deck 4 - The toxins storage room is now directly off the hangar in order + to let scientists actually get to their toxins storage room. Finally adds a + security camera to the fuel bay. The AI can now watch the fascinating process + of refueling. Moves the atmos control computer in the Petrov Laboratory so that + you can actually reach all the counter space when working. + - bugfix: Had a long discussion with the OR computers and we both agreed that they + need to actually face the direction they were mapped in. + Zuhayr: + - rscadd: Added a crashed escape pod that may generate on exoplanets and allow for + latejoiners a la Bearcat. + - tweak: Some ruins and submaps will add themselves to the distress signal list. + Probably worth checking now. + - rscdel: Prevented submap jobs from being test-spawned by the global datum system + as they do not expect null args. + afterthought2: + - rscadd: The IT skill now has gameplay effects when using modular computers. + - rscadd: 'Higher IT skill allows the user to bypass logging on program download + with higher probability (Trained: 30%, Expert: 60%, Master: 90%). Logs will + still be generated, with faked entries for the download info.' + - rscadd: The antag access decryption program is more effective at higher skill + levels. It works faster and has a chance to avoid tripping the alarm. At unskilled + (generally meaning non-antag) it has a chance to give the wrong access. + - rscadd: The antag camera alarm-trip probability is now tied to skill, with similar + effectiveness as current at Trained. + - rscadd: The antag dos program is more effective at higher skill, with more dos + attacks per tick at higher levels (equal to current at Basic). At expert and + master, gives extra fake attacking nodes to the system log to impede sysadmins. + - rscadd: The network monitor, email administration, and AI management programs + are locked below basic, basic, and trained skill, resp. You will instead get + some random data displayed. The programs do link to a terminal now. + - rscadd: Added a command line interface for modular computers. With enough skill + (expert+ for most things) you can run specific commands (type man for a list) + to do rudimentary sysadmin diagnostic tasks. Notably, with network access, you + can ssh into terminals of other computers over the network. If you are unskilled, + you may get various failure effects or just be unable to do anything. + - rscadd: To access the terminal, either use one of the programs or use Ctl Alt + Click. + zaredman: + - tweak: Adds defib and compact defib crates to be ordered through supply. + - tweak: Added holosign projector and advanced mop to the janitor robot. + - tweak: Added medical HUD to the surgical robot. +2018-09-28: + sabiram: + - tweak: Added a delay to welding/unwelding airlocks. + - tweak: Xenolife Technicians no longer have access to the fabrication lab or Petrov + helm. +2018-09-30: + Cakey: + - maptweak: Added Deck 5, an expansion of Deck 4 adding more verticality to the + ship beyond stairs and ladders. Deck 4 has been split up to accomodate these + changes. + - maptweak: The hangar has been moved inwards to be more centralised on Deck 5. + - maptweak: The lounge has been moved under cryogenics and now overlooks the hangar + (Still accessible from cryogenics). + - maptweak: The officer's mess has been moved under the mess hall and now overlooks + the hangar (Still accessible from the mess hall). + - maptweak: The Petrov has been made slightly bigger to be more useful. Moved several + research suites to the Petrov. + - tweak: The Research Director and Corporate Liason can now use the ID program to + modify accesses within their own department. Petrov accesses are now only modifiable + by the Research Director and NTL + - tweak: Fixes the commissarry shutter access requirement. + Miraviel: + - maptweak: Repositioned lights in the SEA's office, the XO's and CO's request consoles, + the fire extinguisher cabinets on the Bridge, the labels at the stairs, and + the CO's light switch. Removed the overlapping Nanomed from the Bridge and the + urinal from the Aquila. +2018-10-02: + Cakey: + - maptweak: 'Made maintenance style-consistent throughout all decks with techmaint + tiles and railings. maptweak: Made railings not obstruct items, shuffled some + items around to not be behind railings.' + - maptweak: Added a single seat in the lounge facing space, which takes up barely + any extra space. + - maptweak: Added a fax machine to the pilot's lounge. + - tweak: Fixed Petrov airlock accesses. + - tweak: Fixed Hangar maintenance airlock accesses. + ParadoxSpace: + - rscadd: After complaints that Unathi would have to be cut open [stack overflow] + amount of times with a scalpel, Unathi can now again toggle their healing. + - tweak: To reflect their biology, Unathi are now actually ectotherms instead of + being particularly cold-sensitive endotherms. + Sbotkin: + - rscdel: Removed peacekeeper armband from loadout. + Textor: + - bugfix: Helm control, engine control, sensor, and navigation consoles no longer + stop functioning after repair or construction. Just hit "reconnect." + - bugfix: The windowtint button on the back wall of the XO's office actually works + now. + sabira: + - tweak: The research department's colouration has changed from the red of NanoTrasen + to the green of Torch, Limited. + - tweak: Torch, LLC (the holding company representing the research department) has + been renamed to Torch, Ltd. + - maptweak: Changed the area around research to use the green decals, and new Torch + Ltd logo. + - maptweak: Changed the research director and liaison's offices on the bridge to + make use of the green decals. + - rscadd: Added legacy NanoTrasen uniforms to the loadout. + sabiram: + - tweak: Adherents of the Vigil can now play as Janitor, Chef, Bartender, Supply + Assistant, Engineering Contractor, Roboticist, Chemist, Research Assistant and + Researcher. + zaredman: + - maptweak: Adds dedicated Robotics OR. + - maptweak: Each OR now has holosigns to show when they are in use. + - maptweak: Moved some items from the joint OR to the robotics OR, added some extra + tools. + - rscadd: Separates Roboticist and Biomechanical Engineer. +2018-10-03: + Chinsky: + - tweak: Various changes to gunshot residue (GSR) forensic thingamabob. + - rscadd: Shooting someone pointblank will now leave GSR on the targeted organ, + and burn them a bit. Just like in those mystery novels! + - rscadd: You now need to aim at hand to take GSR from THAT hand, not from both. + You can take GSR from other bodyparts by aiming at them too. + - rscadd: Gun actually gets GSR too now. + - rscadd: Guns have a chance to leave GSR on the ground when fired. + Miraviel: + - rscadd: Added mechanical description to skill blurbs. + ParadoxSpace: + - rscadd: Adds a menu for you to select from your list of available attacks. Naturally, + this depends on species. + Sbotkin: + - rscdel: Removed ID modification and weapon authorization tools from command computers. + Textor: + - tweak: Lets engineering module and maint drones pick up floor tiles. They can + now put the tiles they levered off the floor back. + sabiram: + - maptweak: The hallway leading from the elevator to engineering in the maintenance + deck has been re-opened. + - maptweak: Moved security guard lockers from Petrov to the main checkpoint. +2018-10-04: + CrimsonShrike: + - bugfix: Rotating should no longer make science floor disassemble. + afterthought2: + - experiment: 'We are conducting some stability testing. You may notice issues with + how objects below you, on other z levels, are rendered: this is expected.' +2018-10-05: + Spookerton: + - bugfix: Automatic shutoff valve circuit toggling now works as intended. + Textor: + - rscadd: Deimos Advanced Information Systems (DAIS) is now officially in the game. + Lunchboxes, mugs, an undershirt polo, contractor uniforms, winter coats, and + a labcoat, are all in-game now. + - rscadd: DAIS is now a faction in the background tab of the character creator. + - rscadd: A new experimental DAIS lawset is available for researchers to install + in an AI. + - maptweak: Adds DAIS lunchbox, coat, and mug to telecomms room. + - bugfix: Corrects science labcoat description to reflect new color scheme. + - bugfix: Replaces lingering references to Torch, LLC with Torch, Ltd. + greggbot: + - rscadd: RFID Card Broadcasters, previously only found in PDAs, can now be printed. + zaredman: + - tweak: Adjusts max skill points and skill caps for Biomech and Roboticist. +2018-10-06: + Sbotkin: + - bugfix: The microphone circuit now translates non-GalCom languages only. + sabiram: + - rscadd: Added new colours of wrench and wire cutters, wherever wrenches and wire + cutters are found. + - rscadd: Adherent players can now select from some pre-set colours in character + creation. +2018-10-07: + Cajoes: + - rscadd: Added cubed spiders + - rscdel: Removes previously added domestic animal cubes + Cajoes & Earthcrusher: + - rscadd: Mass Driver Ammunition, two types. + - rscadd: Icon for the blunt mass driver round by Earthcrusher + afterthought2: + - bugfix: Air sensor thresholds should now work properly. + zaredman: + - tweak: Adds wheelchair and roller bed crates to be ordered through supply. + - tweak: Raises minimum player age for AI to 7 days and Cyborg to 3 days. +2018-10-08: + Atebite: + - bugfix: Fixed less wet floors increasing slip chance. Mopped floors should now + only have a 50% chance of slipping you. + Cajoes: + - rscdel: Removed the mention of crate in the cargo interface order form. Since + it is implied the shipment will be in a crate.. or locker.. or otherwise sealed + in some material. + - rscdel: Removed \improper tags from labels that didn't require them. You will + neither notice nor care. + - rscdel: Removed dispenser cartridge packs from Galley-Cargo due to redundancy. + Refer to Dispenser Refills-Cargo. + Textor: + - rscadd: Adds buttons to allow selecting "high," "low," or "never" on all antag + roles with a single click. + TheWelp: + - rscadd: Adds the starlight deity! Embodiment of fire and flame, watch out for + its super-powerful heralds and minions of light and darkness. + afterthought2: + - tweak: '"Starburst" spell has been heavily nerfed. The fireball spell is no longer + available in starlight deity mode pending balance adjustments.' + zaredman: + - tweak: Adds recipe for Chemistry to synthesize adrenaline. +2018-10-10: + FTangSteve: + - tweak: janihud now bases vision off of what the mob wearing it can see instead + of the tile + - rscadd: nabbers can now use HUDs + greggbot: + - bugfix: IC seed extractor now properly creates the appropriate seed and deletes + the fruit. +2018-10-12: + Atebite: + - tweak: Added a skillcheck for slips based on athletics + Cakey: + - maptweak: Tweaked several areas within maintenance after feedback. Removed majority + of railings. + - maptweak: Fixed shutoff valve layout on decks 4 and 5. + - maptweak: Swapped Petrov air pump with one that starts as on. + - tweak: Railings can now be wrenched open to allow passage, and the time it takes + to climb railing has been reduced from 5 seconds to 1.25 seconds. + - maptweak: Fixes merchant base accesses. + - maptweak: Removes a bunch of tiles from maintenance over piping and wires. + - maptweak: Fixes lack of cameras on D5. + - maptweak: Fixes dark spot on D4 fore hallway. + - maptweak: Adds consoles to pilot's lounge, exploration prep. + - maptweak: Adds suit sensors/camera monitoring console to Charon. + - maptweak: Adds exploration network cameras to explorer helmets. + - maptweak: Gives the shuttle pilot access to explorer camera network, suit sensors + monitoring. + - maptweak: Fixes noticeboard placement around the map, added extra noticeboards + to departments that lacked one. + - tweak: Fixes Petrov camera network, only accessible by LLC employees. + Chinsky: + - tweak: Disarming is now riskier. There's a chance to hurt your hand on the weapon + you're going for instead, with chance adjusted based on skill difference / being + flashed etc / being on help intent. +2018-10-13: + Anticept: + - balance: Increased atmospheric pump efficiency, and atmospheric filter efficiencies. + Pipe wizards rejoice! + - balance: Increased air injector internal tank size as well as power cap. this + increases its flow rate due to how atmospheric devices perform their math. Pipe + wizards rejoice! +2018-10-15: + Textor: + - tweak: Due to the extremely likely outcome of death for the crew upon ejection + of the escape pods, command has moved abandon ship from Command and Communciations + to Keycard Authentication Devices and renamed it to "Initiate Evacuation Procedures." + Abort still occurs at C&C consoles, as does bluespace jump initiation. + - tweak: Moves bolt/unbolt saferooms from Keycard Authentication Devices to C&C + - tweak: Changes Keycard Authentication Device interface to NanoUI +2018-10-16: + Cakey: + - maptweak: Fixes Petrov isolation cell alarm placement. + - maptweak: Added sticky notes to offices around the ship. + - maptweak: Added noticeboard to head of staff offices where missing. + - maptweak: Added missing air alarms to hangar, hangar storage. + - maptweak: Fixes hangar exit button access. + - maptweak: The Aquila is now overmap-capable. + - maptweak: The Guppy has been given some extra cargo space. + Roland410: + - tweak: Changes Tower deity spells to have more charges, and the fountain of power + only takes 30 seconds to recharge it. + Textor: + - tweak: O2 Tanks are once again removable without having to take your entire hardsuit + off. Hardsuit users will no longer risk suffocating in a vacuum because they + ran low on air. + afterthought2: + - rscdel: Spiderbots have been removed. + - maptweak: The telescreen by the copier in medical has been removed; some laptops + have been restored. + - tweak: Everyone gets four times more starting cash. + - tweak: Traders spawn much more often, and stick around about four times longer. +2018-10-17: + Melioa: + - bugfix: Fixes text displayed when examining an Automatic Shutoff Valve. + Textor: + - rscadd: Body scans now look different depening on the skill of the person reading + them. This includes printed and scanned versions. + - rscadd: 'New machine: Body Scan Display. It can have scans pushed to it for surgeons + to reference.' + - tweak: Body scanner UI updated to nanoui. + - maptweak: Maps in two body scan displays, one in the main operating room, the + other in robotics operating room. + sabiram: + - tweak: The conglomerate representing corporate interests onboard the Torch has + been renamed to Tenjin Holdings. + zaredman: + - maptweak: Adds washroom to medical. Moves a maint ladder to give some space. + - maptweak: Expands medical's D3 storage slightly to use up unused space. + - maptweak: Adds trash chute to medical locker room. +2018-10-18: + sierrakomodo: + - bugfix: Fixes mouse/drone duplication bugs with cookers, microwaves, and destructive + analyzers (#14179) + zaredman: + - tweak: 'Change to chem recipe for making adrenaline: now requires inaprov, hyperzine, + and dex+.' +2018-10-19: + Miraviel: + - maptweak: Added proper piping to the infirmary hallway and lighting to the locker + room. Added missing shutters and moved around a few overlapping objects. +2018-10-20: + EcklesFire: + - rscadd: Added helmets to Xenowear loadout for Skrell in security/roles that use + armour. Credits to Karbivio for icons + Miraviel: + - rscadd: 'Added the following new emotes: afold, alook, crub, eroll (targeted), + erub, hbow, hip, holdup, hrub, hshrug, hspread, fslap, ftap,pocket, rsalute, + rshoulder, squint (targeted), tfist, tilt.' + Sbotkin: + - bugfix: Fixes the integrated circuits recycling. + - rscadd: Allows to recycle assemblies and individual circuits. +2018-10-21: + zaredman: + - bugfix: Replaces D2 Atmos CO2 high-power pump with pressure regulator and replaces + D5 CO2 high-power pump with a normal pump to avoid unintentional blowouts. +2018-10-22: + Datraen: + - tweak: Uplink kits come in generic containers now. + Textor: + - tweak: Changes Torch Ltd. to Expeditionary Corps Organisation in several spots. + - tweak: Adds DAIS labcoat to roboticist and biomech engineer loadouts. + sierrakomodo: + - rscadd: Bridge Officers now have access to the Charon's Airlock and Charon's Helm +2018-10-24: + Anticept: + - tweak: All pipes, except fuel pipes, now have the same pressure damage threshold. + Previously, cross-z pipes were significantly weaker. Fuel pipes' extremely high + threshold remain unchanged. + - tweak: All pipes have a slightly higher burst pressure threshold. + BlueNexus: + - tweak: '"Many chemicals now require heating or cooling in order to mix. Check + the wiki for specifics."' + - maptweak: '"Added heaters and coolers to various locations on the map."' + Roland410: + - rscadd: Radiation suits got a larger pocket and you can fit your geiger counters + on them now. Technology! + Sbotkin: + - tweak: All guns now spawn with safety on. + - bugfix: Fixes twohanded weapons not being rendered when on back. + afterthought2: + - tweak: Ship movement physics have been altered. Ships are now generally slower + to accelerate, though can move pretty fast when at max speed. This includes + the Torch as well as overmap-capable shuttles and away site vessels. + - bugfix: Overmap wrapping when moving diagonally has been fixed. + - tweak: Shuttles no longer have gravity when not at a location that has ambient + gravity. + - rscadd: A new admin tool has been added, Toggle Overmap Halt, which allows admins + to make all overmap ships stop and freeze them from moving. + - rscdel: The Move To Top object verb has been removed due to changes in the new + BYOND version making it no longer work consistently. + sierrakomodo: + - maptweak: Pilot's Lounge and Deck 5 Maintenance now have air alarms +2018-10-26: + Sbotkin: + - rscadd: Experienced shooter will disable the safety if they draw a gun with harm + intent. + - tweak: Captain's revolver (the one in the showcase) spawns with no ammo. + - bugfix: Fixed a bug with safety state not showing after unholstering. +2018-10-27: + Melioa: + - tweak: Replaces 'Broad-shouldered' setup build for 'Well-built' +2018-10-29: + Gates: + - rscadd: NTOS now requires MANDATORY updates every once in a while. + MistChristmas: + - maptweak: Added a weapon charger to Deck One Checkpoint + - maptweak: Removed fire alarm hiding in a bin in excavation prep +2018-10-30: + BlueNexus: + - rscadd: Added insulated beakers. It is now actually possible to make clonex. Oops. + - tweak: Clonex no longer requires phoron. + RyanSmake: + - rscdel: Removed NTNet relay from Bearcat space ruin as it was non-functional. + SierraKomodo: + - bugfix: All disposal units should now be connected to the disposal network. + sierrakomodo: + - bugfix: Adds missing disposal pipes to the briefing room. +2018-10-31: + Textor: + - tweak: The bodyscanner now provides feedback when pushing scans to the OR displays. + sabiram: + - rscadd: Some jobs now have a cap on education tiers you can select. +2018-11-01: + EcklesFire: + - imageadd: Adds new icons for the Skrell riot security voidsuit to bring it in + line with the Torch voidsuit. Credits to Karbivio. +2018-11-02: + afterthought2: + - tweak: Secret and random will (almost) never fail to start when voted in. + zaredman: + - maptweak: Adds Security, Science, and Engineering department pagers in their respective + lobbies. +2018-11-03: + Cakey: + - rscadd: Added fleet branch berets, for showing off your branch when you need to + wear your service uniform. + SierraKomodo: + - bugfix: Job slots should now open back up properly whenever someone cryos from + a multi-slot job +2018-11-04: + SierraKomodo: + - bugfix: OOC lobby manifest entries should now show proper Active/Inactive status + - rscadd: Crew records now have a separate 'Formal Name' field that contains the + MD/PhD/etc suffix. This will be the name displayed on manifests. + afterthought2: + - balance: TC prices on some merc items have gone up. + - tweak: You can now dump the contents of a pill bottle into the chem grinder by + clicking the grinder with the bottle. +2018-11-06: + Datraen: + - rscadd: Added Skrellian SDTF Holobadges, verb to set individual SDTF. + Miraviel: + - rscadd: 'Added three new hairstyles: Donut Bun, Gentle 2, Gentle 2 Long.' + SierraKomodo: + - bugfix: Crew manifest entries should now update properly when someone cryos + afterthought2: + - balance: EMPs now deal much less damage to synthetic humans (FBP, IPC), though + the amount is still considerable. + - balance: Damaged robotic legs and feet reduce movement speed. + - balance: Robotic external organs will, if heavily damaged or the damage taken + is large, pass burn damage to contained internal organs. + - tweak: Cell organs are dramatically less power-efficient if damaged. + - tweak: If a synthetic human runs out of juice, they become unconscious. +2018-11-07: + sabiram: + - tweak: It now takes some time to repair and pry open/closed blast doors and shutters. + - rscadd: Added a EXO polo undershirt to the loadout underwear options. +2018-11-08: + Earthcrusher: + - bugfix: Emotes ending in quotation marks will no longer add a superfluous period + on the end. + - bugfix: Lazy typists rejoice! When speaking, the game will automatically capitalize + and add punctuation where needed. Well at least on the end of the sentence. + - tweak: Emotes now use the visible emote character set in your Character Setup, + which defaults to "^". + EcklesFire: + - tweak: Removes Skrell education background requirements and allows them to utilise + more unarmed attacks. + SierraKomodo: + - bugfix: Deck 5 hallways now have air alarms. + sabiram: + - tweak: All various subcontractor (NanoTrasen and Hephaestus Industries, at time + of writing) items in the loadout have been merged into one item with type selection. + Key word to search for (CTRL-F) is 'corporate' + - rscadd: Lighters, zippos and candles now come in a variety of new colours. +2018-11-09: + Miraviel: + - rscadd: Prospectors were given EVA and SolGov crew access. +2018-11-10: + MistChristmas: + - maptweak: Replaces overlapping Xenobiology pipes for Scrubbers and Supply Ones. +2018-11-11: + Roland410: + - rscadd: Added a playable crashed survival pod. + - maptweak: Converted the old crashed pod into a random ruin. +2018-11-12: + Alex6511: + - tweak: Reduced the frequency of windows updates events by half + Blue Bit: + - imageadd: Added sprites for the anomaly console and scanning pad. + Datraen: + - bugfix: Cancelling SDTF naming for Skrell badges no longer blocks setting in the + future. + Sbotkin: + - rscadd: Adds digital multitool to the engineering toolset augment. + SierraKomodo: + - bugfix: Fake Crew Announcements traitor service now broadcasts the correct arrivals + message on use + - bugfix: Fake Crew Announcements traitor service now properly updates the crew + manifest with rank, name, and honorifics +2018-11-15: + Roland410: + - tweak: Gamemode vote starts at 160 seconds, giving players 100 seconds to change + their character/preferences according to the voted gamemode. + - tweak: Should a non-secret mode fail to start, you will have one minute to adjust + your preferences or unready before roundstart. +2018-11-16: + Faustico: + - rscadd: Added basic security belts, like normal security belts but without a holster. + - maptweak: Added basic security belts to MAA lockers. + - tweak: Storage accessories and holsters use two different accessory slots again. + SierraKomodo: + - tweak: Blob resistance has been rebalanced. Brute-based weapons (Crowbars, fireaxes) + are more effective against cores, while fire-based weapons (Welders, lasers*) + are more effective against blob and strong blob. *Laser rifles take a 1/2 damage + penalty against all blob targets. See https://github.com/Baystation12/Baystation12/pull/23774 + for specific numbers. + TheWelp: + - rscadd: Adds ability to destroy circuit assemblies via damage. Bigger assemblies + means more health. Can be healed with wire. +2018-11-17: + CrimsonShrike: + - rscadd: Adds the mech pilot inspired Null Suit to robotics fabricator. This lightweight + rig offers little to no protection and cannot mount weapon modules. +2018-11-19: + Alex6511: + - tweak: the malfunctioning drone on away sites has had its damage adjusted + BlueNexus: + - bugfix: Cryo Cells now work properly, with temperature. This means clonex is possible. + - tweak: Clonex can no longer mix below -200C + Miraviel: + - tweak: Updated the guest pass terminal icon. Added guest pass terminals to supply + and to the Pathfinder's office. + - tweak: Using the autopsy scanner in-hand will now print the scan. Its icon was + also updated. +2018-11-21: + Aticius: + - bugfix: Crashed pod should no longer have random space tiles causing constant + air flow/air loss. + SierraKomodo: + - tweak: Charon and Aquila APCs now include helm access flags, meaning anyone who + can access the shuttle's helm can also unlock the shuttle's APCs. Engineers + still have APC access as well. + afterthought2: + - bugfix: Clonex should work properly with cryo tubes now (recall that you have + to make it at -100 to -75 C, best done with the cooler). It will adjust its + temperature to that of the cryo tube, which should prevent it from denaturing + under normal circumstances. +2018-11-22: + Alex6511: + - maptweak: Added a large insulated beaker to chemistry. + EcklesFire: + - bugfix: Makes Skrell medical voidsuit helmets work. + afterthought2: + - tweak: Clonex now won't denature below 50 C (i.e. unless you heat it). + sabiram: + - balance: Space carp now have generally more health and more powerful attack values, + and move faster. Pikes and sharks now have more health and do more damage. + - balance: All castes of giant spiders are now tougher, faster, and more deadly + all around. Hunters in particular are very dangerous. + - rscadd: Hunters and guards now use a new venom. + - rscadd: Added colour variants for space carp. + - rscadd: Added randomly coloured eyes for giant spiders, and made them glow. + - rscadd: Hostile mobs will now attempt to pry open doors between them and their + target, though they can be interrupted. + - rscadd: Hostile mobs can now destroy window-doors and tables. + - bugfix: Fixed hostile mobs not destroying windows, grilles, wall frames, etc. + - rscadd: Added more colours for space carp. +2018-11-24: + Blue Bit: + - rscadd: 'There are now two additional exoplanet types: shrouded and chlorine.' + - rscadd: Added a few alien creature color variants. + - maptweak: Added six new randomly spawning exoplanet sites. + - bugfix: Fixed a portion of the "Lodge" away site that was designated as space. + RyanSmake: + - rscadd: Adds a Bluespace Artillery to Deck 2 missile bay. Select an adjacent overmap + tile, and get rid of the event on it, or shoot at the away sector a charge of + your choosing (emp, remote mining, explosive, fire, or droppod). + Toriate: + - tweak: Photocopier now uses new photocopier icon state in bureaucracy.dmi instead + of the scanner iconstate. + - imageadd: New photocopier sprites added! Made by yours truly. + afterthought2: + - rscadd: The mecha skill (Exosuit Operation) is now a subskill of EVA. You need + to have at least Trained in EVA to select it, and then choose it from skill + selection. + - rscadd: Driving mecha without the mecha skill may result in unpredictable movement. + - rscadd: Exiting a mecha without proper skill may occasionally force-eject you. + - tweak: The mecha skill no longer has anything to do with mecha fabrication in + the description. + sabiram: + - tweak: Nurse spiders should infest their enemies with eggs less often than before. + - rscadd: Added giant spider legs, harvested from giant spiders. Can be used in + sushi or boiled in the microwave. +2018-11-25: + RyanSmake: + - bugfix: The BSA actually works now. +2018-11-26: + Funce: + - bugfix: You can no longer get infinite amounts of cable coil from constructing + and deconstructing certain telecomms equipment + Hubblenaut: + - tweak: Drawing guns based on intent is now a preference option. + SierraKomodo: + - tweak: Autopilot default speed lowered from 2 (Exceeds max speed hardcap of 0.1) + to 0.0025 (40 seconds ETA per tile) + - bugfix: Autopilot no longer burns fuel needlessly bouncing above/below the speedlimit, + and will now never go above the speedlimit. + - tweak: Autopilot now handles changing direction/destination and diagonal movement + much more efficiently fuel wise + - bugfix: It is once again possible to decelerate to a speed of 0. +2018-11-28: + afterthought2: + - tweak: Surgically repairing decaying organs is once again viable. +2018-11-30: + Heph-hasto: + - rscdel: Removes ability for ship AI to be traitors +2018-12-01: + Cakey: + - tweak: After the sudden drop in SCG funding, the newly released MRE line has been + reduced in content. + SierraKomodo: + - rscadd: General Notes (Public) field has been added to crew records. These are + records visible to anyone who can open crew records, and are intended for 'common' + information between security, medical, /and/ employment records. + afterthought2: + - rscadd: A new admin tool, Toggle Circuits, has been added to the Secrets panel. +2018-12-02: + Aticius: + - rscadd: Adds a joinable Colony map that can spawn on exoplanets. Rimworld mode + is here. + Broseph Stylin: + - rscadd: A new Scientist rank is now available for the SolGov Employee branch. + - tweak: The Scientist and Research Assistant jobs are now open for the SolGov Employee + rank of Scientist. +2018-12-03: + Cakey: + - rscadd: Added katsu curry, made with a slab of chicken, 10 units of rice, 10 units + of water, 5 units of flour, an apple, a carrot, and a potato. + Toriate: + - imageadd: The LAEP90's sprites have been replaced with new ones! + sabiram: + - tweak: Wall frames now use materials like walls do, and can be painted and unpainted + with the paint gun. +2018-12-04: + Aticius: + - maptweak: Bunch of minor fixes and tweaks to the Colony map. The walls no longer + eat mining computers. Oops. + Cakey: + - rscadd: Added Terran Navy uniforms. + - rscadd: Added Terran Navy ranks and structure. + sabiram: + - balance: Giant spider nurses will now only inject eggs into organs that have space + for them. + - balance: Reduced the number of spiders hatched per egg injected. + - balance: Injected spider eggs now mature more slowly. + - tweak: Slightly reduced maximum possible health for all castes of giant spider. + - tweak: Reduced occurrence weight and severity of spider infestation event. + - tweak: Spiders bursting out of organs is more damaging. + - tweak: Hostile simple animals can now destroy railings. + - tweak: Simple animals should now die faster after taking fatal damage. + zaredman: + - rscadd: Adds a MEDIC and OCIE AGENT tag for plate carriers. +2018-12-06: + Cakey: + - imageadd: Fleet uniforms sprites have been re-done. + - rscadd: Added Fleet officer's alt utility uniform, mainly used by bridge crew. + - rscadd: Added Fleet service jackets, with alternating trimmings based on rank + (enlisted, officer, senior officer, flag officer) + - rscadd: Added new Fleet dress jackets, with alternating trimmings based on rank + (enlisted, officer, senior officer, flag officer) + afterthought2: + - maptweak: The GUP is now overmap capable, though with poor sensor quality. + - maptweak: The GUP is no longer fully pressurized. Use the unlocked air alarm to + properly modify the atmosphere as needed. +2018-12-07: + Aticius: + - rscadd: A new paint job has been added to suit cyclers in the Engineering department. + Stomp around in style in a Hazardous Operation suit! + RyanSmake: + - bugfix: Stopped AIs and ghosts from activating artifacts. +2018-12-08: + sabiram: + - maptweak: The ship's Christmas tree has been installed in the galley. +2018-12-09: + Eckles: + - tweak: Changed Terran to Gilgamesh/Independent. Faction rename. + - tweak: Enforced Martian and Martian Surfacer as default human culture/system instead + of generic 'humankind'. + Persona E: + - balance: Unathi and Dionaea can no longer regenerate without nutrition. + Roland410: + - tweak: Construction skill is required for basically any recipes now, and material + difficulty (what skill you need to be able to craft from it) has been upped + for most of them. + - tweak: Engineering contractors receive trained construction now to be able to + handle plasteel. + Sabira: + - balance: Handheld and mounted/portable flashers now work on all simple animals. + - balance: All hostile mobs can now be stunned. + - balance: Spiderlings now pull from a weighted list of castes when determining + which caste to grow up into. Hunter spiders are rare, all other castes are even. + - balance: Every caste of spider except hunters can now be captured with nets. + - balance: Various spider numbers tweaks. Reduced hunter maximum damage. Reduced + lifesteal for all castes. Reduced nurse venom-ness. + - balance: Nurse spiders now have a maximum amount of eggs they can lay. They can + ready more eggs by feeding from mobs trapped in cocoons. + - rscadd: The base variant of giant spider is now an unremarkable generic worker + meant to fill the ranks. They don't have any special gimmicks. They're green. + - rscadd: Added a proper guard caste to spiders. Guard spiders (brown) will now + be paired with a nearby nurse (beige), and will closely follow them til' death + do they part. Killing a nurse might throw their guard into a rage. + - rscadd: Added a spitting spider (purple) caste - once they're out of venom, they'll + have to generate more before they can spit again. They'll resort to melee combat + if they're out of spitting venom. + - rscadd: Hunter spiders can now initiate combat by leaping at their prey. + - tweak: Hostile mobs will now only attempt to destroy their environment if the + obstacle is between them and their target. + - tweak: Hostile mobs now have a chance to miss their attacks. Flashing them increases + the chance. + - tweak: Hostile mobs can now have individual delays for prying open doors. Spiders + and carp are currently the only ones set. +2018-12-10: + Blue Bit: + - rscadd: Liquids can now be collected from exoplanet puddles. + - rscadd: Added tar. It's a bit toxic, but it can be heated and broken down. + afterthought2: + - rscadd: Some exoplanet plants now produce exotic chemicals, with effects that + are randomly generated each round. + - rscadd: Inspecting these chemicals in the mass spec with high chemistry and/or + science skill will reveal additional information about them. + - rscadd: By heating them to almost, but not quite, their boiling points, the effects + of these chemicals strengthen (if with phoron catalysis, then weaken). By also + adding certain additional ingredients (depending on the effect), the effect + will instead be left unchanged. + - rscadd: 'Cooling works similarly, but now the default behavior is that the effect + is left unchanged: you need to add certain additional ingredients to make the + effect strengthen (or weaken, with phoron).' + - rscadd: These chemicals may have powerful combinations of medical (or poisonous) + effects that can be used, or (if purified sufficiently) can be sold for large + profits. + sabiram: + - bugfix: Giant spider nurses will no longer infinitely attempt to cocoon deceased + giant spiders. +2018-12-11: + Persona E: + - rscdel: Removed the TCC ushanka from the loadout. + afterthought2: + - tweak: You can now order additional BSA charges from supply. + - tweak: Mass driver ammo is now cheaper. +2018-12-12: + Carlen White: + - tweak: The supply terminal listing of supplies shade every so listing to help + item selection. +2018-12-13: + Dave-TH: + - bugfix: The Pilot's qualification pin can now be pinned to jackets. (Like the + rest of the pins) + - bugfix: The dedication plaques on the bridge are no longer invisible. + - bugfix: The Pathfinder's hardsuit no longer has an invisible chest piece when + sealed. + WhiteHusky: + - rscadd: Supply consoles now show a notice when there are pending orders when properly + authenticated. + - spellcheck: Fixed misspellings in the Supply Console. +2018-12-14: + PoZe: + - tweak: Admin verb Create Object major flaw was optimized to display/search lists + of all objects instantly, instead of freezing for 3-4 seconds. + RyanSmake: + - bugfix: After repeated complaints from the SEV Torch that all showers are constantly + clogged we have deployed the NanoTrasen Bluespace Plunger(tm). Operation successful, + showers will never clog again. + WhiteHusky: + - bugfix: You no longer "see" items being removed from bags or other storage items + when blind. + sabiram: + - tweak: Placing acids in a fire extinguisher will now destroy them, and may splash + acid onto the user. +2018-12-15: + afterthought2: + - rscdel: NTSL has been removed entirely. +2018-12-16: + Alex6511: + - bugfix: Normal humans can no longer select the vat-grown specific culture + Hubblenaut: + - bugfix: Fixes movement with grabs. +2018-12-22: + sabiram: + - rscadd: Added two new holodeck programs; a plaza and a bathhouse. +2018-12-24: + WhiteHusky: + - rscadd: You can enable notifications for the shipping program. +2018-12-27: + Anticept: + - tweak: 'XO default access is no longer spotty. It now has access to the entire + ship and shuttles, including research. Specific changes: Added robotics, all + of research including petrov, Pilot, Mining, and Commisary. Places XO does not + have access: Captain, Research Director''s office, Research Director''s Petrov + Office, SolGov Rep, and Corporate Liason.' + - rscdel: Removed Genetics access from the game. + - tweak: Renamed "Nanotrasen" in the access computer program to "Corporate". + - tweak: Renamed access "Psychiatrist's Office" to "Mental Health". Renamed access + "Head of Security" to "Chief of Security". Renamed "Head of Personnel" to "Executive + Officer". "Quartermaster" is renamed to "Deck Chief". + Hubblenaut: + - bugfix: Anomaly isolation and Xenobiology air alarms will no longer cause atmos + alarms. + Toriate: + - tweak: RCD now carries 120 matter units at max. Small matter cartridges give 30 + units, while large ones give 120. + - rscadd: Rapid Crossbow Device added. Craft by screwdrivering a RCD and then slapping + a fully assembled crossbow frame into it. + - imageadd: New RCD sprites in tools.dmi, made by yours truly. Originally made for + Eris. + - imageadd: New Matter Cartridge sprites, based off /tg/'s. + - imagedel: Old RCD sprites deleted. + WhiteHusky: + - rscadd: You can now print receipts on pending, approved, and archived orders. +2018-12-28: + WhiteHusky: + - rscadd: You can now examine neural laces, and understand them assuming you have + the skill. + afterthought2: + - tweak: Off-station roles are blacklisted from being on-station antags. +2018-12-30: + WhiteHusky: + - rscadd: RFID card readers firmware has been updated to allow verbose diagnostics + checks. +2018-12-31: + WhiteHusky: + - tweak: You no longer drop computer hardware onto the floor if possible. +2019-01-02: + afterthought2: + - tweak: The colony will no longer start irradiated. +2019-01-03: + Broseph Stylin: + - rscadd: A system to automatically switch clothing icons based on gender has been + introduced. It is currently set up to work for humans and human subspecies. + - tweak: Expeditionary Corps, Fleet and Army uniforms as well as EXO and corporate + variations of the Torch Research uniforms now have gendered icons. +2019-01-06: + Cakey: + - maptweak: Fixed odd spacing in supply, adds a cargo lift to the warehouse. + CrimsonShrike: + - rscadd: Adds detective instinct verb for master forensics. This will give most + of the scene a distinctive noir look. + Hubblenaut: + - bugfix: Fixes shuttles removing air from the hangar upon arrival. +2019-01-07: + Anticept: + - tweak: Radiation resistance now fully blocks radiation levels below its radiation + resistance percentage, and thereafter will only allow some radiation leakthrough. + Lower resistance suits leak much more readily once past the threshold, while + high resistance suits will only leak a little bit after the threshold is reached. + Very highly irradiated environments are still extremely dangerous. +2019-01-08: + Anticept: + - tweak: The CE Firesuit is now firefighting rated, just like firesuits and atmos + suits. + Chinsky: + - soundadd: Pain has a low chance of heartstop again. High shock levels ('You feel + like you can die any moment now!' level) can sometimes cause thready pulse. + Countered by giving poor sod some painkillers to prevent shock, or some inapro + to stabilize the pulse. + sabiram: + - maptweak: The Christmas tree in the bar has been removed. +2019-01-10: + Anticept: + - rscadd: Added a waste tank for atmospheric waste gasses next to the fuel bay. + Now there's a place for gasses the Torch doesn't have a tank for, as well as + storage for engine byproducts, and can be dumped to space or recovered with + canisters. Also acts like a good way to clear a backed up atmos system if you + know how to configure the pumps and valves, and don't mind spacing the gas. + - rscdel: Engineering thrusters (not nacelles) are now purged from the game. They + offered next to no thrust at all and now the engine room is a little bit simpler. + - tweak: All black pipes in engineering ultimately go to the waste tank. + - tweak: Removed redundant fuel bay firedoor (it had two at the entrance). + RyanSmake: + - bugfix: AIs now get alerted once again when someone edits their laws. + Textor: + - rscadd: Adds DAIS, Xynergy, EC, and EXO logos to paperwork formatting, adds help + information about new logos to nanoword formatting help. + - rscadd: Adds all missing logos to the admin paperwork so that they can be used + in fax replies. + - tweak: Changes [tccseal] to [iccgseal], makes the EXO logo take over "[logo]" + and moves nt logo to [ntlogo] + comma: + - tweak: All speed/acceleration values are now displayed multiplied by 1000. Actual + mechanics are still same. + - tweak: Only 1 random alien seed in Xenoflora storage now, and can't order them + from cargo. Go on expeditions nerds. + - maptweak: No more pre-spawned anomalies on Petrov. Go on expeditions nerds. + lorwp: + - tweak: IPCs can now use the Command Hardsuits +2019-01-11: + Anticept: + - tweak: Radiation planets background rads peak out at 75bq. Hotspots are still + deadly though! + - tweak: Adjusted waste tank dump port so it goes to the edge of shields, rather + than dumping onto the top of D3 pod. + - tweak: Added a pump to the waste tank canister port. + BlueNexus: + - maptweak: Nacelles have been reworked. + - bugfix: As a result, combustion mode works again. MistakeNot4892: - - tweak: Ported Skrell from Stella and added to the Bay alien roster. + - rscdel: Removed the education system entirely. + RyanSmake: + - bugfix: Chief Engineers now spawn with correct backpacks. + Zuhayr: + - rscadd: Added a department goal system. Use Check Goal to view them inround. + - rscadd: Added a personal goal system. Defaults to disabled. Set Crew Goals to + something else in your global preferences to start getting them on join. + - tweak: Merged ambitions into goals. +2019-01-13: + Anticept: + - tweak: The "Set transfer amount" verb's range is now one tile, so now you don't + have to be carrying them to set it anymore. + - bugfix: ghosts and unconscious can no longer invoke the set transfer amount verb + on containers and IVs. + - tweak: Gas sensors in atmos and waste tank now display all gas contents that they + can identify. + Chinsky: + - tweak: Falling down zlevels now has a chance to dislocate feet/arms. Athletic + skill mitigates it, Trained and above are safe. + - tweak: Setting dislocated limbs now requires Medicine skill to be reliable, especially + for self-setting. Basic skill is enough for ~90% success rate, Trained is guaranteed + or your money back. + - tweak: Walking on fractured or dislocated limbs now applies additional pain to + that limb. Rest a bit for it to clear up or use a cane. + Hubblenaut: + - rscadd: Large escape pods will now repressurize themselves after undocking. +2019-01-21: + Anticept: + - rscadd: CMOs rejoice! Your hypospray now has a quantity setting, you can administer + in 1,2,5,10,15,20, or 30 units per injection! + - rscadd: CMOs rejoice! You can now pour your hypospray contents into a container + without removing the vial! (you can already put reagents in it too without swapping + vials) + - rscadd: CMOs rejoice! You are now coordinated enough to swap vials on the fly. + No longer do you have to remove and put away the old vial before you can install + a new one. + - rscadd: Medical rejoice! The contractor producing your syringes have heard your + cries and installed easier to read graduations on syringes. You now can set + transfer amounts in 1, 2, and 5. + - rscadd: Everyone rejoice! When pouring containers, you will now be able to see + how many units are remaining. + - bugfix: drones and borgs can once again use r-glass. + - bugfix: drones and borgs glass stacks are colored correctly. + Blue Bit: + - rscadd: Security borgs now have a hailer. + - bugfix: The playable colony should once again have its rods. + Cakey: + - maptweak: The robotics lab is now two-floored. Has a lift. + - maptweak: Cyborg station has been moved next to atmospherics. + ChaosAlpha: + - bugfix: Robots and drones should once again be able to drop items from their grippers + from the Silicon Commands tab (the verb has been renamed "Drop Gripped Item"). + - bugfix: Robots and drones now drop all gripped items on death. + Chinsky: + - rscadd: Rods are now material based, can be made from more than just steel. Same + with grilles and lattices. + - rscadd: Windows are material based too, any non-opaque material can be used to + make them (currently diamonds and quartz). + - rscadd: You can get back rods from rglass (rphoronglass) by welding them out. + - bugfix: Autolathe now will properly get some steel material on top of glass if + you feed it rglass. + Eckff: + - tweak: The sleep button now keeps you asleep until you press it again. It will + not wake you up from other things that cause you to sleep, like chems. + Eckles: + - bugfix: Fixes sprite and object issues with the riot security voidsuit for Unathi + and Skrell + Hubblenaut: + - bugfix: Fixes cameras of robots, hardsuits, Thunderdome and similar not being + accessable. + MistakeNot4892: + - tweak: Locker icons now use a runtime-based system. This should have no player-facing + impact other than the cosmetic effects of new locker icons. + - rscadd: Added a Loss Prevention Associate role. Basically a bodyguard for the + Workplace Liaison. They can only spawn with an active Liaison in the round, + and get a secure gun with corporate access. + - tweak: Added backend support for deferred roles, please make a bug if this breaks + anything in roundstart job allocation. + - rscadd: Added a stomach organ. If your stomach is damaged, you can't eat properly + and won't metabolize reagents well. + - tweak: Puke now contains some of the reagents you had in your stomach, plus some + stomach acid. We are pushing the boundaries of puke simulation technology. + - rscdel: Removed Xenolife Technician and NT Guard. + - tweak: Research Director is now the Chief Science Officer and may only be EC-ranked, + not contractor. + - tweak: All other science roles are now available to EC staff as well as contractors. + WhiteHusky: + - rscadd: Intergrated circuit's medical scanners can now get a patient's pulse. + afterthought2: + - tweak: Adherent are now shock-immune. + lorwp: + - tweak: the EVA Hardsuit in Engineering Hard Storage now fits on IPCs. Rejoice + sabiram: + - rscadd: Added aluminium. It's the standard material for furniture such as tables + and chairs, among other things. + - tweak: Added plastic and aluminium to the autolathe. Many recipes have been adjusted. + - tweak: Smelting bauxite now yields aluminium. Bauxite blocks can still be obtained + by compressing. + - tweak: Added aluminium sheets to the supply menu. + - maptweak: Added aluminium sheets to where metal sheets are found. + xales: + - tweak: Torch command (CO, XO, SEA) now share a headset type and encryption key + - tweak: The XO now has science keys in their locker. +2019-01-26: + Cakey: + - rscadd: Re-adds exploration helmet-cameras. + MistakeNot4892: + - tweak: YOU WILL NEED TO UPDATE YOUR RANK AND BRANCH PREFERENCES, READ THIS CHANGELOG. + - tweak: Occupations panel got a visual overhall. Click the link-name of a job to + set alt title, and click the never/high/low/medium to cycle between job weights. + - tweak: Rank is now tracked by job, not by save slot. You can set your rank and + branch up as you like for each given job. + - tweak: You can now set/save skills for submaps in the occupations panel. + Pandolphina: + - rscadd: Adds a new exoplanet ruin, a data capsule ejected from a ship with zombie + juice inside. + Textor: + - rscadd: Escape pod blast doors now open upon reaching pod launch sequence. You + might want to stay out of maint areas near escape pods when pods are getting + ready to launch. + - maptweak: After much deliberation, the Health and Safety department decided that + Engineering, the misc laboratory, and the tunnels outside the deck 2 escape + pods should be more well-lit. + - maptweak: The forensics office and bridge now have chairs that can rotate. + - maptweak: The deck 1 conference room floor has finally been repainted properly. + - maptweak: The R-UST now has its own power monitor installed and a gas injector + and a port to allow engineers to inject various gasses into the R-UST chamber + if they want. + - maptweak: Deck 3 has more emergency shutters to prevent the spread of fire and + decompression and prevent hapless engineers from wandering into unknown danger + outside the EVA room. + - bugfix: Fixes deck 5 subgrid configuration. + - bugfix: Fixes stasis cages. + - maptweak: Replaces ready room with adherent maintenance. Ding. + - tweak: Adherents now recharge at cyborg rechargers at half the rate. + - maptweak: Removes mineral baths from all other map locations. + - tweak: Adherent pylon will now damage robots. + - rscadd: Adds adherent tool vendor and crystal material airlock. + WhiteHusky: + - rscadd: You can show the contents of supply products. + afterthought2: + - tweak: Rad collectors and potted plants now cost more when ordered from supply. + - tweak: Adrenaline now does some heart damage if used to restart the heart. + sabiram: + - rscadd: Added green tea, iced green tea, and sweet green tea. + - rscadd: Added green tea to bartender soft drinks and coffee reagent dispensers. + - rscdel: Removed iced tea dispenser. Combine ice and the tea of your choice to + create iced tea. + - rscadd: Added flavour pods and sugar packs to the hot drinks vendor to flavour + your tea or coffee. + - rscadd: 'Added two new mixed tea drinks: Baron Grey is prepared by mixing black + tea and orange juice, and Maghrebi mint tea is prepared by mixing sweet green + tea and mint.' + - rscadd: Added teacups to the cutlery vendor. + - rscadd: Added chazuke. It can be prepared by mixing ten parts rice and one part + green tea in any container. Microwaving ten parts chazuke will result in a snack + bowl meal. + - rscadd: Added aluminium and plastic into the protolathe system. Many recipes have + been adjusted. + - maptweak: Removed protolathe from the robotics laboratory. + - maptweak: Added aluminium sheets to the research and robotics storage areas. +2019-01-28: + Roland410: + - bugfix: Fixed/removed the cap on away site jobs' skills. + sabiram: + - tweak: The circuit printer and protolathe can now hold more materiel. +2019-02-05: + Anticept: + - tweak: Pilot skill description now clarifies random movement occurs until trained + or greater, regardless of what ship you are flying. + - bugfix: Fixed phoron glass sheet's melting temperature so that reinforced phoron + glass is consistent with the pre-material overhaul melting temperature. This + should stop the random window breakage in the engine core until close to delamination + temperatures. + - tweak: Due to the nature of the material overhaul and this change, regular un-reinforced + phoron glass also gets its temperature significantly buffed. It's still weak + to physical attack by comparison to reinforced phoron glass. + Cakey: + - maptweak: Added LPA equipment closet to the Workplace Liason's office. + - tweak: Added "Asset Protection Agent" as an alt title to LPA. + - tweak: You can now put people onto wall frames with grabs + Chinsky: + - rscadd: Added an exploration shotgun. It's in a wall locker on Charon, along with + ammo, replacing netgun. What can possibly go wrong? + - rscadd: It can fire freely off-ship, but onboard you gotta register and get XO + or CO to authorize it. Yes it's pain, yes it's intended. + - rscadd: It is only guaranteed to work with types of ammo it ships with - beanbags, + flash, net rounds. Loading combat ammo voids warranty and may result in fun. + Datraen: + - rscadd: Adds Skrellian Weapons, currently admin spawn only. + Herigony: + - bugfix: Fixed admin jobban panel + Textor: + - bugfix: After paperwork being filled out in triplicate, lost, found, and buried + in peat for two weeks, the CSO now has access to their uniform in the uniform + vendor. + - bugfix: You now need to be an EC scientist to select an EC labcoat in loadout. + Senior Researchers and Assistants now have access to some of the same stuff + as normal scientists that they lacked. Also adds some equipment the biomech + should have access to. + - bugfix: Non-senior researcher Ensigns in the science department are now properly + considered officers and have an officer's uniform given to them when they wake + up instead of an enlisted uniform. + - rscadd: Labcoats can now be issued via the uniform vendor for EC science people. + sabiram: + - rscadd: Added the CSO's rigsuit. + - maptweak: Removed the AMI rigsuit module from the CSO's Petrov office and added + the new rigsuit to the bridge EVA storage. + - maptweak: Resized and reorganised the bridge EVA storage. + - rscadd: 'Added new wood material types: mahogany, maple, walnut, and ebony. These + types are largely identical apart from their colour.' + - rscadd: Added supply crates to obtain the new woods. + - maptweak: Several tables and chairs across the ship that were previously generic + wood are now made from mahogany, maple, or walnut. + - maptweak: Shuffled things around a bit in the captain's quadrant. + - maptweak: Moved the CSO's primary office back to the bridge, from the Petrov. + - rscadd: Clipboards are now a material item and can be constructed from most materials. + Clipboards that spawn around the map will be of various materials. +2019-02-06: + ghostsheet: + - maptweak: Rearranged the Guppy's interior for quality of life conveniences. + sabiram: + - rscadd: Radiation collector arrays will now fail catastrophically if exposed to + extreme temperatures, such as those found within the supermatter core. + - maptweak: The robotics lab has been messed with again, everything should work + now hopefully. +2019-02-07: + comma: + - tweak: The year is 2307 now. Roleplay accordingly. + sabiram: + - rscadd: Added explosive harpoons to the uplink. These will only explode upon embedding + in a target, by throwing it at them or sticking them close up. + - tweak: Increased the base harpoon's throwing force divisor. +2019-02-08: + Datraen: + - bugfix: Fixes incorrect access on hangar maintenance doors. +2019-02-09: + Anton-Kr: + - rscadd: Adds Vox ship and base to the game. It's join-able as a submap. +2019-02-10: + SierraKomodo: + - maptweak: Added rechargers to merchant shuttle and merchant base + - maptweak: Connected Flight Control disposal bin to pipe network + - maptweak: Added borg rechargers to communal brig and merchant's station + comma: + - tweak: Uplink gun selection for traitors was scaled down. Assault rifles and similary + big guns are gone, only pistol-likes available now. + - tweak: Wall of text about clothing items property is moved to a codex entry for + the item, instead of being shown on every examine. + sabiram: + - maptweak: The king of goats in the hydrobase planetary ruin has been retired. +2019-02-12: + Chinsky: + - rscadd: CPR changes. It now will help with blood circulation even if it fails + to restart the heart, so there's a reason to do it (especially on higher levels). + Fake circulation lasts 20 seconds and is better with Anatomy/Medicine skill + (highest). + - rscadd: Can now put IV bags etc on rollerbeds and use them as IV stands for buckled + people. Click with beaker to add it. Click with empty hand on empty (no buckled + guy) bed to remove it. Drag bed on people to hook/unhook. + - rscdel: Damaged livers no longer generate ammonia. It was creating self-perpetuating + damage which wasn't intended, it was for diagnostic memes. + - rscadd: Adds auto-CPR device. Goes into victim's suit slot. It won't do mouth-to-mouth + or resusticate them, but it will help with circulation. Needs Basic Anatomy + and Medicine skills to use, or risk rib fracture. Basically continuously applies + circulation part of CPR. Mapped bunch of them in medbay + - tweak: Sleepers now have 10x stasis option. Their power usage now also scales + with stasis factor greatly, 500 per factor, so ~5000 W at 10x + - rscadd: Guns suck now. + - tweak: When you have a gun in activa hand, you're considered to be 'aiming'. Moving + or changing active hand resets timer. + - tweak: Aiming gives bonuses to accuracy, longer you aim, capped by accuracy of + the gun - so no point in aiming longer than few secs with pistol, but with sniper + rifle, take your time. + - tweak: If you haven't stood still for at least a second, you get penalties based + on size of your gun. Pistols are almost not affected, but rifles are affected + greatly. + - tweak: Accuracy falloff differs for different calibers. Pistol rounds are best + used 4 tiles or closer, rifles can be used from any range without ok results. + Lasers mirror that setup, with higher range. + - tweak: Overall, pistols are now useless at range, but don't suffer much if you + move around or change hand to do something else. + - tweak: Rifles are oppsite, can hit if you aim even from other end of screen, but + if you move around, you're not going to hit shit. + - tweak: Moving around (not towards gun) will make you harder to hit now. Yakkety + sax away. + - rscadd: Added a small bells ringing sound playing when you regain consciousness. + Will only play if player is considered AFK (currently 5 minutes without activity) + Spookerton: + - tweak: Mercenary and Raider game modes no longer do early round-end votes when + the antagonists leave or die. + afterthought2: + - rscdel: Guns and armor are no longer available in personal command lockers. + - tweak: The bridge sidearms closet now also has three sets of command armor. +2019-02-14: + Anton-Kr: + - bugfix: Some misc things fixed on Vox ship. + RyanSmake: + - bugfix: Holodeck windoors now actually face the right direction. + SierraKomodo: + - maptweak: Added Pilot Voidsuit to bridge deck's EVA Storage that Bridge Officers + and Senior Enlisted Advisors can access. + - maptweak: Re-arranged the bridge deck's EVA storage. + Spookerton: + - tweak: IPV Fortuna can now fly on the overmap without being doomed. + Textor: + - maptweak: The battery backup PSU in telecomms has been moved after many Chief + Engineers and Senior Engineers have complained about its disruptive location. + The battery backup PSU also now recharges off of the deck 3 subgrid rather than + making a loopback off of the telecomms subgrid. Grey outlines have been moved + around in telecomms to be more consistent with the rest of telecomms' appearance. + - tweak: All telecomms machinery and computers have been updated to use NanoUI style + interfaces, bringing them in line with the majority of UI interfaces on the + Torch. +2019-02-15: + Chinsky: + - tweak: Accidental gun discharge chances upped, and now it can happen when aggressively + unholstering (hurt intent). Chance is now 20% at unskilled, 5% at Basic and + 1% at Trained. + - tweak: When unholstering or trying to fire a safetied gun on hurt intent, there's + now a chance you automatically unsafety it. Chance is 0% at unskilled, 25% at + Basic and 50% at Trained, guaranteed above. + RyanSmake: + - rscadd: You can now interact with emergency shutters through ladders and open + spaces. + SierraKomodo: + - maptweak: Added air and fire alarms to the deck 4 hanger catwalks. +2019-02-18: + Chinsky: + - rscadd: Crypods now have more immulsion. When joining round you will spawn inside + a pod, asleep for 1-5 seconds. Roleplay accordingly. + - tweak: Can now place auto-cpr device on people by clicking on them with it on + help intent. + afterthought2: + - experiment: No stasis bags are available on spawn on the Torch, except one on + the Charon. + - tweak: Stasis bags can now be printed from the protolathe. + - tweak: Stasis bags are now more expensive when ordered from supply. + - tweak: Rollerbeds can now be placed in backpacks. + comma: + - tweak: Autopsy scanner can now be used on severed organs to get some information. + No trace chems or time of death though, need body for that. +2019-02-19: + afterthought2: + - tweak: Modular consoles will no longer have access to NTnet when off-station. + comma: + - rscadd: Mountains can now spawn on any type of planet +2019-02-20: + Chinsky: + - rscadd: Added rescue bags. Work like bodybags, but provide atmosphere from attached + gas tank. Will set internal atmosphere of the bag to tank's release pressure. + Use screwdriver to remove tank. +2019-02-21: + Anticept: + - tweak: XO now has CSO access. + MistakeNot4892: + - rscadd: Added a drug called Three Eye to the contraband drug crate. + - rscadd: Added a chemical agent for crystallizing people. Good for repairing golems. + - rscadd: Breaking a soulstone into shards and stabbing them into a wizard (or firing + a null rod out of a pneumo cannon hard enough to embed it) will now prevent + the wizard from casting spells. + - rscadd: Added supporting code for psionics. + sabiram: + - rscadd: Added chevaux de frise, or spiky barriers. They're constructed by first + building a barricade of any valid material, and then attaching rods of any material + to the barricade. It will damage anyone who walks into it. +2019-02-23: + BlueNexus: + - rscadd: Added Venaxilin, a powerful antivenom made with spider venom. + - rscadd: Added leporazine variants, which are made by either heating up or cooling + down leporazine. Heating it up makes a chem that raises body temperature, cooling + it down makes one that lowers it. + Textor: + - rscadd: Adds new global preference to opt into having your ckey displayed in the + credits. This is set to hide your ckey by default. + - tweak: Adds additional snark to the end of the credits and some new randomly generated + title possibilities. + - tweak: Changes some awkward wording in play global sounds command, makes the change + end credits song command not suck anymore. + afterthought2: + - bugfix: The merchant can now use the merchant program again. + - tweak: The merchant program cannot be downloaded on NTnet. + comma: + - rscdel: Stasis bags are no longer orderable from cargo. +2019-02-24: + RyanSmake: + - bugfix: Shuttles no longer steal asteroid tiles when undocking. +2019-02-25: + Spookerton: + - tweak: Medals can be stored in wallets. + afirpo: + - bugfix: viruses weren't correctly cleaned up from the human-like mobs' bloodstream. + afterthought2: + - tweak: Door access has been substantially reworked. Please report any anomalies. +2019-02-26: + Piccione/Textor: + - rscadd: Adds new duty gloves for utility uniforms. They are available in some + lockers and via the uniform vendor. All gloves offer some protection, and engineering + gloves are also insulated. + SierraKomodo: + - bugfix: Officer's Mess doors will have the correct access flags again. + afterthought2: + - tweak: Arbitrary shuttles can no longer land at restricted landmarks. + xales: + - tweak: Adherent eyes have been upgraded. They no longer need a welding mask to + not go blind. As a side effect, they also cannot be flashed. +2019-02-27: + Chinsky: + - rscdel: Removes Medical Contractor job. It's merged into Physician/Corpsman, number + of slots for those bumped. GAS can join Corpsman only. + - rscadd: Physician and Corpsman jobs can now be joined with Contractor rank. + - rscadd: Engineering Contractor and Supply Assistant were merged into Engineer + and Deck Technician respectively, pick Civilian branch to join as contractor + SierraKomodo: + - maptweak: The Officer's Mess booze-o-mat is now accessible by officers. If you + can open the door, you can vend things. +2019-02-28: + SierraKomodo: + - bugfix: Senior Researcher now has standard sol gov crew access (Notably, access + to the bridge foyer and firing range), maintenance access, and Petrov security + checkpoint access. + - bugfix: Fixed access flags for bridge foyer, charon guppy and aquila airlocks, + communal brig, and supply office windoor. + - bugfix: Counselors can now access medical storage again + - bugfix: Bridge EVA storage windoors have the proper access restrictions again + mikomyazaki: + - bugfix: Swapped the names around on the D3 Ladders/Firing Range Hallway Cameras. + mikomyazaki2: + - bugfix: Removed duplicate items from B-Deck - Captain's Flask and Nanomed Vendor. + - rscadd: Geiger counter now makes a sound when radiation levels are high enough. + Volume increases with increased radiation level. + - soundadd: Added a geiger counter sound. + - bugfix: Fixes the case where the supply pack contents will be blank when ordering + live cargo. + - rscdel: MULE is no longer orderable, since it does not work on the Torch. +2019-03-01: + mikomyazaki2: + - rscadd: QOL Change - Adds an extra Supply & Denied Stamp to the Deck Tech lockers. +2019-03-02: + MistakeNot4892: + - tweak: Removing organs from a robotic bodypart (ie. FBP or IPC) will now use Devices + skill. + - tweak: A longstanding bug with amputated/severed limbs has been fixed and new + limbs will once again require reattachment with a hemostat after replacement. + - tweak: Surgery will now present a list of possible surgeries (if skilled enough) + rather than using a priority system. + SierraKomodo: + - tweak: Renamed NSV Petrov area tags to SRV Petrov. + - tweak: Soviet Cola has been renamed to TerraCola. + mikomyazaki2: + - bugfix: Corpsmen can use the Paramedic alt-title again. +2019-03-03: + Spookerton: + - tweak: Updated Workplace Liason and LPA job descriptions and access to match their + current role. + mikomyazaki2: + - bugfix: Game no longer assumes genders when self-examining as a neuter/plural. + - bugfix: IC Printers now take materials correctly when cloning. +2019-03-04: + Chinsky: + - rscadd: Examining things now shows message about it to people in 4 tile range. + If you don't wanna see it, you can disable it with a preference. + MistakeNot4892: + - tweak: Facial repair surgery is now a single step conducted with a hemostat after + making an incision. + - tweak: Skull repair is now identical to regular bone repair. + mikomyazaki: + - bugfix: Extends the restriction on some types of prosthetics to cover the entire + set of human subspecies instead of just human-basic. + sabiram: + - tweak: Adherents can no longer slip if they're floating. + - rscadd: Added two new colours to the adherent colour selection. + - tweak: The job slot formerly known as Corpsman is now Medical Technician by default, + with the former name as an alt-title. + - tweak: The job slot formerly known as Corpsman Trainee is now Trainee Medical + Technician by default, with the former name as an alt-title. +2019-03-05: + Crystalnole: + - bugfix: Securing microwaves gives the right securing verbs + Spookerton: + - tweak: Bridge officer lockers are harder to get into. + afterthought2: + - bugfix: Surgery is again possible. + - tweak: Makes cryo bags much more expensive in the protolathe, and require higher + tech levels. + mikomyazaki: + - bugfix: Fixes an error introduced through resolving a merge conflict incorrectly + with my earlier prosthetics restrictions PR. + sabiram: + - maptweak: The second deck hallway leading from the stairwell and elevators to + the engineering foyer has been reconstructed in the style of the typical hallways + on the ship. + - rscdel: Engineering duty gloves are no longer insulated. +2019-03-06: + CrystalNole: + - bugfix: Fixes invisible Cyborg materials + mikomyazaki: + - bugfix: Fixes an issue where full fire extinguishers would report an incorrect + message when you tried to fill them further. +2019-03-07: + Higgin: + - rscadd: Added a moderately weak TTV to the traitor uplink. 40 TC cost. + MistakeNot4892: + - tweak: Species who can eat mobs or items will now get an action button to puke + it back up. + - rscdel: Removed Regurgitate verb in favour of above. + SierraKomodo: + - bugfix: Security lobby door is now accessible by Sol Gov crew + - bugfix: Bridge safe room is now all-access + - bugfix: Merchant shuttle doors and windoors now require merchant access + - maptweak: Bridge access hallways now have their own area tags - Bridge Port Access + Hallway and Bridge Starboard Access Hallway + Textor: + - bugfix: You are able to construct glass and material airlocks again. + - bugfix: Airlocks that have their control circuits removed will remember their + paint jobs after the circuit is re-inserted. + - tweak: Atmospheric tanks now hold more CO2, H2, and O2 in the tanks due to increased + usage on board. + - maptweak: Camera networks have been adjusted to reflect reality. The lounge is + now located in the deck 4 camera network, as is the pathfinder's office camera. + The deck 1 fore hallway cameras have been renamed to reflect their location + better. The Adherent room now has a camera. + - maptweak: Adds deck 5 signage and warning signs to the escape pod launch areas + on deck 4, in addition to more escape pod direction signs to make sure confused + passengers know where to go to find pods on decks 2 and 4, and the deck 2 stairwell + is now more well-lit. + - maptweak: The R-UST now has an atmos control console in the control room so engineers + can adjust the injector port for gas. Don't forget to refresh the input. + - maptweak: New emergency shutters have been added to deck 4 to limit the decompression + caused by escape pod launch procedures. + - maptweak: At the direction of the Expeditionary Command Fire Marshal, there are + now more fire closets on board the Torch. + - maptweak: All the nacelles now have phoron windows installed on half-walls to + conform with the aesthetic on the rest of the ship. + - rscadd: After evaluating flaws in evacuation procedures, all escape pod outer + hatches now have a manual bolt override that can be manipulated with a wrench + after opening the cover in the event that the power is offline. As a reminder, + the outer hatch must be closed and the bolts re-engaged before the pod will + launch. + - tweak: Code Delta announcement no longer specifically mentions self destruct due + to rare cases in which it is engaged without the destruct mechanism being online. + Code Delta procedures have not changed. + mikomyazaki: + - rscadd: Adds Cultural Exchange patch to xenowear loadout for EC Unathi, Skrell + and IPCs. + - imageadd: Adds images for the Cultural Exchange patch. +2019-03-08: + SierraKomodo: + - maptweak: Antag shuttles, merchant shuttle, and admin shuttles are now shielded + against rad and ion storms. +2019-03-09: + MistakeNot4892: + - rscadd: Adamantine golem extracts now contain crystalizing agent. + - rscadd: Crystalizing agent can be used to produce resin globules that work like + medpacks for adherent and golems. + - tweak: Golems can now be operated on by substituting a surgical drill for a scalpel, + and resin packs for bone gel/fixovein/medpacks/cautery. + - tweak: Vox are now capable of gaining nutrition from wood pulp, napalm, glue and + various other inedible reagents. + - tweak: Vox are now capable of gaining nutrition from various materials and processing + others into a usable form with their stomach. + - tweak: Vox now require a hindtongue to speak Vox-Pidgin. + afirpo: + - rscadd: now it is possible to export virus dishes to earn credits (supply points). + - bugfix: now Toxicity related to a virus dish (Incubator) works again. + - tweak: checking for virus dishes already exported in the past or not analyzed + at all (those MUST NOT be exported!). + afterthought2: + - tweak: The IC printer can now take any materials as inputs. + - bugfix: Circuits properly init their steel cost now; this means that some are + much more expensive than previously. + - tweak: 'The TP circuit now costs more and rarer materials, and has a very high + complexity: you''re going to need the medium assembly or larger to house it.' + - tweak: The TP circuit will not function properly if the slaved computer is on + a z level not connected to its location. + mikomyazaki: + - bugfix: Fixes an issue with prosthetics selection for IPCs due to previous changes + for allowed_bodytypes on prosthetics. + - bugfix: Condiment containers can no longer be stored inside food. +2019-03-10: + Anticept: + - tweak: Atmos pumps have all had their power limits increased considerably. This + means atmospherics will operate faster, but at the cost of much more power at + peak performance. In addition, vents and scrubbers will operate faster when + stressed, but they too will cause a tremendous power spike in a ship wide atmos + contamination emergency where a huge number of scrubbers have to work hard (from + a badly clogged waste line, for example). A flooded deck can also overload a + deck substation, so bypass switching may be required in such cases. Beware of + extreme scrubber overload! + - tweak: Filter pressure limits raised to 15,000 kpa. They are still not powerful + devices when pumping from low to high pressures. You should put pumps around + them if you intend them to work quickly with moving pressures in a non-passive + manner. + FTangSteve: + - maptweak: deck 2 hallway by janitorial now dimmer and with no cameras + SierraKomodo: + - bugfix: Medical is now restricted access again. + SierraKomodo & Anticept: + - tweak: Flight manifest input box no longer shows the rank to make it easier to + find personel in the list. The report itself will show the rank. + afterthought2: + - bugfix: Disassembling research machines should now work. Upgrading circuit printers + should be more consistent. + sabiram: + - tweak: Most castes of giant spider will generally do more damage, and may have + more health. +2019-03-11: + SierraKomodo: + - tweak: You can no longer use headsets while sedated or sleepy-penned due to paralysis + making you unable to use your hands. + afirpo: + - bugfix: now the Core Sampler (Xenoarcheologist and perhaps Anomalist related) + works again - the sample is spitted out from its sample \ evidence bag. + afterthought2: + - rscadd: Adds the proxy command to terminals. This lets you obfuscate your nid + by routing through another computer. Requires access_network and experienced + skill. Generates local logs on the machine you route through, stored as a file + on the hard drive. +2019-03-12: + SierraKomodo: + - maptweak: Added fire shutters to the cargo warehouse shutters + Spookerton: + - bugfix: Inappropriate crew and passengers no longer have supply program admin + rights. + afterthought2: + - tweak: Petrov and research access can now only be granted by the XO and CO. You + can now build/adjust access on Petrov doors. + mikomyazaki: + - bugfix: Booze-o-mat contained a tea master item rather than actual actual tea. + Made it contain black tea instead. + - tweak: Robotics R&D consoles can no longer link with destructive analyzers. + - tweak: Made the Geiger Counter sound falloff and range larger. +2019-03-13: + Devildabeast: + - rscadd: After numerous flight tests and simulations, Adherents have begun to receive + piloting licenses and can now serve aboard the SEV Torch as Shuttle Pilots. + sabiram: + - maptweak: The firing range on deck 3 has been removed due to consistently causing + crashes. +2019-03-14: + Datraen: + - rscadd: Adds the Xilvuxix, a Multi-Z Shuttle capable of overmap travel and it's + own shuttle (capable of overmap travel as well) + Higgin: + - tweak: Traitor TTVs now share power with merc TTVs. They were underwhelming for + 40 TC cost. + SierraKomodo: + - bugfix: Windoors will now ignore walls when determining autoset access. This should + fix hardsuit windoors. + afterthought2: + - tweak: Unathi brute mod for the subspecies has been decreased a lot. + - tweak: Unathi healing can only be toggled once every two minutes. It cannot be + toggled within a minute of being hit in combat. + - tweak: Unathi limb and organ regeneration is only possible when the heal can be + toggled. + - tweak: When an unathi is at extreme levels of hunger, it no longer receives healing + from the passive heal ability. Instead, it takes internal organ damage, converting + it into nutrition. This is inefficient, so if the healing ability is left on, + it will die quickly. + - tweak: Unathi passive healing is less nutrition-efficient now. +2019-03-15: + SierraKomodo: + - tweak: Prone mobs can no longer buckle other mobs to beds/chairs. This prevents + crawling bucklespam during combat. + mikomyazaki: + - bugfix: Changes pin to an in-type pin on the reagent storage circuits. + - bugfix: Disassembling sleepers with an occupant will now eject the occupant. +2019-03-16: + Chinsky: + - rscadd: Coffins are made with steel now. Can still make wooden one with wood if + needed. + Datraen: + - bugfix: Fixes prosthetics not being selected by subspecies. + SierraKomodo: + - maptweak: The Deck Chief's office now has a guest pass terminal. +2019-03-17: + MistakeNot4892: + - rscdel: The flying pizza sprites are no longer available to crew robot modules. + - rscadd: A flying robot frame can now be constructed as an alternative to standard + robot. It uses the same arms, chest and head as the regular robot, but needs + the 'flyer' frame. + - rscadd: Flying robot frames produce flying robots, which use the flying pizza + sprites and can pass over tables. They have a selection of unique modules to + pick from and are generally faster but more fragile. +2019-03-18: + SierraKomodo: + - bugfix: Chairs and stools now have the correct materials when constructed and + deconstructed. + sabiram: + - rscadd: Added bamboo seeds to the vendors. Their produce can be chopped up into + wood. + - tweak: You can place wrenches onto tables if you're on help intent. Use harm intent + if you want to disassemble them. + - tweak: Halved the number of seeds stored in machines from 30 of each type to 15. + Use the seed extractor if you need more. +2019-03-20: + MistakeNot4892: + - rscadd: Added a humanoid species for the Vox Armalis, representing a larger, slower + voxform. It is not currently accessible outside of adminbus. + - rscdel: Removed armalis simple_animal and icon. + - tweak: Vox now have their own damage masks, blood masks and damage overlays. + - tweak: Vox wizard spell will now transform into a lesser version of the giant + space parrot. + sabiram: + - bugfix: Fixes IPCs becoming blind after being revived in surgery. + - bugfix: IPCs are no longer immune to sources of eye damage such as flashes and + welders. + zaredman: + - imageadd: Adds OCIE logo to be drawn onto official paperwork. +2019-03-21: + Hubblenaut: + - maptweak: Adds binoculars, prybar and a station bounced radio to the CoS Office. + RyanSmake: + - bugfix: Touching anomalies now works properly. +2019-03-22: + Devildabeast: + - tweak: Large mobs and bigger can no longer enter exosuits. + Hubblenaut: + - maptweak: Removes the disposal bin from the brig. + SierraKomodo: + - tweak: Synaptizine now overdoses at 5u instead of 30u. + sabiram: + - bugfix: Fixes issues with assigning and deleting accesses to mechs. +2019-03-23: + Devildabeast: + - rscdel: Due to numerous concessions to mental health procedure and human rights + complaints, the Sol Central Government will no longer stock straight jackets + on-board their vessels. + SierraKomodo: + - tweak: Characters that have ghosted (NOT aghosted) will be immediately flushed + when placed into cryo. + Spookerton: + - tweak: Viruses no longer infinitely increase the duration of effects like deafness + and drowsiness. + sabiram: + - tweak: Butchering simple animals now relies on your cooking skill, requires a + butcher's cleaver, and must be done on a table. + - tweak: Added cleavers to the dinnerware vendors. + - rscadd: Wood rendered from the produce of the bamboo plant will now be the bamboo + material. + - balance: Blobs will now spread and attack diagonally. + - balance: Blob attacks now take into account armour. + - tweak: Blob attack damage now depends on the individual blob segment attacking + you. The core defends itself the most vigorously. + - tweak: Blobs now attack with a random damage type. + - rscadd: You can now attempt to remove a sample from blobs by attacking it with + wire cutters. The regular blobs produce fairly powerful weapons in various damage + types, and the nuclei produce cores which can be disassembled for research points. + - tweak: Cigarettes and the like can now be lit by more hot objects such as plasma + cutters, and some tendrils snipped from the blob. +2019-03-24: + Spookerton: + - bugfix: Robot organs in meat bodies can be repaired with nanopaste in surgery. +2019-03-25: + Datraen: + - bugfix: Fixed Skrell Recon channel; Skrell ship holopad, spawns not operating + properly. + - bugfix: Filled the first-aid kits on the Skrell ship by making them the proper + subtype. + - maptweak: Fixed thrust, external access, and rearranged some parts of the Skrellian + vessel. + - tweak: Changed Skrellian Suits to voidsuit subtypes, allows stacking of helmet/magboots + inside of it. + - tweak: Lowered slowdown on the skrellian rifle. + SierraKomodo: + - maptweak: Added carp spawn zones to Torch bridge deck, Bearcat, and Unishi for + overmap events. + - maptweak: Moved a Torch deck 2 carp spawn from outside the reactor area to avoid + carp spawning inside the shields. + - tweak: Deck Chiefs now have access to Exploration comms. + Spookerton: + - tweak: Traitor Binary Gas Bombs are weaker, but also cheaper. + sabiram: + - rscadd: Added folding knives, replacing boot knives. + - rscadd: Added two types of folding knife to the loadout. +2019-03-26: + MrKicker: + - tweak: Players can pull items across Z-Levels + SierraKomodo: + - maptweak: Various areas on the SEV Torch have been renamed to be more descriptive + of their purpose/location. + - tweak: Typing indicator bubbles no longer appear for hidden mobs (Cloaked or inside + objects such as lockers). Indicators after you say or emote still appear. + ajkrupka: + - bugfix: Fixed an oversight to make armbands and webbing hide when jumpsuits are + rolled down. + sabiram: + - rscadd: Screwdrivers, wirecutters and all types of pry bar now come in a variety + of new colours. + - balance: Reduced armour values for the breacher and heavy mercenary rigs. +2019-03-27: + mikomyazaki: + - rscdel: Removes fax machine from Pilot's Office. + - tweak: Merges plastic flaps and airtight plastic flaps into one item. Can change + airtight setting with screwdriver, deconstruct now with crowbar. Can now construct + airtight flaps. + sabiram: + - tweak: Added colour selection to the suit vest and waistcoat in the loadout. +2019-03-28: + Datraen: + - tweak: Changes renegade spawn list to allow for any bag to conceal a spawned weapon. + - bugfix: Gyrojet no longer drops casings, now accepts magazines properly. + SierraKomodo: + - maptweak: Unishi and Bearcat now have long-range holopads. + sabiram: + - tweak: Crawlers who are weakened (forced down) will crawl slower. Being confused + will now additionally reduce their crawl speed. + - tweak: You can no longer attack with harm intent while incapacitated. + - tweak: Being incapacitated in any way will drastically reduce your melee accuracy. +2019-03-29: + sabiram: + - tweak: All knives have been unified under one type. Please report any irregularities. + - rscadd: 'Added an additional folding knife to the loadout: ''tactical folding + knife''' + - rscdel: Butterfly knives and switchblades can no longer backstab, temporarily + at least. +2019-03-30: + SierraKomodo: + - tweak: Intercom sprites now reflect the on/off status of microphone and speaker + switches. +2019-04-01: + Chinsky: + - bugfix: Torch is now facing upper side of the map. + SierraKomodo: + - bugfix: Bluespace River away site no longer spawns with a teleporter beacon. +2019-04-02: + Atebite: + - bugfix: Fixed weapon firing mechanisms not being able to fire in cardinal directions + CSCMe: + - rscadd: Adds extracting a specific amount of slime cores as a departmental goal + for science + Loaf && Banditoz: + - rscadd: 'Added four flying robot modules: repair, cultivator, surveyor, and forensics.' + SierraKomodo: + - tweak: There can now be 3 bridge officers in a round. + - maptweak: Playable colony now has universal enzymes in the freezer + - tweak: Rogue maintenance drones now spawn in separate smaller groups instead of + one massive blob. Total number of drones spawned per event is unchanged. + Spookerton: + - bugfix: Being cured of a virus now correctly adds its antigens where appropriate. + afterthought2: + - tweak: Some tweaks have been made to job spawn code. Beware of any anomalies. + ghostsheet: + - rscadd: Prospector locker will now always spawn with a duffle bag + mikomyazaki: + - bugfix: Moves the engine ejection door controls inside the box with the eject + button. + sabiram: + - tweak: Admins will now be informed why antagonist autospawn fails, instead of + printing to debug logs. +2019-04-04: + Banditoz: + - tweak: Flying mobs are now immune to quicksand. + Higgin: + - tweak: Push-time now depends on the difference of CQC skill between the two parties. + - tweak: At equal skill levels, pushing has a very short duration. + - tweak: Grabbing a prone person is no longer automatically an upgraded grab unless + the victim is stunned, unconscious, or on help intent. + - tweak: CQC costs more. Check your skill loadouts! + - tweak: Increased global miss chances to head, feet, and legs. + - tweak: Additionally reduced knockdown chances. + - tweak: Made organ damage much less likely before ribs/skull are broken. + - tweak: Increased likelihood of organ damage after encasing bones are broken + - tweak: Increased damage to brain when dealt and probability of brain damage from + damage to the head. +2019-04-05: + Cakey: + - maptweak: Added wooden walls to some areas of the Torch. + - tweak: AI holopads have been renamed to holopads. + - tweak: Removed the long range holopad's Z-range. + Cronac: + - tweak: Adds egg cartons as an item the biogenerator can produce. + - bugfix: Adds missing biohoods to CSO locker. + Higgin: + - tweak: Chances of collapsing from limb damage can now be mitigated by walking + and moving along walls/other objects you could reasonably use to prop yourself + up. + - tweak: This mitigation only works if at least one of your legs fully works. + - tweak: Stools and beds are collapse-exempt. IPCs at funerals rejoice. + - tweak: The chance of collapsing when not doing these things to mitigate it is + now significantly higher to compensate. + Spookerton: + - tweak: Wallets can hold ribbons, armor tags, and patches. + - tweak: Ribbons, armor tags, and patches are now tiny instead of small. + afterthought2: + - admin: A new admin tool, Toggle Harddelete Queue, has been added to the Secrets + panel, under Debug. Do not use this unless you know what you're doing. + ghostsheet: + - rscadd: Carp shoal map hazard now works for overmap shuttles such as the Charon, + Aquila and Guppy. + - bugfix: Fire alarm can now be constructed properly +2019-04-06: + Banditoz: + - tweak: Flying mobs are now immune to lava. + Cronac: + - bugfix: Fixes morgue trays and cremation trays displaying above bodies and bodybags. + Spookerton: + - bugfix: Refilling a fire extinguisher from a tank no longer tells you the extinguisher + is full when the tank is empty. + WatermelonsEverywhere: + - rscadd: Added a spare explorer equipment crate to Supply. +2019-04-07: + Cakey: + - tweak: Increased explorer job slots from 3 to 5. + - tweak: Lowered prospector job slots from 4 to 2. + Higgin: + - tweak: Prevents material weapons from taking damage on parry except against other + material weapons. + - tweak: Increases material weapon health. + - tweak: Reduces crowbar and toolbox accuracy penalties. + - rscadd: Adds an inferior, expensive, steel machete to the autolathe. + afterthought2: + - tweak: Acids are generally weaker now. + ghostsheet: + - rscadd: Ore boxes can now be ordered in supply +2019-04-08: + Chinsky: + - tweak: Charon and Guppy now only need Basic skill for flying on overmap without + random turns. +2019-04-09: + ChaosAlpha: + - bugfix: Drones spawn with modules once again. + - bugfix: All robots/drones material synthesizers should be functional once again. + - bugfix: AI cores should once again be constructible. + - bugfix: Surveyor bioreactor doesn't runtime and actually gives a reasonable amount + of power now. + - tweak: Flying repair robot module comes with slightly nerfed synthesizers. + - tweak: When remote controlling a maintenance drone, the AI can now use its radio + as normal. + - tweak: Cultivator module comes with a robot harvester. + Cronac: + - bugfix: Targeted healing spells such as those used by wizards should now properly + heal synthetics. + - rscadd: Adds the ability to synthesize crystallizing agent via chemistry with + polytrinic acid, tungsten, and silicon (and a bit of heat). + - tweak: Rogue drones now leave cleanable corpses when killed. + - bugfix: Monkeys are no longer ripping out their augments and throwing them across + the room. + - tweak: Augments now show up on medical scanners and related admin scans. + SierraKomodo: + - bugfix: Glowing slime extracts now create light. + - bugfix: Lit flares now process fuel and shut off when out of fuel again. + mikomyazaki: + - rscadd: Upgrading a sleeper now reduces power requirements, unlocks new chemicals, + and increases pump rate. + - rscadd: Adds emag effects to sleeper. + xales: + - tweak: Antag selection now defaults to NONE. You may need to update your antag + prefs. + zaredman: + - maptweak: Moves Security's Deck 1 checkpoint to the old Research Checkpoint. Decommissions + old Deck 1 Checkpoint. Adds lockdown shutters by ladderwell. + - maptweak: Adds 2 prisoner lockers for Communal. Also changes newscasters in the + Brig to the SEC variant where appropriate. + - maptweak: SEC-VEND now has new stock. More cuffs, more evidence bags, and now + carries pepper spray and holowarrant projectors. +2019-04-10: + Unknown: + - rscadd: Added a verb to change lobby track playing - Play Different Lobby Track + in OOC tab. +2019-04-11: + BiscuitCookie: + - maptweak: Renamed the HoP Office Privacy Shutters to XO Office Privacy Shutters + - bugfix: Removed objects outside the ship that didn't belong there. + Cronac: + - bugfix: A damaged aorta can once again be repaired while the chest cavity is open. +2019-04-12: + Randall: + - maptweak: The Supply Office and Supply Warehouse shutters now require Supply access + from the outside. +2019-04-13: + Chinsky: + - rscadd: Added speed indication to helm console. Green means 'slow', red means + 'too fast'. + - rscadd: Pilotable shuttles now can pass through meteor fields safely. Keep at + green speed and you'll make it. Need Trained skill for Charon/Aquila and Basic + for GUP. At Master/Experienced can do this at normal speed too. + - tweak: Torch now accelerates roughly 2x slower + Cronac: + - bugfix: The Adherent mineral bath will no longer kill Adherent users by deleting + their tendril junction. + - tweak: The Adherent mineral bath now removed embedded objects like shrapnel, but + will not remove implants such as tracking implants etc. + MikoMyazaki: + - rscadd: Titanium and its ore Rutile are now available via mining, allowing repair + of shuttles and the ship exterior. + Spookerton: + - bugfix: Lava turfs no longer incorrectly reignite and burn you every process forever. + mikomyazaki: + - tweak: Time police fixed a couple of items that weren't adjusted when we travelled + back 300 years. + myazaki: + - bugfix: Corrects piloting skill description to reflect recent change to basic + training with Charon and GUP movement. + zaredman: + - tweak: Security Equipment supply order replaced with Master at Arms supply order. + - tweak: Auto-Compressor and Rescue Bags can now be ordered via Supply. +2019-04-14: + Aurum22: + - bugfix: Fixes various layering issues with stasis cages, honey extractors, and + reagent dispensers (chemistry and bar varieties). + Cronac: + - bugfix: Cryogenic tubes will no longer heal anything without containing a drug. + - tweak: Clonexadone and Cryoxadone have been buffed due to cryogenic tube changes. + - rscadd: Adds nanite fluid, which is like cryoxadone for robotic parts. It can + be made with cryoxadone, space lube, and aluminum chilled down to -25C. Requires + 5 phoron as a catalyst. This is NOT safe to use on its own and should be used + on conjunction with cryoxadone or clonexadone. + mikomyazaki: + - bugfix: Floor lights can now be dismantled with a wrench. +2019-04-15: + CarefulLilCassie: + - rscadd: Adds high heels. + - tweak: Changes some items in the civilian uniform vendor to match the military + ones and utilises some more categories for cleaner usage. +2019-04-17: + Atebite: + - rscadd: Three new random events have been added + - tweak: The T-ray scanner can now inspect disposal pipes for damage + Chinsky: + - maptweak: Charon laoyout changed, it now has a cargo bay that can be cycled to + outside air. + Crackers5: + - rscdel: Removes some existing body markings + - rscdel: Removes species restriction from tattoos + - rscadd: Splits up existing body markings/tattoos to be selectable per limb instead + of full body. + Roaper: + - rscdel: Removed old contraband poster that depicted a spess cat. Also commented + out it in the code. + mikomyazaki: + - bugfix: Smartfridge ID Scan hack now allows access. +2019-04-18: + mikomyazaki: + - bugfix: Allows setting stasis to x10 on sleepers. + zaredman: + - tweak: Medical max staff numbers decreased to a maximum of 2 Physicians, 3 Medics, + and 1 Trainee Medic. +2019-04-19: + GooeyChickenman: + - bugfix: Defibrillators no longer appear empty on spawn. + mikomyazaki: + - bugfix: Voice changer now works properly while using an active camouflage module. + xales: + - tweak: Adherent can now play as Prospector +2019-04-20: + Chinsky: + - rscadd: 'Most handheld scanners (plant, health, gas, mass spectrometer, reagent, + xenobio, price) now store last scan result. Click inhand to see it. tweak : + Mass spectrometers now can be used directly on open reagent containers or syringes + to take sample. Old behaviour is still supported too.' + - rscadd: 'Price scanners keep adding scan results instead of overwriting them. + You can clear buffer in scan result view window. tweak : Tweaked health analyzer + colorings a bit. Now not coloring things like section headers, coloring more + deviations from norm (blood oxygenation / pulse)' + Flying_loulou: + - tweak: Blood bags are now small if containing a reaggent, and tiny if empty. +2019-04-23: + Flying_loulou: + - rscadd: Adds a new command voidsuit type for bridge officers and the SEA. + - maptweak: Replaces the pilot voidsuit in the bridge EVA storage by the command + voidsuit. + GooeyChickenman: + - tweak: More common medicines and reagents will appear on medical scanners. + Higgin: + - rscadd: Cult members can now make stun talismans again. Requires a tome, paper, + and a substantial amount of blood. + - rscadd: Ported obscure and reveal runes back into cult. Obscure runes make all + runes around them invisible, reveal runes reveal them. Runes cannot be used + while invisible. +2019-04-24: + Datraen: + - bugfix: Ion Thrusters now respect on state and thrust modifier when calculating + thrust +2019-04-25: + Datraen: + - rscadd: Adds lighting, overlaying to energy melee weapons. + Draxtheros: + - rscadd: Robots will now announce via chatlog when they enter an emergency power + state. + FTangSteve: + - bugfix: ingested reagents are now handled properly + - tweak: pulse impacting reagents now have stronger effects when compounded + - tweak: stomach volume is now 65 units instead of 30 + - tweak: vomiting when stomach is overfull now based on chance, higher with the + more you're over the limit + GooeyChickenman: + - bugfix: Ryetalyn will now fix a characters appearance after resetting genes. + Hubblenaut: + - bugfix: Fixes syndicate ID cards not being examinable. + Lilja: + - bugfix: Fixed sheet materials stacking bug where icon wasn't updating. + - tweak: Recolored & adjusted all sheet material icons to have more contrast. + - rscadd: New aluminium sprite, new plastic sprite, new glass sprite, new reinforced + glass sprite, new diamond sprite, new wood sprite, new uranium sprite, new rod + sprites, new cable wire sprites, new deuterium and tritium sprites. + - rscadd: Sheet material stacks now change appearance when they have reached maximum + stack. + Randall: + - maptweak: The auxiliary sanitation closet now holds a spare mop. + Spookerton: + - tweak: Optical Meson Scanner glasses only protect from supermatter hallucinations + when turned on. + ghostsheet: + - rscadd: Hardsuit overlay icons will now change depending on what module is selected + - tweak: Hardsuit drill mount now functions like a normal drill, being able to mine + multiple tiles at once + - tweak: Hardsuit drill mount energy usage has increase to a non insignificant amount + - rscadd: Mounted plasma cutter has a close range mode to enable object interaction + accessible by configuring + - bugfix: Selecting a hardsuit module now checks for energy and suit status + - bugfix: The energy blade projector can now fire darts again + - rscadd: Mounted plasma cutter now has a sprite + - rscadd: Mounted energy gun and Tazer now has a sprite + - rscadd: Mounted medical injector now has a sprite + - rscadd: Mounted grenade launchers now has a sprite + mikomyazaki: + - bugfix: Holocomms will no longer transmit speech before the call is accepted. +2019-04-26: + Randall: + - maptweak: The Auxiliary Warehouse shutter buttons now require Supply access from + the outside. + mikomyazaki: + - tweak: Allows changing a cryptographic sequencer's icon and name in a similar + way to chameleon items. +2019-05-03: + CarefulLilCassie: + - rscadd: Adds folding knives based on the Swiss Army Knives made by Victorinox + & adds them to lockers based on job as well as the loadout for a basic one. + ChaosAlpha: + - bugfix: Fix robots click-dragging things on catwalks. + - rscadd: Robots can now use the , and . hotkeys to move up and down z-levels in + hotkey-mode. + - rscadd: Everyone can now use > and < in non hotkey-mode to move up and down z-levels. + Chinsky: + - rscadd: New sprite for mining scanner, look for air analyzer-like thingie in miner + colors. + - tweak: Mining scanner now behaves like other scanners, storing last scans. To + use it click on a tile you want to scan. It will keep all scans unless buffer + is cleared. + - rscadd: Scanners now make sounds when used. + - rscadd: You can now make handrolled cigs out of any dried plants. + - tweak: Tobacco from cig vendomats can be put in pipes. + Flying_loulou: + - rscadd: Medical Technicians rejoice ! Following OHS inspections, EXCOM decided + to grant you a light polymer helmet, as in most of other EMS services throughout + human space. + - rscadd: Medical Technicians rejoice ! EXCOM also issues you a 'medical technician + chest rig', to help you carry your equipment without being forced to sweat in + a jacket. + - tweak: Medical personnel rejoice ! your paramedic and EMS jackets have been modified, + and now allow you to store a blood bag on the suit storage slot. + - maptweak: The MT chest rig and the EMS helmet are now available in the medical + technician's lockers. + - maptweak: Due to budget cuts, EXCOM had to sell the labcoat from the MTs lockers, + in order to aquire the new equipment. Therefore, you will no longer find labcoats + in the MT lockers. + Higgin: + - tweak: Tactical armor plates now offer extra resistance against brute and bullet + damage over regular medium plates. + - admin: Adminhelps not taken or closed in five minutes automatically close with + a reminder to the owner. + - tweak: Being stunned, weakened, or paralyzed now all prevent radio use. + - tweak: Getting hit can apply a very brief cooldown before you can use your radio + - guaranteed for stun weapons, projectiles, and powerful melee weapons. + - tweak: Pepperspray no longer automatically stuns/weakens targets without mouth/nose + protection. + - tweak: Pepperspray briefly confuses targets without eye protection. + - tweak: Pepperspray has a 50/50 chance to stun targets without full mouth/nose + protection. + - tweak: Partial mouth/nose protection (masks, bandanas) reduces pepperspray stun + chance. + - tweak: Pepperspray weakens stunned targets without full face protection. + - tweak: Buffs pepperspray gas pain damage and adds a chance of stun to gas effects. + Hubblenaut: + - rscadd: Adds a new chameleon headset to the chameleon kit. + - rscadd: Adds three new chameleon accessories to the chameleon kit. + - bugfix: Fixes chameleon items having broken sprites. + Randall: + - tweak: The advanced mop now synthesizes space cleaner instead of water. + RyanSmake: + - bugfix: The Torch is now a valid target for the BSA (for BSAs not on the Torch). + SierraKomodo: + - bugfix: Deck 1 security checkpoint shutters work as intended now. (Actually fixed + this time). + Spookerton: + - tweak: Secure guns are slightly more informative about registration changes and + have shorter ranged interaction logging. + - tweak: Welding tools are now all just one pocket-sized item with swappable tanks. + Tanks change the size of the tool when attached. + - tweak: Emergency toolboxes now also contain a welder with a tiny fuel tank. + - admin: Admin narrations can be styled. SubtleMessage is part of DirrectNarrate. + Moderators get limited DirectNarrate with a SubtleMessage style. + mikomyazaki: + - rscadd: Cooking supply pack now has a bottle of universal enzyme. +2019-05-08: + ChaosAlpha: + - bugfix: New < and > keybinds are now CTRL+. and CTRL+ in non hotkey-mode, to circumvent + a byond limitation. You will need to update your skin. + sabiram: + - rscadd: 'Added several new human languages: Yangyu, a Chinese language (key 2); + New Dehlavi, a Hindustani language (key 3); Prototype Standard Arabic, an Arabic + language (key 4); and Iberian, a Spanish-Portugese language (key 5).' + - tweak: Changed the way human culture defines assign language. Please double-check + your loadout. + - tweak: Sol Common's syllable list has been adjusted. + - tweak: Renamed 'Independent' to Pan-Slavic. + - tweak: The language keys of several languages have changed. Xenophage (4 to L); + Borer (x to z); Vox (5 to x) + - rscdel: Removed 'Lunar' and 'Spacer' languages. +2019-05-12: + Chinsky: + - rscadd: Adds jars of medical lollipops (holding 15u of a random common medicine) + to infirmary lobby and CMO office + - rscadd: Can now scan overmap things with sensor console. By default just shows + site description. + - rscadd: For ships, shows heading and speed, if ship is moving. + - rscadd: For planets output depends on Science skill - atmosphere / plantlife / + wildlife presence (Basic), number of non-natural ruins (Trained), compoisition + / temp / pressure of atmosphere (Expert). + Novacat: + - tweak: Fixes a UI bug with the modular computer downloader and antag programs + Spookerton: + - tweak: Arterial bleeding is now much more obvious to the bleeder. + mikomyazaki: + - bugfix: You now need to wear hardsuit gloves/boots to have a complete airtight + seal when wearing a RIG. +2019-05-13: + Cakey and Marie Taylor: + - imageadd: Adds directional sprites for vending machines, smartfridges, watercoolers, + drying racks and medivendors. Sprites by Marie Taylor. +2019-05-14: + Chinsky: + - tweak: Shuttles now display their fuel in Delta-V rather than pressure gauge. + They also show Delta-V used per move, so you can actually gauge how many jumps + you have left on your fuel. + Devildabeast: + - rscadd: IPCs can now select kicking and stomping as their default unarmed attack. + SierraKomodo: + - bugfix: Energy guns no longer become invisible if cell charge exceeds cell capacity + due to adminbus. + - bugfix: Spacer now has a text color again. It's dark-yellow. +2019-05-15: + ChaosAlpha: + - bugfix: Robots can once again build windows using their synthesizers. + Eckles: + - rscadd: Adds new Skrell factions and home systems. + SierraKomodo: + - bugfix: Being incapacitated no longer affects talking and radio use if the radio's + microphone is set to on. + - bugfix: Talking normally with a nearby radio set to on will no longer trigger + aim-mode shooting. + afterthought2: + - tweak: Movement delay handling from items has been tweaked slightly to give more + fine-grained effects. +2019-05-16: + Chinsky: + - tweak: Helm console layout changed, mostly to prevent sector descriptions shifting + movement keys down at WRONG FUCKIGN MOMENT. + - rscadd: Added acceleration limiter to helm console. Hard value vs engine thruster's + percentage. Doesn't affect fuel usage, use engine limiters for that. + ghostsheet: + - tweak: Hardsuit ore scanner module can now print survey data disk. + - tweak: Hardsuit mounted drill now has an increased energy cost of 2Wh per use. +2019-05-17: + Montykore: + - imageadd: Atmos canister icons and canister details revamped and updated. +2019-05-18: + Chittersky: + - tweak: If you are wearing a voidsuit, spiders now need to breach it before injecting + poison. On other hand, spiders now can breach voidsuits. + - tweak: Spider venom's toxin damage is now slightly weaker, but can cause confusion. + Montykore: + - imageadd: Updated and revamped corgi related icons. + SierraKomodo: + - bugfix: Deck 1 security checkpoint windoors have the correct access flags now. + babydoll: + - tweak: Simple animals' speed prying doors open now depends on the door. + ghostsheet: + - rscadd: 'Plasma cutters can now cut through the following: bulkhead walls, floor + platings, girders, catwalks, windows, low wall frames and lattices.' + - rscadd: Plasma cutters will now spark and require eye protection when interacting + with object. + - tweak: Mounted plasma cutter has an increased object interaction energy cost, + 10 Wh per use. + - bugfix: Drills will now have a delay and sound when drilling through girders. +2019-05-19: + Chinsky: + - rscadd: Added 'Known Implants' field to medical record, that gets auto-filled + with roundstart robotic organs + - rscadd: Added buddy tags to explorer lockers. These can be worn as an accessory, + and will start pinging every half a minute or so if they don't detect another + tag with the same ID in 10 tile range. They can be clicked in hand to set ID + and toggle on/off. + SierraKomodo: + - tweak: Helm and navigation consoles now show 'gigameters/hour' for speed and acceleration. +2019-05-20: + Albens: + - maptweak: Bridge Deck has undergone a refit. +2019-05-23: + Devildabeast: + - tweak: The Roboticist and Biomechanical Engineer have had their access adjusted + to better reflect their respective departments, and the Roboticist can now access + the Engineering Locker Room and front desk, but has had Tech Storage access + removed (which was unusable anyway). + - rscdel: The Roboticist's headset has been removed; the Roboticist and Biomechanical + Engineer now spawn with their respective department's headset. + - tweak: The Roboticist is now Trained in EVA and exosuit operation by default. + - maptweak: The Engineering Locker Room's material reserves have been locked behind + windoors in order to prevent certain nerds from thieving. + - maptweak: Robotics now gets two loaded toolbelts and multitools instead of one, + as well as two pairs of insulated gloves. + SierraKomodo: + - maptweak: Various map tweaks to Aquila to fix clickable sprites being under other + sprites and other mapping nonsense. + - maptweak: The Charon power compartment has a camera again. + ghostsheet: + - rscadd: Medical drop pouch and Medical webbing is now available on the loadout + to medical trainee, chemist and biomech. +2019-05-24: + SierraKomodo: + - bugfix: 7mm haywire ammo boxes now contain the correct ammo. + - bugfix: Flying borgs are no longer capable of having infinite VTEC modules installed. +2019-05-25: + Flying_loulou: + - rscadd: The EC now issues branch berets to their personnel, to denote which section + they're from (available in the loadout, hats and headgear section). + - rscadd: Following extensive training the personnel of the Torch is now able to + clip their helmets on their plate carrier's suit storage slot. + - rscadd: Following even more extensive training the medical technicians can now + clip their EMT helmet on their MT Chest-rig's suit storage slot. + SierraKomodo: + - tweak: Flying borg speed has been reduced one level. Flying borg default speed + is now the same as a regular borg with a VTEC module. Flying borgs with a VTEC + module will be as fast as the old default flying borg speed. + - rscadd: Pill bottles can now be printed at autolathes + afterthought2: + - tweak: The pilot qualification pin is now restricted to Fleet and EC. +2019-05-26: + Chinsky: + - tweak: Spacesuits etc now have maximum pressures they can handle. You can check + their codex entry to see it. + babydoll: + - rscadd: You can now permanently disable radio/teleporter beacons with an emag + or EMP attack. Any connected teleporters will also lose their connection. + - rscadd: Anchored underfloor beacons can be repaired with nanopaste. Handheld or + portable beacons are unrecoverable and must be replaced. +2019-05-27: + BearKingKrug: + - tweak: Clicking on borgs/drones on harm intent with a welder/crowbar actually + attacks them now + ChaosAlpha: + - bugfix: In non hotkey-mode, move-up/down have been moved to CTRL+Numpad_Add/Numpad_Substract + to fix issues with some keyboard layouts. + Chinsky: + - tweak: NTIRC client no longer spawns by default, freeing up some space on PDAs + and such. + - tweak: Reports editor now spawns on Cargo and Command PDAs by default. + Flying_loulou: + - tweak: Security coveralls are now also available for all fleet security personnel + (via the uniform vendor, under utility extra). + - tweak: Changes the firesuit sprite for a new one, based on TG's. + - tweak: Lowered the firesuit slowdown to 0.6 (voidsuits' slowdown is at 1). + - rscadd: Based on TG's sprites, adds the firefighter helmet, and the chief firefighter + helmet (for the CE). You don't need to wear a mask while wearing it, and it + does connect to internals (you still have to toggle them on, of course). + - maptweak: Adds said helmet in the fire closets, to replace the already existing + red hardhat. + - maptweak: Adds fire closets throughout the ship. + - maptweak: Adds fire closets in the Charon and the Aquila. + NewOriginalSchwann: + - tweak: Fatigues have been added to the Fleet pilot's uniform vendor under utility. + SierraKomodo: + - maptweak: 'The bridge deck has received some minor tweaks and fixes. See https://github.com/Baystation12/Baystation12/pull/25628 + for details. Notable changes below:' + - maptweak: CMO's office fax machine no longer blocks access to part of the table + - maptweak: Meeting room now has a fire alarm + - maptweak: Additional cameras were added to CO's office and aft hallway to fix + blindspots + - maptweak: Fire doors were added to doors and windoors that were missing them + - maptweak: PPE closet access flags now match the sidearm closet + - rscadd: Shield generator and shield generator monitor UI now includes a capacity + percentage. + - maptweak: The lift now has firedoors. + - rscadd: Flying borgs now have light-weight armor, providing half the armor value + of a regular borg's armor. Light-weight armor can be printed from fabricators + for half the cost of regular armor, and can also be applied to regular borgs + (Not that you'd ever want to do this.) +2019-05-28: + AlexMorgan3817/_Elar_: + - bugfix: Now device can't be its own proxy. + BearKingKrug: + - spellcheck: Fixed AI intro text to not mention being a traitor + Cakey: + - rscadd: EC service and dress under-uniforms have been replaced with service jumpers, + with complimentary departmental colouring. + - rscadd: EC senior officers (captain and above) now have a unique service cap. + ghostsheet: + - tweak: Overmap Fast speed is now reduced from 20 to 15, this applies to dodging + meteors in shuttles at experienced/master levels. + - tweak: Gas thrusters for overmap travel, will now calculate thrust and fuel consumption + by volume. Lower volume limit from the engine control for more fuel efficiency. + - tweak: Guppy's mass and max speed has been increased. + - maptweak: Charon's atmospheric and electric compartment has be reworked to accommodate + for the fuel consumption. + - maptweak: There are now shuttle navpoints on the hanger deck. +2019-05-31: + EcklesFire: + - rscdel: Removed inappropriate boots from Fleet EMT. + ghostsheet: + - rscadd: Vey-Med has generously donated two prototype hardsuit defibrillator modules + to be used on the torch mission. + - rscadd: Hardsuit defibrillator module has been added to the rescue rig and the + CMO hardsuit. + - tweak: Hardsuit health scanner can now display their reading like the ore scanner. +2019-06-01: + Orelbon: + - rscadd: Adds NanoUI interface to suit storage units. + SierraKomodo: + - rscdel: Vat-grown blanks have been removed from the SRV Petrov. + babydoll: + - tweak: Many objects that were previously rotatable with a verb are now rotated + using alt-click. Any such object will report in examine that it can be rotated. + - tweak: You can now rotate vending machines with alt-click. + ghostsheet: + - maptweak: The Aquila's engine room has been updated, most notably it now has a + fuel pump for easy refuelling. +2019-06-02: + Atebite: + - rscadd: 'New integrated circuit components have been added:' + - rscadd: Reagent funnels - Allows you to use reagent containers such as beakers + on the assembly to refill internal reagent storages + - rscadd: Reagent heaters/coolers - Heats/cools contained reagents, similar to heater/cooler + pads + - rscadd: Anchoring bolts - Anchors the assembly so that it cannot be moved + - rscadd: Hatch locks - Prevents opening the assembly with screwdrivers while enabled + Spookerton: + - rscdel: Resleevers and neural laces no longer exist. + babydoll: + - rscadd: Blobs will now additionally attempt to attack a random nearby tile, even + if they aren't expanding to that tile. The core nucleus itself is particularly + aggressive. + - tweak: Material coins are no longer effective weapons. + ghostsheet: + - rscadd: Plasma cutter can now deconstruct closet. + - tweak: Hardsuit chemical dispenser now has inaprovaline instead of tricordrazine. + - tweak: Rescue rig can now have auto-compressor hooked on the suit storage slot. + - tweak: Ninja's chemical dispenser now has dermaline instead of radium, no more + radioactive super powers today. + - bugfix: Hardsuit module item will no longer be put into bags or closets. +2019-06-03: + SierraKomodo: + - tweak: You know longer magically know an emag is an emag because of your complex + devices skill. + Spookerton: + - tweak: Hearing your current default language skips adding the language identity + to the log. + - tweak: You no longer grunt as if you have no languages if you have any language + you can speak. + - tweak: Team outsider special roles are given an appropriate team language. + - bugfix: Legalese is enabled in the dme again. Derp. + - rscdel: GalCom no longer exists. + - tweak: Everyone on the Torch and Verne except stowaways and merchants are given + ZAC on spawn. + - tweak: Non-Torch jobs do not give a language on spawn unless you spawn with no + languages, in which case you get Spacer. + - tweak: The maximum number of preferences-selectable languages is 3 instead of + 4 due to other changes. + - tweak: Sinta Unathi speak Sinta. Yeosa Unathi speak Yeosa. Having the other language + is optional for both. + - rscadd: Selenian exists. It is a dialect of ZAC (high cross-understanding), not + money-speak. It is the language of selenians, and optional for residents of + luna. + - bugfix: Having no languages at all prevents you from speaking in raw text that + everyone understands. + - tweak: Chimpanzee is renamed Primitive. Subtypes of Primitive no longer exist. +2019-06-04: + WezYo: + - bugfix: Ghosts can no longer close antag pda program +2019-06-05: + Cakey: + - tweak: You can now rotate in chairs when buckled to them by clicking once again. + SolarK: + - tweak: Slowdown penalties based on cold now affected by species discomfort levels + babydoll: + - tweak: All types of blob will now launch bonus attacks less often overall, and + will attack more or less often depending on their type. + - rscadd: Added the 'ravaging mass', which forms an offensive line around the shield + blob spawned by the cores. This type attacks most often and most potently of + all the blob types. + - tweak: The base type (which makes up the bulk of the blob) formerly known as 'ravaging + mass' is now 'pulsating mass', and has had its maximum damage potential reduced. + - tweak: Reduced damage potential of the shielding mass. Increased hit points. + - tweak: Mecha are now valid targets for the blob's bonus attacks. +2019-06-06: + Cakey: + - rscadd: Added a new on-ship ambience sound, for that in-flight pressurised cabin + feel. + Devildabeast: + - rscadd: Adds a nine-pointed star icon to the list of potential bible choices. +2019-06-07: + WezYo: + - bugfix: resetting a flying drone will no longer make it invisible +2019-06-11: + Spookerton: + - tweak: Radio messages no longer show language identifiers if the language is the + same as your default. +2019-06-12: + Chinsky: + - tweak: Doors to the catwalk overlooking Hangar are no longer access-locked. + Devildabeast: + - rscadd: Adds urns which can contain, move, and release ashes, and can be constructed + from different materials. The Counselor gets a wooden urn in their locker on + round start. + Kamiztheman: + - tweak: Item descriptions in the traitor uplink menus have been adjusted so that + new recruits actually understand what they are buying. + - tweak: EMP ammo boxes purchased from the uplink should now have enough ammo to + refill a magazine. + - bugfix: 7mm EMP ammo boxes now contain and can store the correct caliber rounds. + MistakeNot4892: + - tweak: Status indicators on the UI have had a makeover. + - rscadd: You can now click status indicators to get an idea of how things are in + your current state. + Spookerton: + - tweak: The brig no longer contains prison camp clothes because it's not one. + - tweak: The brig officer gets a multitool for locking guests' sensors on. + - tweak: You can lock and unlock suit sensors through the stripping menu with a + multitool. + WezYo: + - bugfix: Attacking with swiss knives properly displays attack verb + ghostsheet: + - rscadd: Hardsuit interface now has internal tank controls. + - tweak: Hardsuit interface has been updated. Fresh coat of paint to keep it looking + good. + - bugfix: Tank "reset" button now works properly, resetting tank release pressure + to its original value. +2019-06-13: + Draxtheros: + - tweak: Raised the temperature at which Unathi begin to receive "warmth" messages. + Spookerton: + - tweak: IPCs cannot be OCIE agents. +2019-06-14: + MistakeNot4892: + - rscadd: Adds thirst. It's like hunger. + Spookerton: + - tweak: Changing species with the changer re-adds languages required by the user's + antagonist type. +2019-06-15: + Cakey: + - maptweak: 'adjusted the bridge deck slightly:' + - maptweak: straightened the outer hallways to be more convenient + - maptweak: reorganised the meeting room to use its space better + - maptweak: matched wood types accross all offices + - maptweak: gave an extra console to the side-islands in the bridge + - maptweak: reshuffled COS and CE office contents, added disposal chutes + - maptweak: brought outer hallway decals in line with door marking standard + afterthought2: + - bugfix: SMES inverted logic fixed; should now work with terminals properly. + - bugfix: APCs now charge from empty properly again. + - bugfix: Heaters/coolers/protolathe/circuit printer work again. + babydoll: + - bugfix: Fixed mirrors not opening their menu. + - rscadd: Added yew wood, and its planks to the supply menu. + - tweak: Adjusted mahogany and walnut wood colours. + - bugfix: Corrected mahogany and maple plank loadout info. + ghostsheet: + - maptweak: Deck three toilets now doesn't suffocate people anymore. + - tweak: Hardsuit modules can now be deselected by pressing select again. + - tweak: Hardsuit plasma cutter automatically do object interaction if they're adjacent. + They will now also always fire on harm intent. + - tweak: Hardsuit flash module now flashes on unarmed attacks. + - tweak: Hardsuit flash module now has has a function to activate the flash without + targeting anything. + - tweak: Hardsuit flash now has a higher energy cost of 10 Whr per use. +2019-06-16: + Devildabeast: + - rscadd: "Adds the Bah\xE1'\xED Faith to the list of selectable human religions." + - tweak: Suit sensors can now be set by alt-clicking your uniform. + MistakeNot4892: + - tweak: Humans can now leap/tackle at a small distance based on their Athletics + skill. + - tweak: Leaping and tackling (Vox and Xenophage powers) are now invoked by attempting + to make a ranged grab - if it's not a mob you'll just hurl yourself in that + direction like an idiot. They have had timing values tweaked and require a short + channel before use. + - tweak: The various outcomes for leaping/tackling have been made dependant on skill + levels in Athletics and Combat. Check the PR for specific values. + - tweak: Split the Chaplain and the Counselor into two separate roles. Chaplain + was moved to Service and lost Medical access. + - rscadd: Replaced the defunct Sec checkpoint near the Chapel with the Counselor's + Office, it's where t'Counselor lives. + - tweak: Moved the Psychiatrist and Psychologist alt titles to the Counselor. + Spookerton: + - bugfix: Species toxins modifiers are used again, and modify internal organ damage + taken from toxins and organ failure. + - bugfix: Lava no longer deletes human and human derived mobs early when braindead. + afterthought2: + - bugfix: Borg chargers once again spawn with the cell installed. + - bugfix: Vents starting as off are fixed. +2019-06-17: + SierraKomodo: + - tweak: Brig Officer is now known as Brig Chief. + afterthought2: + - bugfix: SMES sizes and starting charge should now be back to normal. + - bugfix: Pressure regulators should once again be interactable. + babydoll: + - rscadd: Added a system to rarely spawn larger, more dangerous fauna on exoplanets. + - rscadd: A giant crab, peaceful until provoked, can now spawn on desert exoplanets. + ghostsheet: + - tweak: Plasma cutter now uses up half a charge per deconstruction. + - bugfix: Deconstruction of walls and girders now gives the appropriate materials. +2019-06-18: + MistakeNot4892: + - tweak: Dionaea can stand in water to recover thirst, and lose hydration slower + than others. + - tweak: Going prone on water turfs will now drown you. +2019-06-19: + SierraKomodo: + - tweak: Airlock control boards now have 'Autoset Access' enabled by default. +2019-06-20: + Heptagon49: + - bugfix: Fixed variables so powercells aren't duped when inserted into the coilgun. + - bugfix: Fixed coilgun examination so that it works now. + Kamiztheman: + - rscadd: Adherents aboard the Torch have finally found their crystalline toolboxes, + and have loaded their vending machine with them as an alternative to the harness. + MistakeNot4892: + - tweak: You now use grab intent only to perform a tackle/leap. + - tweak: Running off a ledge with a leap prepared (using Prepare To Maneuver) will + automatically try to jump to the next closest non-open turf. + - tweak: Mobs will now behave more like objects when thrown - they will pass tables/rails + and collide with obstacles. + SierraKomodo: + - rscadd: AI can now jump to people talking near an active holopad. + Spookerton: + - tweak: Improvised cuffs break if resisted out of a few times. + - tweak: Cuffs and improvised cuffs can now be attached to most shoes, hobbling + them. Improvised cuffs break if the wearer moves enough. + - tweak: Knives can be stored in more kinds of shoe. + afterthought2: + - tweak: Kitchen cookers, microwaves, gibbers, and seed/honey extractors are now + buildable. +2019-06-21: + Alex6511: + - tweak: Meteor now requires 15 players + Textor: + - rscadd: Adds gas sensor, air injectors, digital 3-way valves, and gutters to pipe + dispenser + - rscdel: Removes non-omni versions of filters and mixers from the game. + - rscadd: Pipe dispensers UI is updated. Pipe dispensers can now dispense normal + pipes with paint already applied to them and dispense 1, 5, or 10 pipes at a + time. + - rscadd: Atmospheric control console UI updated. You may now directly input values + instead of using plus and minus buttons. + - rscadd: Pressure tanks can now be built with steel sheets, and deconstructed. + - rscadd: Vent pumps and injectors can now have their configuration changed using + a multitool. + - tweak: Due to fuel pipes having different tolerances, they are no longer compatible + with normal pipes and need a universal adapter to connect two networks together. + - maptweak: Removes all non-omni filters and mixers from all maps and replaces them + with omni versions. + afterthought2: + - tweak: Washing machines are now buildable. + - tweak: Portable pumps, scrubbers, huge scrubbers, and hydroponics trays are now + buildable using circuitboards. +2019-06-22: + Unknown: + - tweak: The Mend psi-power now scales in effectiveness to your rank, and is available + at lower ranks. + - tweak: Autoredaction is now less buggy in regards to fixing bleeding, and somewhat + less spammy when healing you. + - tweak: Coercion now has Mind Read as a power. It prompts someone with a question + that they are compelled to answer - RP tool only. + - tweak: Blindstrike now has a visible tell when used. + - tweak: Spasm, Agony and Blindstrike have been shuffled around within the Coercive + tree. + - tweak: Latent psionics will no longer be aware they are latent psionics. + - tweak: The Probe power is now called Assay and has been moved to operant-rank. + - tweak: Made some roundstart announcements bigger/easier to read. + babydoll: + - maptweak: Moved the chapel down to deck 3, south of the holodeck. + - maptweak: Remapped the mental health section of the infirmary. + - rscadd: Added pews for the chapel. + - rscadd: Added pews to the material construction menu. They can only face south! +2019-06-23: + MikoMyazaki: + - rscadd: Traitor robots always get their emag items. + - rscadd: Cultivator drone now has an emag item, an energy machete. + - bugfix: Restores Petrov access to the Access Decrypter antagonist program. + MistakeNot4892: + - tweak: The config options RUN_SPEED and WALK_SPEED are now more accurately named + RUN_DELAY and WALK_DELAY. Default values have been adjusted to match the previous + behavior. + - rscadd: Stamina now exists. You will recover stamina fastest while well fed and + lying down, but will recover it slowly so long as you aren't actively sprinting. + Stamina recovery can be tweaked in config. + - tweak: Running will now consume stamina. Costs can be tweaked in the config. If + you run out of stamina, you will not be able to run again until it refills. + - rscadd: You can now hold shift to sprint, and release it to walk. You can set + default walk/sprint options with Set Default Walk and Set Default Run. + - tweak: The Counselor is now mildly psionic, and is a registered affiliate of the + Cuchulain Foundation for RP purposes. They have some tat in their office relating + to psionics more generally. This is hopefully going to be a way to make psionics + more broadly known ingame - see Discord/PR/other discussions if interested. + - rscdel: Removed Psychiatrist. + - tweak: Psychologist is now a Passenger alt title. + afterthought2: + - tweak: Machine interaction has been reworked further. Be ready for some issues. + - tweak: You may now install and remove machine components by hand on (some) machines + you can build from circuits. To do this, first open the panel with the screwdriver + (you may need to make sure the machine is off or other conditions are met). + Then either insert a component by clicking on the machine with it, or use a + wrench on the machine to remove the component. + babydoll: + - rscadd: Added the disorientator, a short-ranged beam weapon with effects similar + to a flash. + - rscadd: Added the disorientator to core department head closets and RnD. +2019-06-24: + Alex6511: + - balance: The meteor gamemode is now significantly more powerful. + MikoMyazaki: + - bugfix: Spells granted by The Tower deity no longer require robes to cast. + - tweak: Adds an exit button to the Deity punishment menu incase you open it accidentally. + - rscdel: Removes some stamps that shouldn't exist. (Warden, HoP, HoS, etc.) + - imagedel: Removes some now unused stamp icons. + - tweak: RIG stamp module now does the normal stamp instead of the Internal Affairs + stamp. + - tweak: Centcomm stamp (used on admin faxes) now uses the map specific boss name + for the stamp. + - bugfix: Prevents putting polytool augment tools in your pocket, behind your ear, + etc. + - tweak: RIGs will now warn you if you make them malfunction while offline, requiring + nanopaste to repair. + Mistakenot4892: + - rscadd: Added a slower version of walk, Creep intent. + NobleCaos: + - tweak: Diona Nascent Gestalts can now katamari up items as well as nymphs based + on the amount of nymphs in the gestalt + SierraKomodo: + - maptweak: Filters in atmospherics no longer connect to the wrong pipes. + - maptweak: The Corporate Liaison's office now has a gun recharger for the LPA's + sidearm. + - tweak: LPA and CL lockers now spawn with spare headsets, including bowmans. + afterthought2: + - bugfix: SMES panel opening, shieldgen deconstruction, and door autoclose have + been fixed. + - tweak: You can rotate disposals pipes now. + - tweak: Flipping disposals pipes moves them to the mirrored state (unlike rotating + twice). + - tweak: Dragging disposals pipes no longer rotates them. + - bugfix: various issues with disposals construction have been addressed. +2019-06-25: + ghostsheet: + - bugfix: Shuttle thruster now block air and fire; shuttles are more fireproof and + less gas contamination should occur. + - tweak: Shuttle engine heater, are now climbable. + - maptweak: Medical bathroom now has a mirror, for all your post radiation treatment + needs. + - maptweak: Charon atmospheric compartment has been returned to its previous state. + - maptweak: Hanger fuel bay now has a high power pump, to reduce prep time. +2019-06-26: + Cakey: + - tweak: Grass, carpets, and dirt have new icons. + - rscadd: A new system has been put in place for floor detailing, allowing for pre-made + edges. +2019-06-27: + MikoMyazaki: + - bugfix: Can no longer drag people off of something they are buckled into (e.g. + roller bed) onto an op table without unbuckling. + MistakeNot4892: + - rscdel: Removed xenophage and all adjacent code. + - tweak: You now need to hold CTRL to do a leap. + SolarK: + - tweak: Added damage limit applied by vacuum. + babydoll: + - rscadd: Swarms of enormous leeches can now spawn on shrouded exoplanets collectively + as megafauna. + - rscadd: Soap now comes in a few different shapes, sizes and colours. + - rscadd: Cleaning someone with soap will now attempt to transfer some of the soap's + reagents to that person. +2019-06-28: + MikoMyazaki: + - rscadd: Adds a chemistry recipes book to the chemist's locker that lists the medication + recipes. + Novacat: + - rscadd: Adds the dufflebag of holding, a cosmetic reskin of the Bag of Holding. + - tweak: Fixes some onhand sprites for dufflebags. + Roland410: + - maptweak: Moved the CE's suit to the bridge EVA storage. + - maptweak: Made the conference room a tad bit bigger and moved items around, gave + it a request console. + - maptweak: Removed one console on each side of the bridge and added tables instead, + gave another emergency toolbox, donut box, coffee mug, and a shortwave. + - maptweak: Gave the CL a box of cigars, bronze zippo, union card box, and made + the backroom properly boltable by the button. + - maptweak: Added disposals to the CL office. + - maptweak: Shuffled around the contents of the CE's office. + - maptweak: Gave the CO a Torch ship model. +2019-06-29: + .verarch: + - tweak: lizard horns should no longer obscure eyes. + - tweak: work gloves should fit unathi somewhat better now. + Cakey: + - rscadd: Adds pixel offsets to all mobs to give the game more feel for depth. + - rscadd: Gives all mobs a drop shadow. + afterthought2: + - admin: More things should show up in admin logs now. +2019-07-01: + MistakeNot4892: + - tweak: Vox jobs (scav and stowaway) now have soft antagonist status. + Spookerton: + - bugfix: Microwaves don't eject their components. + - tweak: dismantling a microwave empties it first. +2019-07-02: + Cajoes: + - tweak: modified adherent tool vendor to look modified + - tweak: changed adherent tool vendors vend animation from "tool_vend" to "tool-vend" +2019-07-04: + MikoMyazaki: + - maptweak: Officer's Mess is now all access. + Spookerton: + - bugfix: microwaves properly remove their ingredients after cooking. +2019-07-05: + Cajoes: + - tweak: Lava lamps have been optimized. + MistakeNot4892: + - tweak: Borers now use Dominate via ranged disarm attack and Infest via melee grab + attack. + - tweak: Language on borer messages is now more neutral. + - tweak: Borer powers now largely have UI buttons. + - tweak: Psionics can see auras around borers when they aren't inside hosts. + - tweak: Borer Dominate is now properly psionic, and respects psi-null atoms and + psi armour (ie. Coercion ranks). + - rscadd: Added neutered borers. Adminspawn only, basically defanged peaceborers. + - tweak: Significant backend refactor for borers, please report borer bugs. + afterthought2: + - rscadd: Robots now get skills set according to their module choice. + babydoll: + - tweak: Bog-standard parrots will now retaliate briefly when attacked. + - tweak: The space parrot occupying its temple in the asteroid will now retaliate + with force when attacked. Beware! + - rscadd: A giant parrot can now spawn as the grass planet's megafauna. + babydoll, Xhuis & Sunner: + - rscadd: Added the hivemind, a megafauna spawn for settled exoplanets. Beware its + attacks and strike when it's vulnerable. +2019-07-06: + Devildabeast: + - rscadd: Inscriptions can now be carved into material (gold, steel, silver, etc) + rings using sharp objects. + MikoMyazaki: + - tweak: Antagonist implants are now not visible to the bodyscanner, you can find + them by opening the implanted bodypart and examining. + afterthought2: + - tweak: If a machine is hackable, you'll now only get shown the wires panel; to + see the usual interface close the hacking hatch with a screwdriver again. +2019-07-07: + Devildabeast: + - tweak: 'Counselor now gets different psionic faculties by alternate title: Redaction + for Counselor and Coercion for Mentalist.' + - rscadd: Focus has been added as an Operant Coercive ability; grab a target while + target the mouth, then use the grab on them on disarm intent to cure the target + of various mental ailments. Power scales by rank. + - tweak: Spasm is now a Master ability rather than Operant. +2019-07-08: + Devildabeast: + - rscadd: Dog tags can now be added to the commemorative plaque to memorialize members + of the Expeditionary Corps. + afterthought2: + - tweak: The emergency supplies crate is cheaper but has no armored vests now. + mikomyazaki: + - bugfix: Clonexadone and Cryoxadone no longer reduce damage on necrotic organs. +2019-07-09: + mikomyazaki: + - tweak: RUST manual now links to the wiki guide (and doesn't teach you to blow + up the RUST) +2019-07-10: + afterthought2: + - rscadd: Machines now require power components to draw power. These can be printed + from the autolathe. The tesla link one is the default one to use. + - rscadd: Many machines now require screens and keyboards to be fully interactable. + You can print them from the autolathe. + - rscadd: To install components, open the panel with a screwdriver (after the machine + is built) and click on the machine with the component. To remove components, + use the wrench while the panel is open. + - tweak: 'Computer construction has been changed. A screen and keyboard is required + now. The order is: make a frame, wrench to anchor the frame, add 5 coils, add + the circuit, add all components as prompted, screwdriver to build. To deconstruct, + crowbar to remove components, wirecutters to cut the wire, unwrench, and apply + welder.' + - tweak: General machinery follows the same construction steps as computers now. + - rscadd: Computers now have panels, like other machines. To deconstruct a computer, + use a screwdriver to open the panel and then a crowbar to deconstruct. + - tweak: Newly built machines have the panel open. + - rscadd: If confused about this, examine the machine while standing next to it + to get information about which tools to use on it. + mikomyazaki: + - bugfix: Can now properly construct multi-tile glass airlocks. +2019-07-11: + afterthought2: + - rscadd: Shuttle consoles are now buildable. Use a multitool on the circuit while + on a shuttle to set the shuttle first! Shuttles are still not buildable; you + must do this on an existing shuttle. + mikomyazaki: + - bugfix: pAIs no longer have to fold up twice to become a card. + - bugfix: pAIs with the Universal Translator module can now speak and understand + Spacer and Gutter. + - bugfix: Mend psychic power now works properly on operant level to fix bleeding. + zaredman: + - maptweak: Adds an Interview Room to the Brig. Adjusts nearby rooms to fit. +2019-07-12: + Cajoes: + - rscadd: food in steel cans and support for canned items, added to cargo + - rscadd: Added pistachios to snix vendor + - rscadd: Added Sol Snacks vending machine. (And ethnic sol foods to go with it) + - Vendor by Chinsky + - rscadd: Added japenese snacks to the snix machine and changed it to its own vendor + with some label tweaks please welcome the painfully ethnic "Yummy Fods" vending + machine. Available in cargo + - tweak: Snix machine now more slavic in design + - rscadd: Added deoderant to lavatory essentials + - rscadd: Added chessboard to game vendor + - rscadd: Added numerous vendors to the Cargo Supply Form + mikomyazaki: + - bugfix: Printing from the file manager program now prints visible paper. + - tweak: Adds basic medical and trained chemistry skills to the Service Module. + Gives the Service Module the full selection of booze and soft drink dispenser + drinks. Significantly reduces power requirement of the drink dispenser tool. + - bugfix: Autopilot will now accelerate correctly. + - tweak: The psiblade can now hit robots instead of trying to cut their wires like + a wirecutter. + sick trigger: + - maptweak: Added tinted windows and a light switch to the chapel. + zaredman: + - maptweak: Fixed some map oversights following the Security interview room addition + (like the wall blocking the door to the FT's lab). + - maptweak: Added laundry pods to the Medical washroom. +2019-07-13: + mikomyazaki: + - tweak: Machines will now have a hint if you have forgotten to install a tesla + link. + - rscadd: Robco vendor will now vend tesla links and keyboards for building machinery. +2019-07-14: + Devildabeast: + - tweak: Makes the machete sheath its own selection under loadout; removes it from + the list of holster selections. + - rscadd: The Chaplain's bible now has "blessings;" as a Chaplain, use your bible + (or holy book) on another character to recite a prayer to them, or use the book + in your hand to read a passage to everyone nearby. If you are of the same religion, + they will receive a message putting them at ease. + sick trigger: + - maptweak: Skrell ship air alarms set to a higher, more appropriate temperature. +2019-07-15: + afterthought2: + - admin: You can now ban, jobban, and view notes on logged out mobs. This will act + on the last ckey to have possessed the mob. + babydoll: + - maptweak: Replaced all-in-one grinders in cooking areas with idiot proof juicers. + These cannot hurt your hands. + - maptweak: Replaced all-in-one grinders in laboratory areas with industrial grinders. + These can hurt your hands. + mikomyazaki: + - rscadd: Conveyor Belt and Switch assemblies can be created from the autolathe. + Use the switch on the conveyor belt to link before placing, crowbar to remove + both. +2019-07-16: + MikoMyazaki: + - imageadd: New MMI icons with damage states by Joeynosegay. + - tweak: FBPs no longer get brute/burn mod bonuses from their human subspecies. + - rscadd: Prosthetic organ fabricator can now print replacement FBP power cell organs. +2019-07-18: + Devildabeast: + - rscadd: Adds colorable beanies and rastacaps to the loadout. + babydoll: + - rscadd: The zeq queen megafauna can now spawn on chlorinated exoplanets. +2019-07-20: + Boznar: + - maptweak: Adjusted fire locks on deck one and three for better mobility and logic. + Devildabeast: + - rscadd: Adds several Chaplain religious insignia to the loadout, representing + various faiths. + - rscadd: Adds Sikhism to the list of human religions. + - rscadd: Adds several preset religious books to the loadout. + - rscadd: Adds Shinto to the list of human religions. + Funce: + - bugfix: Bad Chefs no longer make runtimes with the juicer. + Rain7x: + - tweak: Increased the chances of the mail event; and of its rare gifts spawning + SierraKomodo: + - bugfix: Masks can now properly hide ear and eye slot items if configured to do + so. + WezYo: + - bugfix: renaming paper no longer runtimes + YodaDoge: + - bugfix: Farmbot can now harvest plants and remove dead plants, again. + afterthought2: + - tweak: Adding capacitors to a machine buffs the battery backup's charge rate. + - tweak: Borg chargers recharge faster now. + - bugfix: Toggling APC power manually with exotic mapped apcs should work properly + now. + ghostsheet: + - maptweak: Hanger Atmospheric Storage room has been added to the hanger. This replaces + the unused refinery slot near the fore of the charon. + - bugfix: Restore button pressing sprites to their previous states. + - bugfix: Cell charger will now work in Z-level transition, and they now have proper + sprite charge bar. + - rscadd: Cells now have a red charge state which is below 25% charge. + - tweak: Suit cyclers repair function is now default for all suit cyclers. + - bugfix: Duct tape space suit repairs now works properly while suits are being + worn. + - rscadd: Mining drill head now indicate how full they are. + - tweak: Mining drill head logic change slightly to be more informative. + - tweak: EVA airlock on deck 3 now has all its access set to ACCESS_EVA. So anyone + who can enter the room can use the airlock. + mikomyazaki: + - tweak: Can no longer adjust your Chameleon Item's appearance while restrained + or disabled. + - maptweak: Toxins lab now has a button for its blast doors, labels for its pumps, + chamber now has a gas sensor, and more lighting. + - tweak: Can no longer do surgery through thick clothing, suits, RIGs, etc. You + will need to remove the clothing before you can make incisions. + - bugfix: Female characters will now be able to use the roll down and roll sleeves + verbs without their jumpsuits disappearing. +2019-07-21: + SierraKomodo: + - tweak: Blob resistance values have been tweaked. Cores are now weak to fire and + laser, and strong to brute, like green blob. + - tweak: Blob shielding mass regeneration rate has been very slightly reduced. +2019-07-22: + MikoMyazaki: + - rscadd: Adds Vecuronium Bromide, a paralytic drug. + afterthought2: + - rscadd: Vending machines are now constructable using circuits, and also can be + deconstructed. Drag the container they drop to another vendor of the same type + to restock it. + - tweak: To add things back to vending machines, you now must be on help intent + (useful for tool machines). + zaredman: + - maptweak: Moved and remodeled Investigations Office, Forensics Lab, and Evidence + Storage. + - maptweak: Slight adjustments to Brig Chief's office to better accommodate the + redesigned processing room. +2019-07-23: + CrimsonShrike: + - rscadd: Exosuits have been completely refactored. Make sure to check your skills + before joining the round. + - rscadd: You can now slide ID across a PAI to grant them your access. + Devildabeast: + - rscadd: Adds a unique holosign to the Chapel airlock. + - rscadd: Adds Jainism and Taoism to the list of human religions. + - rscadd: Adds two new chaplain insignia for Jainism and Taoism. + Eonoc: + - tweak: Tweaks Vox codex entry + - rscadd: Add Vox shriek audible emote + afterthought2: + - tweak: Manually toggling apc settings will no longer raise alarms. Also applies + to some mapped APCs. + ghostsheet: + - tweak: Electron reservoir will now shock you upon bumping/getting thrown into + it. + mikomyazaki: + - tweak: Supermatter manual will now show you the wiki page for the Supermatter + Engine. + - bugfix: Underwear will now no longer be kept on species change, if the species + you are changing into cannot wear underwear. +2019-07-24: + Chinsky: + - tweak: Earmuffs now actually muffle sounds. You'll also not hear spoken things. + - rscadd: Headphones can actually play music now. Drag onto yourself when worn in + ear slot to access menu. They act as earmuffs when music is playing. + mikomyazaki: + - bugfix: IV Bag construction option name changed from 'plastic bag' to 'plastic + IV bag' so it is different from the other 'plastic bag'. +2019-07-25: + WezYo: + - tweak: Aiming point blank at someone will actually aim at them now + YodaDoge: + - tweak: Order Ranks of Jobs ascending so the lowest rank is selected by default + afterthought2: + - rscadd: An overmap-capable shuttle can now catch/grapple another overmap-capable + shuttle currently moving on the overmap. You do this by moving to an appropriate + landmark on the shuttle console. + - rscadd: If a shuttle is grappling another shuttle, it cannot move on the overmap; + it will be moved by the other shuttle. + - rscadd: If a shuttle is being grappled by another shuttle, it cannot make shuttle + jumps until the grappler has left. + - tweak: Ships within ships count towards vessel mass now, meaning you'll accelerate + slower with them landed/attached. + - tweak: All greentext for antag objectives and game modes has been removed. + babydoll: + - tweak: All hivebots now have increased health. + - tweak: Increased hivebot megafauna 'hivemind' damage output. + - tweak: Reduced hivemind vulnerability duration. + - tweak: Reduced hivemind cycle duration. +2019-07-27: + zaredman: + - maptweak: The larger portion of the Security Armory is now Equipment Storage. + Security Staff now have access to this room. +2019-07-29: + Chinsky: + - rscadd: Added a medical health checkup to Reports program for all you thirsty + doctors + CrimsonShrike: + - rscadd: Exosuits can now be repaired without using a recharger using either a + welding tool or cable coil depending on damage. + Devildabeast: + - rscadd: Adds Hephaestus Titan, a bulky full-body prosthetic, and Morpheus Atlantis, + a skeletal head prosthetic, to chargen. + Eonoc: + - bugfix: Fixes the Vox spacesuit light overlay from a grey hat, to just nothingness, + since I didn't feel up to making new sprites for it, and most of the suits have + glowy-looking bits anyway. + Rain7x: + - tweak: Makes the "boot selection" in loadout available to civilians only. + Spookerton: + - tweak: Prosthetic limbs previously named Grayson are now named Shellguard. + mikomyazaki: + - tweak: Unathi brains will now not accept being MMI'd. + - tweak: Unathi may no longer have prosthetic internal organs attached. + - tweak: Unathi may not start the round as FBPs. + - tweak: Unathi may no longer select assisted or synthetic internal organs on round-start. + - maptweak: Vox ship burn chamber now operates properly (fixes incorrect injector + settings) + - maptweak: Vox ship burn chamber can no longer cause the ship to self-destruct + due to temperature melting the windows, since they have been replaced with walls + that handle up to 12,000K. + - maptweak: Adds a temperature/gas sensor to the burn chamber. + - maptweak: Vox ship ignition switch now isn't hidden under a light. +2019-07-30: + Rain7x: + - tweak: Medical & Engineering trainees can now select their department specific + webbing & drop pouches; and medical trainees now have access to their department + armbands. + mikomyazaki: + - tweak: Senior Engineer now gets access_network, allowing them to use the NTNet + Diagnostics and Monitoring program and various command line tools. + - tweak: Access hacking antag program can now hack access_network, if the antag + has master level IT skill. + - tweak: The NTNet Quantum Relay in telecomms will now keep physical logs of network + activity, wiping the NTNet Diagnostics Program logs will not affect these, and + they cannot be accessed remotely. The portable drive can be removed via a UI + eject button and the data imported from it into a modular computer. + - maptweak: Telecomms storage room now has a couple of spare portable hard disks. +2019-07-31: + Devildabeast: + - rscadd: Adds colorable bracelets to the loadout. + WezYo: + - bugfix: Requesting pAI personalities works now +2019-08-01: + BlueNexus: + - rscdel: The Security cyborg module has been disabled. + afterthought2: + - bugfix: Chloral hydrate is once again effective; this applies to sleepy pens. + babydoll: + - rscadd: Added the antlion and antlion queen to desert exoplanets. + - tweak: Moved the giant crab megafauna to snow exoplanets. + mikomyazaki: + - bugfix: Nacelle control switches in the engineering monitoring room will now work. + - bugfix: Fixes issue that prevented organ transplants. +2019-08-02: + CrimsonShrike: + - rscadd: Added 2 new exosuit propulsions. The quadlegs and the armored tracks. + - tweak: Speed tweaks to exosuit legs. + Noble Caos: + - rscadd: Allows nascents gestalts to add human-sized mobs when the gestalt contains + 20 nymphs. + babydoll: + - tweak: Renamed all tasers in their various forms to electrolaser. + zaredman: + - tweak: Re-adds the Torch variant of the Sec-Tech and actually stocks it with more + gear. +2019-08-03: + Boznar: + - maptweak: Nacelles now have air alarms, fire alarms, and fire doors. + Nirnael: + - bugfix: Fixes bug in using a new apc frame on a broken apc to repair it. + Rain7x: + - tweak: Tweaks the event announcement messages to be more tone-neutral & standardizes + the announcement header + WezYo: + - tweak: Attaching a photo to a newscaster story will no longer remove it from your + hand + afterthought2: + - tweak: The shield generator has been reworked. It is now much more expensive to + keep the shields on continuously, and for large shields it's likely not viable. + - rscadd: The shield generator now has an idle and active state (as well as the + off state). In the idle state, it consumes limited power and does not generate + a shield. In the active state, it consumes a lot of power and produces a shield. + - rscadd: If an idle generator is toggled on, it takes a short amount of time to + spin up to active state. If an active generator is toggled to idle, it will + switch to that state instantly. + - rscadd: There are several levels of idle power usage that can be selected. Higher + power usage decreases the spin-up time proportionately. + - rscadd: The shield generator takes time to adjust the radius of the shield. The + radius will not be adjusted while the shield is active. + - tweak: The shield generator's power storage has been vastly expanded. + - tweak: The shield generator's field integrity is now tracked separately from the + power storage (it's determined by the amount of power stored, up to a threshold). + mikomyazaki: + - tweak: Radiation collectors are now capped at 500kW output at 250Bq radiation. + They are more efficient at lower radiation levels. + - tweak: Radiation collectors will have variable fuel usage, capping out at 250Bq + radiation. Fuel usage increased significantly (1-10x depending on radiation + levels) + - tweak: Radiation collectors will now break from high radiation levels (500Bq) + as well as temperature, they will display a warning and play a warning sound. + - maptweak: Stowaways can no longer spawn in the incinerator room, which they cannot + leave. + - bugfix: Fixes inconsistent icon names for female jumpsuit icons. Should work for + rolling down / roll sleeves for all jumpsuits/suits now. +2019-08-04: + Bxil: + - tweak: Inflatables now have 1 second delay. + Chinsky: + - rscadd: Adds 'Codex' verb that shows user the 'frontpage' of codex, with links + to search / index / categories. + Eonoc: + - rscadd: Adds a Vox RIG. Same statline as the Industrial RIG, but with full temperature + and radiation resistance. Vox had no way to scavenge radioactive or volcanic + planets up until now. + - rscadd: Adds flux cannon. Essentially a Vox AEG, but with the lasers doing brute + damage, and shock mode replaced by a mode that scatters low damage pellets in + a burst. + - rscadd: Adds sonic cannon. A vox stun rifle, with a mode that uses up all the + gun's charge to push, deafen, and dizzy an opponent. Ear protection such as + helmets and earmuffs will negate the deafening, and reduce the dizziness. + - rscadd: Added the associated projectile types for both above, obviously. + - rscadd: Added two new firing sounds, spike.ogg and eLuger.ogg + - tweak: Changes spike launcher firing sound to spike.ogg + - tweak: Stealth buff to Armalis to make their large size reflected more mechanically. + - tweak: Changes the Vox species check on Vox guns to make the guns hiss and jump + out of your hands. + WezYo: + - rscadd: CSO now has maint access + - rscdel: Removed the discard verb from playing cards + - rscadd: Added the ability to pick a card by clicking it with an open hand + comma: + - tweak: Blunt yet sufficiently strong weapons can now pop inflatables + mikomyazaki: + - bugfix: Yeosa unathi have correct job restrictions now. +2019-08-05: + mikomyazaki: + - tweak: Resisting will auto-cancel resting. +2019-08-07: + BlueNexus: + - tweak: All non-total radiation resistance values for suits etc have been halved. + - tweak: The Supermatter, nuclear reactor, R-UST, PACMANs and other radiation sources + which were too weak to be relevant have been buffed. + - tweak: Radiation sources that were deemed to be too strong have been nerfed, such + as garbage planets. + - tweak: Grilles have had most of their radiation resistance removed. + - tweak: Low walls and windows have had their rad resistance halved, so they add + up to a full 100% instead of 200%. + MistakeNot4892: + - rscadd: Added a more involved butchery system. + - rscdel: Removed stowaway. + mikomyazaki: + - maptweak: Double sets of windoors now have only the interior windoor at department + reception desks. + - bugfix: Low wall frames deconstruct into 3 steel sheets, which is the amount required + to build them. + - maptweak: Robotics central windows are now not tintable, surgery area still is. + - tweak: Autoinjectors now have a timer for use on other people, instant for yourself + OR on incapacitated people with any skill level. They take a third the time + compared to a syringe. +2019-08-08: + Cajoes: + - maptweak: Reworked the abandoned shooting range space into additional lavatory + facilities and a sauna. + - rscadd: Adds a wooden bucket +2019-08-10: + Bxil: + - rscdel: The asteroid will no longer spawn at the Torch every round. + mikomyazaki: + - bugfix: Relocating limbs will now properly always work when you have high enough + medical skill. +2019-08-12: + Boznar: + - maptweak: Adds shutters to the exterior windows of hydroponics, aft bubble, and + lounge. + Chinsky: + - tweak: Medical Technicians can no longer have Anatomy skill at Experienced or + higher. + - tweak: Surgery skill reqs and penalties got beefed up. + - tweak: Most surgery step require both Trained Anatomy AND Expert Medicine. + - tweak: Delicate' surgery steps (basically inside organ stuff) require both Expert + Anatomy AND Expert Medicine. + - tweak: Penalties to success chance for missing skills were jacked up mercilessly. + Unless you're missing 2 or less skill levels you're not going to succeed, sorry + bud. + - tweak: Physicians now start with Expert Medicine, free skillpoint pool lowered + by its cost. + - tweak: Robotic steps require Trained Complex Devices. If there's meat bodyparts + involved (e.g. installing into one), need both Trained Complex Devices and Trained + Anatomy + - tweak: Slime surgery steps require Trained Science. + Piccione: + - tweak: Heads of Security are now are better screened to ensure loyalty to the + SCG + ghostsheet: + - tweak: Butterfly knife damage is now slightly lowered. Still pretty deadly. + mikomyazaki: + - bugfix: Airlock bolt buttons (e.g. SMES room and engine hatch doors) will now + work. +2019-08-13: + Terror4000rus: + - rscadd: You can take a pill from pillbottle by using it. + YodaDoge: + - tweak: reduced shield power usage + ghostsheet: + - tweak: Due to the space related mortality rate of our recent expedition, the EXO + has increased funding to restock EVA equipment. There are now 5 jetpacks and + 3 cooling units in EVA on deck 3. + mikomyazaki: + - bugfix: Resetting a tech you have no levels in at the RnD Server will no longer + give you 1 in that tech. + - rscdel: Removes Arcane Tech, as it did nothing. + - rscadd: Worn RIG suits will now be charged if you walk into a cyborg recharger. + If you have an internal cell (FBP/IPC) then that will charge first. + - bugfix: Airlock access buttons will now work even if the area they are in has + no power. + - rscadd: Traitor Robots will get a verb 'Reset Identity Codes' that will remove + their external camera connection, robot console connection and lawsync status. + - bugfix: Fire axes can now attack unpowered airlocks on harm intent, regardless + of the damage level of the door. + - tweak: It now takes several hits to get through an undamaged door with a fire + axe. +2019-08-14: + MistakeNot4892: + - rscadd: Added a new human subspecies, the boosters. + mikomyazaki: + - tweak: Illegal Tech is renamed to Esoteric Tech. Producing items with this tech + & having esoteric tech levels is not illegal, however possession of those items + may be if they appear on the contraband list. + - bugfix: Petrov RnD console will start the round able to access the Core RnD server + data and sync with the rest of the Torch. + - bugfix: Elevator will no longer get stuck when you give it multiple move orders + via the elevator panel or the buttons on each floor. It will wait for nine seconds + on each floor and then move to the next one in the list. + - rscadd: Surveyor Flying Robots now have an emag item, an energy machete. +2019-08-15: + Cajoes: + - tweak: Improved kitchen utensil visibility on grey surfaces. + babydoll: + - rscadd: The drake megafauna can now spawn on volcanic exoplanets. + mikomyazaki: + - rscadd: As the Torch now starts at random coordinates, the Torch round-start sensor + scan will list these coordinates so it is clear where the bearings point from, + incase you forget / join the round late. +2019-08-16: + mikomyazaki: + - bugfix: RnD server control consoles will only connect to things on connected Z-levels. + So the Torch won't pick up away-site RnD servers only the RnD server control + console. + - tweak: Robots can open the door control menu again, like AI. + - tweak: FBPs don't get affected by their species slowdown stat, positive or negative. + - tweak: Robotic eyes ignore your species flash modifier. + - tweak: Robotic eyes don't get species darkvision bonuses (e.g. from Space-Adapted + Humans) +2019-08-17: + ghostsheet: + - maptweak: Torch's fuel pipes have been slightly remapped into safer positions + with parts segmented by automatic shutoff valves to prevent leakage. The fuel + lines has also been removed completed from the SM heating element (although + the HE pipes are still there) and they should now be able to survive an SM delamination. + To balance out these safety features, fuel line pressure has been doubled to + increase the risk of bodily harm. + mikomyazaki: + - bugfix: Glasses that apply a vision overlay (mesons, tactical goggles, etc.) will + no longer function when you are using a sensor console to view the overmap. +2019-08-19: + Chinsky: + - tweak: Can no longer sample plants with machet. Need an edged weapon of size 'small' + or 'tiny'. Normal size and above will chop as usual now. Harm intent also forces + chopping instead of sampling. + - tweak: Can alt-click vines when holding normal-sized blade (machet) in hand to + chop them down. It'll take a short time, faster if you have Trained botany skill. + Basically less chat-spamming alternative to just bashing them down. + mikomyazaki: + - bugfix: Ghosts can't interact with space heaters anymore. + - bugfix: Stacks of one sheet will now not be deconstructable twice in the deconstructive + analyzer. +2019-08-20: + Devildabeast: + - bugfix: Mules will no longer spawn with psi-dampener implants. + MistakeNot4892: + - rscadd: Added a new human subspecies, the Mule. Mules can be merchants or submap + roles. + mikomyazaki: + - bugfix: Space vine event will now never have invisible vines. + - bugfix: Surveyor drone now has skills. +2019-08-22: + ghostsheet: + - rscadd: SMES chance to discharge is now skill based, with 50% increase at unskilled + and 50% decrease at master. + sunofang: + - maptweak: Revamps the yacht into a prettier state. +2019-08-23: + Boznar: + - maptweak: Adds large vents to both sides of the engine room. These can be opened + with a button in the emergency box in the control room. + - maptweak: Renamed all of the glass box emergency buttons and added descriptions. + - maptweak: Engine hatch bolt control button has been moved to the inside of the + engine room next to the hatches. + Cajoes: + - rscadd: Commissary now spawns with a vending machine. + - tweak: tweaked the sauna thermostat and auxiliary space heater to bring the room + up to a comfortable 348.15 kelvin. Which I am reasonably sure the human body + can tolerate. For a while. + MistakeNot4892: + - rscadd: Enhanced an opossum. + mikomyazaki: + - bugfix: Adherents now properly get their speed bonus again. +2019-08-24: + Anticept: + - rscadd: Water tanks are now immune to atmospheric temperatures + - rscadd: Fire extinguishers can be filled from sinks! When full, they are instead + washed. + - rscadd: Fancy progress bar when washing in a sink! + - bugfix: Slightly refactored sink washing code. if a user interrupts the process, + it will not continue processing the item or most item effects. + ghostsheet: + - rscadd: Floodlights are now constructable circuit machines. + - rscadd: Floodlights can now be upgraded with capacitor components, for increased + brightness with a higher power cost. + - bugfix: Floodlights also work in areas without APC. +2019-08-26: + Boznar: + - maptweak: Shield generators have been consolidated to a single shield bay with + its own substation. Bridge deck shield has been left in place to account for + all 5 shield generators. Shields also have their own SMES units so that configuring + each individual shield can be done more precisely. + - maptweak: Bluespace drive has been remapped to be prettier. It is no longer considered + a maintenance area and wont spawn drones or trash. + - maptweak: Deck two saferoom has been removed to make room for these changes. + Plaguewalker: + - imageadd: Adds 3 new FBP variants for Morpheus - Blitz, Airborne, and Prime +2019-08-27: + Bxil: + - tweak: The Bluespace Artillery has been rebranded to Obstruction Field Disperser. + Cajoes: + - tweak: Ascent Cutter has been updated. + ghostsheet: + - bugfix: Fixes various bugs for emergency fire shutters construction/deconstruction, + such as going invisible, returning incorrect amount of metal and skipping steps. + - tweak: Emergency fire shutters will now have a delay for welding them. +2019-08-30: + CrimsonShrike: + - bugfix: Fixes exosuits being able to use all modules at any range. + Devildabeast: + - rscdel: Removes the Biomechanical Engineer as a role. + - tweak: Gives the Roboticist trained Anatomy by default. + Rain7x: + - tweak: The sleepy pen now contains Vecuronium Bromide instead of Chloral Hydrate. + WezYo: + - bugfix: Ghosts can no longer interact with pagers + ghostsheet: + - bugfix: Fixes toolbelt overlay. Putting tools into toolbelt will now show up the + belt icon again. +2019-08-31: + BRAINOS, Plaguewalker: + - rscadd: Ported new prosthetic types from Aurora; Bishop Rook, ZH Spirit, Xion + Econ + BlueNexus: + - rscadd: Sauna heaters and reagent sublimators can now be emagged to make them + accept any reagent. + Bxil: + - rscdel: The OFD can now only shoot at overmap events. + WezYo: + - rscadd: Skrellship crew can now be selected as provocateur +2019-09-01: + Hubblenaut: + - imageadd: Adds new sprites for the TEGs, made by spriter who does not want be + named. + Zenithstar: + - maptweak: Maintenance near the shield bay now has radiation shielding. + babydoll: + - maptweak: Replaced all the various depreciated shield rooms. + - maptweak: Split the bluespace drive chamber into two areas for air alarm accuracy. +2019-09-02: + babydoll: + - tweak: Reduced attack frequency and damage for nearly all castes of asteroclast. + - tweak: Asteroclast nucleus' values change as they're damaged. They become more + aggressive, but more vulnerable to attack, and spend more energy regenerating + than trying to expand. + - rscadd: Added incense cones. + mikomyazaki: + - imageadd: Adds the 'Trimmed Right Sidecut' hairstyle. +2019-09-03: + CrimsonShrike: + - rscadd: Adds second robo slot since biomech is now gone and workload is too high. + Devildabeast: + - rscadd: Adds a Morpheus Cyberkinetics labcoat to the loadout. + Piccione: + - rscadd: Added Crosses buildable out of Material Sheets. Can also be found in Loadout. + Rain7x: + - rscadd: Added "Resident" Physician Alt Title + - rscdel: Removed "Trauma Surgeon" Alt Title +2019-09-04: + CrimsonShrike: + - rscadd: Mapped a basic exosuit to the cargo bay. +2019-09-06: + BlueNexus: + - tweak: Default Cyborgs no longer have stunbatons +2019-09-10: + Boznar: + - maptweak: Skrell Air alarms are now set to 40 degrees instead of 65 degrees. Server + air alarm added to Skrellship engineering bay at 20 degrees. + Chinsky: + - tweak: You can now grab yourself. Can't grab grabbing limb (e.g. right arm with + right hand), can't throw yourself, can't nab yourself. Otherwise you can do + whatever you want, like inspecting limbs, or covering your own eyes, or dislocating + your leg as a party trick. + Nirnael: + - rscadd: Adds pencode tags [pre] [fontblue] [fontred] [fontgreen], with closing + [/pre] and [/font] universal for the three fonts. They only work digitally with + nanoword, emails, report editors and direct txt files. Font color gives color, + [pre] gives monospace font and preserves whitespace spaces only and not tabs, + e.g. for ascii art. + - rscadd: Gas analyzers now show total moles, total volume and moles per gas, check + codex for more info. + - bugfix: Fixed robot inventory not updating automatically when dropping items which + are stored back into it. + - bugfix: Saving emails to a txt file on disk now works correctly and can be printed + with the new tags. +2019-09-11: + Spookerton: + - tweak: Added guidance on law priority and conflicts to the text shown when laws + are listed. +2019-09-12: + WezYo: + - rscadd: Adds new paperwork commands to the pen codex + ghostsheet: + - rscadd: Gas thruster is now modifiable machine. + - bugfix: Gas thruster now hooks up to their ship when built. + - rscadd: Gas thrusters now has a boot up time. + - rscadd: Gas thruster can be upgraded with matter bin for extra fuel intake volume + and less boot up time or capacitor for energy efficiency. + - rscadd: Gas thrusters has an increased energy usage on idle (6 Wh per tick so + every 2 second) and 10 Wh per burn. So please keep them off unless you need + them, for that same reason all thrusts starts offline. + - tweak: Guppy's mass and max speed has both been increased. + zaredman: + - tweak: Wizard and Ninja now require a minimum of 5 players. +2019-09-13: + babydoll: + - rscadd: Added geese, available in the supply menu. +2019-09-14: + BlueNexus: + - tweak: Tripled the damage mobs take from being in low pressure + afterthought2: + - admin: Some rudimentary spam prevention has been added. Offending users will be + kicked and noted, and you will receive notice of this. If you see patterns of + abuse, further admin action may be warranted. False positives due to overly + aggressive client macros may be possible. +2019-09-15: + WezYo: + - bugfix: Turning on a floodlight will no longer make it invisible + babydoll: + - experiment: Disables macro use. +2019-09-16: + Anticept: + - bugfix: Rigsuit codex entries now read the correct armor values for each piece. + Has no effect on damage calculations, that has always worked correctly. + - tweak: Medical voidsuit descriptions no longer imply that they have some incredible + radiation resistance, but it's still relatively good to most things in the game. + - tweak: Medical voidsuit bomb resistance values increased slightly. It's still + not a bomb suit! +2019-09-17: + Rain7x: + - rscdel: Removed old Research Director gear from the CSO locker +2019-09-18: + Chinsky: + - tweak: Inflatables now have maximum pressure difference and maximum temperature + they can endure. Currently it's 5000 kPa pressure difference and 5000 K temperature. + Every second or so when they're in worse condition than that it'll take damage. + You can patch them once with duct tape but otherwise just consider more permanent + solutions. + Rain7x: + - tweak: Members of the exploration department can now select Science Goggles, Botany + Gloves, and the Brown Webbing Vest in loadout + - tweak: Non-Civilian pilots can no longer take the EXO Flightsuit + - tweak: Webbing names now reflect their color, rather than their department. + bitMuse: + - rscadd: Added an empty autoinjector schematic to autolathes. +2019-09-20: + Rain7x: + - bugfix: The supermatter grenade box now has a working icon and is no longer invisible. + SparklySheep: + - rscadd: Adds in the fake moustache as a cheap 1 crystal item for traitors. It + will hide your identity, but that's about it. +2019-09-21: + Rain7x: + - rscadd: Added the biowaste disposal cart, for disposing of organs. + ghostsheet: + - bugfix: Boosters randomised speed has been fixed, no more indefinite speed malaise. +2019-09-23: + Imienny: + - tweak: Change heavy armor plate slowdown from 1 to 0.5 + babydoll: + - tweak: Sunglasses no longer provide full protection from handheld flashes, instead + halving their effect. + - tweak: Green glasses now have prescription lenses. + bitMuse: + - rscadd: Added reagent grinder, chemical heater, and chemical cooler to Unishi + Chem Lab. +2019-09-24: + Chinsky: + - rscadd: Added vitals monitor machines. Drag them onto people to 'hook' them. They + will display general state of brain activity, pulse and breathing, with blinky + warnings if something's wrong. + - maptweak: Replaced computers by optables with vitals monitors. + - rscadd: Chemical explosions (welderfuel and ANFO) now produce a bunch of heated + gas during explosion. + - rscadd: Welderfuel produces N, NO, NO2 and a pinch of Hydrogen for flavor + - rscadd: ANFO produces CO2, nitrogen and water + - tweak: '''Settled'' exoplanets have been renamed to ''ruined'' for 23% less confusing.' + NanakoAC: + - tweak: Adds bottled water to gym vendor + - tweak: Adds bottled water to ration crates + adamkad1: + - rscadd: Variation of artery repair surgery for Kharmaani + bitMuse: + - rscadd: Added gyrotron recipe. + - rscadd: Changed minimum fire rate of gyrotron from 1 to 2. Nerf. + ghostsheet: + - rscadd: Pipe dispenser is now a modifiable machine. + - rscadd: Pipe dispenser circuit is now a printable research design. + - bugfix: Disposal outlet will now properly eject objects outside of shuttles + - tweak: SMES installing/removing components are possible while active. They still + need to have their safety wire disabled but this will allow for more sabotage + or anti tampering opportunity. + - tweak: SMES discharge will now call electrocution (with some minor nerfs so it's + little less lethal), so insulation and armour will be taken into calculations. + - tweak: SMES will now shock people upon pulsing/cutting the grounding wire, similar + to vending machines. The severity is based upon the SMES's powernet and is reduced + with the safety wire on. + - tweak: Stun acts (from weapons) will now take existing pain of limbs and any painkillers + into account. + - tweak: Stun acts will now rely on pain to calculate, so damaged limbs will go + down to stuns easier. It also means it longer affect robotic limbs or anything + that can't feel pain. Ya IPC! + - tweak: Painkillers will now resist some stun effect due to them blocking pain. + - tweak: Stun weaponry now deals a very small amount of burn for flavor, 1-3 burn + depending on the gun. + - bugfix: Stun act will now work properly on body shots, bringing down targets with + enough pain on chest/head/groin shots. + - tweak: Robolimbs will no longer have blurry eye/ stutter or create adrenaline + upon being hurt. + - tweak: Adjusted some stun and shock duration, lowering most of it. + - tweak: Shock has a lower tier stun effect, stunning people that takes 10-15 damage + for 2 seconds. + - tweak: Shock and Stuns weapon inconsistency and damage has been adjusted. + - tweak: Shock will now activate a weak local EMP on the limb they hit (if they + deal more than 10 dmg), frying any implants, augments or synthetic organs inside + and also the limb they hit. They will neutralise an IPC/FBP after 3/4 shock + shots to the chest, frying their microbattery. + - tweak: EMP on robotic limbs will make them fail. EG. as Shock beam to a roboleg + will cause it to collapse. + - tweak: EMP now deals more damage to internal synthetic organs. + - tweak: Implants are now vulnerable to EMP if they weren't already. EG, shock beam + might fry, disables or activate the implant. + - tweak: Security and Engineering (not atmospherics) voidsuit is slightly more insulated + against shocks and stuns. Still not as a good as a hardsuit. + - tweak: Light bulbs can be taken down without gloves, on non help intent, for extra + badassery. + - tweak: Wall toss will now take armor calculations into account. + - tweak: Rejuvenate will now restore stamina. + - bugfix: APC construction has been fixed, they will now be deconstructable even + when broken. + - tweak: Space adapted human oxygen pressure requirement has been lowered to 14 + kPa. + - tweak: Grav adapted human oxygen pressure requirement has been increased to 18 + kPa. + - tweak: Grav adapted strength has been increased to high, this means they get reduced + slowdown for wearing or carrying heavier gear, eg. dufflebags, voidsuit. Still + slower than human in most regards. + - tweak: Unathi oxygen pressure requirement has been increased to 20 kPa. They + need more oxygen to support their extremely robust metabolism. +2019-09-25: + MrKicker: + - tweak: Command announcments are now multi-line. + - tweak: Command Announcements can now be multi line to allow for clever formatting +2019-09-26: + Boznar: + - maptweak: Adds mineral processing, chemistry, and cages to the ascent seedship. + - rscadd: Adds voidsuits for Alates to replace the hardsuits as base gear. Hardsuits + can still be granted to alates at the Gyne's discretion. Icons and code credit + to Zuhayr/Loaf/MistakeNot. + Chinsky: + - rscadd: Using xenolife scanner on a stasis cage will now scan the animal inside. + CrimsonShrike: + - rscadd: Exosuit pilots can now manage their inventory, throw items and some other + minor actions so long the cockpit is open. This prevents usage of exosuit modules. + Imienny: + - tweak: Ammonia now work like Dexalin Plus for Vox instead of removing oxy loss + - tweak: Nerfs Vox breathing mask to filter out only oxygen + - tweak: Updates Vox alien mask's filtered gases list + - rscadd: Adds inaprovaline autoinjector to Vox survival kit + - tweak: Change Vox minimum/maximum age from 17 - 70 to 1 - 100 + - tweak: Vox get +8 skill point bonus instead of bonus based on their age. +2019-09-27: + Chinsky: + - tweak: Made modular computer consoles proper machines instead of big items. Report + any odd behavior. + - tweak: Modular computers are now constructed via normal computer frames, requiring + a circuitboard and various generic machinery parts like input/output controllers + like other computers. + nearlyNonexistent: + - tweak: Janitor module synths now have a welding tool, to remove graffiti with. +2019-09-28: + EcklesFire: + - tweak: Made EC scarves for all uniforms, not just Dress. + comma: + - rscadd: Adds loadout accessories that are locked behind Trained skill level. + ghostsheet: + - tweak: Rescue rig can now carry an inflatable dispenser in its suit slot. + - tweak: EVA and CE rigsuit's offline slowdown has been increased to standard offline + slowdown. + - tweak: Mining prep, and prospector's locket has its round start equipment changed. + - tweak: Mining voidsuit has its laser resistance lowered and its bullet and energy + resistance rounded up, to be more a well rounded suit. + - tweak: The industrial rig has its tint lowered to moderate. +2019-09-30: + Chinsky: + - tweak: Windows now have much less health. + ghostsheet: + - maptweak: Most interior windows inside medical are now non-reinforced windows + - tweak: Full-tile glass are now tintable whereas border windows are not. +2019-10-01: + ghostsheet: + - bugfix: Overmap shuttles can now dodge meteors again. + nearlyNon: + - bugfix: Certain IPC monitor options will no longer shapeshift you into a Morpheus + monitor head. +2019-10-03: + Boznar: + - maptweak: Lepidoptera has been remapped to be more compact for planetary landing. + Extra space has been utilized for additional rooms. + - bugfix: Ascent airlocks will now all cycle and dock correctly. + - maptweak: Ascent seedship walls made more uniform. Keel is composed of reinforced + walls, while the outside is regular walls. The Tricoptera has been tweaked to + prioritize form over function. + Chinsky: + - rscadd: Adds entries for skills to Codex. They have description and what levels + of skill mean. + - rscadd: Minimum character age for jobs is now code-enforced. You may have to adjust + your chars to be able to join as your preferred job. + Rain7x: + - tweak: The labcoat can only be selected in loadout if your job would realistically + require it. It has also been removed from the medical wardrobe. + WezYo: + - bugfix: Fixed janibot and medibot crafting + comma: + - tweak: Larger internal organs are now more likely to get hit than larger ones + - tweak: Energy-based weapons are now in many cases less likely to cause internal + organ damage than ballistic weapons (based on damage output) +2019-10-04: + Rain7x: + - rscdel: Several alt tiltes have been removed. + - tweak: The job Chemist is now called Pharmacist. +2019-10-05: + Flying_loulou: + - rscadd: Creates the red ("grunt"), Yellow (Senior) and White (Chief) Damage Control + Helmets + - rscadd: Damage control helmets have now been issued to the engineering department, + they can be found in the engineer's personnal equipment lockers. + WezYo: + - bugfix: Fixed transferring reagents between beakers +2019-10-06: + Chinsky: + - tweak: Thrown items will go down the ladder if they hit it. + - tweak: If you use Move Up verb, it will try climbing random climbable turf above + if you couldn't just straight up move up. +2019-10-08: + PhosphoricPanda: + - tweak: Stabilization kits now have a radiation pouch. + nearlyNonexistent: + - rscadd: Non-Branded Spirit Boards. Gather around in the dark with another friend, + and move the planchette around. Now only works in cult rounds, otherwise just + is silly fun. + - tweak: Steaks, kabobs, and a few other recipes use cutlets instead of full-on + slabs of beef. (Plain steaks don't due to the sprite) +2019-10-10: + Chinsky: + - tweak: Stack recipies that you don't have skills for are now visible too, marked + with red warning label. You can even attempt them, wasting resources almost + certainly. +2019-10-11: + Cakey: + - bugfix: Fixed airlock paint vanishing when interacting with unpowered airlocks. + ghostsheet: + - tweak: Default aim mode allows all movement, items an radio uses. +2019-10-12: + Flying_loulou: + - tweak: Sailors rejoice ! New coveralls have been issued by the fleet. + Mordeth221: + - rscadd: Adds fancy pens to character loadout +2019-10-13: + CrimsonShrike: + - rscadd: Adds exosuit energy shields. + ghostsheet: + - maptweak: Deck 4 aft airlocks' controllers are now accessible from inside of the + airlock, so they can be more easily cycled and force. They are still not accessible + from the outside. +2019-10-14: + Chinsky: + - tweak: OCIE renamed to SFP (Sol Federal Police). There was never OCIE. + Rain7x: + - rscdel: The Corporate Security Beret has been removed from the loadout. + ghostsheet: + - rscadd: Plasma cutters can now be ordered from supply, they are locked to mining + access and engineering access + - tweak: Plasma cutters now needs trained construction to deconstruct safely. + - rscadd: Updated the skill description of the EVA, Piloting and Construction skills. + - bugfix: Fixes gun accidents only hitting the user; instead now everything in their + general vicinity is fair game. +2019-10-15: + Nanako: + - rscadd: Airlocks, curtains, ladders and cult runes can now be interacted with + by clicking the floor in their tile. + - tweak: Lift call buttons and panels are now easier to click +2019-10-16: + Anticept: + - bugfix: PAI should no longer fold up when hitting it with an access card while + on help intent. + Chinsky: + - experiment: Armor calculations and some values were changed. It should be generally + more protecting now. Report weird stuff happening. + Datraen: + - bugfix: Microwaves now properly handle non-item based recipes all the time + LiljaMortensen: + - imageadd: Updated holopad sprites + PsiOmegaDelta: + - tweak: Most objects now always consider ghosts to be adjacent when examined + - tweak: Must now shift+click to interact with boardgames + - tweak: Must now shift+click to interact with integrated circuits + nearlyNon: + - maptweak: Counselor's office reworked to have an actual desk. Much more comfortable. +2019-10-17: + Flying_loulou: + - tweak: Resprites the red O2 tank to make it look like an actual firefighter's + tank. + - tweak: The duty boots, jackboots and workboots are now fireproof. + - tweak: The firesuit no longer covers the whole body, but only the chest, arms + and groin. + - rscadd: Adds a "fire overpant", to be worn over the uniform as an accessory to + protect your legs against a fire. + - rscadd: Adds the fire gloves, fully fire proof. + - rscadd: Adds the EFT (Emergency Forcing Tool). + - rscadd: Adds the "water grenade" to fight fires more efficiently. + - rscadd: Creates the firebelt, which has 5 slots and can contain EFTs, water grenades, + inflatable doors and mini-extinguishers. It comes filled with 3 water grenades, + 1 EFT and 1 inflatable door. + - rscadd: Adds the new equipment in the fire closets (places them into a dufflebag + for convenience) + - tweak: In order to survive a fire, you now have to wear the fire overpants, firesuit, + fire gloves, duty boots (Jackboots and Work boots are fire resistant as well), + as well as a fire resistant helmet/hardhat and proper internals. +2019-10-19: + CrimsonShrike: + - rscadd: Allow some more interactions from inside exosuits such as grabbing items + from clamp if the cockpit is open. + Marie Taylor: + - imageadd: Updated fridge sprites + - imageadd: Updated pylon sprite + - imageadd: Resprited holopad, the artist of the previous version has been executed + - imageadd: Resprited bell + - imageadd: Added ringing animation to bell + - imageadd: Resprited notice board, added 4 dir +2019-10-20: + Anticept: + - bugfix: PAIs, Photos, Integrated Circuit Printers, Printed Crew records, and Warrant + Projectors should be working again. + Ithalan: + - bugfix: Fixes modular computer icons not updating automatically for certain monitoring + program events. + WezYo: + - bugfix: Fixed crafting floorbots +2019-10-21: + Nirnael: + - bugfix: Fixes personal closets. + ghostsheet: + - soundadd: Voidsuit now has sounds for tank ejection and disassembling. +2019-10-22: + Higgin: + - bugfix: SecHUDs and goggles will now protect against flashes and flashbangs as + they used to. +2019-10-23: + Marie Taylor: + - imageadd: Resprite of crates, open decals added + Spookerton: + - admin: Build mode has an area viewer/editor. + ghostsheet: + - tweak: Senior researcher no longer has access to mining. + - bugfix: Plasma cutter crate access has been fixed to work with both engineering + and mining access + - tweak: Supply's warehouse is now open to mining access. +2019-10-24: + Boznar: + - maptweak: Maps Vox rigs, soundcannon, and flux cannon to Vox base + CrimsonShrike: + - rscadd: The SEV Torch is now fitted with point defense batteries, that will protect + certain parts of ship from meteor impacts. + ghostsheet: + - tweak: Supply's mechsuit now has two hydraulic clamps instead of a drill. +2019-10-27: + Higgin: + - tweak: Radicals rejoice! Head Revolutionaries once again get traitor uplinks. +2019-10-28: + Ithalan: + - bugfix: Fixed several cases of missing powercables underneath doors and tables + aboard bearcat + - bugfix: Fixed a couple of tiles in bearcat atmospheric compartment that were permanently + without pressure or gravity + - maptweak: Added girders and a few walls to more clearly indicate original extent + of damaged rooms aboard bearcat, for purpose of predicting APC and gravity coverage +2019-10-29: + BlueNexus: + - tweak: Nerfed the bloodsucking creatures often found on away sites +2019-10-30: + SierraKomodo: + - rscadd: Added rooibos tea, chai tea, chai latte, london fog, and mocha latte as + dispensable or mixable drinks. + - rscadd: Added chocolate, vanilla, caramel, and pumpkin spice syrups for flavoring + drinks. + - rscadd: Added alternate title 'Barista' to the Bartender job. + WezYo: + - spellcheck: Fix gaia blurb +2019-11-02: + Imienny: + - tweak: Fix races with low oxy_mod recovering slower from oxygen deprivation than + races with high oxy_mod +2019-11-03: + CrimsonShrike: + - rscadd: Exosuit cells can now be swapped without disassembling entire thing. Simply + use a crowbar while mainteance protocols are active to take one out. + ghostsheet: + - rscadd: Welding tool now gives off light when active (it's a little weaker than + a flashlight) and sparks blue when it's welding. + - tweak: Lighters had their light color adjusted for the sake of ambience +2019-11-04: + Higgin: + - tweak: The accuracy bonus for shooting ranged weapons from standing still has + received a slight buff. + ghostsheet: + - tweak: Mining voidsuit now has minor bullet resistance and can withstand up to + 5000 kPa worth of pressure. +2019-11-05: + Higgin: + - tweak: Harm-intent clicking will now remove shotshells directly from shotholders. + SierraKomodo: + - tweak: Tablets now beep just like PDAs. + - tweak: Borgs can now alt-click doors to access the tile tab instead of shocking + them. To shock a door, use harm intent when alt-clicking. +2019-11-06: + Ithalan: + - tweak: Solar arrays on planetary surfaces now only require 5 tiles of clear space + around them to work at all, instead of 20. Solar arrays in space are unchanged. + SierraKomodo: + - bugfix: Cyborg cable coil can now be used to build machines +2019-11-07: + Albens: + - tweak: Bridge Holopad is now named SEV Torch Bridge + Soviet Swede: + - rscadd: Added the inflatables dispenser to the surveyor +2019-11-08: + Marie Taylor: + - imageadd: Updates the appearance of crates +2019-11-10: + SierraKomodo: + - bugfix: The `hwinfo` command in console terminals now outputs to the terminal + window instead of to chat. + - tweak: The console terminal prompt now includes a helpful reminder about the `man` + command. +2019-11-11: + Bxil: + - bugfix: Character setup works as expected again. + Rain7x: + - bugfix: You can now attach pins to Dress Jackets again. +2019-11-12: + Flying_loulou: + - bugfix: The nitrogen tanks again look like nitrogen tanks. + - tweak: Changes the fire (red) oxygen tank name to 'self contained breathing apparatus' + (SCBA) + - rscadd: Adds the Emergency Management Bureau helmetto the loadout + - rscadd: Adds the ancient Emergency Management Bureau helmet to the loadout (credits + to Sin2 for the sprites) + - rscadd: Adds the light damage control helmet to the loadout + - rscadd: Adds the SCBA mask, and adds it to the engineering crew survival kit, + instead of the breath mask.(credits to Sin2 for the sprites) + Imienny: + - rscadd: adds zipgun, knock-off pistol, small energy gun, ion pistol, ion slug, + duct tape, combat defibrillator, stasis bag, stabilisation kit, balaclava and + "exceptionally robust MRE" to uplink + - tweak: MRE coffee and tea powder no longer require heating + - bugfix: fixed MRE menu 8 (chilli) spawning with pizza instead of chilli + babydoll: + - rscadd: Added scented candles. + - rscadd: Incense and scented candles are now available in the aromatherapy crate + in supply. + ghostsheet: + - rscadd: Rapid Piping Device has been added! + - rscadd: RPD can be ordered from supply, at semi-reasonable cost of a 100 points + a piece. + mikomyazaki: + - bugfix: Body bag label overlays will now properly persist through opening/closing, + instead of disappearing. +2019-11-13: + SierraKomodo: + - bugfix: Intercoms and handheld radios can now select common and entertainment + channels again. + comma: + - tweak: Wall girders are now easier to take down using brute force + mikomyazaki: + - bugfix: NTNet downloads will no longer download the file at the beginning of the + download sequence, instead only adding the new program at the end of the download + timer. +2019-11-14: + mikomyazaki: + - bugfix: Different pen types (blue, red, multicoloured, black) now have different + names. They will now appear as differently named items on the autolathe list. +2019-11-15: + Higgin: + - tweak: Limits the range within which escaping cuffs/unbuckling yourself while + cuffed is visible. + - tweak: Readded different furniture/structure recipes to wood. + - tweak: Added orderable titanium sheets to supply. + - tweak: Fear the gun! Buffed all bullet damage towards a benchmark of 50. Gave + additional armor penetration to most common rounds with more than 50 damage. + - tweak: Love the armor! Buffed many armors' resistance to bullet damage. + Jaraci: + - tweak: Fixes/expands loadout options for off-Torch away site roles. +2019-11-16: + MrKicker: + - bugfix: Fixed Roboticist JumpSkirt appearing invisible + SierraKomodo: + - rscadd: Added soy and iced variants of the chai latte, london fog, pumpkin spice + latte, and mocha latte. + mikomyazaki: + - bugfix: Engine emitter control button (and other buttons of this type) no longer + go invisible for a couple of seconds when clicked. + - bugfix: Surgical borgs can now use their hypospray on targets that are on an operating + table. +2019-11-17: + Chinsky: + - tweak: Geiger counter thresholds have been tweaked upwards, 'high' is now for + rads that will breach most non-radproof suits, 'very high' is dangerous even + to 'radproof' suits. + Imienny: + - rscadd: Improved a bit Vox hardsuit, now you can store more useful stuff in hardsuit + storage slot and use claws attack through now-insulated hardsuit gloves. + Technetium: + - rscadd: Wound infection speed is now twice as fast at 50-70% immunity as it was + before, and 10 times as fast at 0% immunity. + mikomyazaki: + - tweak: Instruct verb will inform you better about why it fails, if it does. + - bugfix: Stationary consoles now have a 'Forced Shutdown' verb, just like other + kinds of modular computer. + - bugfix: The 'boiled spider meat' recipe now correctly produces an item called + 'boiled spider meat' rather than 'giant spider leg'. +2019-11-18: + Higgin: + - imageadd: Added two bunny-eared booster sprites. +2019-11-19: + mikomyazaki: + - bugfix: Removing an ID from a modular computer no longer brings up a selection + menu containing other modular computers with ID card slots in range. +2019-11-20: + Rain7x: + - tweak: Mentalists can now only be an O-1 (Ensign) + - bugfix: The Pathfinder, Med Tech, and pilot headsets now have an on mob icon again. + SierraKomodo: + - tweak: Swallowing pills now displays a message to people within a 2 tile radius. + This message does not tell them what pill you swallowed. + - tweak: Initiating a give (Right click > Give) now displays a message that you + 'hold out an item' to the target. + Technetium: + - rscadd: Adds immunobooster, an immune-system restoring drug that will rapidly + bring a ruined immune system up to half strength. Will not replace a proper + immune system, though, so be careful with those rads and spaceacillin. + babydoll: + - rscadd: Added the incendiary laser blaster to the traitor menu. + ghostsheet: + - tweak: Ion rifle and pistol has its capacity reduce to 8/4 shots respective and + had their delay between shots increased to 3 seconds. + - tweak: Uplink implant is now more EMP resistant, it can still be disabled by an + EMP but its chance of permanently breaking is significantly lowered. + - tweak: Imprinting implant cannot be implanted into synthetic being and must now + be imprinted where the brain organ is eg. For a GAS that would be their thorax; + for humans, their head. + - bugfix: You can leap over objects once again. + mikomyazaki: + - bugfix: Supermatter hallucination effect now checks for any source of meson vision, + rather than just meson glasses. Other sources of meson vision, e.g. the hardsuit + module will now properly stop hallucinations from developing when active. + - bugfix: You can now remove splints from yourself. + - tweak: '''Remove Splints'' is now a verb (right click your target to find it) + rather than in the stripping menu.' +2019-11-21: + Chinsky: + - tweak: Airlock controllers were resprited to blend with rest of wallstuff, have + directional icons now + - tweak: Flashbangs nerfs! No flooring, stun durations are now very short (you have + 4-6 seconds against non-protected, 2 against anyone with a helmet. Added confusion + effect (generally 2-3 times longer than stun) to them too. + SierraKomodo: + - bugfix: Give emotes now display the correct text for recipient vs everyone else + Technetium: + - rscadd: Carbon mobs now take immune damage from radiation. + WezYo: + - bugfix: Clicking on first aid kits (or other crafting objects) with certain items + will no longer delete the first aid kit. + babydoll, dirtygirl: + - rscadd: Added the dire goose, occasionally making its nest on grass exoplanets. + mikomyazaki: + - soundadd: Vending machines now play a sound when dispensing an item. + - bugfix: SolGov Employees now have clothing in their uniform vendor, the same as + the civilian uniform set. +2019-11-23: + Rain7x: + - tweak: The CMO now has the same amount of total skill points as a regular physician. + ghostsheet: + - rscadd: Added a navigation telescreen to the Charon crew compartment. + - rscadd: Replaced the rack on the Guppy with a storage compartment crate + - rscadd: Added binoculars to mining prep. + - rscadd: Carp migration event got reworked! They will now be launched into the + ship at slow speed, over a period of time. + - rscadd: Overmap carp hazard, has been tweaked in same maner as the carp migration + event, carps will be launched at the ships over a period of time. The speed + of carps hitting ships will be dependent on the ship's speed, multiplied by + the pilot's skill. (Go fast for road kills, you want to go fast to escape the + carp event either way). + - tweak: Structures and machine such as windows and computers, will hurt any mob + thrown against it, similar to being thrown against a wall. (Throwing people + against things now deals the same damage as a wall) + mikomyazaki: + - tweak: Firing a gun successfully will now switch off RIG-based cloaking devices. +2019-11-24: + mikomyazaki: + - bugfix: Malfunctioning AIs will now properly get the ai-select-hardware, ai-select-research + and display-help and set-ambition verbs. + - tweak: Malfunctioning AI is now consistently called Malfunctioning AI everywhere. + (This will not affect your character role settings.) + - tweak: Ascent Drones will no longer have the bureaucracy skill to speak legalese. +2019-11-25: + Chinsky: + - tweak: Free skillpoints for medical jobs were lowered, check your skill setups. + - tweak: Virology is no longer a full skill, a perk now requiring Trained Medicine. + - tweak: Codex now has navigation bar to get to home page quickly, or search or + list all stuff. + SierraKomodo: + - tweak: Borgs with the proper skills can now use console terminals with ctrl+alt+click. + You must be adjacent to the console to use this. + Technetium: + - tweak: Immunobooster now has overdose effects and a lower OD threshold (60u -> + 30u). + - tweak: Immunobooster now has strong negative interaction with spaceacillin. Do + not mix. +2019-11-27: + Anticept: + - tweak: Deck Chief now has mining access + MrKicker: + - tweak: Added extra table to OR 2 + - bugfix: Fixed medical hallway telescreen + Rain7x: + - tweak: The job Pharmacist is now called "Laboratory Technician". Their job has + been expanded to include virology duties. + - rscdel: The "Laboratory Technician" alt-title has been removed from the Research + Assistant Role. + SierraKomodo: + - tweak: Shield generator monitoring programs now display the same shield statuses + as the shield generator UI itself + Technetium: + - rscadd: Carbon mobs now take radiation damage upon exposure, modified by their + species radiation modifier -and- burn modifier. + mikomyazaki: + - rscadd: All Deity mode spells and structures now have a codex entry visible to + the God Cultists that explains what they do, or how to use them. + - tweak: Dionaea can be cured of viruses by receiving a middling dose of radiation. + Exposure to a radiation storm or standing outside the supermatter containment + window for a short time should be sufficient. +2019-11-28: + Rain7x: + - tweak: The Lab Tech now only has 16 skill points, and is restricted to trained + medicine and anatomy. + babydoll: + - rscadd: Added two new types of fauna to volcanic exoplanets. + - tweak: To account for their low health, simple animals take less damage from ballistic + and laser projectiles. +2019-11-29: + mikomyazaki: + - tweak: Failing to do surgery due to thick material clothing items will now display + an appropriate error message. +2019-11-30: + afterthought2: + - bugfix: Robotic limb attachment and connection surgery now consistently checks + robotic skills (complex devices, also anatomy if on flesh target). +2019-12-01: + mikomyazaki: + - bugfix: The delete warrant button in the main window of the Warrant Assistant + program will now properly do its job. +2019-12-02: + MrKicker: + - tweak: Notes/memories can now be multi-line. + Rowtree: + - rscadd: Added 30 new drinks, added recipes for Nothing, and added new bottles + to the booze-o-mat +2019-12-03: + Technetium: + - tweak: Nerf to Vox Slug Sling, 2.5x addt. egg generation speed. + mikomyazaki: + - bugfix: Antagonist HUD markers e.g. Cultist indicators will now properly show + up instead of being under the floor layer sometimes. +2019-12-04: + Rain7x: + - tweak: Candy Bar sprite has been updated. + afterthought2: + - rscdel: Virology has been entirely removed from the game. +2019-12-05: + Spookerton: + - tweak: Booster biomod hair options have been replaced with booster markings. +2019-12-06: + MrKicker: + - tweak: Allows hand-labeler to label storage items when used with non-help intent. + babydoll: + - rscadd: Added retractable ball point pens. + mikomyazaki: + - bugfix: Taping paper to windows will no longer put it below the window. +2019-12-07: + Boznar: + - maptweak: Engineering bay and atmospherics have been remapped to be less cramped + and more space efficient. + - maptweak: RPDs added to atmospherics lockers. Additional EVA hardsuit and Atmos + Voidsuit added to engineering. + Imienny: + - tweak: You can no longer hear aiming sounds, unless you are being aimed at/aiming + at. +2019-12-08: + Imienny: + - rscadd: Added option to change type of stomach in character setup menu + - bugfix: Fixed bug allowing to use stun batons without charges + - bugfix: Fixed bug preventing stun prods from working with standard device cells + Spookerton: + - bugfix: Female rolled uniform and sleeves for EC command uniform no longer makes + you naked. + mikomyazaki: + - tweak: Burn damage from radiation exposure is nerfed by 75%. +2019-12-09: + mikomyazaki: + - bugfix: Robots can now wrench portable rechargers to move/anchor them. +2019-12-12: + Rowtree: + - bugfix: Fixes recently added drink strengths to a more accurate level. + Spookerton: + - tweak: Bald boosters get bald ears. + mikomyazaki: + - bugfix: AIs can now spawn properly at roundstart. + zaredman: + - bugfix: Biowaste disposal cart access to only require surgery access instead of + requiring 6 different accesses. Corpsmen rejoice! +2019-12-15: + Spookerton: + - bugfix: Starborn, Blueforged, and Promethean variations properly show the head, + torso, and groin. +2019-12-17: + CrimsonShrike: + - rscadd: Drill heads show current status while mounted and can be examined for + information when not mounted on an exosuit drill. + EcklesFire: + - tweak: Adjusted renegade numbers. + - bugfix: Removed duplicate vars. +2019-12-19: + Spookerton: + - tweak: PTR bullets aren't hitscan and do a little less damage and penetration. + babydoll: + - rscadd: Added foam dart launchers. + - rscadd: Foam dart launchers can now be won as prizes from arcade machines. + - rscadd: Added a modified foam dart launcher to the uplink's gimmick weapons menu. +2019-12-20: + Cajoes: + - rscadd: Added orderable replacement barricade tape rolls from supply. + PsyCommando: + - tweak: Made the currency used in text entries read from the current map. Mainly + to help with downstream stuff. + afterthought2: + - rscadd: Buildable radio components for machines are now available. They will have + limited use with machines currently. + - tweak: When building air sensors, you now must also add a power component and + a radio transmitter. You can use a multitool on the radio transmitter while + standing near a machine to configure it. + ghostsheet: + - rscadd: Mercenary gamemode is now overmap. +2019-12-21: + Imienny: + - tweak: Tweaked TC cost of uplinks in Character Setup menu, radio uplink now gives + you 30% more TC, uplink Implant cost only 20% of total TC and taking TC without + uplink gives you 50% more TC. + - tweak: Message shown after receiving PDA uplink now should explain better how + to access uplink. + - tweak: Delay for removing knives from boots was decreased to one second + - tweak: Using combi-knifes on intent other than help intent will now open their + blade + - tweak: Portable freezers can now fit inside backpacks and have capacity of large + box + - tweak: Combat knifes can now fit inside boots + mikomyazaki: + - bugfix: Sleepers will now properly display the amount of a drug in the occupant + on the UI. + - tweak: R-UST now has a prompt to tell you when hitting the shutdown button will + cause an instant explosion, asking whether you're sure. + - maptweak: R-UST room machinery starts the round anchored. + - tweak: Improves the fuel injector controller UI, with injection rate and toggle + all injectors controls. +2019-12-22: + Chinsky: + - tweak: During the metor rounds, evacuation jump will be called automatically after + announcement that rocks are coming. It will take 30ish minutes to arrive + - tweak: Since there's less time and Torch is /very/ sturdy (thicc hull and PD), + initial intensity is bumped a bit and escalation is going faster, so will hit + max intensity at around 30 minutes mark. + - tweak: 'After the jump mode will check for some important things and will print + red/green text about them: helm console (need to have at least one and powered), + thrusters (ditto), bluespace drive (the room must be powered).' + mikomyazaki: + - tweak: Trained Forensics now provides a much larger bonus to making simple incisions + on dead targets for autopsies. +2019-12-23: + mikomyazaki: + - bugfix: Can't put objects inside bags that are in pockets anymore. + - tweak: Updated traitor extended round description so it is appropriate for the + SEV Torch setting. + - bugfix: Double doors are properly solid again. +2019-12-27: + babydoll: + - tweak: Increased damage taken when falling down a hole to another deck. + - tweak: Increased duration of stun after falling. + mikomyazaki: + - bugfix: Merchant station teleporter computer will now display the proper messages + relating to costs. +2019-12-28: + Cheb Pomidorov: + - tweak: Scientists and Research Assistants can now enter areas such as Medbay and + Brig's hallways and the Bridge Entry. + Devildabeast: + - tweak: Changes the Mentalist's Mind Read time limit from 25 seconds to 60. + Spookerton: + - tweak: Mercenary and Provocateur starting points are hidden from the Torch's roundstart + sensor message. + zkxs: + - bugfix: The psionic signal event can no longer give synthetics genetic disabilities +2020-01-03: + Devildabeast: + - tweak: Changes "restricted roles" to the broader "casual roles" in loadoout. + - tweak: Adjusts several loadout item restrictions. + Imienny: + - tweak: Replaced spoon in MRE with spork + mikomyazaki: + - bugfix: Nymphs and Golems are no longer valid targets for auto-traitor. + - bugfix: Mercenary radio channel now works again for mercs, raiders, traitors etc. + zkxs: + - bugfix: Fixes a runtime when using an atmos analyzer on a pit +2020-01-30: + Anticept: + - tweak: Farmbots now refill from a sink at a higher rate, up from 10 to 100 per + cycle. + Cheb Pomidorov: + - rscadd: You can now lock and unlock coffins using a screwdriver. Locked coffins + can be struggled out of, similarly to welded closets. + Imienny: + - rscadd: Added a new roles to Vox Scavenger away site, "Shoal Biotechnician", "Shoal + Technician" and "Quill" + MrKicker: + - tweak: AI can now make multi-line announcements + Spookerton: + - rscdel: IPCs can no longer be counsellors. + WezYo: + - bugfix: Flying drones can now open windoors + Xaytan: + - tweak: Adds welding goggles as an option in loadout. + afterthought2: + - rscadd: Pipe meters, vents, scrubbers, and pumps now use radio components. + mikomyazaki: + - tweak: Guest pass icon will now change colour to black when expired. + - tweak: Guest pass machine gets an updated UI. + - tweak: Humanoid Dionaea now get the audible chirp emotes. + - soundadd: Added a new multichirp (*mchirp) audible emote sound effect for humanoid + Dionaea. + - bugfix: Portable drives now work properly in modular computers for all operations. + - bugfix: Dense objects will now properly stop throwing/leaping. + - bugfix: Hand teleporters will now create portals that aren't random, when you + are linked to a teleport computer on a connected z-level. + - tweak: Hand teleporters will now only list teleport computers that are on a connected + z-level. + - bugfix: Can no longer right-click darkness due to being unconscious to see what + is on that turf. + - tweak: Decreased difficulty of installing augments to the same level as installing + robotic organs. + - imageadd: Adds three xenowear options for Space-Adapted humans - Leg braces, neck + brace and venter. + - imageadd: Adds animations for the sleeper & bodyscanner when active & occupied. + - soundadd: Adds a scanning sound for the bodyscanner. + - tweak: Space-Adapted humans' stamina now depends slightly upon gravity levels, + with better stamina than baseline humans in low-gravity, worse in standard gravity. + - tweak: Space-Adapted humans are adapted for lower-pressure environments, but suffer + in higher pressure environments faster relative to baseline humans. + - bugfix: The Vox shuttle can now return to its hangar properly. + quardbreak: + - tweak: Tweaked welding sounds on airlock and vents. Now after weld operation you + should hear second sound like you end your action. + zkxs: + - bugfix: Combining stacks from an inventory no longer leaves bugged sprites + - bugfix: Having more than 10 brain damage no longer grants immunity to peridaxon's + side effects (confusion and drowsiness) + - spellcheck: Sec HUD goggles description grammar fix + - rscadd: Adherent can now float over tables +2020-01-31: + Lorwp: + - soundadd: Energy melee weapons now have an on-hit sound + mikomyazaki: + - tweak: Paper will now check if your pen works before you start writing instead + of after you've written your text. + - tweak: If your retractable pen isn't in its active state when you start writing + on something, your character will automatically click it. + - tweak: Retractable pens will now toggle to their active state when you write on + anything (union cards, people, the wall) instead of only paper. + zaredman: + - tweak: Security now has access to a written statement, weapons license, arrest + report, and restraining order template on the Reports program. Paperwork masochists, + rejoice. +2020-02-03: + mikomyazaki: + - bugfix: Throwing items at a disposal chute will properly dispose of them again. + - bugfix: Fixes a bug where (for example) throwing an object at a grilled window + would hit the grill inside the window instead of the window. +2020-02-05: + mikomyazaki: + - admin: Mobs without the UI elements to use psionics can no longer be granted psionics. + e.g. simple animals. + - bugfix: Polytools now allow you to extend tools again. +2020-02-07: + Chinsky: + - tweak: Various drinking glasses are now printed from a microlathe instead of being + vended. Bar now has pre-loaded microlathe for this purpose. + - rscadd: Added new type of drinking glass - flute glass. + - tweak: Added transparency to some reagents, namely water and booze. + - tweak: Can now select recipies category in fabricators + - tweak: More types of glasses can take accessories like sticks or straws now, try + it out. +2020-02-08: + mikomyazaki: + - bugfix: Atmospherics' tank controllers work again when controlling the output + vent. + zaredman: + - maptweak: Removes Explorer and Pilot access to Xenobiology, Xenoarchaeology, Toxins, + and assorted labs. Pathfinder retains their original access. +2020-02-10: + Flying_loulou: + - rscadd: Fleet engineers rejoice ! The fleet unlocked some funds, in order to provide + you with a dedicated uniform, constituted of a polo, some pants, and a jacket + (available in the uniform vendor, under the utility extra section). +2020-02-12: + SomeoneStoleMyNickname: + - bugfix: The Guidebooks Hacking and Repair and Construction should now work as + intended. +2021-01-27: + MistakeNot4892: + - tweak: Will the bot generate the changelog now? Let's find out. + - tweak: Coat racks are now material-based and craftable. + - tweak: Coat rack backend has been rewritten to support hanging any hat or suit + item. + - experiment: A bunch of structures have been rewritten to use some shared code. + As a result, you can examine most structures to see some tips on how to interact + with them, and you will find several construction/deconstruction steps have + changed. + - tweak: Metal structures must be dismantled with a welding tool, while other materials + use a crowbar. + - tweak: Girders are now 'supports', and are reinforced by using a material stack + on them before anchoring. Using a screwdriver will remove the reinforcement, + or toggle whether or not the support will produce a fake wall. + - experiment: This is going to be buggy, please report issues and problems. + N8-Toe: + - rscadd: Added chemical saftey suits to code, protect against gas in the air but + need to be used with a face covering mask, unimplemented at this time. + SierraKomodo: + - admin: Disposal bin stuffing and flushing are now attack logs instead of admin + logs. + - tweak: Cutting the ID Scan wire on doors will now disable ID scanning. If the + door is 'secure', this blocks access entirely. For all other doors, this fully + bypasses access requirements. + - bugfix: Windoors are now properly emag-able. + - tweak: Emagged windoors will now provide feedback that they are broken when you + try to close them. + - tweak: You can now tell if a door's control board has been fried by examining + the door with an IT skill of trained or higher. + - tweak: '''Mild'' labels in medical scans are now highlighted in yellow and bold + to make them more noticeable.' + - rscadd: Windows and airlock windows are now paintable. + - admin: Smothering people with a rag and hitting people with an ignited rag now + generates attack logs. + - tweak: You now require a grab to smother people with a rag. + - tweak: Smothering people with a rag now has a timed progress bar - 3 seconds if + your CQC skill is trained or above, 6 seconds for everyone else. + - rscadd: General station/ship lights now have randomized tones - The old default + warm yellow, a cool blue, and pure white. + SierrqKomodo: + - admin: Banned player's mobs now have their ckey stripped so they display the permanent + SSD message and instantly cryo. + SolatK: + - bugfix: Dropped mobs should not take the same direction with those who held them + - bugfix: CE rig now have a boots + SomeoneStoleMyNickname: + - rscadd: Added a new digital pencode tag. [redacted] creates the string R E D A + C E D in black lettes on black background to give the illusion of redacted contend + in reports. + The Stalker: + - rscadd: Finished up some unused void suits. So they have stats (finally) + - rscadd: Added new materials to vender and recipes. Will be doing a part two i + gues. Will eventually look into finishing the cotton plant or make a mega edition + pack of new weapons + Winter: + - rscadd: Added textbooks. Textbooks are items that give skillbuffs while you are + actively using them. Textbooks require basic literacy to use, and you must have + the specific textbook for your skill level. + - rscadd: Added a book merchant who sells textbooks. + - tweak: Molluscs and Mollusc meat now have monetary value. + - maptweak: Tradeship now always starts the round with a book trader available. + - maptweak: Tradeship has four randomized textbooks in various locations at roundstart. + - experiment: Please report balance issues (and of course bugs) that may arrise + from this feature. + - tweak: 'Bonus: Codex links now open new windows.' + - rscadd: Those with Master Literacy can now make their own textbooks. Blank textbooks + are acquired via an autobinder and then written using a pen. + - rscadd: Includes codex information on this process. + - tweak: Made textbooks in general to be one size smaller to allow being put in + bags. + - tweak: Very basic support for fabricators to get colours from something else other + than pipe_colors + - experiment: Unsure how this impacts skill balance, please report on that if there + are issues. + comma: + - tweak: Desert planets now have 'dry mud' turfs in the areas where quicksands can + spawn. + - rscadd: Added new type of toolbox - electrician's. It holds all needed tools for + machinery components interactions and several boxes of most common components. + Can be found in supply (electrical maintenance pack) and electrical locker + - balance: Engineering vendomats now vend APC/air alarm kits instead of just circuitboards. + - balance: Most machinery components are now tiny rather than small + - bugfix: APCs can be fixed again after explosions + - tweak: APCs now don't draw screen overlay / glow if screen component is destroyed + - tweak: APCs now don't report cell power in UI etc if battery backup is destroyed + - tweak: APCs now show that external power is not coming in if terminal component + is destroyed + - experiment: Machines can actually be destroyed fully by strong explosions again + (not just component damage) + - tweak: Added categories to textile designs + - balance: Costs for armor items are adjusted, generally more expensive to produce + - tweak: Holsters now leave their fibers on things put inside. + - tweak: Crowbarring doors now leaves scuffing on them, visible when examined up + close. Can be repaired as any other damage. + - tweak: Gas tanks will now dump their content into air when destroyed + eckff: + - rscadd: Backported Adherent species from Baystation12. + - rscadd: Backported Lizards species (previously Unathi). + - imageadd: Lizard people get new dark sprite. + - bugfix: Fixes monitor mask initial world icon. + - rscadd: Adds radial icon choice for monitors. + - tweak: Roundstart can now be any hour. +2021-01-28: + comma: + - tweak: Ha ha ha I am abusing my GitHub maint powers to make chinsky commit a changelog + via the bot workflow. Science! +2021-01-30: + eckff: + - rscdel: Removed the privacy poll. +2021-01-31: + comma: + - tweak: Credsticks are now tiny instead of normal sized +2021-02-02: + MistakeNot4892: + - tweak: Firearms now use pixel-precise projectile iteration, ported from Aurora. +2021-02-03: + MistakeNot4892: + - tweak: Amputating the second-to-last organ on a human mob (typically leaving the + torso) will drop the last organ as a limb and destroy the mob -in other words + you can now chop bodies up entirely instead of being left with a weird unwieldly + torso. + - tweak: Amputation is faster but messier if you're doing it improperly (improvised + tool or circumstances). + - tweak: Failing an amputation will now get the tool stuck in the person's limb. +2021-02-04: + eckff: + - tweak: Tweaked bucket world-icon state. It's little bit bigger now, but still + tiny. + - rscadd: Added augmentation implanting support code if anyone would like to add + implants or augmentations in loadout. +2021-02-05: + comma: + - tweak: Need to be on same tile as rollerbed to buckle to it. + - tweak: Fires no longer destroy wiring under floor tiles. + - bugfix: Guns found in xenoarch now have icons again + - imageadd: Added inhands for xenoarch find blades + eckff: + - rscadd: Added the panic bunker support from Hestia repository. By default, it + turned off and can be toggled on in config or manually for a round. + - admin: Admins can control the panic bunker state and add/revoke bypass in Server + section with R_SERVER flag. +2021-02-08: + eckff: + - rscadd: Added a overmap-based merchant submap ship - Liberia. +2021-02-13: + MistakeNot4892: + - rscadd: Ailments and prosthetic faults now have codex pages. + - rscadd: You can diagnose some ailments and faults with grab-examine diagnosis. + - rscadd: Failing a skill check after prosthetics replacement surgery can add a + fault to the prosthetic. +2021-02-14: + comma: + - tweak: Airlock tool interactions changed. + - tweak: Screwdriver on airlock will open wires panel, letting you access wires + for hacking. + - tweak: Crowbarring a secured (welded/bolted/braced) airlock will open the hatch + letting you access components for repairs and deconstruction. + - tweak: Hatch can only be opened if you have appropriate access to the door. Use + ID on the door to toggle the lock. +2021-02-16: + MistakeNot4892: + - rscadd: There is now a Mouseover Highlight preference that can be set to Show, + Hide or Show While Shift Held. This will highlight the object you are currently + mousing over. You can set colour and alpha for the highlight in your UI preferences. + silicons: + - bugfix: projectiles use a better get angle function now +2021-02-17: + MistakeNot4892: + - tweak: 'Several changes of note only to administrators:' + - tweak: Traitor panel has been renamed to Special Roles. + SolatK: + - bugfix: now the tail will not stick out through the clothes where it is not necessary +2021-02-20: + comma: + - imageadd: Radio receivers / transmitters (machine components) got new icons +2021-02-22: + comma: + - bugfix: Emagged airlocks can now be crowbarred close, after they're depowered. + - tweak: Airlocks now use access lock components to decide their access, instead + of circuitboards. Locks now use same UI as airlock electronics did for access + setup. Mapped airlocks should spawn these as needed to work same. + - tweak: Doors can now have their internal components damaged too like the rest + of machinery. It won't happen until they're bashed down first though. + - tweak: Access locks with auto-set option will automatically set their access to + the area's on installation into machine (like doors do) + - imageadd: Access lock components (and network lock) now have their own icons instead + of reusing scanning module one. +2021-02-24: + MistakeNot4892: + - rscadd: Poppy and other possums can now be picked up thanks to Pawn. +2021-02-27: + SierraKomodo: + - admin: Admin logs for turret setting changes now display the correct user instead + of *INVALID* and a loc link. + - admin: Attack logs for cremation no longer has the attacker and victim reversed. +2021-02-28: + MistakeNot4892: + - tweak: Webhook config now supports per-endpoint mention lists. Consult config/example/webhooks.json + for the format. If you don't need individual pings, you don't need to update + anything. + SierraKomodo: + - tweak: Codex entries for magnetic guns (Coilguns, railguns, etc) have been updated + with a lore blurb and detailed information on specific mechanics. + comma: + - bugfix: Airlocks no longer spawn extra lock when constructed + - tweak: Wall emergency lockers renamed to emergency dispensers (since they're not + lockers at all), and given new icon + - soundadd: Crypods, sleepers and bodyscanner pods now make sounds when someone + enters/leaves +2021-03-02: + SierraKomodo: + - admin: Supply beacons now generate attack logs when activated + - admin: Suicide by gun in the mouth now trigger attack logs instead of admin logs, + including a new log when starting the suicide process +2021-03-03: + SierraKomodo & Pawn: + - imageadd: New sprites and lighting overlays for teleporters have been added. +2021-03-06: + comma: + - tweak: Walls now take much less damage from melee strikes, depending on material. +2021-03-08: + MistakeNot4892: + - tweak: The status condition backend (paralyzed, asleep, etc) has been completely + rewritten; please report any inconsistencies or bugs. +2021-03-09: + eckff: + - rscadd: 'Added prepared subtypes of suit cyclers which usually hold helmets/hardsuits/magboots + on roundstart:' + - rscadd: 'Jobs which have prepared suit cyclers: engineers, atmospheric engineers, + security, medical and generic.' + - rscadd: Generic is access-free suit cycler which contain simple space suit and + space helmet. + - maptweak: 'Did some changes for merchant away submap Liberia:' + - maptweak: Added more money in trading room. Initially there's should be 13k credits, + but before this change there only 1k. It fixed now. + - maptweak: Added light switches in almost all rooms. + - maptweak: Removed a few spawnpoints in rooms. + - maptweak: Replaced bar keg in bar room with alcohol chemical dispenser. + - maptweak: Replaced some bubble lights in atmospherics with tube lights. + - maptweak: Replaced bookcases in library room with skillbook bookcases, since nobody + really use manuals and skillbooks will be useful for merchants as a trading + product. + - maptweak: Moved disposal bin in library a bit, so it will not interfere with the + passage to the chairs. +2021-03-13: + Andrew-Fall: + - tweak: Drastically increases large map loading speed +2021-03-19: + afterthought2: + - tweak: Additional support has been instated for templates which are to be loaded + multiple times. The main user-facing change is that when adding shuttle-restricted + waypoints to an overmap object's initial_restricted_waypoints list, use the + shuttle's type path, not its name. Templates that load ferry-type shuttles with + waypoints not on the template will break with this system, but you can opt out + by setting modify_tag_vars on the template datum to FALSE. +2021-04-28: + Koollan: + - tweak: Changed a couple things about armor values of some of the new metals. Shinier + metals are now semi-useful for laser protection. Also, Slag is now able to be + dissolved into some reagents. + - rscadd: Added a new metal and more alloys. + - rscadd: I added some metals and mineral types in order to actually acquire the + new metals. This is the first pass. Check the PR for full details. + MistakeNot4892: + - tweak: You can now target head/hands/arms on help intent to do some more specific + hug actions (headpats and handshakes). + - tweak: You can now headpat simple animals and robots. + - tweak: Many objects previously made of glass are now made of fiberglass, which + is stronger but less heat resistant. + - tweak: Cables are now made of copper rather than steel. + - tweak: Slag can now be processed via grinding and acid to recover some useful + trace elements. + - rscadd: Fiberglass sheets can be made from glass and plastic at an autolathe or + textiles fab, or by grinding glass and plastic then heating over 100C. + - tweak: Age is now a descriptor, and can be found alongside height and build in + preferences. + - rscadd: Some status effects (sleeping, stunned, confusion, weakened) are visible + in the form of markers over the victim's head. This can be disabled in preferences + if you'd rather not see them. + - tweak: Your gender no longer determines your base character icon. Instead, there + is a 'bodytype' option. + - tweak: Character gender pref has been renamed to pronouns. + - tweak: Species skin variants have been changed into body types. + MuckerMayhem (Ported by SierraKomodo): + - bugfix: Fixed the skill panel losing focus when editing skills. + SierraKomodo: + - rscadd: Admin paralyzed players now have notices to inform other players they're + paralyzed and being handled by staff, and to not interact until staff are done. + - tweak: Cargo trolleys can now be hitched together regardless of what direction + the trolley is facing. + - tweak: Cargo trolleys now tell you if and what they're linked to when you examine + them. + - admin: Mech weapons now generate proper attack logs instead of admin logs, and + only appear when targeting mobs. + eckff: + - rscadd: Adds diona nymph chirp as fun instrument for synthesizer. Available only + with dionaea modpack. + - maptweak: 'Liberia: Added two ATM on Mule shuttle.' + - maptweak: 'Liberia: Removed redundant firealarm from bar.' +2021-04-29: + ghostsheet: + - bugfix: Camera shake has been refactored. +2021-05-02: + MistakeNot4892: + - tweak: You can now aim at people with fruit, and will throw the fruit if they + trigger reflex fire. +2021-05-06: + MistakeNot4892: + - tweak: Examining an object will show you if it is usable as a tool. + - tweak: Ghetto surgery steps have been adjusted to use a shared tool flag system, + check the codex for updated tools for surgery steps. + - tweak: The incision manager no longer has a special surgery type, but counts as + several different surgical tools at once. +2021-05-07: + MistakeNot4892: + - tweak: Some material stack items and messages around them may have changed due + to a backend refactor of materials. +2021-05-08: + Coltrane97: + - tweak: Radiation closet now contains radiation medpouch instead of toxin one +2021-05-11: + Coltrane97: + - bugfix: Identification cards now properly get their account number; ATM third-level + security will work. +2021-05-12: + MistakeNot4892: + - tweak: Fluid interactions with atoms have been disabled until they can be optimized + to be less of a server killer. Mobs will still drown, you just won't melt in + acid. On the plus side, fluids are more performant now. + - tweak: Records now have their own area in character preferences. +2021-05-14: + MistakeNot4892: + - tweak: Double-clicking to see turf contents is now a preference. You can choose + alt click (default), double click or nothing. +2021-05-20: + Andromeda-K22: + - tweak: AIs can now have a default holopad color tone set, and set their own color + tone for on-station/ship holopad rendering. + koboldlove: + - bugfix: fixed the character creation preview sometimes not updating when changed + or loaded +2021-05-27: + comma: + - bugfix: Melee weapons now actually use their armor penetration values against + armor +2021-05-30: + Coltrane97: + - bugfix: Missing wall-mounted relay circuitboard + - bugfix: Network cables dupe + - rscadd: Network cables can now pass through z-levels +2021-06-12: + CakeQ: + - rscadd: Added two new layers to walls, paint and striping. Walls will now maintain + their material coloring, and instead have paint colors applied as paint layers + on top. Standard walls can be painted two-tone with the main body and striping + (wooden walls too). + - rscadd: Wall paintability is now defined by their materials. + - rscdel: Removed legacy wall stripe system in favor of the new paint striping. + - tweak: Wall edge connections to things like windows and airlocks have been simplified, + fixing a few erroneous connections. + - tweak: The paint sprayer has finer control when interacting with walls and wall + frames. + - tweak: Renamed airlock paint flags to be generic. These are now also used for + defining wall paintability. + MoondancerPony: + - rscadd: Trays now use vis_contents, so you can interact with tray objects by clicking + on them. + - rscdel: Trays no longer drop their contents when set on a table. + - tweak: Storage UIs now ignore pixel_x and pixel_y when displaying items. +2021-06-16: + SierraKomodo: + - tweak: There is now a user feedback message for wiring a window. + - rscadd: You can now de-polarize a window by using wirecutters to remove the wiring. + - tweak: The set id prompt when using multitools on polarized windows now defaults + to the current id instead of null. + - rscadd: Using a multitool on an anchored (fully installed) window now toggles + the tint instead of changing the ID. To change the ID, unanchor the window first. + - tweak: Examining windows now tells you if they are anchored and/or polarized, + and the construction state (screwdriver/crowbar steps) of reinforced windows. +2021-06-20: + CakeQ: + - rscadd: Walls can now connect to walls of other types depending on their material + by comparing material wall icons + NataKilar: + - rscadd: You can now build landable ships by toggling docking beacons to construction + mode. + PsyCommando: + - rscadd: Added Ice extractor. + - imageadd: Added a placeholder icon for the extractor. + SierraKomodo: + - bugfix: Ghosts will no longer break skill checks for helm controls. + - tweak: Ship helm consoles now only allow a single person to use manual control + at a time, including viewing the overmap through the helm. + - rscadd: Messages are now displayed whenever another mob takes control of a helm + control, to make it outwardly obvious who's skills are used to calculate flight. + - admin: Debug log messages were added for helm control changes, for tracking of + potential issues on live. +2021-06-27: + quardbreak and Pawn: + - rscadd: Added a picnic basket. Sprites made by Pawn. +2021-07-02: + NataKilar: + - tweak: Fusion fuel compressor can now create fuel rods of mixed materials. + - rscadd: Added fission reactor to the game for isotope and power generation +2021-07-06: + MistakeNot4892: + - rscadd: Ports the aspect system from Europa, specifically the backend, not the + aspects themselves. This is a menu in character preferences that allows you + to pick a series of traits for your character, as in some RPGs. + - tweak: Moves prosthetic limbs, prosthetic organs, amputated limbs and nearsightedness + onto aspects instead of the Physical tab. + - tweak: Moves preview options from the Physical tab to the header of character + preferences. +2021-07-10: + Geeves: + - soundadd: Added a sound to falling over, willingly resting does not play the sound, + however. + Gr1lledcheese: + - bugfix: Made oxygel scannable +2021-07-11: + MoondancerPony: + - rscadd: Replaces the HTML microwave UI with a new NanoUI-based one, complete with + an animated progress bar! + - tweak: Microwave recipes can now be made in bulk by multiplying the recipe amounts. +2021-07-12: + greggbot: + - rscadd: PDAs are now constructable +2021-07-13: + Geeves: + - rscdel: AI can now turn their holograms without moving by using the eastface, + westface, northface, and southface macros. +2021-07-15: + quardbreak: + - imageadd: New IV drip sprites from Haven-Urist. +2021-07-16: + PsyCommando: + - bugfix: Fixed shutters and blast doors deconstructed and panel_open state being + unreachable. + - bugfix: Fixed shutters assemblies having the wrong icon. + - bugfix: Fixed shutters deconstructing to blast door assemblies. +2021-07-17: + Azlan (as the sprite author) and quardbreak: + - imageadd: Replaced Supermatter sprites with ones by Azlan. +2021-07-18: + CrimsonShrike and quardbreak: + - rscadd: Ported pool tiles and related to pool objects. You can build pool and + keep water inside it. +2021-07-19: + PsyCommando: + - tweak: Allow anchoring/unanchoring closets/crates to the ground. + - imageadd: Added the access_button_off icon state +2021-07-22: + retlaw34: + - imageadd: Added new fuel port sprites. +2021-07-24: + Nyxodile: + - bugfix: Backend fixes for mobile ladders. + - bugfix: Fixes toggling plated catwalks. + - bugfix: Fixes Wi-Fi bypass. + - bugfix: Minor fireaxe attack fix. + Tennessee116: + - maptweak: A cell charger has been added to the research lab of the tradeship! +2021-07-28: + quardbreak: + - tweak: Skybox transit overlay now should be more noticeable than before. +2021-07-30: + Gr1lledcheese: + - tweak: Adds different levels of the CE_OXYGENATED effect +2021-07-31: + PsyCommando: + - tweak: Made material doors less loud. + - bugfix: Made a few machines stop reporting they're not receiving power when they + do not need power at all. +2021-08-02: + PsyCommando: + - bugfix: Fix reinforced floor being impossible to build due to a bug. +2021-08-03: + MistakeNot4892: + - tweak: Supply beacons no longer need a wire under them to function. +2021-08-15: + comma: + - tweak: Instead of selecting bottle sprite, you can now select lid and label color + - rscadd: Sprites for bottles and beakers were changed +2021-08-22: + PsyCommando: + - bugfix: Logging procs don't crash when used during early init anymore. +2021-08-24: + Andromeda-K22: + - rscadd: the supermatter now makes noises depending on damage. + - rscadd: the supermatter now glows if severely damaged, and changes contrast / + color +2021-08-26: + Andromeda-K22: + - tweak: gas filters no longer use hardcoded modes (i.e ATM_N2), they now use gas + decls and a list that is dynamically generated. + PsyCommando: + - tweak: Make curtains use decl instead of several subtypes. +2021-08-29: + Andromeda-K22: + - rscadd: handcarts are now a thing. control-click a pullable atom, then click the + cart with them to load them on. Only works with ITEMS and OBJECTS, not PEOPLE. + Items have a minimum size to be loaded onto the cart. + - tweak: wheeled objects should now be given ATOM_FLAG_WHEELED and are easier and + less exhausting to move. + - tweak: the skill requirements for landing properly during the gravity failure + event has been changed from professional to trained. +2021-09-01: + PsyCommando: + - bugfix: DNA now properly keep track of facial hair color independently from hair + color as it was intended. + - bugfix: Fix skillset not being a path on mob init crashing mob/Initialize(). +2021-09-03: + MistakeNot4892: + - rscadd: A BYOND emblem modpack has been added that adds an emblem to OOC chatter + from people with membership. Defaults to unincluded. + PsyCommando: + - bugfix: Fix occasional runtime in mob/Destroy() when deleting an ai var that wasn't + initialized yet. + comma: + - tweak: Added more hints to xenoarch effects +2021-09-05: + comma: + - tweak: Planet types are now weighted, with some (barren and shrouded) spawning + less often than normal ones + - rscadd: Adds meat planets made of meat (rarer spawn) +2021-09-09: + Andromeda-K22: + - tweak: updated the UI on species selection + - tweak: species selection is now in the background tab. + - tweak: the pda screen is now an overlay. +2021-09-11: + Andromeda-K22: + - tweak: NTOS is now GOOSE. + SolatK: + - bugfix: Fixes accessory offsets for avians +2021-09-12: + Andromeda-K22: + - rscadd: adds the 'strut' material stack, used for a number of items. + - tweak: metal sheets are no longer used for many things, struts are used instead. +2021-09-14: + Geevies: + - rscadd: Species now have special footprint handling when walking on simulated + turfs, though no core species has anything implemented yet. + SolatK: + - bugfix: Avians can wear gloves. +2021-09-15: + PsyCommando: + - bugfix: Prevent APC runtime spam when in a null area. +2021-09-17: + Andromeda-K22: + - tweak: air alarms now sound different. + MistakeNot4892: + - rscadd: Ports geothermal generators from Europa. + SolatK: + - tweak: a credit-stick can be inserted into an ATM + - rscadd: The tail is now a separate limb. You can select it as target, and button + is shown when you look at somebody with a tail. +2021-09-21: + Gr1lledcheese: + - bugfix: Fixes windoor electronics icon +2021-09-23: + NataKilar: + - tweak: Camera networks are now known as channels and are not tied to access. + - rscadd: Security cameras are now tied directly to computer networks, and can be + managed as with other network devices. +2021-10-01: + Andromeda-K22: + - admin: the player panel has been moved - can still be accessed by the usual verbs + and right-click context menu. +2021-10-02: + MarinaGryphon: + - bugfix: Fixes body scanners not showing organ damage + chaoko99: + - imageadd: Very slight color adjustments to the skybox underlay. + - imageadd: New combat shield sprite. +2021-10-03: + MarinaGryphon: + - bugfix: fixes the emote keybind creating two windows +2021-10-05: + lolman360: + - bugfix: fixes charge pylon (electron reservoir) from shocking adherents +2021-10-06: + MistakeNot4892: + - tweak: All energy weapons (ninja blade, esword, energy axe, energy cutlass, energy + machete) can be used as scalpels when they are energized. + - tweak: Energy swords can be used to slice open safes, lockers, windoors and tables + a la the ninja blade when they are energized. +2021-10-08: + PsyCommando: + - tweak: Makes changing a var type in VV take a type path string instead of having + the slow nearly useless listbox with all the atom types listed in. +2021-10-17: + CrimsonShrike: + - rscadd: Adds a number of exosuit modules + - rscadd: Resprites exosuits +2021-10-19: + CrimsonShrike: + - bugfix: Exosuit radios work again. + - tweak: Intercom shortcut is not usable for exosuits too + CrimsonShrike & Azlan: + - rscadd: Adds exosuit cameras + MistakeNot4892: + - tweak: Species information is now found in the codex rather than primarily in + character preferences. +2021-10-20: + CrimsonShrike: + - rscadd: Swimming. + NataKilar: + - bugfix: Robots now properly work as cameras for the purpose of AI vision + - bugfix: TV cameras can now have their network settings adjusted as intended. +2021-10-21: + MistakeNot4892: + - tweak: Brute and burn meds no longer stack with regenerative serum. + - tweak: Light tubes and floodlights are higher range. +2021-10-31: + Kaksisilma: + - tweak: Ion Thruster density is now set to 1. + PsyCommando: + - bugfix: Fix cryopods without control computers from runtiming during init. + lolman360: + - bugfix: plasmacutters now cut mineral walls +2021-11-01: + MistakeNot4892: + - tweak: Painkillers will now apply their additional effects at much lower cumulative + dosage. +2021-11-02: + PsyCommando: + - bugfix: Fixed runtime on autosetting airlocks placed outside an area. + - bugfix: Fixed runtime on building an external airlock outside an area. + anconfuzedrock: + - tweak: graphite is now spawnable and orderable. +2021-11-03: + NataKilar: + - bugfix: Fixes a bug with blueprint and shuttle landing vision causing mobs to + see blackness. +2021-11-07: + MistakeNot4892: + - rscadd: Added behavior for reloadable energy weapons. +2021-11-09: + Andromeda-K22: + - tweak: machines no longer directly check brainloss, but instead rely fully on + dexterity checks. + - balance: dexterity is influenced by brain damage, starting at 30 brainloss (configurable). + Dexterity loss is on a sliding scale. + MistakeNot4892: + - experiment: There is now a weather system on exoplanets. Take your umbrella. +2021-11-14: + Kaksisilma: + - tweak: painkillers now have a number of modular vars for use in the creation of + subtypes. +2021-11-24: + SolatK: + - bugfix: Russian radio keys work again. +2021-11-27: + SolatK: + - tweak: Sleeper uses actual drug dosages to stop you from overdosing +2021-12-01: + PsyCommando: + - bugfix: Blanks don't runtime. +2021-12-02: + PsyCommando: + - tweak: File changes. + - tweak: Fishes can float now. +2021-12-03: + NotRanged: + - tweak: Lying down while facing left or right now lays you down left or right. + - tweak: You can now change facing direction while lying down. + PsyCommando: + - tweak: Tweak inventory hiding fix. +2021-12-04: + MistakeNot4892: + - tweak: Utility frames, Kharmaani and adherent now bleed exciting new colours. + - tweak: Human subtypes can now share blood without triggering a rejection. +2022-01-03: + Gaxeer: + - bugfix: fix looping APC power down sound +2022-01-11: + Gaxeer: + - bugfix: fix the bug with grab-moving dead mob +2022-01-24: + PsyCommando: + - tweak: Changes to human mob initialization. +2022-01-27: + Noelle Lavenza: + - bugfix: Brute damage healing medications now heal brute damage again.. +2022-02-02: + Noelle Lavenza: + - bugfix: Sometimes, thrown fruit smudges would fail to save. That's fixed now. +2022-02-14: + comma: + - bugfix: Network relays will now attempt reconnect on their own, so if router had + a blackout, they'll rejoin on their own without manual reboot. + keIgaras: + - balance: if you hit a person against a window while they are in a grapple, you + release them from the grapple, also increased the duration of the weakness effect + from 1 to 2 seconds +2022-02-16: + keIgaras: + - bugfix: You can force move mob on catwalk in passive grab +2022-02-18: + keIgaras: + - bugfix: Fix bug where sprites for open doors were not displayed +2022-02-20: + comma: + - bugfix: Cannot phase onto low walls through solid windows anymore. + - bugfix: Shuttle chairs now display their bars in raised state too +2022-02-24: + SierraKomodo: + - rscadd: You can now remove ID cards from wallets with AltClick. This only works + for human mobs, and only if you're holding or wearing the wallet. + keIgaras: + - tweak: Change the location of the ui_storage, now it is more convenient +2022-03-02: + NataKilar: + - bugfix: Fixed a bug where wall damage would not be retained when moving a shuttle +2022-03-14: + SierraKomodo: + - bugfix: Deaf mobs no longer see 'You hear something about' messages while asleep. + keIgaras: + - rscadd: added sofa, rounded chairs and updated armchair sprites + - tweak: fixed names of chairs in the construction panel +2022-03-21: + hermaplusplus: + - bugfix: Fixes potential index out-of-bound error when filling grown foods with + reagents. +2022-03-24: + PsyCommando: + - bugfix: Brains removed from someone's head now properly gets renamed to whoever + the brain owner was. + - bugfix: Organs now properly deleted in some cases where they wouldn't be. +2022-03-28: + PsyCommando: + - tweak: Refactored fabricator UI. +2022-04-10: + PsyCommando: + - bugfix: Explosion won't damage a human mob with the godmode flag on anymore. +2022-04-16: + NataKilar: + - bugfix: Fixes a bug causing windows and pipes to be constructed incorrectly. +2022-04-25: + NataKilar: + - tweak: Machinery which previously connected to cables directly for power now require + terminals, which can be added by attacking the machine with a stack of cables. +2022-04-29: + PsyCommando: + - bugfix: Fix organ surgery. + - bugfix: Manually spawned human mobs of the "human" species now spawn with a language. +2022-05-04: + PsyCommando: + - tweak: Greeting message now check if your starting loadout actually gives you + a headset before advising you on how to talk through your headset.. +2022-05-09: + PsyCommando: + - bugfix: Godmode human now properly ignore fall damage, shock, and dislocation + effects. + - bugfix: Fix heart not restarting on rejuv. +2022-05-10: + NataKilar: + - rscadd: Adds user accounts and network groups which allows for custom access systems + tied to computer networks + - rscadd: Adds access requirements tied to computer files for read/write + - rscdel: Removes previous grant based computer network access system + - tweak: You can now hack industrial fabs to print shields, or craft a buckler from + a stool. +2022-05-12: + afterthought2: + - tweak: Engine power use has been decreased substantially. +2022-05-13: + MistakeNot4892: + - tweak: You can now carry things up ladders and through space with grabs. + PsyCommando: + - bugfix: Dislocated limbs now show in medical scans again. + - bugfix: Dislocating someone's limb now causes pain again. + - tweak: Now get feedback when trying to use a jointlock or dislocate someone's + limbs and don't have the required skills. +2022-05-15: + tag if you want to specify another name or several people. -->: + - tweak: Upward pointing cable stubs now give proper feedback, and install properly + when clicked on with a cable coil in hands. You used to need to click on the + turf instead before, which was a bit confusing. +2022-05-18: + keIgaras: + - rscadd: new icons for vents and scrubbers +2022-05-22: + MistakeNot4892: + - tweak: Inflatables are now craftable. +2022-05-26: quardbreak: - rscadd: Progress bars use gradient function for transit animation now. - rscdel: Failure animation for progress bars has been removed. - tag if you want to specify another name or several people. -->: +2022-05-30: + MistakeNot4892: + - tweak: Ported Skrell from Stella and added to the Bay alien roster. +2022-06-03: + SolatK: - tweak: Airlock components panel now opens with wrench +2022-06-04: + MistakeNot4892: + - tweak: Removes HULK, FAT and LASER mutations. +2022-06-05: + gyurka66: + - bugfix: Fixed the TEG icon + - maptweak: Added SM to engineering + - maptweak: Removed 2 of 3 solars +2022-06-06: + MistakeNot4892: + - tweak: Tajaran icon has been updated with new work from Azlan. + PsyCommando: + - soundadd: Added sound for some tool interactions with the axes and hatchets. + - tweak: Config `expanded_alt_interactions` allows for various generic actions (look, + grab, drop, rotate) to show up when alt-clicking. + - soundadd: Changed the handling sounds for several material stacks to something + more fitting. +2022-06-10: + PsyCommando: + - bugfix: Fixed how some tool interactions wouldn't play tool sounds. +2022-06-15: + PsyCommando: + - tweak: Generic plants can now be cut. Trees can be chopped down with an axe. + - soundadd: Added several sound effects when dealing with generic plants. +2022-06-16: + gyurka66: + - maptweak: Randomised Ministation Asteroid Field +2022-06-20: + MistakeNot4892: + - tweak: GPS units now provide a visual compass to track each other. +2022-06-22: + NataKilar: + - tweak: Network machinery now has lower tech requirements across the board. + - tweak: Network broadcasters now have their signal strength scale with the rating + of installed microlasers. + - rscadd: Computer networks are now able to communicate over PLEXUS. + - rscadd: Adds PLEXUS uplinks, machinery which allows devices to connect to PLEXUS + in conjunction with a PLEXUS repeater. + - tweak: Network signal simulation has been adjusted slightly. Connection strengths + should be comparable with old setups. +2022-06-25: + MistakeNot4892: + - tweak: Species previews are no longer naked. +2022-07-01: + MistakeNot4892: + - tweak: Construction skill will now speed up some tool interactions. +2022-07-25: + PsyCommando: + - tweak: More things are now considered pens. Like the flashlight pen. From 00dbd3eb09705e6791e419b94b3615af5ad173f3 Mon Sep 17 00:00:00 2001 From: jade-lavenza Date: Wed, 27 Jul 2022 20:08:27 -0500 Subject: [PATCH 0229/1518] Fix bugfix prefix in PR template --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 67ac1eca98f..15f4a756de8 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -21,7 +21,7 @@ add: Added more things del: Removed old things tweak: tweaked a few things balance: rebalanced something -fix: fixed a few things +bugfix: fixed a few things soundadd: added a new sound thingy sounddel: removed an old sound thingy imageadd: added some icons and images From 5bd1ab61ef8fc96985ee9ef47e2aa903d03a7c53 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 29 Jul 2022 00:56:05 +0000 Subject: [PATCH 0230/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 7 ------- 1 file changed, 7 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index b2a08fd844e..bc088ee9f35 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -142,13 +142,6 @@

      MistakeNot4892 updated:

      • Ported Skrell from Stella and added to the Bay alien roster.
      - -

      26 May 2022

      -

      quardbreak updated:

      -
        -
      • Progress bars use gradient function for transit animation now.
      • -
      • Failure animation for progress bars has been removed.
      • -
    From 8a09410eb0f554d629249cc5ac6099712d893305 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Thu, 28 Jul 2022 18:29:59 -0400 Subject: [PATCH 0231/1518] Fixed update_inv_wear_mask by merging with other implementation * The two implementation of /mob/living/carbon/human/update_inv_wear_mask(update_icons) were preventing the mob icon to be updated properly when putting on and then removing a mask, like a balaclava. So merged them together on the advice of lohikar. --- code/modules/mob/living/carbon/human/inventory.dm | 10 ---------- code/modules/mob/living/carbon/human/update_icons.dm | 8 ++++++++ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 7751875459c..90cb7cdf582 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -76,14 +76,6 @@ This saves us from having to call add_fingerprint() any time something is put in else return has_organ(slot) -/mob/living/carbon/human/update_inv_wear_mask(update_icons) - update_hair(0) //rebuild hair - update_inv_ears(0) - var/obj/item/clothing/mask/head = src.get_equipped_item(slot_head_str) - if(!(head && (head.item_flags & ITEM_FLAG_AIRTIGHT))) - set_internals(null) - . = ..() - /mob/living/carbon/human/u_equip(obj/W) . = ..() if(!.) @@ -115,8 +107,6 @@ This saves us from having to call add_fingerprint() any time something is put in if(istype(W, /obj/item)) var/obj/item/I = W if(I.flags_inv & (HIDEMASK|BLOCKHAIR|BLOCKHEADHAIR)) - update_hair(0) //rebuild hair - update_inv_ears(0) update_inv_wear_mask(0) if(src) var/obj/item/clothing/mask/mask = src.get_equipped_item(slot_wear_mask_str) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 6efa5326955..c3663856597 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -648,6 +648,14 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/update_inv_wear_mask(var/update_icons=1) var/obj/item/mask = get_equipped_item(slot_wear_mask_str) var/obj/item/head = get_equipped_item(slot_head_str) + update_hair(0) //rebuild hair + update_inv_ears(0) + + if(!(head && (head.item_flags & ITEM_FLAG_AIRTIGHT))) + set_internals(null) + if(!(mask && (mask.item_flags & ITEM_FLAG_AIRTIGHT))) + set_internals(null) + if(mask && !(head && head.flags_inv & HIDEMASK)) overlays_standing[HO_FACEMASK_LAYER] = mask.get_mob_overlay(src,slot_wear_mask_str) else From 1d5eeca3ba63d0b892f69991cc0cbac75f940b55 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Thu, 28 Jul 2022 18:30:48 -0400 Subject: [PATCH 0232/1518] Fix missing top hat head slot icon_state missing --- icons/clothing/head/tophat.dmi | Bin 661 -> 658 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/clothing/head/tophat.dmi b/icons/clothing/head/tophat.dmi index dc92441cbb7f469cc388bc0deecf2ba979176795..4c467bd6a055c120774ccc5a60f496e5efe923ff 100644 GIT binary patch delta 178 zcmV;j08Rgu1(F4jd4HUGR9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5; z&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HT zOe;#vO@*-GsxtG+Qu9jkiz*4K%qY!G%*)SAQAo;9snjjb$tEv}&qz%~vcZICeMRvZ giFst{%)zTuS;5uM1sqrada_+vJ96%>vmpU=0VP^g!~g&Q delta 181 zcmV;m080Oo1(gMmd4HdJR9JLGWpiV4X>fFDZ*Bkpc$}S(%L>9U5JlI?SA=%0_~_P+ zv`82B7fNKJ8E7+QGPd;Z4Hk4G3hwTKb2c|O$Ldr!raaerbR3a_IhbO-(P}~vpJ2b! z$~(MySs;oPmu5B*caUiX$T9I&t1H{yE&F9*7+nzJ`KKu~cquDyt@y0@dv60FmsIDX+Ud=+9szU#L}^t0 From 9ed760980b29bff40b11e000c3430e1b341a7e7b Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Thu, 28 Jul 2022 20:24:10 -0400 Subject: [PATCH 0233/1518] Adjusted flag_inv and bodypart covered for lots of hats * Several hats wouldn't hide people's hair correctly. * Several hats would hide people's facial hair for no reasons. * A lot of hats would be marked as not covering the head and in doing so would bypass some of their effects like shock resistance and etc. So made them cover the head unless they obviously didn't in their sprite. --- .../wizard/servant_items/caretaker.dm | 2 +- .../gamemodes/wizard/servant_items/fiend.dm | 2 +- .../wizard/servant_items/overseer.dm | 2 +- code/modules/clothing/head/_head.dm | 1 + code/modules/clothing/head/collectable.dm | 20 ++++++------- code/modules/clothing/head/earmuffs.dm | 1 + code/modules/clothing/head/fated_key.dm | 2 +- code/modules/clothing/head/hardhat.dm | 4 +-- code/modules/clothing/head/headphones.dm | 2 +- code/modules/clothing/head/helmet.dm | 7 ++--- code/modules/clothing/head/jobs.dm | 9 +++--- code/modules/clothing/head/misc.dm | 29 ++++--------------- code/modules/clothing/head/misc_special.dm | 4 ++- code/modules/clothing/masks/boxing.dm | 1 - .../modules/clothing/spacesuits/spacesuits.dm | 3 +- code/modules/clothing/suits/bio.dm | 4 +-- code/modules/clothing/suits/miscellaneous.dm | 2 +- code/modules/clothing/suits/toggles.dm | 4 +-- code/modules/clothing/suits/utility.dm | 12 ++++---- .../corporate/clothing/head/captain.dm | 2 +- 20 files changed, 47 insertions(+), 66 deletions(-) diff --git a/code/game/gamemodes/wizard/servant_items/caretaker.dm b/code/game/gamemodes/wizard/servant_items/caretaker.dm index 7da680d7cd8..45f0d2e6189 100644 --- a/code/game/gamemodes/wizard/servant_items/caretaker.dm +++ b/code/game/gamemodes/wizard/servant_items/caretaker.dm @@ -10,7 +10,7 @@ rad = ARMOR_RAD_SHIELDED ) bodytype_equip_flags = BODY_FLAG_HUMANOID - flags_inv = HIDEEARS | BLOCKHAIR + flags_inv = HIDEEARS | BLOCKHEADHAIR /obj/item/clothing/suit/caretakercloak name = "holy cloak" diff --git a/code/game/gamemodes/wizard/servant_items/fiend.dm b/code/game/gamemodes/wizard/servant_items/fiend.dm index 885756d04a0..6a163d3aaa6 100644 --- a/code/game/gamemodes/wizard/servant_items/fiend.dm +++ b/code/game/gamemodes/wizard/servant_items/fiend.dm @@ -10,7 +10,7 @@ rad = ARMOR_RAD_SHIELDED ) bodytype_equip_flags = BODY_FLAG_HUMANOID - flags_inv = HIDEEARS | BLOCKHAIR + flags_inv = HIDEEARS | BLOCKHEADHAIR /obj/item/clothing/suit/fiendcowl name = "fiend's cowl" diff --git a/code/game/gamemodes/wizard/servant_items/overseer.dm b/code/game/gamemodes/wizard/servant_items/overseer.dm index dea08b030b8..726e1301811 100644 --- a/code/game/gamemodes/wizard/servant_items/overseer.dm +++ b/code/game/gamemodes/wizard/servant_items/overseer.dm @@ -13,7 +13,7 @@ max_pressure_protection = FIRESUIT_MAX_PRESSURE min_pressure_protection = 0 bodytype_equip_flags = BODY_FLAG_HUMANOID - flags_inv = HIDEEARS | BLOCKHAIR + flags_inv = HIDEEARS | BLOCKHEADHAIR /obj/item/clothing/suit/straight_jacket/overseercloak name = "grim cloak" diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 2b03c199a25..086f7c046aa 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -6,6 +6,7 @@ slot_flags = SLOT_HEAD w_class = ITEM_SIZE_SMALL blood_overlay_type = "helmetblood" + flags_inv = BLOCKHEADHAIR var/protects_against_weather = FALSE var/image/light_overlay_image diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index dce4cd67794..fad555a3109 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -4,17 +4,19 @@ /obj/item/clothing/head/collectable name = "collectable hat" desc = "A rare collectable hat." - + armor = null /obj/item/clothing/head/collectable/petehat name = "ultra rare hat" desc = "an ultra rare hat. It commands a certain respect." icon = 'icons/clothing/head/pete.dmi' + /obj/item/clothing/head/collectable/xenom name = "collectable alien monster helmet!" desc = "Hiss hiss hiss!" icon = 'icons/clothing/head/xeno.dmi' - body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES + body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES|SLOT_EARS + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR /obj/item/clothing/head/collectable/chef name = "collectable chef's hat" @@ -25,32 +27,27 @@ name = "collectable paper hat" desc = "What looks like an ordinary paper hat, is actually a rare and valuable collector's edition paper hat. Keep away from water, fire and Librarians." icon = 'icons/clothing/head/paper.dmi' - body_parts_covered = 0 /obj/item/clothing/head/collectable/tophat name = "collectable top hat" desc = "A top hat worn by only the most prestigious hat collectors." icon = 'icons/clothing/head/tophat.dmi' - body_parts_covered = 0 /obj/item/clothing/head/collectable/captain name = "collectable captain's hat" desc = "A Collectable Hat that'll make you look just like a real comdom!" icon = 'icons/clothing/head/captain.dmi' - body_parts_covered = 0 /obj/item/clothing/head/collectable/police name = "collectable police officer's hat" desc = "A Collectable Police Officer's Hat. This hat emphasizes that you are THE LAW." icon = 'icons/clothing/head/warden.dmi' - body_parts_covered = 0 /obj/item/clothing/head/collectable/beret name = "collectable beret" desc = "A Collectable red Beret. It smells faintly of Garlic." icon = 'icons/clothing/head/beret.dmi' color = COLOR_NT_RED - body_parts_covered = 0 /obj/item/clothing/head/collectable/welding name = "collectable welding helmet" @@ -58,27 +55,32 @@ icon = 'icons/clothing/head/welding/default.dmi' w_class = ITEM_SIZE_NORMAL body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES + flags_inv = HIDEMASK|HIDEEYES|HIDEFACE /obj/item/clothing/head/collectable/slime name = "collectable slime hat" desc = "Just like a real Brain Slug!" icon = 'icons/clothing/head/brainslime.dmi' + flags_inv = 0 + body_parts_covered = 0 + /obj/item/clothing/head/collectable/pirate name = "collectable pirate hat" desc = "You'd make a great Dread Syndie Roberts!" icon = 'icons/clothing/head/pirate.dmi' - body_parts_covered = 0 /obj/item/clothing/head/collectable/kitty name = "collectable kitty ears" desc = "The fur feels.....a bit too realistic." icon = 'icons/clothing/head/cat.dmi' + flags_inv = 0 body_parts_covered = 0 /obj/item/clothing/head/collectable/rabbitears name = "collectable rabbit ears" desc = "Not as lucky as the feet!" icon = 'icons/clothing/head/bunny.dmi' + flags_inv = 0 body_parts_covered = 0 /obj/item/clothing/head/collectable/wizard @@ -91,13 +93,11 @@ desc = "WARNING! Offers no real protection, or luminosity, but it is damn fancy!" icon = 'icons/clothing/head/hardhat/yellow.dmi' w_class = ITEM_SIZE_NORMAL - body_parts_covered = 0 /obj/item/clothing/head/collectable/HoS name = "collectable HoS hat" desc = "Now you can beat prisoners, set silly sentences and arrest for no reason too!" icon = 'icons/clothing/head/hos.dmi' - body_parts_covered = 0 /obj/item/clothing/head/collectable/thunderdome name = "collectable Thunderdome helmet" diff --git a/code/modules/clothing/head/earmuffs.dm b/code/modules/clothing/head/earmuffs.dm index 79e5db01028..87010938248 100644 --- a/code/modules/clothing/head/earmuffs.dm +++ b/code/modules/clothing/head/earmuffs.dm @@ -6,3 +6,4 @@ volume_multiplier = 0.1 body_parts_covered = SLOT_HEAD|SLOT_EARS gender = PLURAL + flags_inv = 0 diff --git a/code/modules/clothing/head/fated_key.dm b/code/modules/clothing/head/fated_key.dm index aa96008a6e5..fdf91b10c5d 100644 --- a/code/modules/clothing/head/fated_key.dm +++ b/code/modules/clothing/head/fated_key.dm @@ -1,10 +1,10 @@ /obj/item/clothing/head/fated name = "strange key" desc = "A glowing key, uncomfortably hot to the touch." - icon = 'icons/clothing/head/fated_key.dmi' body_parts_covered = 0 armor = list(melee = 55, bullet = 55, laser = 55, energy = 55, bomb = 55, bio = 100, rad = 100) + flags_inv = 0 /obj/item/clothing/head/fated/equipped(mob/living/user, slot) . = ..() diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 6bf9b27f8c1..0ddf9253482 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -1,7 +1,6 @@ /obj/item/clothing/head/hardhat name = "hard hat" desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight." - icon = 'icons/clothing/head/hardhat/yellow.dmi' action_button_name = "Toggle Headlamp" brightness_on = 4 //luminosity when on @@ -16,7 +15,6 @@ bio = ARMOR_BIO_MINOR, rad = ARMOR_RAD_MINOR ) - flags_inv = 0 siemens_coefficient = 0.9 light_wedge = LIGHT_WIDE heat_protection = SLOT_HEAD @@ -71,7 +69,7 @@ name = "damage control helmet" desc = "A helmet commonly used by engineers and first responders throughout the human space. Comes with a built-in flashlight." icon = 'icons/clothing/head/hardhat/damage_control.dmi' - flags_inv = HIDEEARS|BLOCKHAIR + flags_inv = HIDEEARS|BLOCKHEADHAIR /obj/item/clothing/head/hardhat/ems/dc_light name = "light damage control helmet" diff --git a/code/modules/clothing/head/headphones.dm b/code/modules/clothing/head/headphones.dm index b2cac84816b..341dbf68641 100644 --- a/code/modules/clothing/head/headphones.dm +++ b/code/modules/clothing/head/headphones.dm @@ -6,7 +6,7 @@ volume_multiplier = 0.5 body_parts_covered = SLOT_HEAD|SLOT_EARS gender = PLURAL - + flags_inv = 0 var/headphones_on = 0 var/sound_channel var/current_track diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 989ae8ee0c3..26d58170db1 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -1,7 +1,6 @@ /obj/item/clothing/head/helmet name = "helmet" desc = "Reinforced headgear. Protects the head from impacts." - icon = 'icons/clothing/head/armor/helmet.dmi' valid_accessory_slots = list(ACCESSORY_SLOT_HELM_C) restricted_accessory_slots = list(ACCESSORY_SLOT_HELM_C) @@ -167,7 +166,7 @@ desc = "Ave, Imperator, morituri te salutant." icon = 'icons/clothing/head/armor/gladiator.dmi' valid_accessory_slots = null - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|BLOCKHAIR + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|BLOCKHEADHAIR body_parts_covered = SLOT_HEAD|SLOT_FACE siemens_coefficient = 1 @@ -183,8 +182,8 @@ energy = ARMOR_ENERGY_RESISTANT, bomb = ARMOR_BOMB_PADDED ) - flags_inv = HIDEEARS|HIDEEYES - body_parts_covered = SLOT_HEAD|SLOT_EYES|BLOCKHEADHAIR + flags_inv = HIDEEARS|HIDEEYES|BLOCKHEADHAIR + body_parts_covered = SLOT_HEAD|SLOT_EYES cold_protection = SLOT_HEAD min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE siemens_coefficient = 0.5 diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 5ebabdbcedb..688cb192576 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -32,16 +32,16 @@ name = "chaplain's hood" desc = "It's hood that covers the head. It keeps you warm during the space winters." icon = 'icons/clothing/head/chaplain.dmi' - flags_inv = BLOCKHAIR - body_parts_covered = SLOT_HEAD + flags_inv = HIDEEARS|BLOCKHEADHAIR + body_parts_covered = SLOT_HEAD|SLOT_EARS //Chaplain /obj/item/clothing/head/nun_hood name = "nun hood" desc = "Maximum piety in this star system." icon = 'icons/clothing/head/nun.dmi' - flags_inv = BLOCKHAIR - body_parts_covered = SLOT_HEAD + flags_inv = HIDEEARS|BLOCKHEADHAIR + body_parts_covered = SLOT_HEAD|SLOT_EARS //Medical /obj/item/clothing/head/surgery @@ -88,7 +88,6 @@ desc = "A beret, an artists favorite headwear." icon = 'icons/clothing/head/beret.dmi' color = COLOR_NT_RED - body_parts_covered = 0 /obj/item/clothing/head/beret/purple name = "purple beret" diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 2d434ca9913..9512e354339 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -11,6 +11,7 @@ desc = "Smells nice." slot_flags = SLOT_HEAD | SLOT_EARS body_parts_covered = 0 + flags_inv = 0 /obj/item/clothing/head/hairflower/blue icon = 'icons/clothing/head/hairflower/pink.dmi' @@ -27,18 +28,17 @@ name = "powdered wig" desc = "A powdered wig." icon = 'icons/clothing/head/powderd_wig.dmi' + /obj/item/clothing/head/that name = "top-hat" desc = "It's an amish looking hat." icon = 'icons/clothing/head/tophat.dmi' siemens_coefficient = 0.9 - body_parts_covered = 0 /obj/item/clothing/head/redcoat name = "redcoat's hat" icon = 'icons/clothing/head/redcoat.dmi' desc = "'I guess it's a redhead.'" - body_parts_covered = 0 /obj/item/clothing/head/plaguedoctorhat name = "plague doctor's hat" @@ -46,13 +46,12 @@ icon = 'icons/clothing/head/plague.dmi' permeability_coefficient = 0.01 siemens_coefficient = 0.9 - body_parts_covered = 0 /obj/item/clothing/head/hasturhood name = "hastur's hood" desc = "It's unspeakably stylish." icon = 'icons/clothing/head/hastur.dmi' - flags_inv = BLOCKHAIR + flags_inv = BLOCKHEADHAIR body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES /obj/item/clothing/head/nursehat @@ -60,7 +59,6 @@ desc = "It allows quick identification of trained medical personnel." icon = 'icons/clothing/head/nurse.dmi' siemens_coefficient = 0.9 - body_parts_covered = 0 /obj/item/clothing/head/cardborg name = "cardborg helmet" @@ -78,6 +76,7 @@ desc = "Wearing these makes you looks useless, and only good for your sex appeal." icon = 'icons/clothing/head/bunny.dmi' body_parts_covered = 0 + flags_inv = 0 /obj/item/clothing/head/flatcap name = "flat cap" @@ -89,19 +88,16 @@ name = "pirate hat" desc = "Yarr." icon = 'icons/clothing/head/pirate.dmi' - body_parts_covered = 0 /obj/item/clothing/head/hgpiratecap name = "pirate hat" desc = "Yarr." icon = 'icons/clothing/head/pirate_cap.dmi' - body_parts_covered = 0 /obj/item/clothing/head/bandana name = "pirate bandana" desc = "Yarr." icon = 'icons/clothing/head/bandana/pirate.dmi' - body_parts_covered = 0 /obj/item/clothing/head/bandana/green name = "green bandana" @@ -150,7 +146,6 @@ name = "witch costume wig" desc = "Eeeee~heheheheheheh!" icon = 'icons/clothing/head/wizard/marisa.dmi' - flags_inv = BLOCKHAIR siemens_coefficient = 2.0 /obj/item/clothing/head/chicken @@ -165,7 +160,6 @@ name = "bear pelt hat" desc = "Fuzzy." icon = 'icons/clothing/head/bearpelt.dmi' - flags_inv = BLOCKHAIR siemens_coefficient = 0.7 /obj/item/clothing/head/xenos @@ -175,54 +169,44 @@ w_class = ITEM_SIZE_NORMAL flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR siemens_coefficient = 2.0 - body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES + body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES|SLOT_EARS /obj/item/clothing/head/philosopher_wig name = "natural philosopher's wig" desc = "A stylish monstrosity unearthed from Earth's Renaissance period. With this most distinguish'd wig, you'll be ready for your next soiree!" icon = 'icons/clothing/head/huge_wig.dmi' - flags_inv = BLOCKHAIR - body_parts_covered = 0 /obj/item/clothing/head/hijab name = "hijab" desc = "A veil which is wrapped to cover the head and chest." icon = 'icons/clothing/head/hijab.dmi' - body_parts_covered = 0 - flags_inv = BLOCKHAIR + body_parts_covered = SLOT_HEAD|SLOT_EARS /obj/item/clothing/head/kippa name = "kippa" desc = "A small, brimless cap." icon = 'icons/clothing/head/kippa.dmi' - body_parts_covered = 0 /obj/item/clothing/head/turban name = "turban" desc = "A sturdy cloth, worn around the head." icon = 'icons/clothing/head/turban.dmi' - body_parts_covered = 0 - flags_inv = BLOCKHEADHAIR //Shows beards! /obj/item/clothing/head/cowboy_hat name = "cowboy hat" desc = "A wide-brimmed hat, in the prevalent style of America's frontier period. By law, you are required to wear this hat while watching True Grit." icon = 'icons/clothing/head/cowboy.dmi' - body_parts_covered = 0 protects_against_weather = TRUE /obj/item/clothing/head/taqiyah name = "taqiyah" desc = "A short, rounded skullcap usually worn for religious purposes." icon = 'icons/clothing/head/taqiyah.dmi' - body_parts_covered = 0 /obj/item/clothing/head/rastacap name = "rastacap" desc = "A round, crocheted cap, often worn to tuck hair away or for religious purposes." icon = 'icons/clothing/head/rasta.dmi' - body_parts_covered = 0 - flags_inv = BLOCKHEADHAIR /obj/item/clothing/head/tank name = "padded cap" @@ -245,7 +229,6 @@ name = "beanie" desc = "A head-hugging brimless winter cap. This one is tight." icon = 'icons/clothing/head/beanie.dmi' - body_parts_covered = 0 /obj/item/clothing/head/helmet/facecover name = "face cover" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 717ca1849fe..7758fc996d1 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -109,7 +109,7 @@ icon_state = ICON_STATE_WORLD icon = 'icons/clothing/head/ushanka.dmi' flags_inv = HIDEEARS|BLOCKHEADHAIR - cold_protection = SLOT_HEAD + cold_protection = SLOT_HEAD | SLOT_EARS min_cold_protection_temperature = HELMET_MIN_COLD_PROTECTION_TEMPERATURE var/up = FALSE @@ -155,6 +155,8 @@ icon = 'icons/clothing/head/cat.dmi' body_parts_covered = 0 siemens_coefficient = 1.5 + flags_inv = 0 + armor = null /obj/item/clothing/head/richard name = "chicken mask" diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 2187a036918..5b0dfc177e0 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -14,7 +14,6 @@ /obj/item/clothing/mask/balaclava/tactical name = "green balaclava" icon = 'icons/clothing/mask/swat_mask.dmi' - material = /decl/material/solid/cloth /obj/item/clothing/mask/luchador name = "Luchador Mask" diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index ca09c6540de..0f83a8c0047 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -7,7 +7,6 @@ desc = "A special helmet designed for work in a hazardous, low-pressure environment." icon = 'icons/clothing/spacesuit/generic/helmet.dmi' item_flags = ITEM_FLAG_THICKMATERIAL | ITEM_FLAG_AIRTIGHT - flags_inv = BLOCKHAIR permeability_coefficient = 0 armor = list( bio = ARMOR_BIO_SHIELDED, @@ -75,7 +74,7 @@ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR else flash_protection = FLASH_PROTECTION_NONE - flags_inv = HIDEEARS|BLOCKHAIR + flags_inv = HIDEEARS|BLOCKHEADHAIR update_icon() update_clothing_icon() diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 7674b586f4b..e7d37a07a58 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -8,9 +8,9 @@ bio = ARMOR_BIO_SHIELDED, rad = ARMOR_RAD_MINOR ) - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|BLOCKHAIR + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR item_flags = ITEM_FLAG_THICKMATERIAL - body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES + body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES|SLOT_EARS siemens_coefficient = 0.9 origin_tech = "{'materials':3, 'engineering':3}" matter = list( diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 153b76f05be..d3ad334f4a9 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -306,7 +306,7 @@ name = "Santa's hat" desc = "Ho ho ho. Merrry X-mas!" icon = 'icons/clothing/head/santa.dmi' - flags_inv = BLOCKHAIR + flags_inv = BLOCKHAIR //Has a fake beard /obj/item/clothing/suit/santa name = "Santa's suit" diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 07e9578e2e5..f825d8d6eb1 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -91,7 +91,7 @@ icon = 'icons/clothing/head/hood_winter.dmi' body_parts_covered = SLOT_HEAD cold_protection = SLOT_HEAD - flags_inv = HIDEEARS | BLOCKHAIR + flags_inv = HIDEEARS | BLOCKHEADHAIR min_cold_protection_temperature = ARMOR_MIN_COLD_PROTECTION_TEMPERATURE protects_against_weather = TRUE @@ -173,4 +173,4 @@ body_parts_covered = SLOT_HEAD min_cold_protection_temperature = T0C - 20 cold_protection = SLOT_HEAD - flags_inv = HIDEEARS | BLOCKHAIR + flags_inv = HIDEEARS | BLOCKHEADHAIR diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index ba568a06069..5665fbec958 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -51,8 +51,8 @@ energy = ARMOR_ENERGY_RESISTANT, bomb = ARMOR_BOMB_SHIELDED ) - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|BLOCKHAIR - body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES + flags_inv = HIDEMASK|HIDEEARS|BLOCKHEADHAIR + body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES|SLOT_EARS siemens_coefficient = 0 /obj/item/clothing/suit/bomb_suit @@ -94,8 +94,8 @@ name = "radiation hood" desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation." icon = 'icons/clothing/head/radsuit.dmi' - flags_inv = BLOCKHAIR - body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR + body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES|SLOT_EARS armor = list( bio = ARMOR_BIO_RESISTANT, rad = ARMOR_RAD_SHIELDED @@ -144,9 +144,9 @@ bio = ARMOR_BIO_RESISTANT, rad = ARMOR_RAD_MINOR ) - flags_inv = HIDEEARS|HIDEEYES|BLOCKHAIR + flags_inv = HIDEEARS|BLOCKHEADHAIR item_flags = ITEM_FLAG_THICKMATERIAL - body_parts_covered = SLOT_HEAD + body_parts_covered = SLOT_HEAD|SLOT_EARS siemens_coefficient = 0.9 matter = list( /decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT, diff --git a/mods/content/corporate/clothing/head/captain.dm b/mods/content/corporate/clothing/head/captain.dm index 0091da2ffc9..93d470cc476 100644 --- a/mods/content/corporate/clothing/head/captain.dm +++ b/mods/content/corporate/clothing/head/captain.dm @@ -5,7 +5,7 @@ item_flags = 0 max_pressure_protection = VOIDSUIT_MAX_PRESSURE min_pressure_protection = 0 - flags_inv = HIDEFACE|BLOCKHAIR + flags_inv = HIDEEARS|HIDEEYES|BLOCKHEADHAIR permeability_coefficient = 0.01 armor = list( melee = ARMOR_MELEE_MAJOR, From e8f188011bb60fb96985c3235d1a08b92261d6b2 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Thu, 28 Jul 2022 20:26:15 -0400 Subject: [PATCH 0234/1518] Tweaked hat base class * Made the /obj/item/clothing/head class have some of the shared values used in many other hats. --- code/modules/clothing/head/_head.dm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 086f7c046aa..6decb705c48 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -1,12 +1,12 @@ /obj/item/clothing/head - name = "head" - icon_state = ICON_STATE_WORLD - icon = 'icons/clothing/head/softcap.dmi' - body_parts_covered = SLOT_HEAD - slot_flags = SLOT_HEAD - w_class = ITEM_SIZE_SMALL - blood_overlay_type = "helmetblood" + name = "head" + icon_state = ICON_STATE_WORLD + icon = 'icons/clothing/head/softcap.dmi' + blood_overlay_type = "helmetblood" + w_class = ITEM_SIZE_SMALL flags_inv = BLOCKHEADHAIR + slot_flags = SLOT_HEAD + body_parts_covered = SLOT_HEAD var/protects_against_weather = FALSE var/image/light_overlay_image From 6a1dcd035e5c940b65cf582e3722a057726fa7c0 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 1 Aug 2022 00:59:56 +0000 Subject: [PATCH 0235/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index bc088ee9f35..1804e99ab78 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -136,12 +136,6 @@

    SolatK updated:

    • Airlock components panel now opens with wrench
    - -

    30 May 2022

    -

    MistakeNot4892 updated:

    -
      -
    • Ported Skrell from Stella and added to the Bay alien roster.
    • -
    From 365f5e345eaecdecf307d20961a37ec9a88e3d37 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Mon, 1 Aug 2022 13:45:05 -0400 Subject: [PATCH 0236/1518] Update client_helpers.dm Allow mind datum to return their client with get_client() --- code/modules/client/client_helpers.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/client/client_helpers.dm b/code/modules/client/client_helpers.dm index 9d2d882d1a6..b4f81a41634 100644 --- a/code/modules/client/client_helpers.dm +++ b/code/modules/client/client_helpers.dm @@ -1,6 +1,9 @@ /datum/proc/get_client() return null +/datum/mind/get_client() + return current?.client + /client/get_client() return src From 7df77320c96458faf2a69f6cf4bd622a40a77d05 Mon Sep 17 00:00:00 2001 From: NataKilar Date: Mon, 1 Aug 2022 21:26:57 -0400 Subject: [PATCH 0237/1518] Updates math for stirling engine. --- code/modules/power/stirling.dm | 90 +++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 40 deletions(-) diff --git a/code/modules/power/stirling.dm b/code/modules/power/stirling.dm index 3b15b4ec420..c5d848ae494 100644 --- a/code/modules/power/stirling.dm +++ b/code/modules/power/stirling.dm @@ -1,4 +1,4 @@ -#define HEAT_TRANSFER 5000 +#define HEAT_TRANSFER 300 #define MAX_FREQUENCY 60 #define MIN_DELTA_T 5 @@ -21,7 +21,7 @@ var/cycle_frequency = MAX_FREQUENCY/2 var/active = FALSE - var/max_power = 100000 + var/max_power = 150000 var/genlev = 0 var/last_genlev @@ -39,14 +39,19 @@ /obj/machinery/atmospherics/binary/stirling/Process() ..() - // Some temperature equilibrium between the gas lines. - var/air1_eq = air1.get_thermal_energy_change(air2.temperature) - var/air2_eq = air2.get_thermal_energy_change(air1.temperature) + var/line1_heatcap = air1.heat_capacity() + var/line2_heatcap = air2.heat_capacity() + + var/delta_t = air1.temperature - air2.temperature - var/heat_transfer = clamp(HEAT_TRANSFER*(air1.temperature - air2.temperature), min(air1_eq, air2_eq), max(air1_eq, air2_eq)) - if(heat_transfer) - air1.add_thermal_energy(-heat_transfer) - air2.add_thermal_energy(heat_transfer) + // Absolute value of the heat transfer required to bring both lines in equilibrium. + var/line_equilibrium_heat = ((line1_heatcap*line2_heatcap)/(line1_heatcap + line2_heatcap))*abs(delta_t) + + // Some passive equilibrium between the lines. + var/passive_heat_transfer = min(HEAT_TRANSFER*abs(delta_t), line_equilibrium_heat) + + air1.add_thermal_energy(-sign(delta_t)*passive_heat_transfer) + air2.add_thermal_energy(sign(delta_t)*passive_heat_transfer) if(!istype(inserted_cylinder)) return @@ -55,14 +60,12 @@ var/datum/gas_mixture/working_volume = inserted_cylinder.air_contents - if((stat & BROKEN) || !air1.total_moles || !air2.total_moles || !working_volume?.total_moles) + if((stat & BROKEN) || !air1.total_moles || !air2.total_moles || !working_volume?.total_moles || !working_volume?.return_pressure()) stop_engine() return // A rough approximation of a Stirling cycle with perfect regeneration e.g. Carnot efficiency. var/working_heatcap = working_volume.heat_capacity() - var/line1_heatcap = air1.heat_capacity() - var/line2_heatcap = air2.heat_capacity() // Bring the internal tank in thermal equilibrium with the hottest line. The temperature/pressure // is kept at the maximum constantly. @@ -77,38 +80,44 @@ working_volume.add_thermal_energy(equil_transfer) + // Redefine in case there was a change from passive heat transfer. + delta_t = air1.temperature - air2.temperature + line_equilibrium_heat = ((line1_heatcap*line2_heatcap)/(line1_heatcap + line2_heatcap))*abs(delta_t) + // The cycle requires a minimum temperature to overcome friction. - if(abs(air1.temperature - air2.temperature) < MIN_DELTA_T) + if(abs(delta_t) < MIN_DELTA_T) if(skipped_cycle) // Allow some leeway since networks can take some time to update. stop_engine() skipped_cycle = TRUE return skipped_cycle = FALSE - // Positive/negative Work from volume expansion/compression. Maximum volume is 1.5 tank volume. The volume of the tank is not actually adjusted. + // Positive/negative work from volume expansion/compression. Maximum volume is 1.5 tank volume. The volume of the tank is not actually adjusted. var/work_coefficient = working_volume.get_total_moles()*R_IDEAL_GAS_EQUATION*log(1.5) - var/work_done = work_coefficient*abs(air1.temperature - air2.temperature)*cycle_frequency // Direction of heat flow, 1 for air1 -> air 2, -1 for air2 -> air 1 - var/heat_dir = air1.temperature > air2.temperature ? 1 : -1 + var/heat_dir = sign(delta_t) - var/air1_dq = -heat_dir*work_coefficient*air1.temperature*cycle_frequency - var/air2_dq = heat_dir*work_coefficient*air2.temperature*cycle_frequency + // We multiply by the cycle frequency to get reasonable values for power generation. + // Energy is still conserved, but the efficiency of the engine is slightly overestimated. + + // The hot line and cold line will not receive or give more than the heat required to reach equilibrium. + var/air1_dq = -heat_dir*min(work_coefficient*air1.temperature*cycle_frequency, line_equilibrium_heat) + var/air2_dq = heat_dir*min(work_coefficient*air2.temperature*cycle_frequency, line_equilibrium_heat) + + var/work_done = -(air1_dq + air2_dq) var/power_generated = 0.75*work_done // Excessive power is transferred as heat to the cooler side, reducing efficiency. if(power_generated > max_power) if(heat_dir == 1) - air2_dq += 0.75*(max_power - power_generated) + air2_dq += 0.85*(max_power - power_generated) else - air1_dq += 0.75*(max_power - power_generated) + air1_dq += 0.85*(max_power - power_generated) power_generated = max_power if(prob(5)) spark_at(src, cardinal_only = TRUE) - air1.add_thermal_energy(air1_dq) - air2.add_thermal_energy(air2_dq) - generate_power(power_generated) last_gen = power_generated genlev = max(0, min(round(4*power_generated / max_power), 4)) @@ -122,8 +131,8 @@ . = ..() if(distance > 1) return - - to_chat(user, "\The [src] is generating [round(last_gen/1000, 0.1)] kW") + if(active) + to_chat(user, "\The [src] is generating [round(last_gen/1000, 0.1)] kW") if(!inserted_cylinder) to_chat(user, "There is no piston cylinder inserted into \the [src].") @@ -138,24 +147,25 @@ update_icon() return TRUE - if(IS_CROWBAR(W) && inserted_cylinder) - inserted_cylinder.dropInto(get_turf(src)) - to_chat(user, SPAN_NOTICE("You remove \the [inserted_cylinder] from \the [src].")) - inserted_cylinder = null - stop_engine() - return TRUE + if(!panel_open) + if(IS_CROWBAR(W) && inserted_cylinder) + inserted_cylinder.dropInto(get_turf(src)) + to_chat(user, SPAN_NOTICE("You remove \the [inserted_cylinder] from \the [src].")) + inserted_cylinder = null + stop_engine() + return TRUE - if(panel_open && IS_WRENCH(W)) - var/target_frequency = input(user, "Enter the cycle frequency you would like \the [src] to operate at ([MAX_FREQUENCY/4] - [MAX_FREQUENCY] Hz)", "Stirling Frequency", cycle_frequency) as num | null - if(!CanPhysicallyInteract(user) || !target_frequency) - return - cycle_frequency = round(clamp(target_frequency, MAX_FREQUENCY/4, MAX_FREQUENCY)) - to_chat(usr, SPAN_NOTICE("You adjust \the [src] to operate at a frequency of [cycle_frequency] Hz.")) - return TRUE + if(IS_WRENCH(W)) + var/target_frequency = input(user, "Enter the cycle frequency you would like \the [src] to operate at ([MAX_FREQUENCY/4] - [MAX_FREQUENCY] Hz)", "Stirling Frequency", cycle_frequency) as num | null + if(!CanPhysicallyInteract(user) || !target_frequency) + return + cycle_frequency = round(clamp(target_frequency, MAX_FREQUENCY/4, MAX_FREQUENCY)) + to_chat(usr, SPAN_NOTICE("You adjust \the [src] to operate at a frequency of [cycle_frequency] Hz.")) + return TRUE . = ..() -/obj/machinery/atmospherics/binary/stirling/attack_hand(mob/user) +/obj/machinery/atmospherics/binary/stirling/physical_attack_hand(mob/user) if((stat & BROKEN) || active || panel_open) return ..() @@ -214,7 +224,7 @@ /obj/item/tank/stirling/Initialize() . = ..() - desc += "It's rated for temperatures up to [failure_temp] C." + desc += " It's rated for temperatures up to [failure_temp] C." /obj/item/tank/stirling/empty starting_pressure = list() From 4faa6733910a586e53f2dad43e62da316453d04c Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Tue, 2 Aug 2022 17:14:36 +1000 Subject: [PATCH 0238/1518] Automatic changelog generation for PR #2316 [ci skip] --- html/changelogs/AutoChangeLog-pr-2316.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2316.yml diff --git a/html/changelogs/AutoChangeLog-pr-2316.yml b/html/changelogs/AutoChangeLog-pr-2316.yml new file mode 100644 index 00000000000..9317c630069 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2316.yml @@ -0,0 +1,5 @@ +author: NataKilar +delete-after: true +changes: + - rscadd: Adds stirling engines to the game. These engines produce power from a + temperature differential of two gas sources. From 9d7cda10a085541782bd8470eddd232f035e6e3a Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Wed, 3 Aug 2022 00:54:45 +0000 Subject: [PATCH 0239/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 4 ++++ html/changelogs/AutoChangeLog-pr-2316.yml | 5 ----- 3 files changed, 10 insertions(+), 5 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2316.yml diff --git a/html/changelog.html b/html/changelog.html index 1804e99ab78..5a236a49a6d 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
    +

    03 August 2022

    +

    NataKilar updated:

    +
      +
    • Adds stirling engines to the game. These engines produce power from a temperature differential of two gas sources.
    • +
    +

    25 July 2022

    PsyCommando updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 3b672b11f2f..3e4cbe5af14 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14236,3 +14236,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2022-07-25: PsyCommando: - tweak: More things are now considered pens. Like the flashlight pen. +2022-08-03: + NataKilar: + - rscadd: Adds stirling engines to the game. These engines produce power from a + temperature differential of two gas sources. diff --git a/html/changelogs/AutoChangeLog-pr-2316.yml b/html/changelogs/AutoChangeLog-pr-2316.yml deleted file mode 100644 index 9317c630069..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2316.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: NataKilar -delete-after: true -changes: - - rscadd: Adds stirling engines to the game. These engines produce power from a - temperature differential of two gas sources. From 6fa3c10b915ea22f5153068115473efdb6b2e142 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 5 Aug 2022 00:58:35 +0000 Subject: [PATCH 0240/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 5a236a49a6d..97c11c216dc 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -136,12 +136,6 @@

      MistakeNot4892 updated:

      • Removes HULK, FAT and LASER mutations.
      - -

      03 June 2022

      -

      SolatK updated:

      -
        -
      • Airlock components panel now opens with wrench
      • -
    From 62b863c5d622bf79519799f83755710dcdc547b5 Mon Sep 17 00:00:00 2001 From: NataKilar Date: Wed, 3 Aug 2022 00:09:30 -0400 Subject: [PATCH 0241/1518] Network check_connection fix --- .../networking/device_types/_network_device.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/modular_computers/networking/device_types/_network_device.dm b/code/modules/modular_computers/networking/device_types/_network_device.dm index de6066e9339..f15f682d2f5 100644 --- a/code/modules/modular_computers/networking/device_types/_network_device.dm +++ b/code/modules/modular_computers/networking/device_types/_network_device.dm @@ -68,7 +68,7 @@ if(!net) // We should already be queued for reconnect if it went down, so do nothing. return FALSE - if(!net.devices_by_tag[network_tag] != src) + if(net.devices_by_tag[network_tag] != src) // The connection has failed but the network is still up, so we try to reconnect. if(!connect()) return FALSE From f12df68d5e271f6c727bebbb37eafb7e934fdde5 Mon Sep 17 00:00:00 2001 From: afterthought Date: Tue, 2 Aug 2022 22:04:26 -0400 Subject: [PATCH 0242/1518] Makes firedoors slightly more performant with area changing. --- code/game/area/areas.dm | 10 ++++++++++ code/game/machinery/doors/firedoor.dm | 2 -- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 5a90cfd2786..464d1b374d8 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -120,9 +120,19 @@ var/global/list/areas = list() for(var/obj/machinery/M in T) M.area_changed(old_area, A) // They usually get moved events, but this is the one way an area can change without triggering one. + T.update_registrations_on_adjacent_area_change() + for(var/direction in global.cardinal) + var/turf/adjacent_turf = get_step(T, direction) + if(adjacent_turf) + T.update_registrations_on_adjacent_area_change() + if(T.is_outside == OUTSIDE_AREA && T.is_outside() != old_outside) T.update_weather() +/turf/proc/update_registrations_on_adjacent_area_change() + for(var/obj/machinery/door/firedoor/door in src) + door.update_area_registrations() + /area/proc/alert_on_fall(var/mob/living/carbon/human/H) return diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index fc73e2858c5..9ec76fe1449 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -85,10 +85,8 @@ if(A && !(A in areas_added)) LAZYADD(A.all_doors, src) LAZYADD(areas_added, A) - events_repository.register(/decl/observ/exited, A, src, .proc/update_area_registrations) /obj/machinery/door/firedoor/proc/unregister_area(area/A) - events_repository.unregister(/decl/observ/exited, A, src) LAZYREMOVE(A.all_doors, src) LAZYREMOVE(areas_added, A) From 5488bf0f52e59ea07396313486444b9704f204e4 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 3 Aug 2022 10:44:37 +1000 Subject: [PATCH 0243/1518] Macroizes get_area(). --- code/_helpers/game.dm | 5 ----- code/_macros.dm | 2 ++ code/modules/admin/verbs/atmosdebug.dm | 6 ++++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index 2108b333cd2..c704ab64ca6 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -16,11 +16,6 @@ return TRUE return FALSE -/proc/get_area(O) - RETURN_TYPE(/area) - var/turf/loc = get_turf(O) - return loc?.loc - /proc/get_area_name(O) //get area's proper name var/area/A = get_area(O) return A?.proper_name diff --git a/code/_macros.dm b/code/_macros.dm index 4520907f8a7..6c97e8f0a76 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -7,6 +7,8 @@ #define get_turf(A) get_step(A,0) +#define get_area(A) (get_step(A, 0)?.loc) + #define get_x(A) (get_step(A, 0)?.x || 0) #define get_y(A) (get_step(A, 0)?.y || 0) diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index 9fceeab8370..19916f831e9 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -10,9 +10,11 @@ if (!PN.nodes || !PN.nodes.len) if(PN.cables && (PN.cables.len > 1)) var/obj/structure/cable/C = PN.cables[1] - to_chat(usr, "Powernet with no nodes! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [get_area(C.loc).proper_name]") + var/area/A = get_area(C.loc) + to_chat(usr, "Powernet with no nodes! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [A?.proper_name]") if (!PN.cables || (PN.cables.len < 10)) if(PN.cables && (PN.cables.len > 1)) var/obj/structure/cable/C = PN.cables[1] - to_chat(usr, "Powernet with fewer than 10 cables! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [get_area(C.loc).proper_name]") + var/area/A = get_area(C.loc) + to_chat(usr, "Powernet with fewer than 10 cables! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [A?.proper_name]") From 3066edb90184040d01b0c819623e9dc33734df66 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sat, 6 Aug 2022 00:48:39 +0000 Subject: [PATCH 0244/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 97c11c216dc..429fb53649f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -130,12 +130,6 @@

    gyurka66 updated:

  • Added SM to engineering
  • Removed 2 of 3 solars
  • - -

    04 June 2022

    -

    MistakeNot4892 updated:

    -
      -
    • Removes HULK, FAT and LASER mutations.
    • -
    From 04d08f41e73817359b6feb94752943cac2a2f798 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 7 Aug 2022 00:53:22 +0000 Subject: [PATCH 0245/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 8 -------- 1 file changed, 8 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 429fb53649f..1fa69e7eeb1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -122,14 +122,6 @@

    PsyCommando updated:

  • Config `expanded_alt_interactions` allows for various generic actions (look, grab, drop, rotate) to show up when alt-clicking.
  • Changed the handling sounds for several material stacks to something more fitting.
  • - -

    05 June 2022

    -

    gyurka66 updated:

    -
      -
    • Fixed the TEG icon
    • -
    • Added SM to engineering
    • -
    • Removed 2 of 3 solars
    • -
    From 7445d73fca7ce6ff963f29a027fb7d3fc4b11c37 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 8 Aug 2022 00:45:55 +0000 Subject: [PATCH 0246/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 1fa69e7eeb1..f5407269937 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -110,18 +110,6 @@

    PsyCommando updated:

    • Fixed how some tool interactions wouldn't play tool sounds.
    - -

    06 June 2022

    -

    MistakeNot4892 updated:

    -
      -
    • Tajaran icon has been updated with new work from Azlan.
    • -
    -

    PsyCommando updated:

    -
      -
    • Added sound for some tool interactions with the axes and hatchets.
    • -
    • Config `expanded_alt_interactions` allows for various generic actions (look, grab, drop, rotate) to show up when alt-clicking.
    • -
    • Changed the handling sounds for several material stacks to something more fitting.
    • -
    From a5c515fd4f22b7db001789ae20c7af631787fbf9 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 5 Aug 2022 20:38:31 +1000 Subject: [PATCH 0247/1518] Repathed submap landmarks to /abstract, optimized submap spawn regis. --- code/modules/submaps/_submap.dm | 17 ++++----- code/modules/submaps/submap_landmark.dm | 20 +++++++--- maps/away/bearcat/bearcat-2.dmm | 10 ++--- maps/away/bearcat/bearcat.dm | 2 +- maps/away/bearcat/bearcat_jobs.dm | 4 +- maps/away/liberia/liberia.dm | 2 +- maps/away/liberia/liberia.dmm | 38 +++++++++---------- maps/away/liberia/liberia_jobs.dm | 2 +- maps/away/unishi/unishi-3.dmm | 10 ++--- maps/away/unishi/unishi.dm | 2 +- maps/away/unishi/unishi_jobs.dm | 4 +- .../crashed_pod/crashed_pod.dm | 6 +-- .../crashed_pod/crashed_pod.dmm | 8 ++-- .../exoplanet_ruins/playablecolony/colony.dmm | 8 ++-- .../playablecolony/playablecolony.dm | 4 +- 15 files changed, 73 insertions(+), 64 deletions(-) diff --git a/code/modules/submaps/_submap.dm b/code/modules/submaps/_submap.dm index 2e45f18d8fb..9536f9d639e 100644 --- a/code/modules/submaps/_submap.dm +++ b/code/modules/submaps/_submap.dm @@ -41,7 +41,7 @@ jobs[job.title] = job if(!associated_z) - testing( "Submap error - [name]/[archetype ? archetype.descriptor : "NO ARCHETYPE"] could not find an associated z-level for spawnpoint placement.") + testing( "Submap error - [name]/[archetype ? archetype.descriptor : "NO ARCHETYPE"] could not find an associated z-level for spawnpoint registration.") qdel(src) return @@ -50,16 +50,15 @@ sync_cell(cell) // Add the spawn points to the appropriate job list. - var/added_spawnpoint + var/registered_spawnpoint for(var/check_z in GetConnectedZlevels(associated_z)) - for(var/thing in block(locate(1, 1, check_z), locate(world.maxx, world.maxy, check_z))) - for(var/obj/effect/submap_landmark/spawnpoint/landmark in thing) - var/datum/job/submap/job = jobs[landmark.name] - if(istype(job)) - job.spawnpoints += landmark - added_spawnpoint = TRUE + for(var/obj/abstract/submap_landmark/spawnpoint/landmark in LAZYACCESS(global.submap_spawnpoints_by_z, "[check_z]")) + var/datum/job/submap/job = jobs[landmark.name] + if(istype(job)) + job.spawnpoints += landmark + registered_spawnpoint = TRUE - if(!added_spawnpoint) + if(!registered_spawnpoint) testing( "Submap error - [name]/[archetype ? archetype.descriptor : "NO ARCHETYPE"] has no job spawn points.") qdel(src) return diff --git a/code/modules/submaps/submap_landmark.dm b/code/modules/submaps/submap_landmark.dm index 9389f13c141..cf33c19bd49 100644 --- a/code/modules/submaps/submap_landmark.dm +++ b/code/modules/submaps/submap_landmark.dm @@ -1,4 +1,4 @@ -/obj/effect/submap_landmark +/obj/abstract/submap_landmark icon = 'icons/misc/mark.dmi' invisibility = INVISIBILITY_MAXIMUM anchored = TRUE @@ -6,12 +6,12 @@ density = FALSE opacity = FALSE -/obj/effect/submap_landmark/joinable_submap +/obj/abstract/submap_landmark/joinable_submap icon_state = "x4" var/archetype var/submap_datum_type = /datum/submap -/obj/effect/submap_landmark/joinable_submap/Initialize(var/mapload) +/obj/abstract/submap_landmark/joinable_submap/Initialize(var/mapload) . = ..(mapload) if(!SSmapping.submaps[name] && ispath(archetype, /decl/submap_archetype)) var/datum/submap/submap = new submap_datum_type(z) @@ -24,8 +24,18 @@ to_world_log( "Submap error - mapped landmark had invalid archetype.") return INITIALIZE_HINT_QDEL -/obj/effect/submap_landmark/spawnpoint +var/global/list/submap_spawnpoints_by_z = list() +INITIALIZE_IMMEDIATE(/obj/abstract/submap_landmark/spawnpoint) +/obj/abstract/submap_landmark/spawnpoint icon_state = "x3" -/obj/effect/submap_landmark/spawnpoint/survivor +/obj/abstract/submap_landmark/spawnpoint/Initialize() + . = ..() + LAZYADD(global.submap_spawnpoints_by_z["[z]"], src) + +/obj/abstract/submap_landmark/spawnpoint/Destroy() + LAZYREMOVE(global.submap_spawnpoints_by_z["[z]"], src) + . = ..() + +/obj/abstract/submap_landmark/spawnpoint/survivor name = "Survivor" diff --git a/maps/away/bearcat/bearcat-2.dmm b/maps/away/bearcat/bearcat-2.dmm index fe706b83f16..7319ec97683 100644 --- a/maps/away/bearcat/bearcat-2.dmm +++ b/maps/away/bearcat/bearcat-2.dmm @@ -293,7 +293,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/item/gun/projectile/pistol/holdout, /obj/structure/bed/padded, -/obj/effect/submap_landmark/spawnpoint/captain, +/obj/abstract/submap_landmark/spawnpoint/captain, /turf/simulated/floor/wood, /area/ship/scrap/command/captain) "aM" = ( @@ -646,7 +646,7 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/effect/submap_landmark/joinable_submap/bearcat, +/obj/abstract/submap_landmark/joinable_submap/bearcat, /turf/simulated/floor/tiled/usedup, /area/ship/scrap/dock) "bs" = ( @@ -1366,7 +1366,7 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ level = 2 }, -/obj/effect/submap_landmark/spawnpoint/crewman, +/obj/abstract/submap_landmark/spawnpoint/crewman, /turf/simulated/floor/tiled/white, /area/ship/scrap/crew/cryo) "cP" = ( @@ -1566,7 +1566,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, -/obj/effect/submap_landmark/spawnpoint/crewman, +/obj/abstract/submap_landmark/spawnpoint/crewman, /turf/simulated/floor/tiled/white, /area/ship/scrap/crew/cryo) "dg" = ( @@ -1744,7 +1744,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/submap_landmark/spawnpoint/crewman, +/obj/abstract/submap_landmark/spawnpoint/crewman, /turf/simulated/floor/tiled/white, /area/ship/scrap/crew/cryo) "dv" = ( diff --git a/maps/away/bearcat/bearcat.dm b/maps/away/bearcat/bearcat.dm index 76f18662e65..2961ab27f55 100644 --- a/maps/away/bearcat/bearcat.dm +++ b/maps/away/bearcat/bearcat.dm @@ -2,7 +2,7 @@ #include "bearcat_jobs.dm" #include "bearcat_access.dm" -/obj/effect/submap_landmark/joinable_submap/bearcat +/obj/abstract/submap_landmark/joinable_submap/bearcat name = "FTV Bearcat" archetype = /decl/submap_archetype/derelict/bearcat diff --git a/maps/away/bearcat/bearcat_jobs.dm b/maps/away/bearcat/bearcat_jobs.dm index 5c6812fc7fb..bc603d93e7d 100644 --- a/maps/away/bearcat/bearcat_jobs.dm +++ b/maps/away/bearcat/bearcat_jobs.dm @@ -45,8 +45,8 @@ else qdel(eyegore) -/obj/effect/submap_landmark/spawnpoint/captain +/obj/abstract/submap_landmark/spawnpoint/captain name = "Independant Captain" -/obj/effect/submap_landmark/spawnpoint/crewman +/obj/abstract/submap_landmark/spawnpoint/crewman name = "Independant Crewman" diff --git a/maps/away/liberia/liberia.dm b/maps/away/liberia/liberia.dm index 04b2072df7d..10f07a89876 100644 --- a/maps/away/liberia/liberia.dm +++ b/maps/away/liberia/liberia.dm @@ -29,7 +29,7 @@ /datum/shuttle/autodock/overmap/mule = list("nav_mule_start") ) -/obj/effect/submap_landmark/joinable_submap/liberia +/obj/abstract/submap_landmark/joinable_submap/liberia name = "Liberia" archetype = /decl/submap_archetype/liberia diff --git a/maps/away/liberia/liberia.dmm b/maps/away/liberia/liberia.dmm index 2c69d93e06d..1822ba911d3 100644 --- a/maps/away/liberia/liberia.dmm +++ b/maps/away/liberia/liberia.dmm @@ -27,7 +27,7 @@ dir = 4 }, /obj/effect/floor_decal/corner/blue/mono, -/obj/effect/submap_landmark/joinable_submap/liberia, +/obj/abstract/submap_landmark/joinable_submap/liberia, /turf/simulated/floor/tiled/dark/monotile, /area/liberia/bridge) "ae" = ( @@ -68,7 +68,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 5 }, -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /obj/machinery/light_switch{ pixel_y = 24 }, @@ -88,7 +88,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 6 }, -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /turf/simulated/floor/carpet, /area/liberia/personellroom2) "ak" = ( @@ -420,7 +420,7 @@ /obj/effect/floor_decal/techfloor{ dir = 4 }, -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /turf/simulated/floor/tiled/techfloor, /area/liberia/cryo) "aY" = ( @@ -639,7 +639,7 @@ /obj/effect/floor_decal/corner/green{ dir = 9 }, -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /turf/simulated/floor/tiled, /area/liberia/hallway) "bo" = ( @@ -2965,7 +2965,7 @@ /obj/structure/cable/blue{ icon_state = "4-8" }, -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /turf/simulated/floor/tiled/techfloor, /area/liberia/cryo) "fi" = ( @@ -2975,7 +2975,7 @@ /obj/structure/cable/blue{ icon_state = "2-8" }, -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /turf/simulated/floor/tiled/techfloor, /area/liberia/cryo) "fk" = ( @@ -3328,7 +3328,7 @@ /obj/machinery/alarm/liberia{ pixel_y = 24 }, -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /turf/simulated/floor/wood/ebony, /area/liberia/bar) "fS" = ( @@ -3351,7 +3351,7 @@ /obj/structure/cable/blue{ icon_state = "0-2" }, -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /turf/simulated/floor/wood/ebony, /area/liberia/bar) "fU" = ( @@ -3513,7 +3513,7 @@ "gj" = ( /obj/structure/bed/chair/wood/walnut, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /turf/simulated/floor/wood/ebony, /area/liberia/bar) "gk" = ( @@ -3971,20 +3971,20 @@ /obj/effect/floor_decal/spline/plain/brown{ dir = 10 }, -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /turf/simulated/floor/wood/ebony, /area/liberia/bar) "gY" = ( /obj/item/stool/padded, /obj/effect/floor_decal/spline/plain/brown, -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /turf/simulated/floor/wood/ebony, /area/liberia/bar) "gZ" = ( /obj/item/stool/padded, /obj/structure/disposalpipe/segment, /obj/effect/floor_decal/spline/plain/brown, -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /turf/simulated/floor/wood/ebony, /area/liberia/bar) "ha" = ( @@ -5435,7 +5435,7 @@ /obj/structure/cable/blue{ icon_state = "2-8" }, -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /turf/simulated/floor/carpet, /area/liberia/library) "kr" = ( @@ -6230,7 +6230,7 @@ /area/liberia/atmos) "nH" = ( /obj/structure/bed/chair/wood/walnut, -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /turf/simulated/floor/tiled, /area/liberia/hallway) "nO" = ( @@ -7615,7 +7615,7 @@ dir = 8; pixel_x = -24 }, -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /turf/simulated/floor/carpet/blue, /area/liberia/personellroom1) "HQ" = ( @@ -7708,7 +7708,7 @@ /obj/effect/floor_decal/corner/green{ dir = 6 }, -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /turf/simulated/floor/tiled, /area/liberia/hallway) "Jf" = ( @@ -8489,7 +8489,7 @@ }, /obj/structure/bed/padded, /obj/item/bedsheet/hos, -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /turf/simulated/floor/carpet/blue, /area/liberia/personellroom1) "Xe" = ( @@ -8572,7 +8572,7 @@ /turf/simulated/floor/tiled/techfloor, /area/liberia/engineeringstorage) "YW" = ( -/obj/effect/submap_landmark/spawnpoint/liberia, +/obj/abstract/submap_landmark/spawnpoint/liberia, /turf/simulated/floor/tiled/techfloor, /area/liberia/cryo) "YX" = ( diff --git a/maps/away/liberia/liberia_jobs.dm b/maps/away/liberia/liberia_jobs.dm index 9ad667ece75..7b0844ca79d 100644 --- a/maps/away/liberia/liberia_jobs.dm +++ b/maps/away/liberia/liberia_jobs.dm @@ -34,7 +34,7 @@ return ..() // Spawn points. -/obj/effect/submap_landmark/spawnpoint/liberia +/obj/abstract/submap_landmark/spawnpoint/liberia name = "Merchant" movable_flags = MOVABLE_FLAG_EFFECTMOVE diff --git a/maps/away/unishi/unishi-3.dmm b/maps/away/unishi/unishi-3.dmm index a3fbda34f6b..c8da3c59949 100644 --- a/maps/away/unishi/unishi-3.dmm +++ b/maps/away/unishi/unishi-3.dmm @@ -9,7 +9,7 @@ /turf/space, /area/space) "ac" = ( -/obj/effect/submap_landmark/joinable_submap/unishi, +/obj/abstract/submap_landmark/joinable_submap/unishi, /turf/space, /area/space) "ad" = ( @@ -109,18 +109,18 @@ /turf/simulated/floor/tiled, /area/unishi/bridge) "ax" = ( -/obj/effect/submap_landmark/spawnpoint/unishi_crew, +/obj/abstract/submap_landmark/spawnpoint/unishi_crew, /turf/simulated/floor/tiled, /area/unishi/bridge) "ay" = ( -/obj/effect/submap_landmark/spawnpoint/unishi_crew, +/obj/abstract/submap_landmark/spawnpoint/unishi_crew, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, /turf/simulated/floor/tiled, /area/unishi/bridge) "az" = ( -/obj/effect/submap_landmark/spawnpoint/unishi_crew, +/obj/abstract/submap_landmark/spawnpoint/unishi_crew, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 }, @@ -996,7 +996,7 @@ /turf/simulated/floor/tiled, /area/unishi/living) "cU" = ( -/obj/effect/submap_landmark/spawnpoint/unishi_researcher, +/obj/abstract/submap_landmark/spawnpoint/unishi_researcher, /turf/simulated/floor/tiled, /area/unishi/living) "cV" = ( diff --git a/maps/away/unishi/unishi.dm b/maps/away/unishi/unishi.dm index 8fc1f49efec..6dd30665b71 100644 --- a/maps/away/unishi/unishi.dm +++ b/maps/away/unishi/unishi.dm @@ -2,7 +2,7 @@ #include "unishi_jobs.dm" #include "../../../mods/content/xenobiology/_xenobiology.dme" -/obj/effect/submap_landmark/joinable_submap/unishi +/obj/abstract/submap_landmark/joinable_submap/unishi name = "SRV Verne" archetype = /decl/submap_archetype/derelict/unishi diff --git a/maps/away/unishi/unishi_jobs.dm b/maps/away/unishi/unishi_jobs.dm index a41f8188216..4f7e57c6d41 100644 --- a/maps/away/unishi/unishi_jobs.dm +++ b/maps/away/unishi/unishi_jobs.dm @@ -39,8 +39,8 @@ r_pocket = /obj/item/radio l_pocket = /obj/item/crowbar -/obj/effect/submap_landmark/spawnpoint/unishi_crew +/obj/abstract/submap_landmark/spawnpoint/unishi_crew name = "Unishi Crew" -/obj/effect/submap_landmark/spawnpoint/unishi_researcher +/obj/abstract/submap_landmark/spawnpoint/unishi_researcher name = "Unishi Researcher" diff --git a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dm b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dm index c3bf8809c65..3b44aa923d2 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dm +++ b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dm @@ -37,15 +37,15 @@ var/global/list/crashed_pod_areas = list() signal might draw help, but even if you should be so lucky, you must survive long \ enough for it to arrive." -/obj/effect/submap_landmark/spawnpoint/crashed_pod_survivor +/obj/abstract/submap_landmark/spawnpoint/crashed_pod_survivor name = "Stranded Survivor" -/obj/effect/submap_landmark/joinable_submap/crashed_pod +/obj/abstract/submap_landmark/joinable_submap/crashed_pod name = "Crashed Survival Pod" archetype = /decl/submap_archetype/crashed_pod submap_datum_type = /datum/submap/crashed_pod -/obj/effect/submap_landmark/joinable_submap/crashed_pod/Initialize(mapload) +/obj/abstract/submap_landmark/joinable_submap/crashed_pod/Initialize(mapload) var/list/possible_ship_names = list( "Hornet", "Witchmoth", "Planthopper", "Mayfly", "Locust", "Cicada", diff --git a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm index 4ac8a2734bb..e369e91f46c 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm +++ b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm @@ -17,7 +17,7 @@ /obj/structure/wall_frame, /obj/structure/grille, /obj/structure/window/borosilicate_reinforced/full, -/obj/effect/submap_landmark/joinable_submap/crashed_pod, +/obj/abstract/submap_landmark/joinable_submap/crashed_pod, /turf/simulated/floor/plating, /area/map_template/crashed_pod) "ae" = ( @@ -447,7 +447,7 @@ /turf/simulated/floor/tiled/techfloor, /area/map_template/crashed_pod) "aZ" = ( -/obj/effect/submap_landmark/spawnpoint/crashed_pod_survivor, +/obj/abstract/submap_landmark/spawnpoint/crashed_pod_survivor, /obj/structure/bed/chair/shuttle/black, /obj/structure/window/reinforced{ dir = 8 @@ -471,7 +471,7 @@ /turf/simulated/floor/plating, /area/map_template/crashed_pod) "bc" = ( -/obj/effect/submap_landmark/spawnpoint/crashed_pod_survivor, +/obj/abstract/submap_landmark/spawnpoint/crashed_pod_survivor, /obj/structure/bed/chair/shuttle/black, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/tiled/dark/monotile, @@ -499,7 +499,7 @@ /turf/simulated/floor/tiled/dark, /area/map_template/crashed_pod) "bf" = ( -/obj/effect/submap_landmark/spawnpoint/crashed_pod_survivor, +/obj/abstract/submap_landmark/spawnpoint/crashed_pod_survivor, /obj/structure/bed/chair/shuttle/black, /obj/structure/window/reinforced{ dir = 4 diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index 5a47a61dd57..c16fc0ac7d4 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -95,7 +95,7 @@ /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/command) "aq" = ( -/obj/effect/submap_landmark/joinable_submap/colony, +/obj/abstract/submap_landmark/joinable_submap/colony, /turf/template_noop, /area/template_noop) "ar" = ( @@ -406,7 +406,7 @@ /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/command) "bg" = ( -/obj/effect/submap_landmark/spawnpoint/colonist_spawn, +/obj/abstract/submap_landmark/spawnpoint/colonist_spawn, /obj/structure/bed/padded, /obj/item/bedsheet/hop, /obj/machinery/light/small{ @@ -1526,7 +1526,7 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/engineering) "dB" = ( -/obj/effect/submap_landmark/spawnpoint/colonist_spawn, +/obj/abstract/submap_landmark/spawnpoint/colonist_spawn, /obj/structure/bed/padded, /obj/item/bedsheet/hos, /turf/simulated/floor/carpet, @@ -2292,7 +2292,7 @@ /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/dorms) "eX" = ( -/obj/effect/submap_landmark/spawnpoint/colonist_spawn, +/obj/abstract/submap_landmark/spawnpoint/colonist_spawn, /obj/structure/bed/padded, /obj/item/gun/energy/gun/small, /obj/item/flashlight/upgraded, diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm b/maps/random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm index cdb3add663e..224f94bebc5 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm @@ -42,10 +42,10 @@ id_type = null pda_type = null -/obj/effect/submap_landmark/spawnpoint/colonist_spawn +/obj/abstract/submap_landmark/spawnpoint/colonist_spawn name = "Colonist" -/obj/effect/submap_landmark/joinable_submap/colony +/obj/abstract/submap_landmark/joinable_submap/colony name = "Established Colony" archetype = /decl/submap_archetype/playablecolony From 05292fdbbd9c20852bab1f8cfecb2d995c0e4102 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 5 Aug 2022 18:57:24 +1000 Subject: [PATCH 0248/1518] Moving the lobby menu to a decl handler. --- code/_helpers/cmp.dm | 3 + code/modules/client/lobby_handler.dm | 68 +++++++++++++++++++++++ code/modules/mob/new_player/new_player.dm | 34 +++++------- maps/~mapsystem/maps.dm | 3 + nebula.dme | 1 + 5 files changed, 90 insertions(+), 19 deletions(-) create mode 100644 code/modules/client/lobby_handler.dm diff --git a/code/_helpers/cmp.dm b/code/_helpers/cmp.dm index e2dd426cd96..f7cbea91069 100644 --- a/code/_helpers/cmp.dm +++ b/code/_helpers/cmp.dm @@ -111,3 +111,6 @@ /proc/cmp_job_desc(var/datum/job/A, var/datum/job/B) return B.get_occupations_tab_sort_score() - A.get_occupations_tab_sort_score() + +/proc/cmp_lobby_option_asc(var/datum/lobby_option/A, var/datum/lobby_option/B) + return A.sort_priority - B.sort_priority diff --git a/code/modules/client/lobby_handler.dm b/code/modules/client/lobby_handler.dm new file mode 100644 index 00000000000..6bfbe052376 --- /dev/null +++ b/code/modules/client/lobby_handler.dm @@ -0,0 +1,68 @@ +/decl/lobby_handler + var/list/lobby_options = list( + /datum/lobby_option/setup, + /datum/lobby_option/view_manifest, + /datum/lobby_option/observe, + /datum/lobby_option/character_setup + ) + +/decl/lobby_handler/Initialize() + . = ..() + for(var/option in lobby_options) + lobby_options += new option(src) + lobby_options -= option + lobby_options = sortTim(lobby_options, /proc/cmp_lobby_option_asc) + +/decl/lobby_handler/proc/get_lobby_header(var/mob/new_player/viewer) + return "[global.using_map.get_map_info()]
    " + +/decl/lobby_handler/proc/get_lobby_footer(var/mob/new_player/viewer) + return + +/datum/lobby_option + var/sort_priority = 0 + +/datum/lobby_option/proc/visible(var/mob/new_player/viewer) + return TRUE + +/datum/lobby_option/proc/get_lobby_menu_string(var/mob/new_player/viewer) + return + +/datum/lobby_option/setup + sort_priority = 1 + +/datum/lobby_option/setup/get_lobby_menu_string(var/mob/new_player/viewer) + return "Setup Character " + +/datum/lobby_option/view_manifest + sort_priority = 2 + +/datum/lobby_option/view_manifest/visible(var/mob/new_player/viewer) + return (GAME_STATE > RUNLEVEL_LOBBY) + +/datum/lobby_option/view_manifest/get_lobby_menu_string(var/mob/new_player/viewer) + return "View the Crew Manifest " + +/datum/lobby_option/observe + sort_priority = 3 + +/datum/lobby_option/observe/get_lobby_menu_string(var/mob/new_player/viewer) + return "Observe " + +/datum/lobby_option/character_setup + sort_priority = 4 + +/datum/lobby_option/character_setup/get_lobby_menu_string(var/mob/new_player/viewer) + var/list/return_string = list() + return_string += "
    Current character: " + return_string += "[viewer.client.prefs.real_name]" + return_string += "[viewer.client.prefs.job_high ? ", [viewer.client.prefs.job_high]" : null]
    " + + if(GAME_STATE <= RUNLEVEL_LOBBY) + if(viewer.ready) + return_string += "Un-Ready" + else + return_string += "Ready Up" + else + return_string += "Join Game!" + return JOINTEXT(return_string) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index b53a8737f5d..e65d4c742a7 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -34,26 +34,22 @@ INITIALIZE_IMMEDIATE(/mob/new_player) /mob/new_player/proc/show_lobby_menu(force = FALSE) if(!SScharacter_setup.initialized && !force) return // Not ready yet. - var/output = list() - output += "
    " - output += "[global.using_map.get_map_info()]" - output +="
    " - output += "Setup Character " - - if(GAME_STATE > RUNLEVEL_LOBBY) - output += "View the Crew Manifest " - - output += "Observe " - - output += "
    Current character: [client.prefs.real_name][client.prefs.job_high ? ", [client.prefs.job_high]" : null]
    " - if(GAME_STATE <= RUNLEVEL_LOBBY) - if(ready) - output += "Un-Ready" - else - output += "Ready Up" - else - output += "Join Game!" + var/output = list("
    ") + + var/decl/lobby_handler/lobby_handler = GET_DECL(global.using_map.lobby_handler) + var/lobby_header = lobby_handler.get_lobby_header(src) + if(lobby_header) + output += lobby_header + for(var/datum/lobby_option/option in lobby_handler.lobby_options) + if(!option.visible(src)) + continue + var/option_string = option.get_lobby_menu_string(src) + if(option_string) + output += option_string + var/lobby_footer = lobby_handler.get_lobby_footer(src) + if(lobby_footer) + output += lobby_footer output += "
    " panel = new(src, "Welcome","Welcome to [global.using_map.full_name]", 560, 280, src) diff --git a/maps/~mapsystem/maps.dm b/maps/~mapsystem/maps.dm index 8974dec7f77..7e3c816b370 100644 --- a/maps/~mapsystem/maps.dm +++ b/maps/~mapsystem/maps.dm @@ -23,6 +23,9 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable var/full_name = "Unnamed Map" var/path + // TODO: move all the lobby stuff onto this handler. + var/lobby_handler = /decl/lobby_handler + var/list/station_levels = list() // Z-levels the station exists on var/list/admin_levels = list() // Z-levels for admin functionality (Centcom, shuttle transit, etc) var/list/contact_levels = list() // Z-levels that can be contacted from the station, for eg announcements diff --git a/nebula.dme b/nebula.dme index d2e682fa219..4e8f5381400 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1553,6 +1553,7 @@ #include "code\modules\client\client_defines.dm" #include "code\modules\client\client_helpers.dm" #include "code\modules\client\client_procs.dm" +#include "code\modules\client\lobby_handler.dm" #include "code\modules\client\movement.dm" #include "code\modules\client\preferences.dm" #include "code\modules\client\preferences_persist.dm" From 4a29edbe634e0950e6f0bed32e56b888aceb990c Mon Sep 17 00:00:00 2001 From: NataKilar Date: Mon, 8 Aug 2022 14:30:42 -0400 Subject: [PATCH 0249/1518] Adds computer directories --- code/__defines/computers.dm | 22 +- code/_helpers/cmp.dm | 5 + code/_helpers/text.dm | 43 ++ code/datums/uplink/uplink_sources.dm | 6 +- .../living/silicon/robot/modules/_module.dm | 2 +- .../modular_computer/assembly_computer.dm | 10 +- .../computers/modular_computer/core.dm | 2 +- .../computers/subtypes/dev_holo.dm | 4 +- .../computers/subtypes/preset_console.dm | 9 +- .../file_system/computer_file.dm | 22 +- .../file_system/directory.dm | 89 +++ .../modular_computers/file_system/program.dm | 26 +- .../engineering/network_monitoring.dm | 8 +- .../file_system/programs/file_browser.dm | 286 ++++++++++ .../programs/generic/email_client.dm | 8 +- .../programs/generic/file_browser.dm | 275 --------- .../programs/generic/file_manager.dm | 452 +++++++++++++++ .../programs/generic/ntdownloader.dm | 33 +- .../programs/generic/ntnrc_client.dm | 2 +- .../file_system/programs/generic/records.dm | 8 +- .../file_system/programs/generic/reports.dm | 2 +- .../file_system/programs/generic/scanner.dm | 29 +- .../programs/generic/wordprocessor.dm | 196 +++---- .../programs/security/digitalwarrant.dm | 41 +- .../file_system/reports/crew_record.dm | 4 +- .../file_system/reports/report.dm | 4 +- .../file_system/reports/warrant.dm | 3 + .../modular_computers/hardware/_hardware.dm | 12 + .../modular_computers/hardware/drive_slot.dm | 24 + .../modular_computers/hardware/hard_drive.dm | 323 ++++++++--- .../hardware/scanners/scanner.dm | 20 +- .../networking/accounts/_network_accounts.dm | 2 +- .../networking/device_types/mainframe.dm | 72 ++- .../networking/network_files.dm | 22 +- code/modules/modular_computers/os/files.dm | 521 +++++++++++++----- code/modules/modular_computers/os/os.dm | 12 +- code/modules/modular_computers/os/ui.dm | 10 +- .../modular_computers/terminal/terminal.dm | 136 ++++- .../terminal/terminal_commands.dm | 288 +++++----- nano/templates/file_browser.tmpl | 75 +++ nano/templates/file_manager.tmpl | 101 ++-- nano/templates/layout_default_header.tmpl | 20 +- nano/templates/word_processor.tmpl | 41 +- nebula.dme | 4 +- 44 files changed, 2274 insertions(+), 1000 deletions(-) create mode 100644 code/modules/modular_computers/file_system/directory.dm create mode 100644 code/modules/modular_computers/file_system/programs/file_browser.dm delete mode 100644 code/modules/modular_computers/file_system/programs/generic/file_browser.dm create mode 100644 code/modules/modular_computers/file_system/programs/generic/file_manager.dm create mode 100644 nano/templates/file_browser.tmpl diff --git a/code/__defines/computers.dm b/code/__defines/computers.dm index 8b14c6b42e4..710816cec40 100644 --- a/code/__defines/computers.dm +++ b/code/__defines/computers.dm @@ -33,6 +33,7 @@ #define PROGRAM_STATE_KILLED 0 #define PROGRAM_STATE_BACKGROUND 1 #define PROGRAM_STATE_ACTIVE 2 +#define PROGRAM_STATE_BROWSER 3 #define PROG_MISC "Miscellaneous" #define PROG_ENG "Engineering" @@ -54,4 +55,23 @@ // Caps for network logging. Less than 10 would make logging useless anyway, more than 500 may make the log browser too laggy. Defaults to 100 unless user changes it. #define MAX_NETWORK_LOGS 100 -#define MIN_NETWORK_LOGS 10 \ No newline at end of file +#define MIN_NETWORK_LOGS 10 + +// Default directories referenced by the OS or programs. +#define OS_PROGRAMS_DIR "programs" +#define OS_RECORDS_DIR "records" +#define OS_ACCOUNTS_DIR "accounts" +#define OS_DOCUMENTS_DIR "documents" +#define OS_LOGS_DIR "logs" + +// Return codes for file storage. +#define OS_FILE_SUCCESS 1 +#define OS_HARDDRIVE_ERROR 0 +#define OS_FILE_NOT_FOUND -1 +#define OS_DIR_NOT_FOUND -2 +#define OS_FILE_EXISTS -3 +#define OS_FILE_NO_READ -4 +#define OS_FILE_NO_WRITE -5 +#define OS_HARDDRIVE_SPACE -6 +#define OS_NETWORK_ERROR -7 +#define OS_BAD_NAME -8 \ No newline at end of file diff --git a/code/_helpers/cmp.dm b/code/_helpers/cmp.dm index f7cbea91069..aded3250ece 100644 --- a/code/_helpers/cmp.dm +++ b/code/_helpers/cmp.dm @@ -114,3 +114,8 @@ /proc/cmp_lobby_option_asc(var/datum/lobby_option/A, var/datum/lobby_option/B) return A.sort_priority - B.sort_priority + +/proc/cmp_files_sort(datum/computer_file/a, datum/computer_file/b) + . = istype(b, /datum/computer_file/directory) - istype(a, /datum/computer_file/directory) // Prioritize directories over other files. + if(!.) + return sorttext(b.filename, a.filename) diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm index 5df9464f702..98d2c59fe5a 100644 --- a/code/_helpers/text.dm +++ b/code/_helpers/text.dm @@ -198,6 +198,49 @@ if(32) //space dat += "_" return jointext(dat, null) + +//Used to strip text of everything but letters and numbers, and select special symbols. +//Requires that the filename has an alphanumeric character. +/proc/sanitize_for_file(text) + if(!text) return "" + var/list/dat = list() + var/has_alphanumeric = FALSE + var/last_was_fullstop = FALSE + for(var/i=1, i<=length(text), i++) + var/ascii_char = text2ascii(text,i) + switch(ascii_char) + if(65 to 90) //A-Z + dat += ascii2text(ascii_char) + has_alphanumeric = TRUE + last_was_fullstop = FALSE + if(97 to 122) //a-z + dat += ascii2text(ascii_char) + has_alphanumeric = TRUE + last_was_fullstop = FALSE + if(48 to 57) //0-9 + dat += ascii2text(ascii_char) + has_alphanumeric = TRUE + last_was_fullstop = FALSE + if(32) //space + dat += ascii2text(ascii_char) + last_was_fullstop = FALSE + if(33, 36, 40, 41, 42, 45, 95) //!, $, (, ), *, -, _ + dat += ascii2text(ascii_char) + last_was_fullstop = FALSE + if(46) //. + if(last_was_fullstop) // No repeats of . to avoid confusion with .. + continue + dat += ascii2text(ascii_char) + last_was_fullstop = TRUE + + if(!has_alphanumeric) + return "" + + if(dat[length(dat)] == ".") //kill trailing . + dat.Cut(length(dat)) + return jointext(dat, null) + + // UNICODE: Convert to regex? //Returns null if there is any bad text in the string diff --git a/code/datums/uplink/uplink_sources.dm b/code/datums/uplink/uplink_sources.dm index 79868c070ce..81c9347f9e3 100644 --- a/code/datums/uplink/uplink_sources.dm +++ b/code/datums/uplink/uplink_sources.dm @@ -40,11 +40,9 @@ var/global/list/default_uplink_source_priority = list( var/obj/item/uplink/T = new(P, M.mind, amount) P.hidden_uplink = T var/datum/computer_file/program/uplink/program = new(pda_pass) - if(!HDD.try_store_file(program)) - HDD.remove_file(HDD.find_file_by_name(program.filename)) //Maybe it already has a fake copy. - if(!HDD.try_store_file(program)) + var/datum/computer_file/directory/program_dir = HDD.parse_directory(OS_PROGRAMS_DIR, TRUE) // This is almost certainly already created, but just in case. + if(HDD.store_file(program, program_dir, TRUE, overwrite = TRUE) != OS_FILE_SUCCESS) return SETUP_FAILED //Not enough space or other issues. - HDD.store_file(program) to_chat(M, "A portable object teleportation relay has been installed in your [P.name]. Simply enter the code \"[pda_pass]\" in TaxQuickly program to unlock its hidden features.") M.StoreMemory("Uplink passcode: [pda_pass] ([P.name]).", /decl/memory_options/system) diff --git a/code/modules/mob/living/silicon/robot/modules/_module.dm b/code/modules/mob/living/silicon/robot/modules/_module.dm index 807f2bf1188..4f51de509d1 100644 --- a/code/modules/mob/living/silicon/robot/modules/_module.dm +++ b/code/modules/mob/living/silicon/robot/modules/_module.dm @@ -237,4 +237,4 @@ if(os && os.has_component(PART_HDD)) var/obj/item/stock_parts/computer/hard_drive/disk = os.get_component(PART_HDD) for(var/T in software) - disk.store_file(new T(disk)) + disk.store_file(new T(disk), OS_PROGRAMS_DIR, TRUE) diff --git a/code/modules/modular_computers/computers/modular_computer/assembly_computer.dm b/code/modules/modular_computers/computers/modular_computer/assembly_computer.dm index 5d1a810562f..0e4cc01553a 100644 --- a/code/modules/modular_computers/computers/modular_computer/assembly_computer.dm +++ b/code/modules/modular_computers/computers/modular_computer/assembly_computer.dm @@ -35,15 +35,13 @@ return . = ..() if(.) - if(istype(P, /obj/item/stock_parts/computer/scanner)) - var/obj/item/stock_parts/computer/scanner/scanner = P - scanner.do_after_install(user, holder) + P.do_after_install(holder, !!user) return TRUE /datum/extension/assembly/modular_computer/uninstall_component(var/mob/living/user, var/obj/item/stock_parts/P) - if(istype(P, /obj/item/stock_parts/computer/scanner)) - var/obj/item/stock_parts/computer/scanner/scanner = P - scanner.do_before_uninstall() + if(istype(P, /obj/item/stock_parts/computer)) + var/obj/item/stock_parts/computer/C = P + C.do_before_uninstall(holder, !!user) return ..() /datum/extension/assembly/modular_computer/critical_shutdown() diff --git a/code/modules/modular_computers/computers/modular_computer/core.dm b/code/modules/modular_computers/computers/modular_computer/core.dm index 494d12656b4..d30ca7ab707 100644 --- a/code/modules/modular_computers/computers/modular_computer/core.dm +++ b/code/modules/modular_computers/computers/modular_computer/core.dm @@ -47,7 +47,7 @@ var/datum/computer_file/program/prog_file = prog_type if(initial(prog_file.usage_flags) & assembly.hardware_flag) prog_file = new prog_file - HDD.store_file(prog_file) + HDD.store_file(prog_file, OS_PROGRAMS_DIR, TRUE) /obj/item/modular_computer/Initialize() START_PROCESSING(SSobj, src) diff --git a/code/modules/modular_computers/computers/subtypes/dev_holo.dm b/code/modules/modular_computers/computers/subtypes/dev_holo.dm index 084ea62792e..c1d4560f2e2 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_holo.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_holo.dm @@ -50,8 +50,8 @@ preset.filename = "temp[rand(1,100)]" preset.stored_data = preset_text - D.store_file(preset) - var/datum/computer_file/program/wordprocessor/word = D.find_file_by_name("wordprocessor") + D.store_file(preset, OS_DOCUMENTS_DIR) + var/datum/computer_file/program/wordprocessor/word = D.find_file_by_name("wordprocessor", OS_PROGRAMS_DIR) word.open_file = preset.filename word.loaded_data = preset.stored_data diff --git a/code/modules/modular_computers/computers/subtypes/preset_console.dm b/code/modules/modular_computers/computers/subtypes/preset_console.dm index 903640a8c3d..5f891efbde6 100644 --- a/code/modules/modular_computers/computers/subtypes/preset_console.dm +++ b/code/modules/modular_computers/computers/subtypes/preset_console.dm @@ -26,10 +26,15 @@ . = ..() var/datum/extension/interactive/os/os = get_extension(src, /datum/extension/interactive/os) if(os) + // We access the harddrive directly because the filesystem is yet to be initialized. + var/obj/item/stock_parts/computer/hard_drive/HDD = os.get_component(PART_HDD) for(var/program_type in default_software) - os.store_file(new program_type()) + HDD.store_file(new program_type(), OS_PROGRAMS_DIR, create_directories = TRUE) if(autorun_program) - os.set_autorun(initial(autorun_program.filename)) + var/datum/computer_file/data/autorun = new() + autorun.filename = "autorun" + autorun.stored_data = initial(autorun_program.filename) + HDD.store_file(autorun) /obj/machinery/computer/modular/preset/engineering default_software = list( diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm index 0f7ea405b4e..68e33ce3299 100644 --- a/code/modules/modular_computers/file_system/computer_file.dm +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -11,6 +11,7 @@ var/global/file_uid = 0 var/obj/item/stock_parts/computer/hard_drive/holder // Holder that contains this file. var/unsendable = 0 // Whether the file may be sent to someone via file transfer or other means. var/undeletable = 0 // Whether the file may be deleted. Setting to 1 prevents deletion/renaming/etc. + var/unrenamable = 0 // Whether the file may be renamed. Setting to 1 prevents renaming. var/uid // UID of this file var/list/metadata // Any metadata the file uses. var/papertype = /obj/item/paper @@ -28,11 +29,9 @@ var/global/file_uid = 0 metadata = md.Copy() /datum/computer_file/Destroy() + if(holder) + holder.remove_file(src, forced = TRUE) . = ..() - if(!holder) - return - - holder.remove_file(src) // Returns independent copy of this file. /datum/computer_file/proc/clone(var/rename = 0) @@ -138,4 +137,17 @@ var/global/file_uid = 0 mod_access = null return TRUE else - return FALSE \ No newline at end of file + return FALSE + +/datum/computer_file/proc/get_directory() + if(holder) + return holder.stored_files[src] + +/datum/computer_file/proc/get_file_path() + var/datum/computer_file/parent = get_directory() + var/list/dir_names = list() + while(istype(parent)) + dir_names.Insert(1, parent.filename) + parent = parent.get_directory() + + return jointext(dir_names, "/") \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/directory.dm b/code/modules/modular_computers/file_system/directory.dm new file mode 100644 index 00000000000..9e8ffc4dfd5 --- /dev/null +++ b/code/modules/modular_computers/file_system/directory.dm @@ -0,0 +1,89 @@ +/datum/computer_file/directory + filetype = "DIR" + size = 0 + + var/list/held_files = list() // Weakrefs of files held by this directory. + var/inherit_perms = TRUE + + var/list/temp_file_refs = list() // List used to temporarily hold references to stored files post cloning, so they + // don't get GC'd. Cleared on storing or deleting the file. + +/datum/computer_file/directory/Destroy() + for(var/weakref/file_ref in held_files) + var/datum/computer_file/held_file = file_ref.resolve() + if(held_file) + holder.remove_file(held_file, forced = TRUE) + + QDEL_NULL(temp_file_refs) + . = ..() + +/datum/computer_file/directory/proc/get_held_files() + . = list() + for(var/weakref/file_ref in held_files) + var/datum/computer_file/held_file = file_ref.resolve() + if(!held_file) + held_files -= file_ref + continue + . += held_file + +// Returns the total file size of held files. We don't override the actual size of the directory so we don't double count file size for capacity. +/datum/computer_file/directory/proc/get_held_size(list/counted_dirs = list()) + . = 0 + counted_dirs |= src // Keep track of files which have been counted in case there's a directory loop. + for(var/weakref/file_ref in held_files) + var/datum/computer_file/held_file = file_ref.resolve() + if(!held_file) + held_files -= file_ref + continue + if(istype(held_file, /datum/computer_file/directory)) + var/datum/computer_file/directory/dir = held_file + if(dir in counted_dirs) + continue + . += dir.get_held_size(counted_dirs) + else + . += held_file.size + +// Get the permissions for mass file actions, generally: +// * OS_READ_ACCESS on all contained files is required for cloning directories. +// * OS_WRITE_ACCESS on all contained files is required for transferring/deleting directories. +/datum/computer_file/directory/proc/get_held_perms(list/accesses, mob/user, list/counted_dirs = list()) + . = get_file_perms(accesses, user) + + if(!accesses || (isghost(user) && check_rights(R_ADMIN, 0, user))) // As with normal file perms, either internal use or admin-ghost usage. + return + + counted_dirs |= src // As above. + for(var/weakref/file_ref in held_files) + var/datum/computer_file/held_file = file_ref.resolve() + if(!held_file) + held_files -= file_ref + + if(istype(held_file, /datum/computer_file/directory)) + var/datum/computer_file/directory/dir = held_file + if(dir in counted_dirs) + continue + . += dir.get_held_perms(accesses, user, counted_dirs) + else + . &= held_file.get_file_perms(accesses, user) + + if(. == 0) // We've already lost all permissions, don't bother checking anything else. + return + +/datum/computer_file/directory/get_file_path() + var/parent_paths = ..() + if(parent_paths) + return parent_paths + "/" + filename + return filename + +/datum/computer_file/directory/clone(var/rename = 0) + var/datum/computer_file/directory/temp = ..() + temp.inherit_perms = inherit_perms + // Add copies of all of our stored files + for(var/datum/computer_file/stored in get_held_files()) + // Do not rename cloned files. + var/datum/computer_file/stored_clone = stored.clone(FALSE) + if(stored_clone) + temp.held_files += weakref(stored_clone) + temp.temp_file_refs += stored_clone + + return temp \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index abfbab7e49d..e5d2d484074 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -7,7 +7,7 @@ var/datum/nano_module/NM = null // If the program uses NanoModule, put it here and it will be automagically opened. Otherwise implement ui_interact. var/nanomodule_path = null // Path to nanomodule, make sure to set this if implementing new program. var/program_state = PROGRAM_STATE_KILLED // PROGRAM_STATE_KILLED or PROGRAM_STATE_BACKGROUND or PROGRAM_STATE_ACTIVE - specifies whether this program is running. - var/datum/extension/interactive/os/computer // OS that runs this program. + var/datum/extension/interactive/os/computer // OS that runs this program. var/filedesc = "Unknown Program" // User-friendly name of this program. var/extended_desc = "N/A" // Short description of this program's function. var/category = PROG_MISC @@ -47,11 +47,11 @@ return temp // Used by programs that manipulate files. -/datum/computer_file/program/proc/get_file(var/filename) - return computer.get_file(filename) +/datum/computer_file/program/proc/get_file(var/filename, var/directory, var/list/accesses, var/mob/user) + return computer.get_file(filename, directory, accesses, user) -/datum/computer_file/program/proc/create_file(var/newname, var/data = "", var/file_type = /datum/computer_file/data, var/list/metadata = null) - return computer.create_file(newname, data, file_type, metadata) +/datum/computer_file/program/proc/create_file(var/newname, var/directory, var/data = "", var/file_type = /datum/computer_file/data, var/list/metadata = null, var/list/accesses, var/mob/user) + return computer.create_file(newname, directory, data, file_type, metadata, accesses, user) // Relays icon update to the computer. /datum/computer_file/program/proc/update_computer_icon() @@ -100,9 +100,9 @@ // This attempts to retrieve header data for NanoUIs. If implementing completely new device of different type than existing ones // always include the device here in this proc. This proc basically relays the request to whatever is running the program. -/datum/computer_file/program/proc/get_header_data() +/datum/computer_file/program/proc/get_header_data(file_browser = FALSE) if(computer) - return computer.get_header_data() + return computer.get_header_data(file_browser) return list() // This is performed on program startup. May be overriden to add extra logic. Remember to include ..() call. @@ -113,7 +113,7 @@ if(nanomodule_path) NM = new nanomodule_path(src, new /datum/topic_manager/program(src), src) if(user) - NM.using_access = computer.get_access() // Programs nab access from users in their get_access() proc so don't bother adding it + NM.using_access = computer.get_access() // Nano modules nab access from users in their get_access() proc so don't bother adding it // to the using list as well. if(requires_network && network_destination) generate_network_log("Connection opened to [network_destination].") @@ -134,15 +134,20 @@ NM = null return 1 +// Called on active or minimized programs when a mounted file storage is removed from the OS. +/datum/computer_file/program/proc/on_file_storage_removal(var/datum/file_storage/removed) + // This is called every tick when the program is enabled. Ensure you do parent call if you override it. If parent returns 1 continue with UI initialisation. // It returns 0 if it can't run or if NanoModule was used instead. I suggest using NanoModules where applicable. /datum/computer_file/program/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) SHOULD_CALL_PARENT(TRUE) ..() - if(program_state != PROGRAM_STATE_ACTIVE) // Our program was closed. Close the ui if it exists. + if(program_state < PROGRAM_STATE_ACTIVE) // Our program was closed. Close the ui if it exists. if(ui) ui.close() return computer.ui_interact(user) + if(program_state == PROGRAM_STATE_BROWSER) + return 0 if(istype(NM)) NM.ui_interact(user, ui_key, null, force_open) return 0 @@ -156,7 +161,8 @@ // CONVENTIONS, READ THIS WHEN CREATING NEW PROGRAM AND OVERRIDING THIS PROC: // Topic calls are automagically forwarded from NanoModule this program contains. // Calls beginning with "PRG_" are reserved for programs handling. -// Calls beginning with "PC_" are reserved for computer handling (by whatever runs the program) +// Calls beginning with "PC_" are reserved for computer handling (by whatever runs the program). +// Calls beginning with "BRS_" are reserved for program file browser handling (not to be confused with the file manager program). // ALWAYS INCLUDE PARENT CALL ..() OR DIE IN FIRE. /datum/computer_file/program/Topic(href, href_list) if(..()) diff --git a/code/modules/modular_computers/file_system/programs/engineering/network_monitoring.dm b/code/modules/modular_computers/file_system/programs/engineering/network_monitoring.dm index 94dfe5aea21..ac3b635d73d 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/network_monitoring.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/network_monitoring.dm @@ -61,7 +61,7 @@ var/list/logs[0] for(var/datum/extension/network_device/mainframe/M in network.get_mainframes_by_role(MF_ROLE_LOG_SERVER, user)) var/list/logdata[0] - var/datum/computer_file/data/logfile/F = M.get_file("network_log") + var/datum/computer_file/data/logfile/F = M.get_file("network_log", OS_LOGS_DIR, TRUE) if(F) logdata["server"] = M.network_tag logdata["log"] = F.generate_file_data() @@ -96,7 +96,11 @@ var/datum/extension/network_device/mainframe/M = locate(href_list["purgelogs"]) if(!istype(M)) return TOPIC_HANDLED - M.delete_file("network_log") + var/datum/computer_file/log_file = M.get_file("network_log", OS_LOGS_DIR) + if(!log_file) + return TOPIC_HANDLED + M.delete_file(log_file) + return TOPIC_REFRESH if(href_list["updatemaxlogs"]) var/datum/extension/network_device/mainframe/M = locate(href_list["updatemaxlogs"]) diff --git a/code/modules/modular_computers/file_system/programs/file_browser.dm b/code/modules/modular_computers/file_system/programs/file_browser.dm new file mode 100644 index 00000000000..5c95c51818a --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/file_browser.dm @@ -0,0 +1,286 @@ +// Generic interface for selecting/saving files with programs. The file manager program does not use this. +/datum/computer_file/program + var/datum/nano_module/program/file_browser/browser_module + +/datum/computer_file/program/on_shutdown(forced) + QDEL_NULL(browser_module) + . = ..() + +/datum/computer_file/program/proc/view_file_browser(mob/user, selecting_key, selecting_filetype, req_perm, browser_desc, datum/computer_file/saving_file) + if(!browser_module) + browser_module = new (src, new /datum/topic_manager/program(src), src) + browser_module.using_access = computer.get_access() + + browser_module.reset_browser(selecting_key, selecting_filetype, req_perm, browser_desc, saving_file) + browser_module.ui_interact(user) + return TRUE + +/datum/computer_file/program/proc/on_file_select(datum/file_storage/disk, datum/computer_file/directory/dir, datum/computer_file/selected, selecting_key) + browser_module.reset_browser() + SSnano.close_uis(browser_module) + SSnano.update_uis(src) + +/datum/nano_module/program/file_browser + var/disk_name = "local" + var/weakref/dir_ref + var/browser_error + + var/selecting_key // String identifying the action being performed, passed to proc/on_file_select on the program itself. + var/selecting_filetype // /datum/computer_file subtype being selected/created. + + var/weakref/selected_file // Reference to the file being selected. + + var/datum/computer_file/saving_file // The file, if any, that's being saved. For the sake of GC, this should be a completely new file + // not stored on any drive, and a reference to it should not be kept until after the browser finishes. + + var/req_perm + var/browser_desc // String describing the action being performed. + +/datum/nano_module/program/file_browser/Destroy() + QDEL_NULL(saving_file) + selected_file = null + dir_ref = null + . = ..() + +/datum/nano_module/program/file_browser/Topic(href, href_list) + . = ..() + if(.) + return + + var/mob/user = usr + var/list/accesses = get_access(user) + var/datum/extension/interactive/os/computer = program.computer + + if(href_list["BRS_back"]) + if(browser_error) + browser_error = null + return TOPIC_REFRESH + SSnano.close_uis(src) + reset_browser() + return TOPIC_REFRESH + + if(href_list["BRS_select_disk"]) + var/selected_disk = href_list["BRS_select_disk"] + if(selected_disk in computer.mounted_storage) + disk_name = selected_disk + return TOPIC_REFRESH + return TOPIC_HANDLED + + if(!disk_name) + return TOPIC_REFRESH + + var/datum/file_storage/current_disk = computer.mounted_storage[disk_name] + if(!current_disk) + disk_name = null + return TOPIC_REFRESH + + var/errors = current_disk.check_errors() + if(errors) + browser_error = errors + return TOPIC_REFRESH + + var/datum/computer_file/directory/current_directory = dir_ref?.resolve() + if(current_directory && !(current_directory in current_disk.get_all_files())) + dir_ref = null + return TOPIC_REFRESH + + if(href_list["BRS_up_directory"]) + if(!current_directory) + disk_name = null + var/datum/computer_file/directory/parent_dir = current_directory?.get_directory() + dir_ref = weakref(parent_dir) + return TOPIC_REFRESH + + if(href_list["BRS_change_directory"]) + var/datum/computer_file/directory/dir = current_disk.get_file(href_list["BRS_change_directory"], current_directory) + if(!istype(dir)) + return TOPIC_HANDLED + if(!(dir.get_file_perms(accesses, user) & OS_READ_ACCESS)) + to_chat(user, SPAN_WARNING("You do not have permission to open this directory.")) + return TOPIC_HANDLED + + dir_ref = weakref(dir) + return TOPIC_REFRESH + + if(href_list["BRS_select_file"]) + var/datum/computer_file/F = current_disk.get_file(href_list["BRS_select_file"], current_directory) + if(!F) + return TOPIC_HANDLED + + if(saving_file) + saving_file.filename = F.filename + return TOPIC_REFRESH + + if(!istype(F, selecting_filetype)) + to_chat(user, SPAN_WARNING("This file is not the proper type.")) + return TOPIC_HANDLED + + if(!(F.get_file_perms(accesses, user) & req_perm)) + to_chat(user, SPAN_WARNING("You do not have permission to open this file.")) + return TOPIC_HANDLED + + selected_file = weakref(F) + return TOPIC_REFRESH + + if(href_list["BRS_rename_file"]) + if(!saving_file) + return TOPIC_HANDLED + var/newname = sanitize_for_file(input(usr, "Enter file name:", "Save file", saving_file.filename)) + if(!length(newname)) + to_chat(user, SPAN_WARNING("Invalid file name!")) + return TOPIC_HANDLED + + saving_file.filename = newname + return TOPIC_REFRESH + + if(href_list["BRS_save_file"]) + if(!saving_file) + return TOPIC_HANDLED + + var/success = current_disk.store_file(saving_file, current_directory, accesses = accesses, user = user) + if(success != OS_FILE_SUCCESS) + if(success == OS_FILE_NO_WRITE) + to_chat(user, SPAN_WARNING("You do not have permission to write/overwrite the file in this directory.")) + return TOPIC_HANDLED + if(success == OS_HARDDRIVE_SPACE) + to_chat(user, SPAN_WARNING("Insufficient harddrive space.")) + + // Since we know the directory exists, any other error indicates something is wrong with the drive or network. + to_chat(user, SPAN_WARNING("I/O ERROR: Drive is non-functional or could not be accessed on the network.")) + return TOPIC_REFRESH + + var/datum/computer_file/saved_file = saving_file + saving_file = null // We null this out so it doesn't get QDEL when the nanomodule is reset, but any other action that resets the browser does. + to_chat(user, SPAN_NOTICE("Created file [saved_file.filename].[saved_file.filetype].")) + program.on_file_select(current_disk, current_directory, saved_file, selecting_key) + return TOPIC_HANDLED + + if(href_list["BRS_finalize_select"]) + if(saving_file || !selected_file) + return TOPIC_HANDLED + + var/datum/computer_file/F = selected_file.resolve() + if(!istype(F)) + selected_file = null + return TOPIC_REFRESH + + if(!istype(F, selecting_filetype)) + to_chat(user, SPAN_WARNING("This file is not the proper type.")) + selected_file = null + return TOPIC_HANDLED + + if(!(F.get_file_perms(accesses, user) & req_perm)) + to_chat(user, SPAN_WARNING("You do not have permission to open this file.")) + selected_file = null + return TOPIC_HANDLED + + program.on_file_select(current_disk, current_directory, F, selecting_key) + SSnano.close_uis(src) + reset_browser() + return TOPIC_REFRESH + + if(href_list["BRS_create_dir"]) + if(!saving_file) + return TOPIC_HANDLED + var/dirname = sanitize_for_file(input(usr, "Enter directory name or leave blank to cancel:", "Directory creation")) + if(!length(dirname)) + return TOPIC_HANDLED + + var/datum/computer_file/directory/created_dir = current_disk.create_directory(dirname, current_directory, accesses, user) + if(!istype(created_dir)) + if(created_dir == OS_HARDDRIVE_ERROR || created_dir == OS_NETWORK_ERROR) + to_chat(user, SPAN_WARNING("I/O ERROR: Drive is non-functional or could not be accessed on the network.")) + return TOPIC_REFRESH + else + to_chat(user, SPAN_WARNING("You lack permission to create a directory in this location.")) + return TOPIC_HANDLED + + to_chat(user, SPAN_NOTICE("Created directory [created_dir.filename]")) + return TOPIC_HANDLED + +/datum/nano_module/program/file_browser/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = global.default_topic_state) + var/list/data = program.get_header_data(TRUE) + + var/datum/extension/interactive/os/computer = program.computer + + var/datum/file_storage/current_disk = disk_name ? computer.mounted_storage[disk_name] : null + var/datum/computer_file/current_directory = dir_ref?.resolve() + + var/list/accesses = get_access(user) + if(browser_error) + data["error"] = browser_error + else + data["filetypes"] = get_readable_filetypes() + if(saving_file) + data["saving_file"] = TRUE + data["curr_file_name"] = saving_file.filename + data["curr_file_type"] = saving_file.filetype + else + data["saving_file"] = FALSE + var/datum/computer_file/selected = selected_file?.resolve() + if(istype(selected)) + data["curr_file_name"] = selected.filename + data["curr_file_type"] = selected.filetype + if(current_disk) + // Safety check. + if(current_directory && !(current_directory in current_disk.get_all_files())) + dir_ref = null + + data["current_disk"] = current_disk.get_dir_path(current_directory, TRUE) + + var/list/files[0] + for(var/datum/computer_file/F in current_disk.get_dir_files(current_directory)) + files.Add(list(list( + "name" = F.filename, + "type" = F.filetype, + "dir" = istype(F, /datum/computer_file/directory), + "size" = F.size, + "selectable" = istype(F, selecting_filetype) + ))) + data["files"] = files + else // No disk selected. + dir_ref = null + disk_name = null + var/list/avail_disks[0] + + for(var/root_name in computer.mounted_storage) + var/datum/file_storage/avail_disk = computer.mounted_storage[root_name] + if(!avail_disk.hidden && avail_disk.check_access(accesses)) + avail_disks.Add(list(list( + "name" = root_name, + "desc" = avail_disk.desc + ))) + + data["avail_disks"] = avail_disks + + ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "file_browser.tmpl", browser_desc, 500, 600, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.set_auto_update(1) + ui.open() + + return 1 + +/datum/nano_module/program/file_browser/proc/reset_browser(new_key, new_filetype, new_req_perm, new_desc, datum/computer_file/new_saving_file) + disk_name = "local" + dir_ref = null + browser_error = null + selected_file = null + + selecting_key = new_key + selecting_filetype = new_filetype + req_perm = new_req_perm + browser_desc = new_desc + + if(saving_file) + QDEL_NULL(saving_file) + saving_file = new_saving_file + +/datum/nano_module/program/file_browser/proc/get_readable_filetypes() + var/list/filetype_strings = list() + for(var/T in typesof(selecting_filetype)) + var/datum/computer_file/option = T + filetype_strings += ".[initial(option.filetype)]" + return english_list(filetype_strings) \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/generic/email_client.dm b/code/modules/modular_computers/file_system/programs/generic/email_client.dm index 7f73cccf8f1..fc0e448b2ff 100644 --- a/code/modules/modular_computers/file_system/programs/generic/email_client.dm +++ b/code/modules/modular_computers/file_system/programs/generic/email_client.dm @@ -236,15 +236,17 @@ download_progress = 0 return 1 - if(drive.store_file(downloading)) + var/success = drive.store_file() + if(success == OS_FILE_SUCCESS) error = "File successfully downloaded to local device." + else if(success == OS_HARDDRIVE_SPACE) + error = "Error saving file: The hard drive is full" else - error = "Error saving file: I/O Error: The hard drive may be full or nonfunctional." + error = "Error saving file: I/O Error: The hard drive may be nonfunctional." downloading = null download_progress = 0 return 1 - /datum/nano_module/program/email_client/Topic(href, href_list) if(..()) return 1 diff --git a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm deleted file mode 100644 index 4173500b956..00000000000 --- a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm +++ /dev/null @@ -1,275 +0,0 @@ -/datum/computer_file/program/filemanager - filename = "filemanager" - filedesc = "OS File Manager" - extended_desc = "This program allows management of files." - program_icon_state = "generic" - program_key_state = "generic_key" - program_menu_icon = "folder-collapsed" - size = 8 - available_on_network = 0 - undeletable = 1 - usage_flags = PROGRAM_ALL - category = PROG_UTIL - var/open_file - var/error - var/list/file_sources = list( - /datum/file_storage/disk, - /datum/file_storage/disk/removable, - /datum/file_storage/network - ) - var/datum/file_storage/current_filesource = /datum/file_storage/disk - var/datum/file_transfer/current_transfer //ongoing file transfer between filesources - -/datum/computer_file/program/filemanager/on_startup(var/mob/living/user, var/datum/extension/interactive/os/new_host) - ..() - for(var/T in file_sources) - file_sources[T] = new T(new_host) - current_filesource = file_sources[initial(current_filesource)] - -/datum/computer_file/program/filemanager/on_shutdown() - for(var/T in file_sources) - var/datum/file_storage/FS = file_sources[T] - qdel(FS) - file_sources[T] = null - current_filesource = initial(current_filesource) - ui_header = null - if(current_transfer) - qdel(current_transfer) - return ..() - -/datum/computer_file/program/filemanager/Topic(href, href_list, state) - . = ..() - if(.) - return - - var/mob/user = usr - var/list/accesses = computer.get_access(user) - - if(href_list["PRG_change_filesource"]) - . = TOPIC_HANDLED - var/list/choices = list() - for(var/T in file_sources) - var/datum/file_storage/FS = file_sources[T] - if(FS == current_filesource) - continue - choices[FS.name] = FS - var/file_source = input(usr, "Choose a storage medium to use:", "Select Storage Medium") as null|anything in choices - if(file_source) - if(istype(current_filesource, /datum/file_storage/network)) - var/datum/computer_network/network = computer.get_network() - if(!network) - return TOPIC_REFRESH - if(!computer.get_network_status(NET_FEATURE_FILESYSTEM)) - to_chat(usr, SPAN_WARNING("The network rejected access to the filesystems with the current connection.")) - return TOPIC_HANDLED - - current_filesource = choices[file_source] - // Helper for some user-friendliness. Try to select the first available mainframe. - var/list/file_servers = network.get_file_server_tags(MF_ROLE_FILESERVER, accesses) - var/datum/file_storage/network/N = current_filesource - if(!file_servers.len) - N.server = null // Don't allow players to see files on mainframes they cannot access. - return TOPIC_REFRESH - N.server = file_servers[1] - else - current_filesource = choices[file_source] - return TOPIC_REFRESH - - if(href_list["PRG_changefileserver"]) - . = TOPIC_HANDLED - var/datum/computer_network/network = computer.get_network() - if(!network) - return - var/list/file_servers = network.get_file_server_tags(MF_ROLE_FILESERVER, accesses) - var/file_server = input(usr, "Choose a fileserver to view files on:", "Select File Server") as null|anything in file_servers - if(file_server) - var/datum/file_storage/network/N = file_sources[/datum/file_storage/network] - N.server = file_server - return TOPIC_REFRESH - - var/errors = current_filesource.check_errors() - if(errors) - error = errors - return TOPIC_HANDLED - - if(href_list["PRG_openfile"]) - . = TOPIC_HANDLED - var/datum/computer_file/data/F = current_filesource.get_file(href_list["PRG_openfile"]) - if(F && (F.get_file_perms(accesses, user)) & OS_READ_ACCESS) - open_file = href_list["PRG_openfile"] - . = TOPIC_REFRESH - else - to_chat(user, SPAN_WARNING("You do not have permission to read this file.")) - . = TOPIC_HANDLED - if(href_list["PRG_newtextfile"]) - . = TOPIC_HANDLED - var/newname = sanitize(input(usr, "Enter file name or leave blank to cancel:", "File rename")) - if(!newname) - return TOPIC_HANDLED - - if(current_filesource.create_file(newname)) - return TOPIC_REFRESH - - if(href_list["PRG_deletefile"]) - . = TOPIC_REFRESH - current_filesource.delete_file(href_list["PRG_deletefile"]) - - if(href_list["PRG_usbdeletefile"]) - . = TOPIC_REFRESH - current_filesource.delete_file(href_list["PRG_usbdeletefile"]) - - if(href_list["PRG_closefile"]) - . = TOPIC_REFRESH - open_file = null - error = null - - if(href_list["PRG_clone"]) - . = TOPIC_REFRESH - current_filesource.clone_file(href_list["PRG_clone"]) - - if(href_list["PRG_rename"]) - . = TOPIC_REFRESH - var/datum/computer_file/F = current_filesource.get_file(href_list["PRG_rename"]) - if(!F || !istype(F)) - return - var/newname = sanitize(input(usr, "Enter new file name:", "File rename", F.filename)) - if(F && newname) - F.filename = newname - - if(href_list["PRG_edit"]) - . = TOPIC_HANDLED - if(!open_file) - return - var/datum/computer_file/data/F = current_filesource.get_file(open_file) - if(!F || !istype(F)) - return - if(F.do_not_edit && (alert("WARNING: This file is not compatible with editor. Editing it may result in permanently corrupted formatting or damaged data consistency. Edit anyway?", "Incompatible File", "No", "Yes") == "No")) - return - if(F.read_only) - error = "This file is read only. You cannot edit it." - return - if(!(F.get_file_perms(accesses, user) & OS_WRITE_ACCESS)) - error = "You do not have write access to this file." - return - var/oldtext = html_decode(F.stored_data) - oldtext = replacetext(oldtext, "\[br\]", "\n") - - var/newtext = sanitize(replacetext(input(usr, "Editing file [open_file]. You may use most tags used in paper formatting:", "Text Editor", oldtext) as message|null, "\n", "\[br\]"), MAX_TEXTFILE_LENGTH) - if(!newtext || !CanInteract(user, state)) - return - - if(F) - current_filesource.save_file(F.filename, newtext, accesses, user) - return TOPIC_REFRESH - - if(href_list["PRG_printfile"]) - . = 1 - if(!open_file) - return - var/datum/computer_file/data/F = current_filesource.get_file(open_file) - if(!F || !istype(F)) - return - if(!computer.print_paper(digitalPencode2html(F.stored_data),F.filename,F.papertype, F.metadata)) - error = "Hardware error: Unable to print the file." - return TOPIC_REFRESH - - if(href_list["PRG_stoptransfer"]) - QDEL_NULL(current_transfer) - ui_header = null - return TOPIC_REFRESH - - if(href_list["PRG_transferto"]) - . = TOPIC_REFRESH - var/datum/computer_file/F = current_filesource.get_file(href_list["PRG_transferto"]) - if(!F || !istype(F) || F.unsendable) - error = "I/O ERROR: Unable to transfer file." - return - var/copying = alert(usr, "Would you like to copy the file or transfer it? Transfering files requires write access.", "Copying file", "Copy", "Transfer") - if(copying == "Transfer") - if(!(F.get_file_perms(accesses, user) & OS_WRITE_ACCESS)) - error = "ACCESS ERROR: You do not have permission to transfer this file" - return - else - if(!(F.get_file_perms(accesses, user) & OS_READ_ACCESS)) - error = "ACCESS ERROR: You do not have permission to copy this file" - return - var/list/choices = list() - for(var/T in file_sources) - var/datum/file_storage/FS = file_sources[T] - if(FS == current_filesource) - continue - choices[FS.name] = FS - var/file_source = input(usr, "Choose a destination storage medium:", "Transfer To Another Medium") as null|anything in choices - if(file_source) - var/datum/file_storage/dst = choices[file_source] - var/nope = dst.check_errors() - if(nope) - to_chat(user, SPAN_WARNING("Cannot transfer file to [dst] for following reason: [nope]")) - return - current_transfer = new(current_filesource, dst, F, copying == "Copy" ? TRUE : FALSE) - ui_header = "downloader_running.gif" - -/datum/computer_file/program/filemanager/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = global.default_topic_state) - . = ..() - if(!.) - return - var/list/data = computer.initial_data() - - if(error) - data["error"] = error - else if(current_filesource) - data["error"] = current_filesource.check_errors() - - data["current_source"] = current_filesource.name - if(istype(current_filesource, /datum/file_storage/network)) - var/datum/file_storage/network/N = current_filesource - data["fileserver"] = N.server - if(open_file) - var/datum/computer_file/data/F - F = current_filesource.get_file(open_file) - if(!istype(F)) - data["error"] = "I/O ERROR: Unable to open file." - else - data["filedata"] = F.generate_file_data(user) - data["filename"] = "[F.filename].[F.filetype]" - else - var/list/files[0] - for(var/datum/computer_file/F in current_filesource.get_all_files()) - files.Add(list(list( - "name" = F.filename, - "type" = F.filetype, - "size" = F.size, - "undeletable" = F.undeletable, - "unsendable" = F.unsendable - ))) - data["files"] = files - - // Don't show transfers that will be over in a tick, screw flickering - if(current_transfer && current_transfer.get_eta() > 2) - data |= current_transfer.get_ui_data() - - ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "file_manager.tmpl", "OS File Manager", 600, 700, state = state) - ui.auto_update_layout = 1 - ui.set_initial_data(data) - ui.set_auto_update(1) - ui.open() - -/datum/computer_file/program/filemanager/process_tick() - if(!current_transfer) - return - var/result = current_transfer.update_progress() - if(!result) //something went wrong - if(QDELETED(current_transfer)) //either completely - error = "I/O ERROR: Unknown error during the file transfer." - else //or during the saving at the destination - error = "I/O ERROR: Unable to store '[current_transfer.transferring.filename]' at [current_transfer.transfer_to]" - qdel(current_transfer) - current_transfer = null - ui_header = null - return - else if(!current_transfer.left_to_transfer) //done - QDEL_NULL(current_transfer) - ui_header = null - diff --git a/code/modules/modular_computers/file_system/programs/generic/file_manager.dm b/code/modules/modular_computers/file_system/programs/generic/file_manager.dm new file mode 100644 index 00000000000..0e40f38133b --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/generic/file_manager.dm @@ -0,0 +1,452 @@ +/datum/computer_file/program/filemanager + filename = "filemanager" + filedesc = "OS File Manager" + extended_desc = "This program allows management of files." + program_icon_state = "generic" + program_key_state = "generic_key" + program_menu_icon = "folder-collapsed" + size = 8 + available_on_network = 0 + undeletable = 1 + usage_flags = PROGRAM_ALL + category = PROG_UTIL + var/open_file + var/error + var/list/disks = list() // List of list(/datum/file_storage, weakref(directory file)). + var/current_index + + var/datum/file_transfer/current_transfer //ongoing file transfer between file_storage datums + +/datum/computer_file/program/filemanager/on_shutdown() + disks.Cut() + ui_header = null + current_index = null + if(current_transfer) + qdel(current_transfer) + return ..() + +/datum/computer_file/program/filemanager/Topic(href, href_list, state) + . = ..() + if(.) + return + + var/mob/user = usr + var/list/accesses = computer.get_access(user) + + if(href_list["PRG_select_disk"]) + var/disk_name = href_list["PRG_select_disk"] + var/datum/file_storage/selected_disk = computer.mounted_storage[disk_name] + if(selected_disk) + disks += list(list(selected_disk, null)) + current_index = disks.len + return TOPIC_REFRESH + + if(href_list["PRG_mount_network"]) + var/datum/computer_network/network = computer.get_network() + if(!network) + to_chat(user, SPAN_WARNING("NETWORK ERROR: No connectivity to the network.")) + return TOPIC_HANDLED + if(!computer.get_network_status(NET_FEATURE_FILESYSTEM)) + to_chat(user, SPAN_WARNING("NETWORK ERROR: The network denied filesystem access.")) + return TOPIC_HANDLED + var/list/available_mainframes = network.get_file_server_tags(MF_ROLE_FILESERVER, accesses) + if(!length(available_mainframes)) + to_chat(user, SPAN_WARNING("NETWORK ERROR: No available mainframes on the network.")) + var/fileserver_tag = input(user, "Choose a mainframe you would like to mount as a disk:", "Mainframe Mount") as null|anything in available_mainframes + if(!fileserver_tag) + return TOPIC_HANDLED + var/root_name = sanitize(input(user, "Enter the name of the root directory for the newly mounted disk.", "Root directory") as null|text) + if(!root_name) + return TOPIC_HANDLED + var/feedback = computer.mount_mainframe(root_name, fileserver_tag) + to_chat(user, SPAN_NOTICE(feedback)) + return TOPIC_REFRESH + + if(href_list["PRG_unmount_network"]) + var/root_name = href_list["PRG_unmount_network"] + var/datum/file_storage/network/avail_disk = computer.mounted_storage[root_name] + if(!istype(avail_disk)) + return TOPIC_REFRESH + if(!avail_disk.hidden && avail_disk.check_access(accesses)) + computer.unmount_storage(root_name) + return TOPIC_REFRESH + + to_chat(user, SPAN_WARNING("You lack permission to unmount this network drive!")) + return TOPIC_HANDLED + + if(href_list["PRG_change_disk"]) + var/disk_index = text2num(href_list["PRG_change_disk"]) + if(disk_index == 0 || disk_index > disks.len) + current_index = 0 + return TOPIC_REFRESH + current_index = disk_index + return TOPIC_REFRESH + + if(!current_index || current_index > disks.len) + current_index = 0 + return TOPIC_REFRESH + + var/datum/file_storage/current_disk = disks[current_index]?[1] + if(!current_disk) + return TOPIC_HANDLED + + if(href_list["PRG_exit_disk"]) + if(!current_index) + return TOPIC_HANDLED + disks -= list(disks[current_index]) // We have to enclose the list in another list to get it to actually remove it from disks. + current_index-- + return TOPIC_REFRESH + + var/errors = current_disk.check_errors() + if(errors) + error = errors + return TOPIC_REFRESH + + var/weakref/dir_ref = disks[current_index][2] + var/datum/computer_file/directory/current_directory + if(istype(dir_ref)) + current_directory = dir_ref.resolve() + if(!current_directory || !(current_directory in current_disk.get_all_files())) + disks[current_index][2] = null + current_directory = null + else + disks[current_index][2] = null + + if(href_list["PRG_up_directory"]) + var/datum/computer_file/directory/parent_dir = current_directory?.get_directory() + if(parent_dir) + disks[current_index][2] = weakref(parent_dir) + else + disks[current_index][2] = null + return TOPIC_REFRESH + + if(href_list["PRG_openfile"]) + . = TOPIC_HANDLED + var/datum/computer_file/F = current_disk.get_file(href_list["PRG_openfile"], current_directory) + if(!F) + return TOPIC_HANDLED + if(istype(F, /datum/computer_file/directory)) + if(F.get_file_perms(accesses, user) & OS_READ_ACCESS) + disks[current_index][2] = weakref(F) + return TOPIC_REFRESH + else + to_chat(user, SPAN_WARNING("You do not have permission to read this file.")) + return TOPIC_HANDLED + + if(istype(F, /datum/computer_file/data)) + if(F.get_file_perms(accesses, user) & OS_READ_ACCESS) + open_file = href_list["PRG_openfile"] + return TOPIC_REFRESH + else + to_chat(user, SPAN_WARNING("You do not have permission to open this directory.")) + return TOPIC_HANDLED + + to_chat(user, SPAN_WARNING("This file is not in a readable format.")) + return TOPIC_HANDLED + + if(href_list["PRG_newtextfile"]) + . = TOPIC_REFRESH + var/newname = sanitize_for_file(input(usr, "Enter file name or leave blank to cancel:", "New file")) + if(!length(newname)) + return TOPIC_HANDLED + + var/created_file = current_disk.create_file(newname, current_directory, file_type = /datum/computer_file/data/text, accesses = accesses, user = user) + if(created_file != OS_FILE_SUCCESS) + switch(created_file) + if(OS_FILE_NO_WRITE) + to_chat(user, SPAN_WARNING("You lack permission to create a file in this directory.")) + return TOPIC_HANDLED + if(OS_NETWORK_ERROR) + to_chat(user, SPAN_WARNING("Unable to access directory on the network.")) + return TOPIC_REFRESH + if(OS_HARDDRIVE_SPACE) + to_chat(user, SPAN_WARNING("Unable to create new file. The hard drive is full.")) + return TOPIC_HANDLED + else + to_chat(user, SPAN_WARNING("Unable to create new file. The hard drive may be non-functional.")) + return TOPIC_REFRESH + + if(href_list["PRG_newdir"]) + . = TOPIC_REFRESH + var/newname = sanitize_for_file(input(usr, "Enter directory name or leave blank to cancel:", "New directory")) + if(!length(newname)) + return TOPIC_HANDLED + var/created_dir = current_disk.create_directory(newname, current_directory, accesses, user) + if(created_dir != OS_FILE_SUCCESS) + switch(created_dir) + if(OS_FILE_NO_WRITE) + to_chat(user, SPAN_WARNING("You lack permission to create a directory in this directory.")) + return TOPIC_HANDLED + if(OS_NETWORK_ERROR) + to_chat(user, SPAN_WARNING("Unable to access directory on the network.")) + return TOPIC_REFRESH + else + to_chat(user, SPAN_WARNING("Unable to create new directory. The hard drive may be non-functional.")) + return TOPIC_REFRESH + + if(href_list["PRG_deletefile"]) + var/datum/computer_file/del_file = current_disk.get_file(href_list["PRG_deletefile"], current_directory, accesses, user) + var/deleted = current_disk.delete_file(del_file, accesses, user) + if(deleted != OS_FILE_SUCCESS) + switch(deleted) + if(OS_FILE_NO_WRITE) + to_chat(user, SPAN_WARNING("You lack permission to delete '[href_list["PRG_deletefile"]]'.")) + return TOPIC_HANDLED + if(OS_NETWORK_ERROR) + to_chat(user, SPAN_WARNING("Unable to access '[href_list["PRG_deletefile"]]' on the network.")) + return TOPIC_REFRESH + else + to_chat(user, SPAN_WARNING("Failed to delete '[href_list["PRG_deletefile"]]'. The hard drive may be non-functional.")) + return TOPIC_REFRESH + return TOPIC_REFRESH + + if(href_list["PRG_closefile"]) + . = TOPIC_REFRESH + open_file = null + error = null + + if(href_list["PRG_clone"]) + var/cloned = current_disk.clone_file(href_list["PRG_clone"], current_directory, accesses, user) + if(cloned != OS_FILE_SUCCESS) + switch(cloned) + if(OS_FILE_NO_READ) + to_chat(user, SPAN_WARNING("You lack permission to clone the file '[href_list["PRG_clone"]]'.")) + return TOPIC_HANDLED + if(OS_NETWORK_ERROR) + to_chat(user, SPAN_WARNING("Unable to access file '[href_list["PRG_clone"]]' on the network.")) + return TOPIC_REFRESH + else + to_chat(user, SPAN_WARNING("Unable to clone file '[href_list["PRG_clone"]]'. The hard drive may be non-functional.")) + return TOPIC_REFRESH + return TOPIC_REFRESH + + if(href_list["PRG_rename"]) + var/datum/computer_file/F = current_disk.get_file(href_list["PRG_rename"], current_directory) + if(!F || !istype(F)) + return TOPIC_REFRESH + if(F.unrenamable) + to_chat(user, SPAN_WARNING("You do not have permission to rename that file.")) + return TOPIC_HANDLED + if(F.get_file_perms(accesses, user) & OS_WRITE_ACCESS) + var/newname = sanitize_for_file(input(user, "Enter new file name:", "File rename", F.filename)) + if(F && length(newname)) + F.filename = newname + return TOPIC_REFRESH + else + to_chat(user, SPAN_WARNING("You do not have permission to rename that file.")) + return TOPIC_HANDLED + + if(href_list["PRG_edit"]) + . = TOPIC_HANDLED + if(!open_file) + return + var/datum/computer_file/data/F = current_disk.get_file(open_file, current_directory) + if(!F || !istype(F)) + return + if(F.do_not_edit && (alert("WARNING: This file is not compatible with editor. Editing it may result in permanently corrupted formatting or damaged data consistency. Edit anyway?", "Incompatible File", "No", "Yes") == "No")) + return + if(F.read_only) + error = "This file is read only. You cannot edit it." + return + if(!(F.get_file_perms(accesses, user) & OS_WRITE_ACCESS)) + error = "You do not have write access to this file." + return + var/oldtext = html_decode(F.stored_data) + oldtext = replacetext(oldtext, "\[br\]", "\n") + + var/newtext = sanitize(replacetext(input(user, "Editing file [open_file]. You may use most tags used in paper formatting:", "Text Editor", oldtext) as message|null, "\n", "\[br\]"), MAX_TEXTFILE_LENGTH) + if(!newtext || !CanInteract(user, state)) + return + + if(F) + current_disk.save_file(F.filename, current_directory, newtext, null, accesses, user) + return TOPIC_REFRESH + + if(href_list["PRG_printfile"]) + . = 1 + if(!open_file) + return + var/datum/computer_file/data/F = current_disk.get_file(open_file, current_directory) + if(!F || !istype(F)) + return + if(!(F.get_file_perms(accesses, user) & OS_READ_ACCESS)) + error = "You do not have read access to this file." + return + if(!computer.print_paper(digitalPencode2html(F.stored_data), F.filename)) + error = "Hardware error: Unable to print the file." + return TOPIC_REFRESH + + if(href_list["PRG_stoptransfer"]) + QDEL_NULL(current_transfer) + ui_header = null + return TOPIC_REFRESH + + if(href_list["PRG_transferto"]) + . = TOPIC_REFRESH + var/datum/computer_file/F = current_disk.get_file(href_list["PRG_transferto"], current_directory) + if(!F || !istype(F) || F.unsendable) + error = "I/O ERROR: Unable to transfer file." + return + + var/copying = alert(usr, "Would you like to copy the file or transfer it? Transfering files requires write access.", "Copying file", "Copy", "Transfer") + var/list/choices = list() + var/list/curr_fs_list = disks[current_index] + for(var/list/fs_list in disks) + // Skip over the disk if its referencing the same directory. + if(curr_fs_list[1] == fs_list[1] && curr_fs_list[2] == fs_list[2]) + continue + + var/datum/file_storage/FS = fs_list[1] + var/weakref/FS_dir_ref = fs_list[2] + + var/datum/computer_file/directory/FS_dir = FS_dir_ref?.resolve() + choices[FS.get_dir_path(FS_dir, TRUE)] = fs_list + + if(!length(choices)) + to_chat(usr, SPAN_WARNING("You must open another disk to transfer files.")) + return TOPIC_HANDLED + + var/storage = input(usr, "Choose a destination storage medium:", "Transfer To Another Medium") as null|anything in choices + if(storage) + var/list/chosen_list = choices[storage] + var/datum/file_storage/dst = chosen_list[1] + var/nope = dst.check_errors() + if(nope) + to_chat(user, SPAN_WARNING("Cannot transfer file to [dst] for following reason: [nope]")) + return + + var/weakref/dst_dir_ref = chosen_list[2] + var/datum/computer_file/directory/dst_dir = dst_dir_ref?.resolve() + + var/error = check_file_transfer(dst_dir, F, copying == "Copy", accesses, user) + if(error) + to_chat(user, SPAN_WARNING("Cannot transfer file. [error].")) + return TOPIC_HANDLED + current_transfer = new(current_disk, dst, dst_dir, F, copying == "Copy" ? TRUE : FALSE) + ui_header = "downloader_running.gif" + +/datum/computer_file/program/filemanager/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = global.default_topic_state) + . = ..() + if(!.) + return + var/list/data = computer.initial_data() + var/list/accesses = computer.get_access(user) + + if(current_index > disks.len) // Safety check. + current_index = 0 + + var/datum/file_storage/current_disk + var/datum/computer_file/directory/current_directory + + if(current_index) + var/list/current_disk_list = disks[current_index] + current_disk = current_disk_list[1] + + var/weakref/dir_ref = current_disk_list[2] + if(istype(dir_ref)) + current_directory = dir_ref.resolve() + else + current_disk_list[2] = null + + if(error) + data["error"] = error + else if(current_disk) + data["error"] = current_disk.check_errors() + + if(!data["error"]) + var/list/ui_disks[0] + var/disk_index = 1 + for(var/list/ui_disk_list in disks) + var/datum/file_storage/ui_disk = ui_disk_list[1] + + var/weakref/ui_dir_ref = ui_disk_list[2] + var/datum/computer_file/directory/ui_directory + if(istype(ui_dir_ref)) + ui_directory = ui_dir_ref.resolve() + else + ui_disk_list[2] = null + + ui_disks.Add(list(list( + "name" = ui_disk.get_dir_path(ui_directory), + "index" = disk_index, + "selected" = disk_index == current_index + ))) + disk_index++ + data["disks"] = ui_disks + + if(current_disk) + data["up_directory"] = !!current_directory + data["current_disk"] = current_disk.get_dir_path(current_directory, TRUE) + + if(open_file) + var/datum/computer_file/data/F + F = current_disk.get_file(open_file, current_directory) + if(!istype(F)) + data["error"] = "I/O ERROR: Unable to open file." + else + data["filedata"] = F.generate_file_data(user) + data["filename"] = "[F.filename].[F.filetype]" + else + var/list/files[0] + for(var/datum/computer_file/F in current_disk.get_dir_files(current_directory)) + files.Add(list(list( + "name" = F.filename, + "type" = F.filetype, + "dir" = istype(F, /datum/computer_file/directory), + "size" = F.size, + "undeletable" = F.undeletable, + "unrenamable" = F.unrenamable, + "unsendable" = F.unsendable + ))) + data["files"] = files + else // No disk selected, option to create a new one. + var/list/avail_disks[0] + + for(var/root_name in computer.mounted_storage) + var/datum/file_storage/avail_disk = computer.mounted_storage[root_name] + if(!avail_disk.hidden && avail_disk.check_access(accesses)) + avail_disks.Add(list(list( + "name" = root_name, + "desc" = avail_disk.desc, + "is_network" = istype(avail_disk, /datum/file_storage/network) + ))) + + data["avail_disks"] = avail_disks + // Don't show transfers that will be over in a tick, screw flickering + if(current_transfer && current_transfer.get_eta() > 2) + data |= current_transfer.get_ui_data() + + ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "file_manager.tmpl", "OS File Manager", 900, 700, state = state) + ui.auto_update_layout = 1 + ui.set_initial_data(data) + ui.set_auto_update(1) + ui.open() + +/datum/computer_file/program/filemanager/process_tick() + if(!current_transfer) + return + var/result = current_transfer.update_progress() + if(result != OS_FILE_SUCCESS) //something went wrong + if(QDELETED(current_transfer)) //either completely + error = "I/O ERROR: Unknown error during the file transfer." + else //or during the saving at the destination + error = "I/O ERROR: Unable to store '[current_transfer.transferring.filename]' at '[current_transfer.transfer_to.get_dir_path(current_transfer.directory_to, TRUE)]'" + qdel(current_transfer) + current_transfer = null + ui_header = null + return + else if(!current_transfer.left_to_transfer) //done + QDEL_NULL(current_transfer) + ui_header = null + +/datum/computer_file/program/filemanager/on_file_storage_removal(datum/file_storage/removed) + var/list/current_disk_list = disks[current_index] + for(var/list/disk_list in disks) + var/datum/file_storage/disk = disk_list[1] + if(disk == removed) + if(current_disk_list == disk_list) + current_index = null + + disks -= list(disk_list) \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm index c67162cf60b..e1e7ccd55f8 100644 --- a/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/generic/ntdownloader.dm @@ -21,6 +21,14 @@ var/datum/file_transfer/current_transfer +/datum/computer_file/program/appdownloader/on_startup(mob/living/user, datum/extension/interactive/os/new_host) + . = ..() + // Initialize the internal "appdownload" disk if necessary. + var/datum/file_storage/network/app_download = new_host.mounted_storage["appdownload"] + if(!istype(app_download)) // If you had another network disk named appdownload it will be appropriated. + qdel(app_download) + new_host.mounted_storage["appdownload"] = new /datum/file_storage/network(new_host, "appdownload", TRUE) + /datum/computer_file/program/appdownloader/on_shutdown() ..() QDEL_NULL(current_transfer) @@ -36,13 +44,20 @@ if(!check_file_download(filename)) return 0 - var/datum/computer_file/program/PRG = net.find_file_by_name(filename, MF_ROLE_SOFTWARE) - var/datum/file_storage/disk/destination = new(computer) - var/datum/file_storage/network/source = new(computer) - source.server = net.find_file_location(filename, MF_ROLE_SOFTWARE) + var/datum/computer_file/program/PRG = net.find_file_by_name(filename, OS_PROGRAMS_DIR, MF_ROLE_SOFTWARE) + var/datum/file_storage/disk/destination = computer.mounted_storage["local"] + if(!destination) + return 0 + var/datum/file_storage/network/source = computer.mounted_storage["appdownload"] + if(!source) + return 0 + var/datum/computer_file/directory/programs_directory = destination.parse_directory(OS_PROGRAMS_DIR, TRUE) + if(!programs_directory) + return 0 + source.set_server(net.find_file_location(PRG, mainframe_role = MF_ROLE_SOFTWARE)) if(source.check_errors() || destination.check_errors()) return 0 - current_transfer = new(source, destination, PRG, TRUE) + current_transfer = new(source, destination, programs_directory, PRG, TRUE) ui_header = "downloader_running.gif" generate_network_log("Downloading file [filename] from [source.server].") @@ -52,12 +67,12 @@ var/datum/computer_network/net = computer.get_network() if(!net) return 0 - var/datum/computer_file/program/PRG = net.find_file_by_name(filename, MF_ROLE_SOFTWARE) + var/datum/computer_file/program/PRG = net.find_file_by_name(filename, OS_PROGRAMS_DIR, MF_ROLE_SOFTWARE) - if(!PRG || !istype(PRG)) + if(!istype(PRG)) return 0 - if(!computer || !computer.try_store_file(PRG)) + if(!computer || (computer.try_store_file(PRG, computer.programs_dir) != OS_FILE_SUCCESS)) return 0 return 1 @@ -73,7 +88,7 @@ return var/result = current_transfer.update_progress() - if(!result) //something went wrong + if(result != OS_FILE_SUCCESS) //something went wrong if(QDELETED(current_transfer)) //either completely downloaderror = "I/O ERROR: Unknown error during the file transfer." else //or during the saving at the destination diff --git a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm index e9215b389d7..f63674d87b3 100644 --- a/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/generic/ntnrc_client.dm @@ -123,7 +123,7 @@ logfile.stored_data += "[logstring]\[BR\]" logfile.stored_data += "\[b\]Logfile dump completed.\[/b\]" logfile.calculate_size() - if(!computer.store_file(logfile)) + if(!computer.store_file(logfile, OS_LOGS_DIR, create_directories = TRUE)) computer.show_error(user, "I/O Error - Check hard drive and free space. Required space: [logfile.size]GQ.") if(href_list["PRG_renamechannel"]) . = 1 diff --git a/code/modules/modular_computers/file_system/programs/generic/records.dm b/code/modules/modular_computers/file_system/programs/generic/records.dm index e72b5784301..ad75a688a90 100644 --- a/code/modules/modular_computers/file_system/programs/generic/records.dm +++ b/code/modules/modular_computers/file_system/programs/generic/records.dm @@ -97,10 +97,16 @@ if(!network) to_chat(usr, SPAN_WARNING("Network error.")) return - if(!network.store_file(active_record, MF_ROLE_CREW_RECORDS)) + var/list/accesses = get_access(usr) + if(!network.get_mainframes_by_role(MF_ROLE_CREW_RECORDS, accesses)) to_chat(usr, SPAN_WARNING("You may not have access to generate new crew records, or there may not be a crew record mainframe active on the network.")) return active_record = new/datum/computer_file/report/crew_record() + if(network.store_file(active_record, OS_RECORDS_DIR, TRUE, accesses, usr, mainframe_role = MF_ROLE_CREW_RECORDS) != OS_FILE_SUCCESS) + to_chat(usr, SPAN_WARNING("Unable to store new crew record. The file server may be non-functional or out of disk space.")) + qdel(active_record) + active_record = null + return global.all_crew_records.Add(active_record) return 1 if(href_list["print_active"]) diff --git a/code/modules/modular_computers/file_system/programs/generic/reports.dm b/code/modules/modular_computers/file_system/programs/generic/reports.dm index e547030d046..2242e71ce77 100644 --- a/code/modules/modular_computers/file_system/programs/generic/reports.dm +++ b/code/modules/modular_computers/file_system/programs/generic/reports.dm @@ -160,7 +160,7 @@ selected_report.rename_file() file.stored_data = selected_report.generate_pencode(get_access(user), user, no_html = 1) //TXT files can't have html; they use pencode only. file.filename = selected_report.filename - if(program.computer.store_file(file)) + if(program.computer.store_file(file, "reports", create_directories = TRUE)) to_chat(user, "The report has been exported as '[file.filename].[file.filetype]'.") else to_chat(user, "Error storing file. Please check your hard drive.") diff --git a/code/modules/modular_computers/file_system/programs/generic/scanner.dm b/code/modules/modular_computers/file_system/programs/generic/scanner.dm index c79f23471de..ff721374a1c 100644 --- a/code/modules/modular_computers/file_system/programs/generic/scanner.dm +++ b/code/modules/modular_computers/file_system/programs/generic/scanner.dm @@ -7,8 +7,8 @@ size = 6 available_on_network = 1 usage_flags = PROGRAM_ALL - nanomodule_path = /datum/nano_module/program/scanner category = PROG_UTIL + nanomodule_path = /datum/nano_module/program/scanner var/using_scanner = 0 //Whether or not the program is synched with the scanner module. var/data_buffer = "" //Buffers scan output for saving/viewing. @@ -36,13 +36,6 @@ metadata_buffer.Cut() return 1 -/datum/computer_file/program/scanner/proc/save_scan(name) - if(!data_buffer) - return 0 - if(!create_file(name, data_buffer, scan_file_type, metadata_buffer.Copy())) - return 0 - return 1 - /datum/computer_file/program/scanner/proc/check_scanning() if(!computer) return 0 @@ -61,7 +54,7 @@ /datum/computer_file/program/scanner/Topic(href, href_list) if(..()) - return 1 + return TOPIC_HANDLED if(href_list["connect_scanner"]) if(text2num(href_list["connect_scanner"])) @@ -69,22 +62,26 @@ to_chat(usr, "Scanner installation failed.") else disconnect_scanner() - return 1 + return TOPIC_REFRESH if(href_list["scan"]) if(check_scanning()) metadata_buffer.Cut() var/obj/item/stock_parts/computer/scanner/scanner = computer.get_component(PART_SCANNER) scanner.run_scan(usr, src) - return 1 + return TOPIC_REFRESH if(href_list["save"]) - var/name = sanitize(input(usr, "Enter file name:", "Save As") as text|null) - if(!save_scan(name)) - to_chat(usr, "Scan save failed.") + if(!data_buffer) + to_chat(usr, SPAN_WARNING("No data to export!")) + return TOPIC_HANDLED + + var/datum/computer_file/data/scan_file = new scan_file_type() + scan_file.stored_data = data_buffer - if(.) - SSnano.update_uis(NM) + // This saves the file, so no additional handling on the program's end is required. + view_file_browser(usr, "saving_file", scan_file_type, OS_WRITE_ACCESS, "Save scan file", scan_file) + return TOPIC_HANDLED /datum/nano_module/program/scanner name = "Scanner" diff --git a/code/modules/modular_computers/file_system/programs/generic/wordprocessor.dm b/code/modules/modular_computers/file_system/programs/generic/wordprocessor.dm index 6c6afa5b8f1..d83417438bc 100644 --- a/code/modules/modular_computers/file_system/programs/generic/wordprocessor.dm +++ b/code/modules/modular_computers/file_system/programs/generic/wordprocessor.dm @@ -6,24 +6,32 @@ program_key_state = "atmos_key" size = 4 available_on_network = 1 - nanomodule_path = /datum/nano_module/program/computer_wordprocessor/ usage_flags = PROGRAM_ALL category = PROG_OFFICE - var/browsing - var/open_file + var/open_file // Name of the file currently open. + var/file_directory // Directory of the file currently open. + var/loaded_data var/error var/is_edited /datum/computer_file/program/wordprocessor/on_shutdown(forced) . = ..() - browsing = null open_file = null + file_directory = null loaded_data = null error = null - is_edited = null + is_edited = FALSE + +/datum/computer_file/program/wordprocessor/on_file_select(datum/file_storage/disk, datum/computer_file/directory/dir, datum/computer_file/selected, selecting_key, mob/user) + var/datum/computer_file/data/text/T = selected + loaded_data = T.stored_data + open_file = T.filename + file_directory = disk.get_dir_path(dir, TRUE) + is_edited = FALSE + . = ..() /datum/computer_file/program/wordprocessor/proc/open_file(var/openingfile, var/list/accesses, var/mob/user) var/datum/computer_file/data/F = get_file(openingfile) @@ -36,10 +44,23 @@ return TRUE error = "I/O error: Unable to open file '[openingfile]'." -/datum/computer_file/program/wordprocessor/proc/save_file(var/savingfile) - . = computer.save_file(savingfile, loaded_data, /datum/computer_file/data/text) - if(.) - is_edited = 0 +/datum/computer_file/program/wordprocessor/proc/save_file(mob/user) + var/datum/computer_file/result = computer.save_file(open_file, file_directory, loaded_data, /datum/computer_file/data/text, null, computer.get_access(user), user) + . = FALSE + if(istype(result)) + to_chat(user, SPAN_NOTICE("Successfully saved file '[open_file]'.")) + is_edited = FALSE + return TRUE + // Errored! + switch(result) + if(OS_BAD_NAME) + error = "I/O error: Invalid file name '[open_file]'." + if(OS_FILE_NOT_FOUND) + error = "I/O error: Directory not found." + if(OS_FILE_NO_WRITE) + error = "I/O error: You do not have permission to modify file '[open_file]'" + else + error = "I/O error: Harddrive may be non-functional." #define MAX_FIELDS_NUM 50 @@ -47,98 +68,67 @@ if(..()) return 1 - if(href_list["PRG_txtrpeview"]) + if(href_list["PRG_txtpreview"]) show_browser(usr,"[open_file][digitalPencode2html(loaded_data)]", "window=[open_file]") - return 1 + return TOPIC_HANDLED if(href_list["PRG_taghelp"]) var/datum/codex_entry/entry = SScodex.get_codex_entry("pen") if(entry) SScodex.present_codex_entry(usr, entry) - return 1 - - if(href_list["PRG_closebrowser"]) - browsing = 0 - return 1 + return TOPIC_HANDLED if(href_list["PRG_backtomenu"]) error = null - return 1 - - if(href_list["PRG_loadmenu"]) - browsing = 1 - return 1 + return TOPIC_REFRESH if(href_list["PRG_openfile"]) - . = 1 if(is_edited) if(alert("Would you like to save your changes first?",,"Yes","No") == "Yes") - save_file(open_file) - browsing = 0 - open_file(href_list["PRG_openfile"], NM.get_access(usr), usr) + if(!save_file(usr)) + return TOPIC_HANDLED + var/browser_desc = "Select a file to open" + view_file_browser(usr, "open_file", /datum/computer_file/data/text, OS_READ_ACCESS, browser_desc) + return TOPIC_HANDLED if(href_list["PRG_newfile"]) - . = 1 if(is_edited) if(alert("Would you like to save your changes first?",,"Yes","No") == "Yes") - save_file(open_file) - - var/newname = sanitize(input(usr, "Enter file name:", "New File") as text|null) - if(!newname) - return 1 - var/datum/computer_file/data/F = create_file(newname, "", /datum/computer_file/data/text) - if(F) - open_file = F.filename - loaded_data = "" - - // Set the write/mod access to the current account if it exists. - var/datum/computer_file/data/account/A = computer.get_account() - if(A) - var/datum/computer_network/network = computer.get_network() - LAZYADD(F.write_access, list(list("[A.login]@[network.network_id]"))) - LAZYADD(F.mod_access, list(list("[A.login]@[network.network_id]"))) - return 1 - else - error = "I/O error: Unable to create file '[href_list["PRG_saveasfile"]]'." + if(!save_file(usr)) + return TOPIC_HANDLED + + var/browser_desc = "Create new file" + var/datum/computer_file/data/text/saving = new() + view_file_browser(usr, "create_file", /datum/computer_file/data/text, OS_WRITE_ACCESS, browser_desc, saving) + return TOPIC_HANDLED if(href_list["PRG_saveasfile"]) - . = 1 - var/newname = sanitize(input(usr, "Enter file name:", "Save As") as text|null) - if(!newname) - return 1 - var/datum/computer_file/data/F = create_file(newname, loaded_data, /datum/computer_file/data/text) - if(F) - var/datum/computer_file/data/account/A = computer.get_account() - if(A) - var/datum/computer_network/network = computer.get_network() - LAZYADD(F.write_access, list(list("[A.login]@[network.network_id]"))) - LAZYADD(F.mod_access, list(list("[A.login]@[network.network_id]"))) - - open_file = F.filename - else - error = "I/O error: Unable to create file '[href_list["PRG_saveasfile"]]'." - return 1 + var/browser_desc = "Save file as" + var/datum/computer_file/data/text/saving = new() + saving.filename = open_file ? open_file : "NewFile" + saving.stored_data = loaded_data + view_file_browser(usr, "saveas_file", /datum/computer_file/data/text, OS_WRITE_ACCESS, browser_desc, saving) + return TOPIC_HANDLED if(href_list["PRG_savefile"]) - . = 1 if(!open_file) - open_file = sanitize(input(usr, "Enter file name:", "Save As") as text|null) - if(!open_file) - return 0 - if(!save_file(open_file)) - error = "I/O error: Unable to save file '[open_file]'. Access may be denied." - return 1 + var/browser_desc = "Save file as" + var/datum/computer_file/data/text/saving = new() + saving.stored_data = loaded_data + view_file_browser(usr, "saveas_file", /datum/computer_file/data/text, OS_WRITE_ACCESS, browser_desc, saving) + return TOPIC_HANDLED + + save_file(usr) + return TOPIC_REFRESH if(href_list["PRG_editfile"]) var/oldtext = html_decode(loaded_data) oldtext = replacetext(oldtext, "\[br\]", "\n") - var/datum/computer_file/data/F = get_file(open_file) - if(!F) - error = "I/O error: File not found." - return 1 - if(!(F.get_file_perms(NM.get_access(usr), usr) & OS_WRITE_ACCESS)) - error = "I/O error: You do not have permission to edit this file." - return 1 + if(open_file) + var/datum/computer_file/data/F = get_file(open_file, file_directory, computer.get_access(usr), usr) + if(istype(F) && !(F.get_file_perms(computer.get_access(usr), usr) & OS_WRITE_ACCESS)) + error = "I/O error: You do not have permission to edit this file." + return TOPIC_REFRESH var/newtext = sanitize(replacetext(input(usr, "Editing file '[open_file]'. You may use most tags used in paper formatting:", "Text Editor", oldtext) as message|null, "\n", "\[br\]"), MAX_TEXTFILE_LENGTH) if(!newtext) return @@ -155,56 +145,28 @@ loaded_data = newtext is_edited = 1 - return 1 + return TOPIC_REFRESH if(href_list["PRG_printfile"]) - . = 1 if(!computer.print_paper(digitalPencode2html(loaded_data))) error = "Hardware error: Printer missing or out of paper." - return 1 + return TOPIC_HANDLED #undef MAX_FIELDS_NUM -/datum/nano_module/program/computer_wordprocessor - name = "Word Processor" - -/datum/nano_module/program/computer_wordprocessor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = global.default_topic_state) - var/list/data = host.initial_data() - var/datum/computer_file/program/wordprocessor/PRG - PRG = program - - if(PRG.error) - data["error"] = PRG.error - if(PRG.browsing) - data["browsing"] = PRG.browsing - if(!PRG.computer || !PRG.computer.has_component(PART_HDD)) - data["error"] = "I/O ERROR: Unable to access hard drive." - else - var/list/files[0] - for(var/datum/computer_file/F in PRG.computer.get_all_files()) - if(F.filetype == "TXT") - files.Add(list(list( - "name" = F.filename, - "size" = F.size - ))) - data["files"] = files - - var/obj/item/stock_parts/computer/drive_slot/RHDD = PRG.computer.get_component(PART_D_SLOT) - if(istype(RHDD) && istype(RHDD.stored_drive)) - data["usbconnected"] = 1 - var/list/usbfiles[0] - for(var/datum/computer_file/F in PRG.computer.get_all_files(RHDD.stored_drive)) - if(F.filetype == "TXT") - usbfiles.Add(list(list( - "name" = F.filename, - "size" = F.size, - ))) - data["usbfiles"] = usbfiles - else if(PRG.open_file) - data["filedata"] = digitalPencode2html(PRG.loaded_data) - data["filename"] = PRG.is_edited ? "[PRG.open_file]*" : PRG.open_file +/datum/computer_file/program/wordprocessor/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = global.default_topic_state) + . = ..() + if(!.) + return + var/list/data = computer.initial_data() + + if(error) + data["error"] = error + if(open_file) + data["filedata"] = digitalPencode2html(loaded_data) + data["filename"] = is_edited ? "[open_file]*" : open_file else - data["filedata"] = digitalPencode2html(PRG.loaded_data) + data["filedata"] = digitalPencode2html(loaded_data) data["filename"] = "UNNAMED" ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) diff --git a/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm b/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm index 98985e05ba2..875c3b8588b 100644 --- a/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm +++ b/code/modules/modular_computers/file_system/programs/security/digitalwarrant.dm @@ -19,28 +19,31 @@ var/global/list/all_warrants name = "Warrant Assistant" var/datum/computer_file/report/warrant/active -/datum/nano_module/program/proc/get_warrants() +/datum/nano_module/program/proc/get_warrants(list/accesses, mob/user) var/datum/computer_network/network = program?.computer?.get_network() if(network) - return network.get_all_files_of_type(/datum/computer_file/report/warrant) + return network.get_all_files_of_type(/datum/computer_file/report/warrant, accesses, user) -/datum/nano_module/program/proc/remove_warrant(datum/computer_file/report/warrant/W) +/datum/nano_module/program/proc/remove_warrant(datum/computer_file/report/warrant/W, list/accesses, mob/user) var/datum/computer_network/network = program?.computer?.get_network() if(network) - return network.remove_file(W) + return network.remove_file(W, accesses, user) -/datum/nano_module/program/proc/save_warrant(datum/computer_file/report/warrant/W) +/datum/nano_module/program/proc/save_warrant(datum/computer_file/report/warrant/W, list/accesses, mob/user) var/datum/computer_network/network = program?.computer?.get_network() if(network) - return network.store_file(W) + return network.store_file(W, OS_DOCUMENTS_DIR, TRUE, accesses = accesses, user = user) /datum/nano_module/program/digitalwarrant/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = global.default_topic_state) var/list/data = host.initial_data() + var/list/accesses = get_access(user) + if(active) - data["details"] = active.generate_nano_data(get_access(user), user) + data["details"] = active.generate_nano_data(accesses, user) else - for(var/datum/computer_file/report/warrant/W in global.all_warrants) + var/list/avail_warrants = get_warrants(accesses, user) + for(var/datum/computer_file/report/warrant/W in avail_warrants) LAZYADD(data[W.get_category()], W.get_nano_summary()) ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) @@ -53,24 +56,26 @@ var/global/list/all_warrants /datum/nano_module/program/digitalwarrant/Topic(href, href_list) if(..()) return 1 + var/list/accesses = get_access(usr) + var/list/avail_warrants = get_warrants(accesses, usr) if(href_list["editwarrant"]) . = 1 - for(var/datum/computer_file/report/warrant/W in global.all_warrants) + for(var/datum/computer_file/report/warrant/W in avail_warrants) if(W.uid == text2num(href_list["editwarrant"])) active = W break if(href_list["sendtoarchive"]) . = 1 - for(var/datum/computer_file/report/warrant/W in global.all_warrants) + for(var/datum/computer_file/report/warrant/W in avail_warrants) if(W.uid == text2num(href_list["sendtoarchive"])) W.archived = TRUE break if(href_list["restore"]) . = 1 - for(var/datum/computer_file/report/warrant/W in global.all_warrants) + for(var/datum/computer_file/report/warrant/W in avail_warrants) if(W.uid == text2num(href_list["restore"])) W.archived = FALSE break @@ -89,17 +94,23 @@ var/global/list/all_warrants if(!active) return broadcast_security_hud_message("[active.get_broadcast_summary()] has been [(active in global.all_warrants) ? "edited" : "uploaded"].", nano_host()) - LAZYDISTINCTADD(global.all_warrants, active) + + var/success = save_warrant(active, accesses, usr) + if(success != OS_FILE_SUCCESS) + to_chat(usr, SPAN_WARNING("Could not save warrant. You may lack access to the file servers.")) + return active = null if(href_list["deletewarrant"]) . = 1 if(!active) - for(var/datum/computer_file/report/warrant/W in global.all_warrants) + for(var/datum/computer_file/report/warrant/W in avail_warrants) if(W.uid == text2num(href_list["deletewarrant"])) active = W break - LAZYREMOVE(global.all_warrants, active) + var/success = remove_warrant(active, accesses, usr) + if(success != OS_FILE_SUCCESS) + to_chat(usr, SPAN_WARNING("Could not remove warrant. You may lack access to the file servers.")) active = null if(href_list["back"]) @@ -112,7 +123,7 @@ var/global/list/all_warrants var/datum/report_field/F = active.field_from_ID(text2num(href_list["edit_field"])) if(!F) return - if(!(F.get_perms(get_access(usr), usr) & OS_WRITE_ACCESS)) + if(!(F.get_perms(accesses, usr) & OS_WRITE_ACCESS)) to_chat(usr, SPAN_WARNING("\The [nano_host()] flashes an \"Access Denied\" warning.")) return F.ask_value(usr) diff --git a/code/modules/modular_computers/file_system/reports/crew_record.dm b/code/modules/modular_computers/file_system/reports/crew_record.dm index 9e6fd8e1874..94fcee7d93f 100644 --- a/code/modules/modular_computers/file_system/reports/crew_record.dm +++ b/code/modules/modular_computers/file_system/reports/crew_record.dm @@ -9,6 +9,8 @@ var/global/arrest_security_status = "Arrest" /datum/computer_file/report/crew_record filetype = "CDB" size = 2 + write_access = list(list(access_bridge)) + var/icon/photo_front = null var/icon/photo_side = null @@ -165,7 +167,7 @@ var/global/arrest_security_status = "Arrest" CR.load_from_mob(H) var/datum/computer_network/network = get_local_network_at(get_turf(H)) if(network) - network.store_file(CR, MF_ROLE_CREW_RECORDS) + network.store_file(CR, OS_RECORDS_DIR, TRUE, mainframe_role = MF_ROLE_CREW_RECORDS) return CR // Gets crew records filtered by set of positions diff --git a/code/modules/modular_computers/file_system/reports/report.dm b/code/modules/modular_computers/file_system/reports/report.dm index 14e4a2277df..c6bc0721e24 100644 --- a/code/modules/modular_computers/file_system/reports/report.dm +++ b/code/modules/modular_computers/file_system/reports/report.dm @@ -166,8 +166,8 @@ Overriden so that read access is required to have write access */ /datum/computer_file/report/get_file_perms(list/accesses, mob/user) var/perms = ..() - if(!(perms & OS_WRITE_ACCESS)) - perms &= ~OS_READ_ACCESS + if(!(perms & OS_READ_ACCESS)) + perms &= ~OS_WRITE_ACCESS return perms // Manually changing the permissions of a report will change *all* contained fields to match. diff --git a/code/modules/modular_computers/file_system/reports/warrant.dm b/code/modules/modular_computers/file_system/reports/warrant.dm index c32a22435b2..e486810042f 100644 --- a/code/modules/modular_computers/file_system/reports/warrant.dm +++ b/code/modules/modular_computers/file_system/reports/warrant.dm @@ -1,6 +1,9 @@ /datum/computer_file/report/warrant title = "Warrant" form_name = "W-104" + + write_access = list(list(access_security), list(access_bridge)) + read_access = list(list(access_security), list(access_bridge)) var/archived = FALSE /datum/computer_file/report/warrant/New() diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm index 2734bc57ce7..c31711f4766 100644 --- a/code/modules/modular_computers/hardware/_hardware.dm +++ b/code/modules/modular_computers/hardware/_hardware.dm @@ -19,6 +19,14 @@ return 1 return ..() +/obj/item/stock_parts/computer/on_install(obj/machinery/machine) + . = ..() + do_after_install(machine, TRUE) + +/obj/item/stock_parts/computer/on_uninstall(obj/machinery/machine, temporary) + do_before_uninstall(machine, TRUE) + . = ..() + // Called on multitool click, prints diagnostic information to the user. /obj/item/stock_parts/computer/proc/diagnostics() return list("Hardware Integrity Test... (Corruption: [max_health ? round((max_health - health)/max_health * 100) : 0]%)") @@ -49,3 +57,7 @@ var/datum/extension/interactive/os/os = get_extension(loc, /datum/extension/interactive/os) if(os) os.recalc_power_usage() + +/obj/item/stock_parts/computer/proc/do_after_install(atom/device, loud) + +/obj/item/stock_parts/computer/proc/do_before_uninstall(atom/device, loud) \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/drive_slot.dm b/code/modules/modular_computers/hardware/drive_slot.dm index a6d5cf7c5fa..da7c5d72987 100644 --- a/code/modules/modular_computers/hardware/drive_slot.dm +++ b/code/modules/modular_computers/hardware/drive_slot.dm @@ -11,6 +11,7 @@ material = /decl/material/solid/metal/steel var/obj/item/stock_parts/computer/hard_drive/portable/stored_drive = null + var/mount_name /obj/item/stock_parts/computer/drive_slot/diagnostics() . = ..() @@ -67,6 +68,29 @@ loc.verbs |= /obj/item/stock_parts/computer/drive_slot/proc/verb_eject_drive return TRUE +/obj/item/stock_parts/computer/drive_slot/do_after_install(atom/device, loud) + var/datum/extension/interactive/os/os = get_extension(device, /datum/extension/interactive/os) + if(!os) + return FALSE + + var/datum/file_storage/new_storage = os.mount_storage(/datum/file_storage/disk/removable, "media", FALSE) + if(new_storage) + mount_name = new_storage.root_name + if(loud) + device.visible_message(SPAN_NOTICE("\The [device] pings: Mounted removable hard drive as file system with root directory '[new_storage.root_name]'.")) + return TRUE + else + if(loud) + device.visible_message(SPAN_WARNING("\The [device] flashes an error: Failed to mount removable harddrive. Hard drive may be non-functional.")) + return FALSE + +/obj/item/stock_parts/computer/drive_slot/do_before_uninstall(atom/device, loud) + var/datum/extension/interactive/os/os = get_extension(device, /datum/extension/interactive/os) + if(!os) + return FALSE + + os.unmount_storage(mount_name) + /obj/item/stock_parts/computer/drive_slot/attackby(obj/item/stock_parts/computer/hard_drive/portable/I, mob/user) if(!istype(I)) return diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index 1084a08c91e..11e17fc7c91 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -9,7 +9,7 @@ matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) var/max_capacity = 128 var/used_capacity = 0 - var/list/stored_files = list() // List of stored files on this drive. DO NOT MODIFY DIRECTLY! + var/list/stored_files = list() // Dictionary of stored files on this drive, with file->weakref of directory. DO NOT MODIFY DIRECTLY! /obj/item/stock_parts/computer/hard_drive/advanced name = "advanced hard drive" @@ -73,42 +73,147 @@ . += "NFS File Table Status: [stored_files.len]/999" . += "Storage capacity: [used_capacity]/[max_capacity]GQ" -// Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. -/obj/item/stock_parts/computer/hard_drive/proc/store_file(var/datum/computer_file/F) - if(!try_store_file(F)) - return 0 - F.holder = src - stored_files.Add(F) - recalculate_size() - return 1 +/obj/item/stock_parts/computer/hard_drive/Initialize() + . = ..() + install_default_programs() + +/obj/item/stock_parts/computer/hard_drive/Destroy() + stored_files = null + return ..() // Add programs that the disk will spawn with /obj/item/stock_parts/computer/hard_drive/proc/install_default_programs() - store_file(new/datum/computer_file/program/computerconfig(src)) // Computer configuration utility, allows hardware control and displays more info than status bar - store_file(new/datum/computer_file/program/appdownloader(src)) // Downloader Utility, allows users to download more software from loca repositories - store_file(new/datum/computer_file/program/filemanager(src)) // File manager, allows text editor functions and basic file manipulation. + var/datum/computer_file/directory/program_directory = add_directory(OS_PROGRAMS_DIR) + program_directory.unrenamable = TRUE // Protect the program directory from renaming/deletion. + program_directory.undeletable = TRUE + store_file(new/datum/computer_file/program/computerconfig(src), program_directory) // Computer configuration utility, allows hardware control and displays more info than status bar + store_file(new/datum/computer_file/program/appdownloader(src), program_directory) // Downloader Utility, allows users to download more software from loca repositories + store_file(new/datum/computer_file/program/filemanager(src), program_directory) // File manager, allows text editor functions and basic file manipulation. + return program_directory + +// Use this proc to add file to the drive. Returns OS_FILE_SUCCESS on success and error codes on failure. Contains necessary sanity checks. +/obj/item/stock_parts/computer/hard_drive/proc/store_file(var/datum/computer_file/F, var/directory, var/create_directories = FALSE, var/list/accesses, var/mob/user, var/overwrite = TRUE) + var/datum/computer_file/directory/target = parse_directory(directory, create_directories) + if(!istype(target) && directory) // The directory could not be parsed or created + return target + var/store_file = try_store_file(F, target) + if(store_file != OS_FILE_SUCCESS) + if(store_file == OS_FILE_EXISTS) + if(!overwrite) + return store_file + // Remove the duplicate file. + var/datum/computer_file/old = find_file_by_name(F.filename, target) + if(!istype(old)) // Something went wrong since we already found this file earlier. + return OS_HARDDRIVE_ERROR + + var/removed = remove_file(old, accesses, user) + if(removed != OS_FILE_SUCCESS) + return removed // Return the error code from removing the file. + + // If we've reached this point, we are able to store the file, since we successfully removed the old version. + // try_store_file() is intentionally written so that existing file checks are returned only if all other checks pass. + else + return store_file + if(istype(F, /datum/computer_file/directory)) + var/datum/computer_file/directory/dir = F + for(var/datum/computer_file/child in dir.get_held_files()) + stored_files[child] = dir + child.holder = src + + dir.temp_file_refs.Cut() // No longer need these references to the directory's stored files. + F.holder = src + if(target) + if(target.inherit_perms) // Add the permissions of the directory to the file's. + if(LAZYLEN(target.read_access)) + LAZYDISTINCTADD(F.read_access, target.read_access) + if(LAZYLEN(target.write_access)) + LAZYDISTINCTADD(F.write_access, target.write_access) + if(LAZYLEN(target.mod_access)) + LAZYDISTINCTADD(F.mod_access, target.mod_access) + stored_files[F] = target + target.held_files += weakref(F) + else + stored_files += F + recalculate_size() + return OS_FILE_SUCCESS -// Use this proc to remove file from the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. -/obj/item/stock_parts/computer/hard_drive/proc/remove_file(var/datum/computer_file/F, list/accesses, mob/user) - if(!F || !istype(F)) - return 0 +// Use this proc to remove file from the drive. Returns OS_FILE_SUCCESS on success and error codes on failure. Contains necessary sanity checks. +/obj/item/stock_parts/computer/hard_drive/proc/remove_file(var/datum/computer_file/F, list/accesses, mob/user, forced) + if(!istype(F) || !(F in stored_files)) + return OS_FILE_NOT_FOUND if(!stored_files) - return 0 + return OS_HARDDRIVE_ERROR - if(!check_functionality()) - return 0 + if(!forced) + if(!check_functionality()) + return OS_HARDDRIVE_ERROR + + if(F.undeletable) + return OS_FILE_NO_WRITE + + if(!(F.get_file_perms(accesses, user) & OS_WRITE_ACCESS)) + return OS_FILE_NO_WRITE + + var/list/removed_files = list(F) + + if(istype(F, /datum/computer_file/directory)) + var/datum/computer_file/directory/dir = F + var/list/dir_files = dir.get_held_files() + if(!forced) + if(!(dir.get_held_perms(accesses, user) & OS_WRITE_ACCESS)) + return OS_FILE_NO_WRITE + for(var/datum/computer_file/child in dir_files) + if(child.undeletable) + return OS_FILE_NO_WRITE + removed_files |= dir_files + + // Store references to the removed files temporarily to prevent them being GC'd, in case we're + // transferring this directory elsewhere. + dir.temp_file_refs += dir_files - if(!(F.get_file_perms(accesses, user) & OS_WRITE_ACCESS)) - return 0 - if(F in stored_files) - stored_files -= F - F.holder = null - recalculate_size() - return 1 + for(var/datum/computer_file/removed in removed_files) + var/datum/computer_file/directory/dir = stored_files[removed] + + // File is being removed without the directory, they're going their seperate ways. + if(dir && !(dir in removed_files)) + dir.held_files -= weakref(removed) + dir.temp_file_refs -= removed + stored_files -= removed + removed.holder = null + recalculate_size() + return OS_FILE_SUCCESS + +// Saves a file, either overwriting the data of a previous file or saving a new one. +/obj/item/stock_parts/computer/hard_drive/proc/save_file(filename, directory, new_data, list/metadata, list/accesses, mob/user, file_type = /datum/computer_file/data) + var/datum/computer_file/F = find_file_by_name(filename, directory) + + if(istype(F) && !(F.get_file_perms(accesses, user) & OS_WRITE_ACCESS)) + return OS_FILE_NO_WRITE + //Try to save file, possibly won't fit size-wise + var/datum/computer_file/backup + if(istype(F)) + backup = F.clone() + remove_file(F) else - return 0 + F = new file_type() + F.filename = filename + if(istype(F, /datum/computer_file/data)) + var/datum/computer_file/data/D = F + D.stored_data = new_data + D.calculate_size() + F.metadata = metadata && metadata.Copy() + + var/success = store_file(F, directory, FALSE, accesses, user) + if(success != OS_FILE_SUCCESS) + if(backup) + store_file(backup, directory) + return success + + if(backup) + qdel(backup) + return F // Loops through all stored files and recalculates used_capacity of this drive /obj/item/stock_parts/computer/hard_drive/proc/recalculate_size() @@ -123,66 +228,146 @@ // In the unlikely event someone manages to create that many files. // BYOND is acting weird with numbers above 999 in loops (infinite loop prevention) if(stored_files.len >= 999) - return 0 + return FALSE if(used_capacity + size > max_capacity) - return 0 + return FALSE else - return 1 + return TRUE // Checks whether we can store the file. We can only store unique files, so this checks whether we wouldn't get a duplicity by adding a file. -/obj/item/stock_parts/computer/hard_drive/proc/try_store_file(var/datum/computer_file/F) - if(!F || !istype(F)) - return 0 - if(!can_store_file(F.size)) - return 0 +// Storing a file in a directory requires write access to that directory. +/obj/item/stock_parts/computer/hard_drive/proc/try_store_file(var/datum/computer_file/F, var/directory, var/list/accesses, var/mob/user) + if(!istype(F)) + return OS_FILE_NOT_FOUND + + var/file_size = F.size + if(istype(F, /datum/computer_file/directory)) + var/datum/computer_file/directory/dir = F + file_size += dir.get_held_size() + + if(!can_store_file(file_size)) + return OS_HARDDRIVE_SPACE if(!check_functionality()) - return 0 + return OS_HARDDRIVE_ERROR if(!stored_files) - return 0 + return OS_HARDDRIVE_ERROR + + // Safety check + F.filename = sanitize_for_file(F.filename) + + var/datum/computer_file/directory/D = parse_directory(directory) + if(directory && !D) + return OS_DIR_NOT_FOUND + if(D && !(D.get_held_perms(accesses, user) & OS_WRITE_ACCESS)) + return OS_FILE_NO_WRITE - var/list/badchars = list("/","\\",":","*","?","\"","<",">","|","#", ".") - for(var/char in badchars) - if(findtext(F.filename, char)) - return 0 + // We intentionally check these two cases last so that if we are overwriting the file, we are sure + // to be able to store it once we remove the old version. // This file is already stored. Don't store it again. if(F in stored_files) - return 0 + return OS_FILE_EXISTS + // Fail on finding a file with a duplicate name. + if(!isnum(find_file_by_name(F.filename, D, TRUE))) + return OS_FILE_EXISTS + return OS_FILE_SUCCESS - var/name = F.filename + "." + F.filetype - for(var/datum/computer_file/file in stored_files) - if((file.filename + "." + file.filetype) == name) - return 0 - return 1 - -// Tries to find the file by filename. Returns null on failure -/obj/item/stock_parts/computer/hard_drive/proc/find_file_by_name(var/filename) - if(!check_functionality()) - return null +// Tries to find file by filename. Returns error code on failure +/obj/item/stock_parts/computer/hard_drive/proc/find_file_by_name(var/filename, var/directory, var/forced) + if(!forced && !check_functionality()) + return OS_HARDDRIVE_ERROR if(!filename) - return null + return OS_FILE_NOT_FOUND if(!stored_files) - return null + return OS_HARDDRIVE_ERROR - for(var/datum/computer_file/F in stored_files) - if(F.filename == filename) - return F - return null + var/datum/computer_file/directory/target = parse_directory(directory) + + if(istype(target)) + var/list/held_files = target.get_held_files() + for(var/datum/computer_file/file in held_files) + // Filename uniqueness is enforced even if filetype is not the same, so allow + // users to access files either by the filename alone or with the filetype. + if(file.filename == filename || (file.filename + "." + file.filetype) == filename) + return file + else + if(directory) + return target + // Check in files not in a directory. + for(var/datum/computer_file/file in stored_files) + if(stored_files[file] != null) // Ignore files in a directory. + continue + if(file.filename == filename || (file.filename + "." + file.filetype) == filename) + return file + return OS_FILE_NOT_FOUND -/obj/item/stock_parts/computer/hard_drive/Destroy() - stored_files = null - return ..() +/obj/item/stock_parts/computer/hard_drive/proc/add_directory(var/directory, var/check_for_existing = TRUE) + if(check_for_existing) + var/datum/computer_file/directory/existing = parse_directory(directory) + if(istype(existing)) + return existing -/obj/item/stock_parts/computer/hard_drive/Initialize() - . = ..() - install_default_programs() + var/list/directories = splittext(directory, "/") + if(!length(directories)) + return OS_DIR_NOT_FOUND + var/new_directory = sanitize_for_file(directories[directories.len]) + if(!length(new_directory)) + return OS_BAD_NAME + directories.Cut(directories.len) // Remove the final directory. + + var/datum/computer_file/directory/new_dir = new() + new_dir.filename = new_directory + if(!length(directories)) + var/success = store_file(new_dir) + if(success != OS_FILE_SUCCESS) + return success + return new_dir + else // Add directories until the final one is added. + var/datum/computer_file/directory/parent_dir = add_directory(jointext(directories, "/")) + var/success = store_file(new_dir, parent_dir) + if(success != OS_FILE_SUCCESS) + return success + return new_dir + +/obj/item/stock_parts/computer/hard_drive/proc/parse_directory(var/directory, var/create_directories = FALSE) + if(istype(directory, /datum/computer_file/directory)) + if(directory in stored_files) + return directory + return OS_DIR_NOT_FOUND + if(istext(directory)) + var/list/directories = splittext(directory, "/") + var/datum/computer_file/directory/current_dir + if(!length(directories)) + return OS_DIR_NOT_FOUND + directory_loop: + for(var/directory_name in directories) + if(directory_name == "..") + directories.Cut(1, 2) + if(!current_dir) + return OS_DIR_NOT_FOUND + current_dir = current_dir.get_directory() + continue + var/list/file_list = current_dir ? current_dir.get_held_files() : stored_files + for(var/datum/computer_file/directory/D in file_list) + if(D.filename == directory_name) + directories.Cut(1, 2) + current_dir = D + . = D + continue directory_loop + // Found a missing directory. + if(create_directories) + var/final_path = current_dir ? current_dir.get_file_path() + "/" : "" + final_path += jointext(directories, "/") + return add_directory(final_path) + else + return OS_DIR_NOT_FOUND // Preset for borgs and AIs /obj/item/stock_parts/computer/hard_drive/silicon/install_default_programs() - ..() - store_file(new/datum/computer_file/program/records()) - store_file(new/datum/computer_file/program/crew_manifest()) - store_file(new/datum/computer_file/program/email_client()) - store_file(new/datum/computer_file/program/suit_sensors()) \ No newline at end of file + var/datum/computer_file/directory/program_directory = ..() + store_file(new/datum/computer_file/program/records(), program_directory) + store_file(new/datum/computer_file/program/crew_manifest(), program_directory) + store_file(new/datum/computer_file/program/email_client(), program_directory) + store_file(new/datum/computer_file/program/suit_sensors(), program_directory) \ No newline at end of file diff --git a/code/modules/modular_computers/hardware/scanners/scanner.dm b/code/modules/modular_computers/hardware/scanners/scanner.dm index 4ee6a6cae25..cdb1222ab75 100644 --- a/code/modules/modular_computers/hardware/scanners/scanner.dm +++ b/code/modules/modular_computers/hardware/scanners/scanner.dm @@ -19,28 +19,32 @@ do_before_uninstall() . = ..() -/obj/item/stock_parts/computer/scanner/proc/do_after_install(user, atom/device) +/obj/item/stock_parts/computer/scanner/do_after_install(atom/device, loud) var/datum/extension/interactive/os/os = get_extension(device, /datum/extension/interactive/os) if(!driver_type || !device || !os) return 0 if(!os.has_component(PART_HDD)) - to_chat(user, "Driver installation for \the [src] failed: \the [device] lacks a hard drive.") + if(loud) + device.visible_message(SPAN_WARNING("\The [device] flashes an error: Driver installation for \the [src] failed. Could not locate hard drive.")) return 0 - var/datum/computer_file/program/scanner/old_driver = os.get_file(initial(driver_type.filename)) + var/datum/computer_file/program/scanner/old_driver = os.get_file(initial(driver_type.filename), OS_PROGRAMS_DIR) if(istype(old_driver)) - to_chat(user, "Drivers found on \the [device]; \the [src] has been installed.") + if(loud) + device.visible_message(SPAN_NOTICE("\The [device] pings: Drivers located for \the [src]. Installation complete.")) old_driver.connect_scanner() return 1 var/datum/computer_file/program/scanner/driver_file = new driver_type - if(!os.store_file(driver_file)) - to_chat(user, "Driver installation for \the [src] failed: file could not be written to the hard drive.") + if(!os.store_file(driver_file, OS_PROGRAMS_DIR, create_directories = TRUE)) + if(loud) + device.visible_message(SPAN_WARNING("\The [device] flashes an error: Driver installation for \the [src] failed. Could not write to the hard drive.")) return 0 - to_chat(user, "Driver software for \the [src] has been installed on \the [device].") driver_file.computer = os driver_file.connect_scanner() + if(loud) + device.visible_message(SPAN_NOTICE("\The [device] pings: Driver installation for \the [src] complete.")) return 1 -/obj/item/stock_parts/computer/scanner/proc/do_before_uninstall() +/obj/item/stock_parts/computer/scanner/do_before_uninstall(atom/device, loud) if(driver) driver.disconnect_scanner() if(driver) //In case the driver doesn't find it. diff --git a/code/modules/modular_computers/networking/accounts/_network_accounts.dm b/code/modules/modular_computers/networking/accounts/_network_accounts.dm index 25d17ec1833..9ef74773dd8 100644 --- a/code/modules/modular_computers/networking/accounts/_network_accounts.dm +++ b/code/modules/modular_computers/networking/accounts/_network_accounts.dm @@ -30,7 +30,7 @@ /datum/computer_network/proc/add_account(datum/computer_file/data/account/acc, accesses) for(var/datum/extension/network_device/mainframe/M in get_mainframes_by_role(MF_ROLE_ACCOUNT_SERVER, accesses)) - if(M.store_file(acc)) + if(M.store_file(acc, OS_ACCOUNTS_DIR, TRUE)) return TRUE /datum/computer_network/proc/find_account_by_login(login, accesses) diff --git a/code/modules/modular_computers/networking/device_types/mainframe.dm b/code/modules/modular_computers/networking/device_types/mainframe.dm index 8693ee89dc5..465b001c5dc 100644 --- a/code/modules/modular_computers/networking/device_types/mainframe.dm +++ b/code/modules/modular_computers/networking/device_types/mainframe.dm @@ -31,64 +31,55 @@ var/global/list/all_mainframe_roles = list( if(istype(M)) return M.get_component_of_type(/obj/item/stock_parts/computer/hard_drive) +// File storage procs /datum/extension/network_device/mainframe/proc/get_all_files() var/obj/item/stock_parts/computer/hard_drive/HDD = get_storage() if(HDD) return HDD.stored_files -/datum/extension/network_device/mainframe/proc/get_file(filename) +/datum/extension/network_device/mainframe/proc/get_file(filename, directory) var/obj/item/stock_parts/computer/hard_drive/HDD = get_storage() if(HDD) - return HDD.find_file_by_name(filename) + return HDD.find_file_by_name(filename, directory) -/datum/extension/network_device/mainframe/proc/delete_file(filename, list/accesses, mob/user) +/datum/extension/network_device/mainframe/proc/delete_file(datum/computer_file/F, list/accesses, mob/user) var/obj/item/stock_parts/computer/hard_drive/HDD = get_storage() if(HDD) - var/datum/computer_file/data/F = HDD.find_file_by_name(filename) - if(!F || F.undeletable) - return FALSE return HDD.remove_file(F, accesses, user) -/datum/extension/network_device/mainframe/proc/store_file(datum/computer_file/file) +/datum/extension/network_device/mainframe/proc/store_file(datum/computer_file/file, directory, create_directories, list/accesses, mob/user, overwrite = TRUE) var/obj/item/stock_parts/computer/hard_drive/HDD = get_storage() if(!HDD) - return FALSE - var/datum/computer_file/data/old_version = HDD.find_file_by_name(file.filename) - if(old_version) - HDD.remove_file(old_version) - if(!HDD.store_file(file)) - HDD.store_file(old_version) - return FALSE - else - return TRUE + return OS_HARDDRIVE_ERROR + + return HDD.store_file(file, directory, create_directories, accesses, user, overwrite) -/datum/extension/network_device/mainframe/proc/save_file(newname, new_data) +/datum/extension/network_device/mainframe/proc/try_store_file(datum/computer_file/file, directory, list/accesses, mob/user) var/obj/item/stock_parts/computer/hard_drive/HDD = get_storage() if(!HDD) - return FALSE + return OS_HARDDRIVE_ERROR + + return HDD.try_store_file(file, directory, accesses, user) - var/datum/computer_file/data/F = HDD.find_file_by_name(newname) - //Try to save file, possibly won't fit size-wise - var/datum/computer_file/data/backup - if(F) - backup = F.clone() - HDD.remove_file(F) - else - F = new() - F.stored_data = new_data - F.calculate_size() - if(!HDD.store_file(F)) - if(backup) - HDD.store_file(backup) - return FALSE - return TRUE +/datum/extension/network_device/mainframe/proc/save_file(newname, directory, new_data, list/metadata, list/accesses, mob/user) + var/obj/item/stock_parts/computer/hard_drive/HDD = get_storage() + if(!HDD) + return OS_HARDDRIVE_ERROR + return HDD.save_file(newname, directory, new_data, metadata, accesses, user) -/datum/extension/network_device/mainframe/proc/append_to_file(filename, data) +/datum/extension/network_device/mainframe/proc/parse_directory(directory_path, create_directories) var/obj/item/stock_parts/computer/hard_drive/HDD = get_storage() if(!HDD) - return FALSE - var/datum/computer_file/data/logfile/F = get_file(filename) - if(F) + return OS_HARDDRIVE_ERROR + + return HDD.parse_directory(directory_path, create_directories) + +/datum/extension/network_device/mainframe/proc/append_to_file(filename, directory, data) + var/obj/item/stock_parts/computer/hard_drive/HDD = get_storage() + if(!HDD) + return OS_HARDDRIVE_ERROR + var/datum/computer_file/data/logfile/F = get_file(filename, directory) + if(istype(F)) var/list/logs = splittext(F.stored_data, "\[br\]") logs.Add(data) if(length(logs) > max_log_count) @@ -99,8 +90,7 @@ var/global/list/all_mainframe_roles = list( F = new() F.filename = filename F.stored_data = data - store_file(F) - return TRUE + return store_file(F, directory) /datum/extension/network_device/mainframe/proc/get_capacity() var/obj/item/stock_parts/computer/hard_drive/HDD = get_storage() @@ -121,9 +111,9 @@ var/global/list/all_mainframe_roles = list( for(var/F in subtypesof(/datum/computer_file/report)) var/datum/computer_file/report/type = F if(initial(type.available_on_network)) - store_file(new type) + store_file(new type, "reports", TRUE) for(var/F in subtypesof(/datum/computer_file/program)) var/datum/computer_file/program/type = F if(initial(type.available_on_network)) - store_file(new type) \ No newline at end of file + store_file(new type, OS_PROGRAMS_DIR, TRUE) \ No newline at end of file diff --git a/code/modules/modular_computers/networking/network_files.dm b/code/modules/modular_computers/networking/network_files.dm index d712e344d8e..66d6e21fc12 100644 --- a/code/modules/modular_computers/networking/network_files.dm +++ b/code/modules/modular_computers/networking/network_files.dm @@ -1,6 +1,6 @@ -/datum/computer_network/proc/find_file_by_name(filename, mainframe_role = MF_ROLE_FILESERVER, list/accesses) +/datum/computer_network/proc/find_file_by_name(filename, directory, mainframe_role = MF_ROLE_FILESERVER, list/accesses) for(var/datum/extension/network_device/mainframe/M in get_mainframes_by_role(mainframe_role, accesses)) - var/datum/computer_file/F = M.get_file(filename) + var/datum/computer_file/F = M.get_file(filename, directory) if(F) return F @@ -15,20 +15,20 @@ . |= F found_filenames |= F.filename -/datum/computer_network/proc/store_file(datum/computer_file/F, mainframe_role = MF_ROLE_FILESERVER, list/accesses) +/datum/computer_network/proc/store_file(datum/computer_file/file, directory, create_directories, list/accesses, mob/user, overwrite = TRUE, mainframe_role = MF_ROLE_FILESERVER) for(var/datum/extension/network_device/mainframe/M in get_mainframes_by_role(mainframe_role, accesses)) - if(M.store_file(F)) + if(M.store_file(file, directory, create_directories, accesses, user, overwrite)) return TRUE -/datum/computer_network/proc/remove_file(datum/computer_file/F, mainframe_role = MF_ROLE_FILESERVER, list/accesses) +// We don't pass the directory since this is generally used in conjunction with get_all_files_of_type +/datum/computer_network/proc/remove_file(datum/computer_file/F, list/accesses, mob/user, mainframe_role = MF_ROLE_FILESERVER) for(var/datum/extension/network_device/mainframe/M in get_mainframes_by_role(mainframe_role, accesses)) - if(M.delete_file(F)) + if(M.delete_file(F, accesses, user)) return TRUE -/datum/computer_network/proc/find_file_location(filename, mainframe_role = MF_ROLE_FILESERVER, list/accesses) +/datum/computer_network/proc/find_file_location(datum/computer_file/F, list/accesses, mainframe_role = MF_ROLE_FILESERVER) for(var/datum/extension/network_device/mainframe/M in get_mainframes_by_role(mainframe_role, accesses)) - var/datum/computer_file/F = M.get_file(filename) - if(F) + if(F in M.get_all_files()) return M.network_tag // Reports @@ -60,13 +60,13 @@ var/entry = "[stationtime2text()] - [source ? source : "*SYSTEM*" ] - " entry += data for(var/datum/extension/network_device/mainframe/M in mainframes_by_role[MF_ROLE_LOG_SERVER]) - if(M.append_to_file("network_log", entry)) + if(M.append_to_file("network_log", OS_LOGS_DIR, entry)) return TRUE /datum/computer_network/proc/get_log_files() . = list() for(var/datum/extension/network_device/mainframe/M in mainframes_by_role[MF_ROLE_LOG_SERVER]) - var/logfile = M.get_file("network_log") + var/logfile = M.get_file("network_log", OS_LOGS_DIR) if(logfile) . += logfile diff --git a/code/modules/modular_computers/os/files.dm b/code/modules/modular_computers/os/files.dm index e0162132790..1d4fae80955 100644 --- a/code/modules/modular_computers/os/files.dm +++ b/code/modules/modular_computers/os/files.dm @@ -1,112 +1,204 @@ -/datum/extension/interactive/os/proc/get_all_files(var/obj/item/stock_parts/computer/hard_drive/disk = get_component(PART_HDD)) - . = list() - if(disk) - return disk.stored_files +/datum/extension/interactive/os + var/list/mounted_storage = list() // Dictionary of root name -> /datum/file_storage + var/programs_dir // For easy reference. Use only with OS filesystem procs. -/datum/extension/interactive/os/proc/get_file(filename, var/obj/item/stock_parts/computer/hard_drive/disk = get_component(PART_HDD)) - if(disk) - return disk.find_file_by_name(filename) +/datum/extension/interactive/os/system_boot() + . = ..() + var/obj/item/stock_parts/computer/hard_drive = get_component(PART_HDD) + if(hard_drive) + mounted_storage["local"] = new /datum/file_storage/disk(src, "local") + programs_dir = "local" + "/" + OS_PROGRAMS_DIR + var/obj/item/stock_parts/computer/drive_slot/drive_slot = get_component(PART_D_SLOT) + if(drive_slot) + mounted_storage["media"] = new /datum/file_storage/disk/removable(src, "media") + +/datum/extension/interactive/os/system_shutdown() + QDEL_LIST_ASSOC_VAL(mounted_storage) + . = ..() -/datum/extension/interactive/os/proc/create_file(var/newname, var/data, var/file_type = /datum/computer_file/data, var/list/metadata, var/obj/item/stock_parts/computer/hard_drive/disk = get_component(PART_HDD)) - if(!newname) - return - if(!disk) +// Mounts a new file storage by a given root_name. +/datum/extension/interactive/os/proc/mount_storage(storage_type, root_name, hidden) + if(!ispath(storage_type, /datum/file_storage) || !length(root_name)) return - if(get_file(newname)) - return - - var/datum/computer_file/data/F = new file_type(md = metadata) - F.filename = newname - F.stored_data = data - F.calculate_size() - if(disk.store_file(F)) - return F - -/datum/extension/interactive/os/proc/store_file(var/datum/computer_file/file, var/obj/item/stock_parts/computer/hard_drive/disk = get_component(PART_HDD)) - if(!disk) - return FALSE - var/datum/computer_file/data/old_version = disk.find_file_by_name(file.filename) - if(old_version) - disk.remove_file(old_version) - if(!disk.store_file(file)) - disk.store_file(old_version) - return FALSE - else - return TRUE + + var/mount_name = root_name + var/i = 0 + while(mounted_storage[mount_name]) + i++ + mount_name = root_name + "_[i]" + + var/datum/file_storage/new_storage = new storage_type(src, mount_name, hidden) + mounted_storage[mount_name] = new_storage + return new_storage -/datum/extension/interactive/os/proc/try_store_file(var/datum/computer_file/file, var/obj/item/stock_parts/computer/hard_drive/disk = get_component(PART_HDD)) - if(!disk) +/datum/extension/interactive/os/proc/unmount_storage(root_name) + var/datum/file_storage/removed = mounted_storage[root_name] + if(!removed) return FALSE - return disk.try_store_file(file) + + // Tell programs to clean up any lingering references. + for(var/datum/computer_file/program/P in running_programs) + P.on_file_storage_removal(removed) + + mounted_storage[root_name] = null + mounted_storage -= root_name -/datum/extension/interactive/os/proc/save_file(var/newname, var/data, var/file_type = /datum/computer_file/data, var/list/metadata, var/obj/item/stock_parts/computer/hard_drive/disk = get_component(PART_HDD), var/list/accesses, var/mob/user) - if(!disk) - return FALSE - var/datum/computer_file/data/F = disk.find_file_by_name(newname) - if(!F) //try to make one if it doesn't exist - return !!create_file(newname, data, file_type, metadata, disk) - if(!(F.get_file_perms(accesses, user) & OS_WRITE_ACCESS)) - return FALSE - //Try to save file, possibly won't fit size-wise - var/datum/computer_file/data/backup = F.clone() - disk.remove_file(F) - F.stored_data = data - F.metadata = metadata && metadata.Copy() - F.calculate_size() - if(!disk.store_file(F)) - disk.store_file(backup) - return FALSE + qdel(removed) return TRUE -/datum/extension/interactive/os/proc/delete_file(var/filename, var/obj/item/stock_parts/computer/hard_drive/disk = get_component(PART_HDD), var/list/accesses, var/mob/user) - if(!disk) - return FALSE +/datum/extension/interactive/os/proc/mount_mainframe(root_name, mainframe_tag) + var/datum/computer_network/network = get_network() + if(!network) + return "NETWORK ERROR: Cannot connect to network." + var/datum/extension/network_device/mainframe/mainframe = network.get_device_by_tag(mainframe_tag) + if(!istype(mainframe)) + return "NETWORK ERROR: No mainframe with network tag '[mainframe_tag]' found." + + var/datum/file_storage/network/created_storage = mount_storage(/datum/file_storage/network, root_name, FALSE) + if(!created_storage) + return "I/O ERROR: Unable to mount mainframe as file system with root directory '[root_name]'." + created_storage.server = mainframe_tag + return "Successfully mounted mainframe with network tag '[mainframe_tag]' as file system with root directory '[root_name]'." + +// Rundown of the filesystem hierarchy: +// The OS creates instances of /datum/file_storage as local or network disks, referenced in its mounted_storage list. +// mounted_storage is keyed by the name of the root directory of the disk. +// Filesystem procs on the OS extension itself expects directory paths with root directories e.g. /local/programs or /network/logs +// Filesystem procs on the file_storage datums and harddrives do not, eg. /programs or /logs + +// Returns list(/datum/file_storage, /datum/computer_file/directory) on success, error code on failure. Only supports absolute paths. +// This should not be done every tick for UIs etc. Cache a reference to the directory/file and only re-parse the directory when necessary. +/datum/extension/interactive/os/proc/parse_directory(directory_path, create_directories = FALSE) + var/list/directories = splittext(directory_path, "/") + + // Cut out any extraneous spaces which may have came from splitting the path + if(!length(directories[1])) + directories.Cut(1, 2) + if(!length(directories[directories.len])) + directories.Cut(directories.len) + + var/datum/file_storage/storage = mounted_storage[directories[1]] + if(!storage) + return OS_DIR_NOT_FOUND + if(length(directories) == 1) // Root directory of the storage + return list(storage, null) + var/datum/computer_file/directory/dir = storage.parse_directory(jointext(directories, "/", 2), create_directories) + if(!istype(dir)) // Error! + return dir + return list(storage, dir) + +// Returns list(/datum/file_storage, /datum/computer_file/directory, /datum/computer_file) from the passed path. Only supports absolute paths. +/datum/extension/interactive/os/proc/parse_file(file_path) + var/list/paths = splittext(file_path, "/") + if(!length(paths)) + return OS_DIR_NOT_FOUND + if(!length(paths[1])) + paths.Cut(1, 2) + + var/list/file_loc = parse_directory(jointext(paths, "/", paths.len)) + if(!islist(file_loc)) + return file_loc + var/datum/file_storage/storage = file_loc[1] + var/datum/computer_file/F = storage.get_file(paths[paths.len], file_loc[2]) + if(!istype(F)) + return F + return list(storage, file_loc[2], F) - var/datum/computer_file/F = disk.find_file_by_name(filename) - if(!F || F.undeletable) - return FALSE +/datum/extension/interactive/os/proc/get_all_files(obj/item/stock_parts/computer/hard_drive/disk = get_component(PART_HDD)) + . = list() + if(disk) + return disk.stored_files - return disk.remove_file(F, accesses, user) +// Returns the file with the given name in the given directory path. Returns error code on failure. +/datum/extension/interactive/os/proc/get_file(filename, dir_path, list/accesses, mob/user) + var/list/file_loc = parse_directory(dir_path) + if(!islist(file_loc)) + return file_loc + var/datum/file_storage/storage = file_loc[1] + return storage.get_file(filename, file_loc[2]) + +// Stores the passed file in the given directory path. Returns OS_FILE_SUCCESS on success, error code on failure. +/datum/extension/interactive/os/proc/store_file(datum/computer_file/file, dir_path, create_directories = FALSE, list/accesses, mob/user, overwrite = TRUE) + var/list/file_loc = parse_directory(dir_path, create_directories) + if(!islist(file_loc)) + return file_loc + + var/datum/file_storage/storage = file_loc[1] + return storage.store_file(file, file_loc[2], create_directories, accesses, user, overwrite) + +// Checks if the passed file can be stored in the given directory path without actually storing it. Returns OS_FILE_SUCCESS on success, error code on failure. +/datum/extension/interactive/os/proc/try_store_file(datum/computer_file/file, dir_path, list/accesses, mob/user) + var/list/file_loc = parse_directory(dir_path) + if(!islist(file_loc)) + return file_loc + + var/datum/file_storage/storage = file_loc[1] + return storage.try_store_file(file, file_loc[2], accesses, user) + +// Helper for creating a file. Returns file on success, error code on failure. +/datum/extension/interactive/os/proc/create_file(filename, dir_path, data, file_type = /datum/computer_file/data/text, list/metadata, list/accesses, mob/user) + filename = sanitize_for_file(filename) + if(!length(filename)) + return OS_BAD_NAME + + var/list/file_loc = parse_directory(dir_path) + if(!islist(file_loc)) + return file_loc -/datum/extension/interactive/os/proc/clone_file(var/filename, var/obj/item/stock_parts/computer/hard_drive/disk = get_component(PART_HDD), var/list/accesses, var/mob/user) - if(!disk) - return FALSE + var/datum/file_storage/storage = file_loc[1] + + return storage.create_file(filename, file_loc[2], data, file_type, metadata, accesses, user) - var/datum/computer_file/F = disk.find_file_by_name(filename) - if(!F) - return FALSE +// Saves or creates the file with the given name in the passed directory. Returns file on success, error code on failure. +/datum/extension/interactive/os/proc/save_file(filename, dir_path, new_data, file_type = /datum/computer_file/data/text, list/metadata, list/accesses, mob/user) + filename = sanitize_for_file(filename) + if(!length(filename)) + return OS_BAD_NAME - if(!(F.get_file_perms(accesses, user) & OS_READ_ACCESS)) - return FALSE + var/list/file_loc = parse_directory(dir_path) + if(!islist(file_loc)) + return file_loc - var/datum/computer_file/C = F.clone(1) + var/datum/file_storage/storage = file_loc[1] + return storage.save_file(filename, file_loc[2], new_data, metadata, accesses, user, file_type) - return disk.store_file(C) +// Deletes the file with the given filepath. Returns OS_FILE_SUCCESS on success, error code on failure. +/datum/extension/interactive/os/proc/delete_file(filepath, list/accesses, mob/user) + var/list/file_loc = parse_file(filepath) + if(!islist(file_loc)) + return file_loc -/datum/extension/interactive/os/proc/copy_between_disks(var/filename, var/obj/item/stock_parts/computer/hard_drive/disk_from, var/obj/item/stock_parts/computer/hard_drive/disk_to, var/list/accesses, var/mob/user) - if(!istype(disk_from) || !istype(disk_to)) - return FALSE + var/datum/file_storage/storage = file_loc[1] + return storage.delete_file(file_loc[3], file_loc[2], accesses, user) - var/datum/computer_file/F = disk_from.find_file_by_name(filename) - if(!istype(F)) - return FALSE - if(!(F.get_file_perms(accesses, user) & OS_READ_ACCESS)) - return FALSE - var/datum/computer_file/C = F.clone(0) - return disk_to.store_file(C) +/datum/extension/interactive/os/proc/clone_file(filename, dir_path, list/accesses, mob/user) + var/list/file_loc = parse_directory(dir_path) + if(!islist(file_loc)) + return file_loc + + var/datum/file_storage/storage = file_loc[1] + return storage.clone_file(filename, file_loc[2], accesses, user) // Generic file storage interface /datum/file_storage - var/name = "Generic File Interface" + var/desc = "Generic File Interface" + var/root_name // Display name of the root directory which doesn't exist as an actual directory file. var/datum/extension/interactive/os/os + var/hidden = FALSE // Whether this file storage interface is for internal use. -/datum/file_storage/New(ntos) +/datum/file_storage/New(ntos, name, is_hidden) os = ntos + root_name = name + hidden = is_hidden /datum/file_storage/Destroy(force) os = null . = ..() +// Additional check for access on top of file system permissions. +/datum/file_storage/proc/check_access(list/accesses) + return TRUE + /datum/file_storage/proc/check_errors() if(!istype(os)) return "No GOOSE compatible device found." @@ -116,36 +208,96 @@ /datum/file_storage/proc/get_all_files() -/datum/file_storage/proc/get_file(filename) +/datum/file_storage/proc/get_dir_files(datum/computer_file/directory/dir) + . = list() + var/list/all_files = get_all_files() + if(dir && (dir in all_files)) + . = dir.get_held_files() + else + // No current directory, get all files which are not held by a directory + if(!all_files) + return + for(var/file in all_files) + if(!all_files[file]) // No directory associated with the file. + . += file + + return sortTim(., /proc/cmp_files_sort) + +// The following procs should return OS_FILE_SUCCESS on success (or the target file), or error codes on failure. +/datum/file_storage/proc/get_file(filename, directory) + +/datum/file_storage/proc/store_file(datum/computer_file/F, directory, create_directories, list/accesses, mob/user, overwrite = TRUE) -/datum/file_storage/proc/store_file(datum/computer_file/F, copied) +/datum/file_storage/proc/try_store_file(datum/computer_file/F, directory, list/accesses, mob/user) -/datum/file_storage/proc/save_file(filename, new_data) +/datum/file_storage/proc/save_file(filename, directory, new_data, list/metadata, list/accesses, mob/user, file_type = /datum/computer_file/data) -/datum/file_storage/proc/delete_file(filename) +/datum/file_storage/proc/delete_file(datum/computer_file/F, list/accesses, mob/user) -/datum/file_storage/proc/create_file(newname, var/file_type = /datum/computer_file/data/text) +/datum/file_storage/proc/create_file(filename, directory, data, file_type = /datum/computer_file/data, list/metadata, list/accesses, mob/user) if(check_errors()) - return FALSE - var/datum/computer_file/F = new file_type - F.filename = newname - var/datum/computer_file/data/FD = F + return OS_HARDDRIVE_ERROR + + filename = sanitize_for_file(filename) + if(!length(filename)) + return OS_BAD_NAME + var/datum/computer_file/F = new file_type(md = metadata) + F.filename = filename if(istype(F, /datum/computer_file/data)) + var/datum/computer_file/data/FD = F FD.calculate_size() - return store_file(F) + var/success = store_file(F, directory, FALSE, accesses, user) + if(success == OS_FILE_SUCCESS) + return F + qdel(F) + return success + +/datum/file_storage/proc/create_directory(filename, directory, list/accesses, mob/user) + return create_file(filename, directory, null, /datum/computer_file/directory, null, accesses, user) -/datum/file_storage/proc/clone_file(filename) +/datum/file_storage/proc/clone_file(filename, directory, list/accesses, mob/user) if(check_errors()) - return FALSE - var/datum/computer_file/F = get_file(filename) - if(F) - store_file(F.clone(1)) + return OS_HARDDRIVE_ERROR + var/datum/computer_file/F = get_file(filename, directory) + if(!istype(F)) + return F + if(!(F.get_file_perms(accesses, user) & OS_READ_ACCESS)) + return OS_FILE_NO_READ + + var/datum/computer_file/cloned_file = F.clone(TRUE) + if(!istype(cloned_file)) + return OS_FILE_NO_READ + + var/success = store_file(cloned_file, directory, accesses, user) + if(success != OS_FILE_SUCCESS) + qdel(cloned_file) // Clean up after ourselves + return success + +/datum/file_storage/proc/get_dir_path(datum/computer_file/directory/current_directory, full) + if(current_directory) + if(full) + return "[root_name]/" + current_directory.get_file_path() + return current_directory.filename + return root_name + +/datum/file_storage/proc/parse_directory(directory_path, create_directories = FALSE) // Storing stuff on a server in computer network /datum/file_storage/network - name = "Remote File Server" + desc = "Remote File Server" var/server = "NONE" //network tag of the file server +/datum/file_storage/network/New(ntos, name, hidden, server_tag) + . = ..() + if(server_tag) + server = server_tag + +/datum/file_storage/network/check_access(list/accesses) + var/datum/extension/network_device/mainframe/M = get_mainframe() + if(!M) + return + return M.has_access(accesses) + /datum/file_storage/network/check_errors() . = ..() if(.) @@ -161,6 +313,9 @@ if(!istype(M)) return "NETWORK ERROR: Invalid server '[server]', no file sharing capabilities detected" +/datum/file_storage/network/proc/set_server(new_server) + server = new_server + /datum/file_storage/network/proc/get_mainframe() if(check_errors()) return FALSE @@ -171,22 +326,41 @@ var/datum/extension/network_device/mainframe/M = get_mainframe() return M && M.get_all_files() -/datum/file_storage/network/get_file(filename) +/datum/file_storage/network/get_file(filename, directory) + var/datum/extension/network_device/mainframe/M = get_mainframe() + if(!M) + return OS_NETWORK_ERROR + return M.get_file(filename, directory) + +/datum/file_storage/network/store_file(datum/computer_file/F, directory, create_directories, list/accesses, mob/user, overwrite = TRUE) var/datum/extension/network_device/mainframe/M = get_mainframe() - return M && M.get_file(filename) + if(!M) + return OS_NETWORK_ERROR + return M.store_file(F, directory, create_directories, accesses, user, overwrite) -/datum/file_storage/network/store_file(datum/computer_file/F, copied) - var/datum/computer_file/stored = copied ? F.clone() : F +/datum/file_storage/network/try_store_file(datum/computer_file/F, directory, list/accesses, mob/user) var/datum/extension/network_device/mainframe/M = get_mainframe() - return M && M.store_file(stored) + if(!M) + return OS_NETWORK_ERROR + return M.try_store_file(F, directory, accesses, user) -/datum/file_storage/network/delete_file(filename, list/accesses, mob/user) +/datum/file_storage/network/delete_file(datum/computer_file/F, list/accesses, mob/user) var/datum/extension/network_device/mainframe/M = get_mainframe() - return M && M.delete_file(filename, accesses, user) + if(!M) + return OS_NETWORK_ERROR + return M.delete_file(F, accesses, user) -/datum/file_storage/network/save_file(filename, new_data) +/datum/file_storage/network/save_file(filename, directory, new_data, list/metadata, list/accesses, mob/user, file_type = /datum/computer_file/data) var/datum/extension/network_device/mainframe/M = get_mainframe() - return M && M.save_file(filename, new_data) + if(!M) + return OS_NETWORK_ERROR + return M.save_file(filename, directory, new_data, metadata, accesses, user, file_type) + +/datum/file_storage/network/parse_directory(directory_path, create_directories) + var/datum/extension/network_device/mainframe/M = get_mainframe() + if(!M) + return OS_NETWORK_ERROR + return M.parse_directory(directory_path, create_directories) /datum/file_storage/network/get_transfer_speed() if(check_errors()) @@ -229,7 +403,7 @@ // Storing stuff locally on some kinda disk /datum/file_storage/disk - name = "Local Storage" + desc = "Local Storage" var/disk_type = PART_HDD /datum/file_storage/disk/proc/get_disk() @@ -248,37 +422,66 @@ /datum/file_storage/disk/get_all_files() if(check_errors()) return FALSE - return os.get_all_files(get_disk()) + var/obj/item/stock_parts/computer/hard_drive/HDD = get_disk() + return HDD.stored_files -/datum/file_storage/disk/get_file(filename) +/datum/file_storage/disk/get_file(filename, directory) if(check_errors()) - return FALSE - return os.get_file(filename, get_disk()) + return OS_HARDDRIVE_ERROR + var/obj/item/stock_parts/computer/hard_drive/HDD = get_disk() + if(!HDD) + return OS_HARDDRIVE_ERROR + return HDD.find_file_by_name(filename, directory) -/datum/file_storage/disk/store_file(datum/computer_file/F, copied) - var/datum/computer_file/stored = copied ? F.clone() : F +/datum/file_storage/disk/store_file(datum/computer_file/F, directory, create_directories, list/accesses, mob/user, overwrite = TRUE) if(check_errors()) - return FALSE - return os.store_file(stored, get_disk()) + return OS_HARDDRIVE_ERROR + var/obj/item/stock_parts/computer/hard_drive/HDD = get_disk() + if(!HDD) + return OS_HARDDRIVE_ERROR + return HDD.store_file(F, directory, create_directories, accesses, user, overwrite) -/datum/file_storage/disk/save_file(filename, new_data, list/accesses, mob/user) +/datum/file_storage/disk/try_store_file(datum/computer_file/F, directory, list/accesses, mob/user) if(check_errors()) - return FALSE - return os.save_file(filename, new_data, get_disk(), accesses, user) + return OS_HARDDRIVE_ERROR + var/obj/item/stock_parts/computer/hard_drive/HDD = get_disk() + if(!HDD) + return OS_HARDDRIVE_ERROR + return HDD.try_store_file(F, directory, accesses, user) -/datum/file_storage/disk/delete_file(filename, list/accesses, mob/user) +/datum/file_storage/disk/save_file(filename, directory, new_data, metadata, accesses, user, file_type = /datum/computer_file/data) if(check_errors()) - return FALSE - return os.delete_file(filename, get_disk(), accesses, user) + return OS_HARDDRIVE_ERROR + var/obj/item/stock_parts/computer/hard_drive/HDD = get_disk() + if(!HDD) + return OS_HARDDRIVE_ERROR + return HDD.save_file(filename, directory, new_data, metadata, accesses, user, file_type) + +/datum/file_storage/disk/delete_file(datum/computer_file/F, list/accesses, mob/user) + if(check_errors()) + return OS_HARDDRIVE_ERROR + var/obj/item/stock_parts/computer/hard_drive/HDD = get_disk() + if(!HDD) + return OS_HARDDRIVE_ERROR + return HDD.remove_file(F, accesses, user) /datum/file_storage/disk/get_transfer_speed() if(check_errors()) return 0 return NETWORK_SPEED_DISK +/datum/file_storage/disk/parse_directory(directory_path, create_directories) + if(check_errors()) + return OS_HARDDRIVE_ERROR + var/obj/item/stock_parts/computer/hard_drive/HDD = get_disk() + if(!HDD) + return OS_HARDDRIVE_ERROR + return HDD.parse_directory(directory_path, create_directories) + // Storing files on a removable disk. /datum/file_storage/disk/removable - name = "Disk Drive" + desc = "Disk Drive" + root_name = "media" /datum/file_storage/disk/removable/get_disk() var/obj/item/stock_parts/computer/drive_slot/drive_slot = os.get_component(PART_D_SLOT) @@ -296,50 +499,63 @@ if(!istype(drive_slot.stored_drive)) return "HARDWARE ERROR: No portable drive inserted." - // Datum tracking progress between of file transfer between two file streams /datum/file_transfer var/datum/file_storage/transfer_from var/datum/file_storage/transfer_to + + var/datum/computer_file/directory/directory_to + var/datum/computer_file/directory/directory_from + var/datum/computer_file/transferring var/left_to_transfer var/copying = FALSE // Whether or not this file transfer is copying, rather than transferring. -/datum/file_transfer/New(datum/file_storage/source, datum/file_storage/destination, datum/computer_file/file, copy) +/datum/file_transfer/New(datum/file_storage/source, datum/file_storage/destination, datum/computer_file/directory/dest_directory, datum/computer_file/file, copy) transfer_from = source transfer_to = destination transferring = file - left_to_transfer = file.size + + directory_to = dest_directory + directory_from = file.get_directory() + + if(istype(file, /datum/computer_file/directory)) + var/datum/computer_file/directory/dir = file + left_to_transfer = dir.get_held_size() + else + left_to_transfer = file.size copying = copy /datum/file_transfer/Destroy() transfer_from = null transfer_to = null + + directory_to = null transferring = null . = ..() /datum/file_transfer/proc/check_self() if(QDELETED(transfer_from) || QDELETED(transfer_from) || QDELETED(transferring)) qdel(src) - return FALSE - return TRUE + return OS_FILE_NOT_FOUND + return OS_FILE_SUCCESS -//Returns FALSE if something went wrong, TRUE if progress was made and or we are done +//Returns OS_FILE_SUCESS if progress was made and or we are done. Returns error code otherwise. /datum/file_transfer/proc/update_progress() . = check_self() - if(!.) + if(. != OS_FILE_SUCCESS) return left_to_transfer = max(0, left_to_transfer - get_transfer_speed()) if(!left_to_transfer) if(copying) - return transfer_to.store_file(transferring, TRUE) + return transfer_to.store_file(transferring, directory_to, TRUE) else - . = transfer_from.delete_file(transferring.filename) // Check if we can delete the file. - if(.) - . = transfer_to.store_file(transferring, FALSE) + . = transfer_from.delete_file(transferring) // Check if we can delete the file. + if(. == OS_FILE_SUCCESS) + . = transfer_to.store_file(transferring, directory_to, FALSE) // If we failed to store the file, restore it to its former location. - if(!.) - transfer_from.store_file(transferring, FALSE) + if(. != OS_FILE_SUCCESS) + transfer_from.store_file(transferring, directory_from, FALSE) /datum/file_transfer/proc/get_transfer_speed() if(!check_self()) @@ -355,9 +571,38 @@ if(!check_self()) return var/list/data = list() - data["transfer_from"] = transfer_from.name - data["transfer_to"] = transfer_to.name + + data["transfer_from"] = transfer_from.get_dir_path(directory_from, TRUE) + data["transfer_to"] = transfer_to.get_dir_path(directory_to, TRUE) data["transfer_file"] = transferring.filename data["transfer_progress"] = transferring.size - left_to_transfer data["transfer_total"] = transferring.size - return data \ No newline at end of file + return data + +// Checks permissions for transferring files. Returns error string on failure, null on success. +/proc/check_file_transfer(datum/computer_file/directory/destination, datum/computer_file/file, copy, list/accesses, mob/user) + if(!file) + return "Could not locate file" + + if(destination) + if(!(destination.get_file_perms(accesses, user) & OS_WRITE_ACCESS)) + return "You lack access to the directory [destination.filename]" + + if(file) + var/req_access = copy ? OS_READ_ACCESS : OS_WRITE_ACCESS + var/move_string = copy ? "copy" : "transfer" + + if(istype(file, /datum/computer_file/directory)) + var/datum/computer_file/directory/dir = file + if(!copy) + if(dir.undeletable) + return "You lack permission to [move_string] the directory [dir.filename]" + for(var/datum/computer_file/child in dir.get_held_files()) + if(child.undeletable) + return "You lack permission to [move_string] the directory [dir.filename]" + + if(!(dir.get_held_perms(accesses, user) & req_access)) + return "You lack permission to [move_string] the directory [dir.filename]" + else + if((!copy && file.undeletable) || !(file.get_file_perms(accesses, user) & req_access)) + return "You lack permission to [move_string] the file [file.filename]" \ No newline at end of file diff --git a/code/modules/modular_computers/os/os.dm b/code/modules/modular_computers/os/os.dm index 2367b5cc2f8..b371c1ff240 100644 --- a/code/modules/modular_computers/os/os.dm +++ b/code/modules/modular_computers/os/os.dm @@ -169,7 +169,7 @@ /datum/extension/interactive/os/proc/system_boot() on = TRUE - var/datum/computer_file/data/autorun = get_file("autorun") + var/datum/computer_file/data/autorun = get_file("autorun", "local") if(istype(autorun)) run_program(autorun.stored_data) var/obj/item/stock_parts/computer/network_card/network_card = get_component(PART_NETWORK) @@ -190,11 +190,11 @@ update_host_icon() /datum/extension/interactive/os/proc/run_program(filename) - var/datum/computer_file/program/P = get_file(filename) + var/datum/computer_file/program/P = get_file(filename, programs_dir) var/mob/user = usr if(!P || !istype(P)) // Program not found or it's not executable program. - show_error(user, "I/O ERROR - Unable to run [filename]") + show_error(user, " - Unable to run [filename]") return if(!P.is_supported_by_hardware(get_hardware_flag(), user, TRUE)) @@ -227,17 +227,19 @@ return active_program.program_state = PROGRAM_STATE_BACKGROUND // Should close any existing UIs SSnano.close_uis(active_program.NM ? active_program.NM : active_program) + if(active_program.browser_module) + SSnano.close_uis(active_program.browser_module) active_program = null update_host_icon() if(istype(user)) ui_interact(user) // Re-open the UI on this computer. It should show the main screen now. /datum/extension/interactive/os/proc/set_autorun(program) - var/datum/computer_file/data/autorun = get_file("autorun") + var/datum/computer_file/data/autorun = get_file("autorun", "local") if(istype(autorun)) autorun.stored_data = "[program]" else - create_file("autorun", "[program]") + create_file("autorun", "local", "[program]") // Autorun file is created in the root directory. /datum/extension/interactive/os/proc/add_log(var/text) var/datum/extension/network_device/D = get_extension(get_component(PART_NETWORK), /datum/extension/network_device) diff --git a/code/modules/modular_computers/os/ui.dm b/code/modules/modular_computers/os/ui.dm index cd4e01ca1b1..26a6980500a 100644 --- a/code/modules/modular_computers/os/ui.dm +++ b/code/modules/modular_computers/os/ui.dm @@ -19,12 +19,13 @@ show_error(user, "DISK ERROR") return // No HDD, No HDD files list or no stored files. Something is very broken. - var/datum/computer_file/data/autorun = get_file("autorun") + var/datum/computer_file/data/autorun = get_file("autorun", "local") var/list/data = get_header_data() var/list/programs = list() - for(var/datum/computer_file/program/P in hard_drive.stored_files) + var/datum/computer_file/directory/program_files = hard_drive.parse_directory(OS_PROGRAMS_DIR, TRUE) + for(var/datum/computer_file/program/P in program_files.get_held_files()) var/list/program = list() program["name"] = P.filename program["desc"] = P.filedesc @@ -97,7 +98,7 @@ return TOPIC_HANDLED if( href_list["PC_killprogram"] ) - var/datum/computer_file/program/P = get_file(href_list["PC_killprogram"]) + var/datum/computer_file/program/P = get_file(href_list["PC_killprogram"], programs_dir) if(!istype(P) || P.program_state == PROGRAM_STATE_KILLED) return TOPIC_HANDLED @@ -169,7 +170,7 @@ SSnano.update_uis(active_program.NM) // Function used by NanoUI's to obtain data for header. All relevant entries begin with "PC_" -/datum/extension/interactive/os/proc/get_header_data() +/datum/extension/interactive/os/proc/get_header_data(file_browser = FALSE) var/list/data = list() var/obj/item/stock_parts/computer/battery_module/battery_module = get_component(PART_BATTERY) if(battery_module) @@ -223,6 +224,7 @@ data["PC_stationtime"] = stationtime2text() data["PC_hasheader"] = !updating data["PC_showexitprogram"] = active_program ? 1 : 0 // Hides "Exit Program" button on mainscreen + data["PC_showshutdown"] = !file_browser // Don't show shutdown/program closing options from file browser window var/datum/computer_file/data/account/cur_account = get_account_nocheck() data["PC_loggedin"] = cur_account?.login diff --git a/code/modules/modular_computers/terminal/terminal.dm b/code/modules/modular_computers/terminal/terminal.dm index 0066c0de5e6..994bbc2f774 100644 --- a/code/modules/modular_computers/terminal/terminal.dm +++ b/code/modules/modular_computers/terminal/terminal.dm @@ -8,15 +8,13 @@ var/network_target // Network tag of whatever device is being targeted on the network by commands. // Terminal can act as a file transfer utility. - var/list/disks = list( - /datum/file_storage/disk, - /datum/file_storage/disk/removable, - /datum/file_storage/network - ) var/datum/file_storage/current_disk + var/datum/computer_file/directory/current_directory + var/datum/file_transfer/current_move var/datum/extension/interactive/os/computer + var/list/disks = list() /datum/terminal/New(mob/user, datum/extension/interactive/os/computer) ..() @@ -55,7 +53,7 @@ /datum/terminal/Process() if(current_move) var/result = current_move.update_progress() - if(!result) + if(result != OS_FILE_SUCCESS) if(QDELETED(current_move)) append_to_history("File Move Cancelled: Unknown error.") else @@ -66,7 +64,7 @@ var/completion = round(1 - (current_move.left_to_transfer / current_move.transferring.size), 0.01) * 100 append_to_history("File Move: [completion]% complete.") else - append_to_history("File Move: Successfully copied file '[current_move.transferring.filename]' to [current_move.transfer_to].") + append_to_history("File Move: Successfully [current_move.copying ? "copied" : "moved"] file '[current_move.transferring.filename]' to '[current_move.transfer_to.get_dir_path(current_move.directory_to, TRUE)]'.") QDEL_NULL(current_move) if(!can_use(get_user())) @@ -100,7 +98,7 @@ account_name = "LOCAL" else account_name = "GUEST" - content += "
    > [account_name]
    " + content += "
    >[account_name]:/[current_disk?.get_dir_path(current_directory, TRUE)]
    " content += "type `man` for a list of available commands." panel.set_content("[jointext(content, "
    ")]
    ") @@ -120,9 +118,10 @@ return 1 /datum/terminal/proc/append_to_history(var/text) - history += text - if(length(history) > history_max_length) - history.Cut(1, length(history) - history_max_length + 1) + if(length(text)) + history += text + if(length(history) > history_max_length) + history.Cut(1, length(history) - history_max_length + 1) update_content() panel.update() @@ -154,4 +153,117 @@ /datum/terminal/proc/get_access(mob/user) var/datum/extension/interactive/os/account_computer = get_account_computer() - return(account_computer.get_access(user)) \ No newline at end of file + return(account_computer.get_access(user)) + +// Returns list(/datum/file_storage, directory) on success. Returns error code on failure. +/datum/terminal/proc/parse_directory(directory_path, create_directories = FALSE) + var/datum/file_storage/target_disk = current_disk + var/datum/computer_file/directory/root_dir = current_directory + + if(!length(directory_path)) + return list(target_disk, root_dir) + + if(directory_path[1] == "/") // This is an absolute path, so we can pass it directly to the OS proc to be processed. + return computer.parse_directory(directory_path, create_directories) + + // Otherwise, we append the working directory path to the passed path. + var/list/directories = splittext(directory_path, "/") + + // When splitting the text, there could be blank strings at either end, so remove them. If there's any in the body of the path, there was a + // missed input, so leave them. + if(!length(directories[1])) + directories.Cut(1, 2) + if(!length(directories[directories.len])) + directories.Cut(directories.len) + + for(var/dir in directories) + if(dir == "..") // Up a directory. + if(root_dir) + root_dir = root_dir.get_directory() + directories.Cut(1, 2) + continue + if(target_disk) + target_disk = null + directories.Cut(1, 2) + continue + // We're trying to move up past the mounting points, return failure. + return OS_DIR_NOT_FOUND + + if(!target_disk) + target_disk = computer.mounted_storage[dir] + if(!target_disk) // Invalid disk entered. + return OS_DIR_NOT_FOUND + directories.Cut(1, 2) + + break // Any further use of ../ is handled by the hard drive. + + // If we were only pathing to the parent of a directory or to a disk, we can return early. + if(!length(directories)) + return list(target_disk, root_dir) + + // Assemble the final path from whatever root directory we're in, and the remaining entered paths. + // The hard drive handles the rest. + var/final_path = root_dir ? root_dir.get_file_path() + "/" : "" + final_path += jointext(directories, "/") + var/datum/computer_file/directory/target_directory = target_disk.parse_directory(final_path, create_directories) + if(!istype(target_directory)) + return OS_DIR_NOT_FOUND + + return list(target_disk, target_directory) + +// Returns list(/datum/file_storage, /datum/computer_file/directory, /datum/computer_file) on success. Returns error code on failure. +/datum/terminal/proc/parse_file(file_path) + if(!length(file_path)) + return OS_FILE_NOT_FOUND + if(file_path[1] == "/") // As above, this is an absolute path, which the OS can handle directly. + return computer.parse_file(file_path) + + var/list/dirs_and_file = splittext(file_path, "/") + if(!length(dirs_and_file)) + return OS_DIR_NOT_FOUND + + // Join together everything but the filename into a path. + var/list/file_loc = parse_directory(jointext(dirs_and_file, "/", 1, dirs_and_file.len)) + if(!islist(file_loc)) // Errored! + return file_loc + + var/datum/file_storage/target_disk = file_loc[1] + var/datum/computer_file/directory/target_dir = file_loc[2] + if(!istype(target_disk)) + return OS_DIR_NOT_FOUND + + var/filename = dirs_and_file[dirs_and_file.len] + var/datum/computer_file/target_file = target_disk.get_file(filename, target_dir) + if(!istype(target_file)) + return OS_FILE_NOT_FOUND + + return list(target_disk, target_dir, target_file) + +/proc/get_terminal_error(path, error_code) + var/list/dirs_and_file = splittext(path, "/") + var/dir_path = jointext(dirs_and_file, "/", 1, dirs_and_file.len) + if(!length(dirs_and_file)) + return "Unable to parse passed path." + var/filename = dirs_and_file[dirs_and_file.len] + + switch(error_code) + if(OS_FILE_NOT_FOUND) + return "Unable to locate the file[length(filename) ? "'[filename]'" : ""]" + if(OS_DIR_NOT_FOUND) + return "Unable to locate the directory[length(dir_path) ? "'[dir_path]'" : ""]" + if(OS_FILE_EXISTS) + return "A file with name '[filename]' already exists" + if(OS_BAD_NAME) + return "The file name '[filename]' is invalid" + if(OS_FILE_NO_READ) + return "You do not have permission to read the file[length(filename) ? "'[filename]'" : ""]" + if(OS_FILE_NO_WRITE) + return "You do not have permission to modify the file[length(filename) ? "'[filename]'" : ""]" + if(OS_HARDDRIVE_SPACE) + return "Insufficient harddrive space" + if(OS_HARDDRIVE_ERROR) + return "I/O error, Harddrive may be non-functional" + if(OS_NETWORK_ERROR) + return "Unable to connect to the network" + + return "An unspecified error occured." \ No newline at end of file diff --git a/code/modules/modular_computers/terminal/terminal_commands.dm b/code/modules/modular_computers/terminal/terminal_commands.dm index 823b16809d4..d0295b3c996 100644 --- a/code/modules/modular_computers/terminal/terminal_commands.dm +++ b/code/modules/modular_computers/terminal/terminal_commands.dm @@ -34,7 +34,28 @@ var/global/list/terminal_commands /datum/terminal_command/proc/get_arguments(text) var/argtext = copytext(text, length(pattern) + 1) - return splittext(argtext, " ") + + var/cur_string = "" + var/list/arguments = list() + + var/last_was_escape = FALSE + for(var/i in 1 to length(argtext)) // Allow players to escape spaces by using '\'. + var/char = argtext[i] + if(char == "\\") + last_was_escape = TRUE + continue + last_was_escape = FALSE + if(char == " ") + if(!last_was_escape) // Space wasn't escaped. + if(length(cur_string)) + arguments += cur_string + cur_string = "" + continue + cur_string += char + + if(length(cur_string)) + arguments += cur_string + return arguments // null return: continue. "" return will break and show a blank line. Return list() to break and not show anything. /datum/terminal_command/proc/parse(text, mob/user, datum/terminal/terminal) @@ -62,7 +83,7 @@ var/global/list/terminal_commands var/pg = clamp(selected_page, 1, max_pages) var/start_index = (pg - 1)*pg_length + 1 - var/end_index = min(length(data), (pg)*pg_length)+1 + var/end_index = min(length(data), pg*pg_length) + 1 . += data.Copy(start_index, end_index) . += "[length(data)] [value_name]\s. Page [pg] / [max_pages]." @@ -251,7 +272,7 @@ Subtypes /datum/terminal_command/cd name = "cd" - man_entry = list("Format: cd \[target\] \[network tag\]", "Changes the current disk to the target.", "LOCAL, REMOVABLE, and NETWORK are supported.") + man_entry = list("Format: cd \[path\]", "Changes the current working directory.", "Both relative and absolute paths are supported.") pattern = @"^cd" /datum/terminal_command/cd/proper_input_entered(text, mob/user, datum/terminal/terminal) @@ -260,94 +281,64 @@ Subtypes var/list/cd_args = get_arguments(text) - var/target = uppertext(cd_args[1]) - if(target == "LOCAL") - terminal.current_disk = terminal.disks[/datum/file_storage/disk] - if(!terminal.current_disk) - return "cd: Could not locate disk." - var/error = terminal.current_disk.check_errors() - if(error) - terminal.current_disk = null - return "cd: [error]" - return "cd: Changed to local disk." - else if(target == "REMOVABLE") - terminal.current_disk = terminal.disks[/datum/file_storage/disk/removable] - if(!terminal.current_disk) - return "cd: Could not locate removable disk." - var/error = terminal.current_disk.check_errors() - if(error) - terminal.current_disk = null - return "cd: [error]" - return "cd: Changed to removable disk" - - else if(target == "NETWORK") - var/datum/extension/interactive/os/origin = terminal.computer - if(!origin || !origin.get_network_status()) - return "cd: Check network connectivity." - var/datum/computer_network/network = terminal.computer.get_network() - // Get the network tag input into the command, or the current network_target otherwise. - var/network_tag = (length(cd_args) >= 2) ? cd_args[2] : terminal.network_target - var/datum/extension/network_device/mainframe/M = network.get_device_by_tag(network_tag) - if(!istype(M)) - return "cd: Could not locate file server with tag [network_tag]." - if(!M.has_access(terminal.get_access(user))) - return "cd: Access denied to file server with tag [network_tag]" - terminal.current_disk = terminal.disks[/datum/file_storage/network] - if(!terminal.current_disk) - return "cd: Could not locate remote file server." - - var/datum/file_storage/network/N = terminal.current_disk - N.server = network_tag - var/error = terminal.current_disk.check_errors() - if(error) - terminal.current_disk = null - return "cd: [error]" - return "cd: Changed to remote file server with tag [network_tag]." - else - return "cd: Target disk not recognized. LOCAL, REMOVABLE, and NETWORK are supported." + var/target_directory = cd_args[1] + + var/list/cd_targets = terminal.parse_directory(target_directory) + if(!islist(cd_targets)) + return "cd: [get_terminal_error(target_directory, cd_targets)]." + + terminal.current_disk = cd_targets[1] + terminal.current_directory = cd_targets[2] + return "" /datum/terminal_command/ls name = "ls" - man_entry = list("Format: ls \[pg number\]", "Lists the files in the current disk, starting from the page number.") + man_entry = list("Format: ls \[pg number\]", "Lists the files in the working directory, starting from the page number.") pattern = @"^ls" /datum/terminal_command/ls/proper_input_entered(text, mob/user, datum/terminal/terminal) - if(!terminal.current_disk || ispath(terminal.current_disk)) - return "ls: No disk selected." - var/list/ls_args = get_arguments(text) var/selected_page = (length(ls_args)) ? text2num(ls_args[1]) : 1 if(!isnum(selected_page)) return "ls: Improper syntax, use format ls \[page number\]." - var/list/files = terminal.current_disk.get_all_files() + if(!terminal.current_disk) + return print_as_page(terminal.computer.mounted_storage, "disk", selected_page, terminal.history_max_length - 1) + var/list/files = terminal.current_disk.get_dir_files(terminal.current_directory) var/list/file_data = list() for(var/datum/computer_file/F in files) - file_data += "[F.filename].[F.filetype] - [F.size] GQ" - + if(istype(F, /datum/computer_file/directory)) + file_data += "[F.filename] - DIR" + else + file_data += "[F.filename].[F.filetype] - [F.size] GQ" + return print_as_page(file_data, "file", selected_page, terminal.history_max_length - 1) /datum/terminal_command/remove name = "rm" - man_entry = list("Format: rm \[file name\]", "Removes the file given in the current disk.") + man_entry = list("Format: rm \[file path\]", "Removes the file with the given path.") pattern = @"^rm\b" /datum/terminal_command/remove/proper_input_entered(text, mob/user, datum/terminal/terminal) - if(!terminal.current_disk) - return "rm: No disk selected." - - var/file_name = copytext(text, 4) - - var/deleted = terminal.current_disk.delete_file(file_name, terminal.get_access(user), user) - if(deleted) - return "rm: Removed file [file_name]." - else - return "rm: Failed to remove file [file_name]. Additional access may be required." - + var/file_path = copytext(text, 4) + var/list/file_loc = terminal.parse_file(file_path) + // Errored! + if(!islist(file_loc)) + return "rm: [get_terminal_error(file_path, file_loc)]." + + var/datum/file_storage/disk = file_loc[1] + var/datum/computer_file/file = file_loc[3] + var/deleted = disk.delete_file(file, terminal.get_access(user), user) + if(deleted == OS_FILE_SUCCESS) + return "rm: Removed file '[file.filename]'." + if(deleted == OS_FILE_NO_WRITE) + return "rm: You do not have permission to remove file '[file.filename]'." + // Other error. Most likely, the hard drive is non-functional. + return "rm: Failed to delete file '[file.filename]'. Hard drive may be non-functional." /datum/terminal_command/move name = "mv" - man_entry = list("Format: mv \[file name\] \[destination\] \[copying (0/1) \]", "Moves a file in the current disk to another.") + man_entry = list("Format: mv \[file path\] \[destination\] \[copying (0/1) \]", "Moves a file to another directory.") pattern = @"^mv" /datum/terminal_command/move/proper_input_entered(text, mob/user, datum/terminal/terminal) @@ -356,63 +347,32 @@ Subtypes var/list/mv_args = get_arguments(text) if(length(mv_args) < 2) - return "mv: Improper syntax, use mv \[file name\] \[destination\] \[copying (0/1) \]." - var/datum/computer_file/F = terminal.current_disk.get_file(mv_args[1]) - if(!F) - return "mv: Could not find file with name [mv_args[1]]." - var/copying = length(mv_args > 2) ? text2num(mv_args[3]) : FALSE - if(copying == TRUE) - if(!(F.get_file_perms(terminal.get_access(user), user) & OS_READ_ACCESS)) - return "mv: You do not have read access to this file." - else - if(!(F.get_file_perms(terminal.get_access(user), user) & OS_WRITE_ACCESS)) - return "mv: You do not have write access to this file. Write access is required when not copying files with mv" + return "mv: Improper syntax, use mv \[file path\] \[destination\] \[copying (0/1) \]." + var/source_path = mv_args[1] + var/list/file_loc = terminal.parse_file(source_path) + if(!islist(file_loc)) // Errored! + return "mv: [get_terminal_error(source_path, file_loc)]." + + var/datum/computer_file/F = file_loc[3] + var/copying = length(mv_args) > 2 ? text2num(mv_args[3]) : FALSE // Find the destination. - var/datum/file_storage/dest - var/target = uppertext(mv_args[2]) - if(target == "LOCAL") - dest = terminal.disks[/datum/file_storage/disk] - if(!dest) - return "mv: Could not locate disk." - var/error = dest.check_errors() - if(error) - return "mv: [error]" - else if(target == "REMOVABLE") - dest = terminal.disks[/datum/file_storage/disk/removable] - if(!dest) - return "mv: Could not locate removable disk." - var/error = dest.check_errors() - if(error) - return "mv: [error]" - else - var/datum/extension/interactive/os/origin = terminal.computer - if(!origin || !origin.get_network_status()) - return "mv: Check network connectivity." - var/datum/computer_network/network = terminal.computer.get_network() - var/datum/extension/network_device/mainframe/M = network.get_device_by_tag(target) - if(!istype(M)) - return "mv: Could not locate destination with tag [target]." - if(!M.has_access(terminal.get_access(user))) - return "mv: Access denied to destination with tag [target]" - dest = terminal.disks[/datum/file_storage/network] - if(!dest) - return "mv: Could not locate remote file server." - - var/datum/file_storage/network/N = dest - N.server = target - var/error = dest.check_errors() - if(error) - return "mv: [error]" - - if(!dest) - return "mv: Could not locate file destination." - - terminal.current_move = new(terminal.current_disk, dest, F, copying) + var/target_path = mv_args[2] + + var/list/destination = terminal.parse_directory(target_path) + if(!islist(destination)) + return "mv: [get_terminal_error(target_path, file_loc)]." + + // Check file permisisons. + var/error = check_file_transfer(destination[2], F, copying, terminal.get_access(user), user) + if(error) + return "mv: [error]." + + terminal.current_move = new(file_loc[1], destination[1], destination[2], F, copying) return "mv: Beginning file move..." /datum/terminal_command/copy name = "cp" - man_entry = list("Format: cp \[file name\]", "Copies a file in the current disk.") + man_entry = list("Format: cp \[file path\]", "Copies the file with the given path.") pattern = @"^cp" /datum/terminal_command/copy/proper_input_entered(text, mob/user, datum/terminal/terminal) @@ -420,43 +380,70 @@ Subtypes return "cp: No disk selected." if(length(text) < 4) - return "cp: Improper syntax, use copy \[file name\]." - - var/target_name = copytext(text, 4) - var/datum/computer_file/F = terminal.current_disk.get_file(target_name) - if(!F) - return "cp: Could not find file with name [target_name]." + return "cp: Improper syntax, use copy \[file path\]." + + var/file_path = copytext(text, 4) + var/list/file_loc = terminal.parse_file(file_path) + // Errored! + if(!islist(file_loc)) + var/list/dirs_and_file = splittext(file_path, "/") + var/dir_path = jointext(dirs_and_file, "/", 1, dirs_and_file.len) + var/filename = dirs_and_file[dirs_and_file.len] + return "cp: [get_terminal_error(filename, dir_path, file_loc)]." + + var/datum/file_storage/disk = file_loc[1] + var/datum/computer_file/file = file_loc[3] + + var/datum/computer_file/copy = file.clone(TRUE) + if(!istype(copy)) + return + var/success = disk.store_file(copy, file_loc[2], FALSE, terminal.get_access(user), user) + if(success == OS_FILE_SUCCESS) + return "cp: Successfully copied file [file.filename]." - var/copied_file = F.clone(TRUE) - if(terminal.current_disk.store_file(copied_file)) - return "cp: Successfully copied file [F.filename]." - else - return "cp: Could not copy file!" + return "cp: [get_terminal_error(file_path, success)]." /datum/terminal_command/rename name = "rename" - man_entry = list("Format: rename \[file name\] \[new name\]", "Renames a file in the current disk.") + man_entry = list("Format: rename \[file path\] \[new name\]", "Renames a file with the given path.") pattern = @"^rename" /datum/terminal_command/rename/proper_input_entered(text, mob/user, datum/terminal/terminal) - if(!terminal.current_disk) - return "rename: No disk selected." - var/list/rename_args = get_arguments(text) - if(length(rename_args) < 2) return "rename: Improper syntax, use rename \[file name\] \[new name\]." - var/datum/computer_file/F = terminal.current_disk.get_file(rename_args[1]) - if(!F) - return "rename: Could not find file with name [rename_args[1]]." - - var/new_name = sanitize(rename_args[2]) + var/file_path = rename_args[1] + var/list/file_loc = terminal.parse_file(file_path) + // Errored! + if(!islist(file_loc)) + return "rename: [get_terminal_error(file_path, file_loc)]." + + var/datum/computer_file/F = file_loc[3] + var/new_name = sanitize_for_file(rename_args[2]) if(length(new_name)) + if(F.unrenamable || !(F.get_file_perms(terminal.get_access(user), user) & OS_WRITE_ACCESS)) + return "rename: You lack permission to rename [F.filename]." F.filename = new_name - return "rename: File renamed to [new_name]." + return "rename: File renamed to '[new_name]'." else - return "rename: Could not rename file." + return "rename: Invalid file name." + +/datum/terminal_command/mkdir + name = "mkdir" + man_entry = list("Format: mkdir \[dir path\]", "Creates a directory with the given path.") + pattern = @"^mkdir" + +/datum/terminal_command/mkdir/proper_input_entered(text, mob/user, datum/terminal/terminal) + var/list/mkdir_args = get_arguments(text) + if(!length(mkdir_args)) + return "mv: Improper syntax, use mkdir \[dir path\]." + var/list/file_loc = terminal.parse_directory(mkdir_args[1], TRUE) + if(!islist(file_loc) || (length(file_loc) > 1 && file_loc[2] == null)) // Don't return the error directly since we're attempting to create a directory, not just parse one. + return "mkdir: Unable to create directory '[mkdir_args[1]]'." + + var/datum/computer_file/directory/created_dir = file_loc[2] + return "mkdir: Successfully created directory '[created_dir.get_file_path()]'." /datum/terminal_command/target name = "target" @@ -503,7 +490,7 @@ Subtypes /datum/terminal_command/permmod name = "permmod" - man_entry = list("Format: permmod \[file name\] \[access key\] \[permission mod flags\]", "Modifies or lists the permissions of the given file. Do not pass an access key to list permissions.", + man_entry = list("Format: permmod \[file path\] \[access key\] \[permission mod flags\]", "Modifies or lists the permissions of the given file. Do not pass an access key to list permissions.", "Supported flags are as follows:", "'+/-' - Add or Remove access requirement", "'r/w/m' - Target read/write/modification access", @@ -520,11 +507,14 @@ Subtypes var/list/permmod_args = get_arguments(text) if(!length(permmod_args)) - return "permmod: Improper syntax, use permmod \[file name\] \[access key\] \[permission mod flags\]." - - var/datum/computer_file/F = terminal.current_disk.get_file(permmod_args[1]) - if(!F) - return "permmod: Could not find file with name [permmod_args[1]]." + return "permmod: Improper syntax, use permmod \[file path\] \[access key\] \[permission mod flags\]." + + var/file_path = permmod_args[1] + var/list/file_loc = terminal.parse_file(file_path) + if(!islist(file_loc)) + return "permmod: [get_terminal_error(file_path, file_loc)]." + + var/datum/computer_file/F = file_loc[3] if(length(permmod_args) < 3) return F.get_perms_readable() diff --git a/nano/templates/file_browser.tmpl b/nano/templates/file_browser.tmpl new file mode 100644 index 00000000000..cf3c3d3c1b5 --- /dev/null +++ b/nano/templates/file_browser.tmpl @@ -0,0 +1,75 @@ +{{if data.error}} +

    A disk error has occured:

    + Additional information: {{:data.error}}
    + Please try again. If the problem persists contact your system administrator for assistance. + {{:helper.link('Back to file select', null, { "BRS_back" : 1 })}} +{{else}} + {{:helper.link('Back to program', 'arrowreturnthick-1-w', { "BRS_back" : 1 })}} + {{if data.current_disk}} +

    Available files ({{:data.current_disk}}):

    + +
    File name + File type + File size (GQ) + Operations + {{if data.saving_file}} + {{:helper.link('+', 'folder-collapsed', { "BRS_create_dir" : 1})}} + {{/if}} + {{:helper.link('', 'arrowthickstop-1-n', { "BRS_up_directory" : 1}, data.up_directory ? null : null)}} + {{for data.files}} + {{if value.dir}} +
    {{:helper.link(value.name, 'folder-collapsed', { "BRS_change_directory" : value.name})}} + + + {{if !data.saving_file}} + {{:helper.link('SELECT', null, { "BRS_select_file" : value.name}, value.selectable ? null : 'disabled')}} + {{/if}} + {{else}} +
    {{:value.name}} + .{{:value.type}} + {{:value.size}}GQ + {{:helper.link('SELECT', null, { "BRS_select_file" : value.name}, value.selectable ? null : 'disabled')}} + {{/if}} + {{/for}} +
    +
    + {{if data.saving_file}} +
    + + + + + + +
    Save file as:{{:helper.link(data.curr_file_name + '.' + data.curr_file_type, null, { "BRS_rename_file" : 1}, null)}}{{:helper.link('Save', 'disk', { "BRS_save_file" : 1}, null)}}
    +
    + {{else}} +
    + + + + + +
    Selecting file: + + {{if data.curr_file_name}} + {{:data.curr_file_name}}.{{:data.curr_file_type}} + {{else}} + No file selected! + {{/if}} + {{:helper.link('Open', null, { "BRS_finalize_select" : 1}, data.curr_file_name ? null : 'disabled')}}
    +
    + {{/if}} +

    Selectable file types are {{:data.filetypes}}.

    + {{else}} +

    Select a disk.

    + +
    Disk + Description + {{for data.avail_disks}} +
    {{:helper.link(value.name, null, { "BRS_select_disk" : value.name})}} + {{:value.desc}} + {{/for}} +
    + {{/if}} +{{/if}} diff --git a/nano/templates/file_manager.tmpl b/nano/templates/file_manager.tmpl index 4c9608d0f3d..d3898404ec6 100644 --- a/nano/templates/file_manager.tmpl +++ b/nano/templates/file_manager.tmpl @@ -1,7 +1,3 @@ -
    -
    Storage Medium
    - {{:helper.link(data.current_source, null, { "PRG_change_filesource" : 1 }, null)}} -
    {{if data.transfer_file}}
    Current Transfer
    @@ -15,12 +11,6 @@ {{:data.transfer_file}} from {{:data.transfer_from}} to {{:data.transfer_to}}
    {{/if}} -{{if data.fileserver}} -
    -
    File Server
    - {{:helper.link(data.fileserver, null, { "PRG_changefileserver" : 1 }, null)}} -
    - {{/if}} {{if data.error}}

    An error has occured:

    Additional information: {{:data.error}}
    @@ -36,44 +26,63 @@

    {{:data.filedata}} {{else}} -

    Available files ({{:data.current_source}}):

    - -
    File name - File type - File size (GQ) - Operations - {{for data.files}} -
    {{:value.name}} - .{{:value.type}} - {{:value.size}}GQ - - {{:helper.link('VIEW', null, { "PRG_openfile" : value.name })}} - {{:helper.link('DELETE', null, { "PRG_deletefile" : value.name }, value.undeletable ? 'disabled' : null)}} - {{:helper.link('RENAME', null, { "PRG_rename" : value.name }, value.undeletable ? 'disabled' : null)}} - {{:helper.link('CLONE', null, { "PRG_clone" : value.name }, value.undeletable ? 'disabled' : null)}} - {{:helper.link('TRANSFER TO', null, { "PRG_transferto" : value.name }, value.unsendable ? 'disabled' : null)}} - {{/for}} + + {{for data.disks}} + {{:helper.link(value.name, null, { "PRG_change_disk" : value.index }, value.selected ? 'selected' : null)}} + {{/for}} + {{:helper.link('+', null, { "PRG_change_disk" : '0' }, null)}}
    - {{if data.usbconnected}} -

    Available files (portable device):

    - -
    File name - File type - File size (GQ) - Operations - {{for data.usbfiles}} -
    {{:value.name}} - .{{:value.type}} - {{:value.size}}GQ - - {{:helper.link('DELETE', null, { "PRG_usbdeletefile" : value.name }, value.undeletable ? 'disabled' : null)}} - {{if data.usbconnected}} - {{:helper.link('IMPORT', null, { "PRG_copyfromusb" : value.name }, value.undeletable ? 'disabled' : null)}} +
    + {{if data.current_disk}} +

    Available files ({{:data.current_disk}}):

    + + + {{for data.files}} + {{if value.dir}} +
    File name + File type + File size (GQ) + Operations + + {{:helper.link('', 'arrowthickstop-1-n', { "PRG_up_directory" : 1}, data.up_directory ? null : 'disabled')}} + {{:helper.link('X', null, { "PRG_exit_disk" : 1})}} +
    {{:helper.link(value.name, 'folder-collapsed', { "PRG_openfile" : value.name})}} + + + {{:helper.link('RENAME', null, { "PRG_rename" : value.name}, value.unrenamable ? 'disabled' : null)}} + {{:helper.link('DELETE', null, { "PRG_deletefile" : value.name}, value.undeletable ? 'disabled' : null)}} + {{:helper.link('CLONE', null, { "PRG_clone" : value.name}, value.undeletable ? 'disabled' : null)}} + {{:helper.link('TRANSFER TO', null, { "PRG_transferto" : value.name}, value.unsendable ? 'disabled' : null)}} + {{else}} +
    {{:value.name}} + .{{:value.type}} + {{:value.size}}GQ + + {{:helper.link('VIEW', null, { "PRG_openfile" : value.name})}} + {{:helper.link('DELETE', null, { "PRG_deletefile" : value.name}, value.undeletable ? 'disabled' : null)}} + {{:helper.link('RENAME', null, { "PRG_rename" : value.name}, value.undeletable ? 'disabled' : null)}} + {{:helper.link('CLONE', null, { "PRG_clone" : value.name}, value.undeletable ? 'disabled' : null)}} + {{:helper.link('TRANSFER TO', null, { "PRG_transferto" : value.name}, value.unsendable ? 'disabled' : null)}} {{/if}} - {{/for}} -
    + {{/for}} +
    + {{:helper.link('NEW DATA FILE', null, { "PRG_newtextfile" : 1 })}} + {{:helper.link('NEW DIRECTORY', null, { "PRG_newdir" : 1 })}} + {{else}} +

    Select a disk.

    + + + {{for data.avail_disks}} +
    Disk + Description + Action
    {{:helper.link(value.name, null, { "PRG_select_disk" : value.name})}} + {{:value.desc}} + {{if value.is_network}} + {{:helper.link('UNMOUNT', null, { "PRG_unmount_network" : value.name})}} + {{/if}} + {{/for}} +
    + {{:helper.link('MOUNT NETWORK DRIVE', null, { "PRG_mount_network" : 1 })}} {{/if}} - {{:helper.link('NEW DATA FILE', null, { "PRG_newtextfile" : 1 })}} {{/if}} - {{/if}} diff --git a/nano/templates/layout_default_header.tmpl b/nano/templates/layout_default_header.tmpl index 6f5dc6f4e28..e1683ca5ffa 100644 --- a/nano/templates/layout_default_header.tmpl +++ b/nano/templates/layout_default_header.tmpl @@ -28,14 +28,16 @@
    -
    - -
    {{:helper.link('Shutdown', null, {'PC_shutdown' : 1})}} - {{if data.PC_showexitprogram}} - {{:helper.link('Exit Program', null, {'PC_exit' : 1})}} - {{:helper.link('Minimize Program', null, {'PC_minimize' : 1})}} - {{/if}} -
    -
    + {{if data.PC_showshutdown}} +
    + +
    {{:helper.link('Shutdown', null, {'PC_shutdown' : 1})}} + {{if data.PC_showexitprogram}} + {{:helper.link('Exit Program', null, {'PC_exit' : 1})}} + {{:helper.link('Minimize Program', null, {'PC_minimize' : 1})}} + {{/if}} +
    +
    + {{/if}}
    {{/if}} \ No newline at end of file diff --git a/nano/templates/word_processor.tmpl b/nano/templates/word_processor.tmpl index 0a786f4973e..433e6afce51 100644 --- a/nano/templates/word_processor.tmpl +++ b/nano/templates/word_processor.tmpl @@ -1,38 +1,13 @@ {{if data.error}} -

    An error has occurred:

    -Additional information: {{:data.error}}
    -Please try again. If the problem persists, contact your system administrator for assistance. -{{:helper.link('Back to menu', null, { "PRG_backtomenu" : 1 })}} -{{else}} -{{if data.browsing}} - {{:helper.link('BACK TO EDITOR', null, { "PRG_closebrowser" : 1 })}} -

    Available documents (local):

    - -
    Name - Size (GQ) - {{for data.files}} -
    {{:value.name}} - {{:value.size}}GQ - {{:helper.link('OPEN', null, { "PRG_openfile" : value.name })}} - {{/for}} -
    - {{if data.usbconnected}} -

    Available documents (portable device):

    - -
    Name - Size (GQ) - {{for data.usbfiles}} -
    {{:value.name}} - {{:value.size}}GQ - {{:helper.link('OPEN', null, { "PRG_openfile" : value.name })}} - {{/for}} -
    - {{/if}} +

    An error has occurred:

    + Additional information: {{:data.error}}
    + Please try again. If the problem persists, contact your system administrator for assistance. + {{:helper.link('Back to menu', null, { "PRG_backtomenu" : 1 })}} {{else}}

    Document: {{:data.filename}}

    {{:helper.link('NEW', null, { "PRG_newfile" : 1 })}} - {{:helper.link('LOAD', null, { "PRG_loadmenu" : 1 })}} + {{:helper.link('LOAD', null, { "PRG_openfile" : 1 })}} {{:helper.link('SAVE', null, { "PRG_savefile" : 1 })}} {{:helper.link('SAVE AS', null, { "PRG_saveasfile" : 1 })}}
    @@ -43,7 +18,11 @@ Additional information: {{:data.error}}
    {{:helper.link('PRINT', null, { "PRG_printfile" : 1 })}}

    + {{if data.filedata}} {{:data.filedata}} + {{else}} + No file data! + {{/if}}
    {{/if}} -{{/if}} + diff --git a/nebula.dme b/nebula.dme index 4e8f5381400..8c1d4d7e6cb 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2546,9 +2546,11 @@ #include "code\modules\modular_computers\computers\subtypes\preset_telescreen.dm" #include "code\modules\modular_computers\file_system\computer_file.dm" #include "code\modules\modular_computers\file_system\data.dm" +#include "code\modules\modular_computers\file_system\directory.dm" #include "code\modules\modular_computers\file_system\manifest.dm" #include "code\modules\modular_computers\file_system\program.dm" #include "code\modules\modular_computers\file_system\program_events.dm" +#include "code\modules\modular_computers\file_system\programs\file_browser.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\access_decrypter.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\hacked_camera.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" @@ -2570,7 +2572,7 @@ #include "code\modules\modular_computers\file_system\programs\generic\deck_management.dm" #include "code\modules\modular_computers\file_system\programs\generic\docks.dm" #include "code\modules\modular_computers\file_system\programs\generic\email_client.dm" -#include "code\modules\modular_computers\file_system\programs\generic\file_browser.dm" +#include "code\modules\modular_computers\file_system\programs\generic\file_manager.dm" #include "code\modules\modular_computers\file_system\programs\generic\folding.dm" #include "code\modules\modular_computers\file_system\programs\generic\game.dm" #include "code\modules\modular_computers\file_system\programs\generic\ntdownloader.dm" From edd86ce8089f80d328b28e33eeb3a6973a1d97aa Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Tue, 9 Aug 2022 15:57:42 -0400 Subject: [PATCH 0250/1518] Make small common machines less annoying to build/repair * Alarms have a built-in unbreakable tesla-link and don't need a console screen and keyboard part anymore to be usable. * Pipe meters have unbreakable built-in components now. * Buttons have unbreakable tesla-link and transmitters/receiver in them now. * Lightswitch have unbreakable tesla-links. * lights have unbreakable tesla-links in them now. * airlock sensors, and airlock access buttons have unbreakable parts now. --- code/game/machinery/alarm.dm | 6 ++--- code/game/machinery/atmoalter/meter.dm | 11 +++----- code/game/machinery/buttons.dm | 9 +++---- code/game/machinery/doors/airlock_control.dm | 13 ++++----- code/game/machinery/doors/blast_door.dm | 6 ++--- code/game/machinery/lightswitch.dm | 7 ++--- code/game/machinery/pipe/construction.dm | 3 --- code/game/machinery/wall_frames.dm | 12 ++++----- code/game/objects/items/buttons.dm | 2 +- .../items/weapons/circuitboards/wall.dm | 12 ++------- code/modules/power/lighting.dm | 27 +++++-------------- 11 files changed, 34 insertions(+), 74 deletions(-) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index f27a9b6adba..183d30f94f8 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -58,8 +58,7 @@ base_type = /obj/machinery/alarm frame_type = /obj/item/frame/air_alarm - stat_immune = 0 - uncreated_component_parts = null + uncreated_component_parts = list(/obj/item/stock_parts/power/apc = 1) construct_state = /decl/machine_construction/wall_frame/panel_closed wires = /datum/wires/alarm @@ -831,8 +830,7 @@ FIRE ALARM base_type = /obj/machinery/firealarm frame_type = /obj/item/frame/fire_alarm - stat_immune = 0 - uncreated_component_parts = null + uncreated_component_parts = list(/obj/item/stock_parts/power/apc = 1) construct_state = /decl/machine_construction/wall_frame/panel_closed var/detecting = TRUE diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 9febfed0ac8..b1493f77cc9 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -9,7 +9,7 @@ idle_power_usage = 15 uncreated_component_parts = list( - /obj/item/stock_parts/power/apc/buildable + /obj/item/stock_parts/power/apc ) public_variables = list( /decl/public_access/public_variable/gas, @@ -18,9 +18,9 @@ ) stock_part_presets = list(/decl/stock_part_preset/radio/basic_transmitter/meter = 1) - frame_type = /obj/item/machine_chassis/pipe_meter/base + frame_type = /obj/item/machine_chassis/pipe_meter construct_state = /decl/machine_construction/default/panel_closed/item_chassis - base_type = /obj/machinery/meter/buildable + base_type = /obj/machinery/meter /obj/machinery/meter/Initialize() . = ..() @@ -103,13 +103,10 @@ set_target(loc) . = ..() -/obj/machinery/meter/buildable - uncreated_component_parts = null - /obj/machinery/meter/starts_with_radio uncreated_component_parts = list( /obj/item/stock_parts/radio/transmitter/basic/buildable, - /obj/item/stock_parts/power/apc/buildable + /obj/item/stock_parts/power/apc ) /decl/stock_part_preset/radio/basic_transmitter/meter diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 63feb75cb31..f8f2a5134ce 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -17,10 +17,10 @@ public_methods = list(/decl/public_access/public_method/toggle_input_toggle) stock_part_presets = list(/decl/stock_part_preset/radio/basic_transmitter/button = 1) uncreated_component_parts = list( - /obj/item/stock_parts/power/apc/buildable, - /obj/item/stock_parts/radio/transmitter/basic/buildable + /obj/item/stock_parts/power/apc = 1, + /obj/item/stock_parts/radio/transmitter/basic = 1 ) - base_type = /obj/machinery/button/buildable + base_type = /obj/machinery/button construct_state = /decl/machine_construction/wall_frame/panel_closed/simple frame_type = /obj/item/frame/button required_interaction_dexterity = DEXTERITY_SIMPLE_MACHINES @@ -30,9 +30,6 @@ var/state = FALSE var/cooldown = 1 SECOND -/obj/machinery/button/buildable - uncreated_component_parts = null - /obj/machinery/button/Initialize() . = ..() update_icon() diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 7f1492a96b4..1870c25ec0a 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -106,19 +106,16 @@ public_methods = list(/decl/public_access/public_method/toggle_input_toggle) stock_part_presets = list(/decl/stock_part_preset/radio/basic_transmitter/airlock_sensor = 1) uncreated_component_parts = list( - /obj/item/stock_parts/power/apc/buildable, - /obj/item/stock_parts/radio/transmitter/basic/buildable + /obj/item/stock_parts/power/apc, + /obj/item/stock_parts/radio/transmitter/basic ) - base_type = /obj/machinery/airlock_sensor/buildable + base_type = /obj/machinery/airlock_sensor construct_state = /decl/machine_construction/wall_frame/panel_closed/simple frame_type = /obj/item/frame/button/airlock_sensor var/alert = 0 var/pressure -/obj/machinery/airlock_sensor/buildable - uncreated_component_parts = null - /obj/machinery/airlock_sensor/on_update_icon() if(!(stat & (NOPOWER | BROKEN))) if(alert) @@ -185,8 +182,8 @@ /decl/stock_part_preset/radio/event_transmitter/access_button = 1 ) uncreated_component_parts = list( - /obj/item/stock_parts/power/apc/buildable, - /obj/item/stock_parts/radio/transmitter/on_event/buildable + /obj/item/stock_parts/power/apc, + /obj/item/stock_parts/radio/transmitter/on_event ) var/command = "cycle" diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 41db01c7b34..efbb8ef6ed1 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -264,9 +264,9 @@ /decl/stock_part_preset/radio/receiver/blast_door_button = 1 ) uncreated_component_parts = list( - /obj/item/stock_parts/power/apc/buildable, - /obj/item/stock_parts/radio/transmitter/on_event/buildable, - /obj/item/stock_parts/radio/receiver/buildable + /obj/item/stock_parts/power/apc, + /obj/item/stock_parts/radio/transmitter/on_event, + /obj/item/stock_parts/radio/receiver ) /obj/machinery/button/blast_door/Initialize(mapload) diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index c859e3bca49..b7c5d4f3144 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -20,12 +20,9 @@ construct_state = /decl/machine_construction/wall_frame/panel_closed/simple frame_type = /obj/item/frame/button/light_switch uncreated_component_parts = list( - /obj/item/stock_parts/power/apc/buildable + /obj/item/stock_parts/power/apc ) - base_type = /obj/machinery/light_switch/buildable - -/obj/machinery/light_switch/buildable - uncreated_component_parts = null + base_type = /obj/machinery/light_switch /obj/machinery/light_switch/on on = TRUE diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index efb3abfe6fb..f598eada40c 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -154,9 +154,6 @@ Buildable meters w_class = ITEM_SIZE_LARGE build_type = /obj/machinery/meter -/obj/item/machine_chassis/pipe_meter/base - build_type = /obj/machinery/meter/buildable - /obj/item/machine_chassis/igniter name = "igniter" desc = "A device which will ignite surrounding gasses." diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm index a8831ad5235..6aaacbeed2a 100644 --- a/code/game/machinery/wall_frames.dm +++ b/code/game/machinery/wall_frames.dm @@ -109,33 +109,33 @@ desc = "Used for building lights." icon = 'icons/obj/lighting.dmi' icon_state = "tube-construct-item" - build_machine_type = /obj/machinery/light/buildable + build_machine_type = /obj/machinery/light reverse = 1 /obj/item/frame/light/small name = "small light fixture frame" icon_state = "bulb-construct-item" material = /decl/material/solid/metal/steel - build_machine_type = /obj/machinery/light/small/buildable + build_machine_type = /obj/machinery/light/small /obj/item/frame/light/spot name = "spotlight fixture frame" icon_state = "tube-construct-item" material = /decl/material/solid/metal/steel - build_machine_type = /obj/machinery/light/spot/buildable + build_machine_type = /obj/machinery/light/spot /obj/item/frame/light/nav name = "navigation light fixture frame" icon_state = "tube-construct-item" material = /decl/material/solid/metal/steel - build_machine_type = /obj/machinery/light/navigation/buildable + build_machine_type = /obj/machinery/light/navigation /obj/item/frame/button name = "button frame" icon = 'icons/obj/objects.dmi' icon_state = "launcherbtt" material = /decl/material/solid/metal/steel - build_machine_type = /obj/machinery/button/buildable + build_machine_type = /obj/machinery/button /obj/item/frame/camera name = "security camera frame" @@ -244,7 +244,7 @@ icon_state = "airlock_sensor_off" name = "airlock sensor" desc = "An airlock sensor frame." - build_machine_type = /obj/machinery/airlock_sensor/buildable + build_machine_type = /obj/machinery/airlock_sensor /obj/item/frame/button/airlock_controller icon = 'icons/obj/airlock_machines.dmi' diff --git a/code/game/objects/items/buttons.dm b/code/game/objects/items/buttons.dm index 25e8e7ec4c8..8f23dd24150 100644 --- a/code/game/objects/items/buttons.dm +++ b/code/game/objects/items/buttons.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/power.dmi' icon_state = "light-p" obj_flags = OBJ_FLAG_CONDUCTIBLE - build_machine_type = /obj/machinery/light_switch/buildable + build_machine_type = /obj/machinery/light_switch /obj/item/frame/button/light_switch/kit name = "light switch kit" diff --git a/code/game/objects/items/weapons/circuitboards/wall.dm b/code/game/objects/items/weapons/circuitboards/wall.dm index ba44e755d56..5fc545cabe3 100644 --- a/code/game/objects/items/weapons/circuitboards/wall.dm +++ b/code/game/objects/items/weapons/circuitboards/wall.dm @@ -9,11 +9,7 @@ board_type = "wall" origin_tech = "{'programming':1,'engineering':1}" req_components = list() - additional_spawn_components = list( - /obj/item/stock_parts/console_screen = 1, - /obj/item/stock_parts/keyboard = 1, - /obj/item/stock_parts/power/apc/buildable = 1 - ) + additional_spawn_components = null /obj/item/stock_parts/circuitboard/air_alarm name = "circuitboard (air alarm)" @@ -23,11 +19,7 @@ board_type = "wall" origin_tech = "{'programming':1,'engineering':1}" req_components = list() - additional_spawn_components = list( - /obj/item/stock_parts/console_screen = 1, - /obj/item/stock_parts/keyboard = 1, - /obj/item/stock_parts/power/apc/buildable = 1 - ) + additional_spawn_components = null /obj/item/stock_parts/circuitboard/apc name = "circuitboard (area power controller)" diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index ac5d222b292..581e65b0446 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -32,10 +32,10 @@ power_channel = LIGHT //Lights are calc'd via area so they dont need to be in the machine list uncreated_component_parts = list( - /obj/item/stock_parts/power/apc/buildable + /obj/item/stock_parts/power/apc ) construct_state = /decl/machine_construction/wall_frame/panel_closed/simple - base_type = /obj/machinery/light/buildable + base_type = /obj/machinery/light frame_type = /obj/item/frame/light var/on = 0 // 1 if on, 0 if off @@ -56,9 +56,6 @@ lightbulb.set_color(color) queue_icon_update() -/obj/machinery/light/buildable - uncreated_component_parts = null - // the smaller bulb light fixture /obj/machinery/light/small icon_state = "bulb_map" @@ -66,12 +63,9 @@ desc = "A small lighting fixture." light_type = /obj/item/light/bulb accepts_light_type = /obj/item/light/bulb - base_type = /obj/machinery/light/small/buildable + base_type = /obj/machinery/light/small frame_type = /obj/item/frame/light/small -/obj/machinery/light/small/buildable - uncreated_component_parts = null - /obj/machinery/light/small/emergency light_type = /obj/item/light/bulb/red @@ -83,12 +77,9 @@ desc = "A more robust socket for light tubes that demand more power." light_type = /obj/item/light/tube/large accepts_light_type = /obj/item/light/tube/large - base_type = /obj/machinery/light/spot/buildable + base_type = /obj/machinery/light/spot frame_type = /obj/item/frame/light/spot -/obj/machinery/light/spot/buildable - uncreated_component_parts = null - // create a new lighting fixture /obj/machinery/light/Initialize(mapload, d=0, populate_parts = TRUE) . = ..() @@ -453,8 +444,9 @@ accepts_light_type = /obj/item/light/tube/large on = TRUE var/delay = 1 - base_type = /obj/machinery/light/navigation/buildable + base_type = /obj/machinery/light/navigation frame_type = /obj/item/frame/light/nav + stat_immune = NOPOWER | NOINPUT | NOSCREEN /obj/machinery/light/navigation/on_update_icon() . = ..() // this will handle pixel offsets @@ -468,9 +460,6 @@ to_chat(user, SPAN_NOTICE("You adjust the delay on \the [src].")) return TRUE -/obj/machinery/light/navigation/buildable - uncreated_component_parts = null - /obj/machinery/light/navigation/delay2 delay = 2 @@ -483,10 +472,6 @@ /obj/machinery/light/navigation/delay5 delay = 5 -/obj/machinery/light/navigation - stat_immune = NOPOWER | NOINPUT | NOSCREEN - - // the light item // can be tube or bulb subtypes // will fit into empty /obj/machinery/light of the corresponding type From d1677f1e83ff7156f049e7baef3d9e393439619e Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Tue, 9 Aug 2022 17:25:37 -0400 Subject: [PATCH 0251/1518] Applied suggestion --- code/__defines/items_clothing.dm | 23 ++++++++++--------- code/game/gamemodes/cult/cult_items.dm | 2 +- .../godmode/form_items/starlight_items.dm | 4 ++-- .../wizard/servant_items/caretaker.dm | 2 +- .../gamemodes/wizard/servant_items/fiend.dm | 4 ++-- .../wizard/servant_items/overseer.dm | 2 +- code/modules/clothing/head/_head.dm | 2 +- code/modules/clothing/head/collectable.dm | 2 +- code/modules/clothing/head/hardhat.dm | 4 ++-- code/modules/clothing/head/helmet.dm | 6 ++--- code/modules/clothing/head/jobs.dm | 6 ++--- code/modules/clothing/head/misc.dm | 10 ++++---- code/modules/clothing/head/misc_special.dm | 6 ++--- code/modules/clothing/masks/boxing.dm | 6 ++--- code/modules/clothing/masks/miscellaneous.dm | 6 ++--- .../clothing/spacesuits/rig/rig_pieces.dm | 2 +- .../modules/clothing/spacesuits/spacesuits.dm | 6 ++--- code/modules/clothing/suits/bio.dm | 2 +- code/modules/clothing/suits/miscellaneous.dm | 2 +- code/modules/clothing/suits/toggles.dm | 4 ++-- code/modules/clothing/suits/utility.dm | 6 ++--- code/modules/clothing/under/jobs/security.dm | 6 ++--- .../mob/living/carbon/human/inventory.dm | 6 ++--- .../mob/living/carbon/human/update_icons.dm | 4 ++-- code/modules/organs/external/head.dm | 2 +- .../corporate/clothing/head/captain.dm | 2 +- 26 files changed, 64 insertions(+), 63 deletions(-) diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm index 0678ded72b8..56cade96b67 100644 --- a/code/__defines/items_clothing.dm +++ b/code/__defines/items_clothing.dm @@ -20,19 +20,20 @@ // Bitmasks for the flags_inv variable. These determine when a piece of clothing hides another, i.e. a helmet hiding glasses. // WARNING: The following flags apply only to the external suit! -#define HIDEGLOVES BITFLAG(0) -#define HIDESUITSTORAGE BITFLAG(1) -#define HIDEJUMPSUIT BITFLAG(2) -#define HIDESHOES BITFLAG(3) -#define HIDETAIL BITFLAG(4) +#define HIDEGLOVES BITFLAG(0) +#define HIDESUITSTORAGE BITFLAG(1) +#define HIDEJUMPSUIT BITFLAG(2) +#define HIDESHOES BITFLAG(3) +#define HIDETAIL BITFLAG(4) // WARNING: The following flags apply only to the helmets and masks! -#define HIDEMASK BITFLAG(0) -#define HIDEEARS BITFLAG(1) // Headsets and such. -#define HIDEEYES BITFLAG(2) // Glasses. -#define HIDEFACE BITFLAG(3) // Dictates whether we appear as "Unknown". -#define BLOCKHEADHAIR BITFLAG(4) // Hides the user's hair overlay. Leaves facial hair. -#define BLOCKHAIR BITFLAG(5) // Hides the user's hair, facial and otherwise. +#define HIDEMASK BITFLAG(0) +#define HIDEEARS BITFLAG(1) // Headsets and such. +#define HIDEEYES BITFLAG(2) // Glasses. +#define HIDEFACE BITFLAG(3) // Dictates whether we appear as "Unknown". +#define BLOCK_HEAD_HAIR BITFLAG(4) // Hides the user's hair overlay, and replace it with short hairs. Leaves facial hair. +#define BLOCK_FACIAL_HAIR BITFLAG(5) // Hides the user's hair, facial and otherwise. +#define BLOCK_ALL_HAIR (BLOCK_HEAD_HAIR | BLOCK_FACIAL_HAIR) // Inventory slot strings. // since numbers cannot be used as associative list keys. diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 022ce7cfb3b..ffcc1c2e6ad 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -59,7 +59,7 @@ name = "magus helm" desc = "A helm worn by the followers of Nar-Sie." icon = 'icons/clothing/head/wizard/magus.dmi' - flags_inv = HIDEFACE | BLOCKHAIR + flags_inv = HIDEFACE | BLOCK_ALL_HAIR body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES armor = list( melee = ARMOR_MELEE_RESISTANT, diff --git a/code/game/gamemodes/godmode/form_items/starlight_items.dm b/code/game/gamemodes/godmode/form_items/starlight_items.dm index 073eef44e31..afa0d1b373b 100644 --- a/code/game/gamemodes/godmode/form_items/starlight_items.dm +++ b/code/game/gamemodes/godmode/form_items/starlight_items.dm @@ -59,7 +59,7 @@ name = "knight's helm" desc = "It's a shiny metal helmet. It looks ripped straight out of the Dark Ages, actually." icon = 'icons/clothing/head/star_champion.dmi' - flags_inv = HIDEEARS | BLOCKHAIR + flags_inv = HIDEEARS | BLOCK_ALL_HAIR /obj/item/clothing/suit/armor/sunrobe name = "oracle's robe" @@ -89,7 +89,7 @@ name = "traitor's hood" desc = "No light can pierce this hood. It's unsettling." icon = 'icons/clothing/head/star_traitor.dmi' - flags_inv = HIDEEARS | BLOCKHAIR + flags_inv = HIDEEARS | BLOCK_ALL_HAIR /obj/item/knife/ritual/shadow name = "black death" diff --git a/code/game/gamemodes/wizard/servant_items/caretaker.dm b/code/game/gamemodes/wizard/servant_items/caretaker.dm index 45f0d2e6189..fca36218387 100644 --- a/code/game/gamemodes/wizard/servant_items/caretaker.dm +++ b/code/game/gamemodes/wizard/servant_items/caretaker.dm @@ -10,7 +10,7 @@ rad = ARMOR_RAD_SHIELDED ) bodytype_equip_flags = BODY_FLAG_HUMANOID - flags_inv = HIDEEARS | BLOCKHEADHAIR + flags_inv = HIDEEARS | BLOCK_HEAD_HAIR /obj/item/clothing/suit/caretakercloak name = "holy cloak" diff --git a/code/game/gamemodes/wizard/servant_items/fiend.dm b/code/game/gamemodes/wizard/servant_items/fiend.dm index 6a163d3aaa6..ccfd4e8119f 100644 --- a/code/game/gamemodes/wizard/servant_items/fiend.dm +++ b/code/game/gamemodes/wizard/servant_items/fiend.dm @@ -10,7 +10,7 @@ rad = ARMOR_RAD_SHIELDED ) bodytype_equip_flags = BODY_FLAG_HUMANOID - flags_inv = HIDEEARS | BLOCKHEADHAIR + flags_inv = HIDEEARS | BLOCK_HEAD_HAIR /obj/item/clothing/suit/fiendcowl name = "fiend's cowl" @@ -41,7 +41,7 @@ name = "fiend's visage" desc = "To gaze upon this is to gaze into an inferno. Look away, before it looks back of its own accord." icon = 'icons/clothing/head/fiend_visage.dmi' - flags_inv = HIDEEARS | BLOCKHAIR + flags_inv = HIDEEARS | BLOCK_ALL_HAIR /obj/item/clothing/suit/fiendcowl/fem name = "fiend's robe" diff --git a/code/game/gamemodes/wizard/servant_items/overseer.dm b/code/game/gamemodes/wizard/servant_items/overseer.dm index 726e1301811..a35d097e549 100644 --- a/code/game/gamemodes/wizard/servant_items/overseer.dm +++ b/code/game/gamemodes/wizard/servant_items/overseer.dm @@ -13,7 +13,7 @@ max_pressure_protection = FIRESUIT_MAX_PRESSURE min_pressure_protection = 0 bodytype_equip_flags = BODY_FLAG_HUMANOID - flags_inv = HIDEEARS | BLOCKHEADHAIR + flags_inv = HIDEEARS | BLOCK_HEAD_HAIR /obj/item/clothing/suit/straight_jacket/overseercloak name = "grim cloak" diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 6decb705c48..bc87bfe780a 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -4,7 +4,7 @@ icon = 'icons/clothing/head/softcap.dmi' blood_overlay_type = "helmetblood" w_class = ITEM_SIZE_SMALL - flags_inv = BLOCKHEADHAIR + flags_inv = BLOCK_HEAD_HAIR slot_flags = SLOT_HEAD body_parts_covered = SLOT_HEAD diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index fad555a3109..85a2eb24045 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -16,7 +16,7 @@ desc = "Hiss hiss hiss!" icon = 'icons/clothing/head/xeno.dmi' body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES|SLOT_EARS - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCK_ALL_HAIR /obj/item/clothing/head/collectable/chef name = "collectable chef's hat" diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 0ddf9253482..3cf29a3977e 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -56,7 +56,7 @@ icon = 'icons/clothing/head/hardhat/firefighter.dmi' item_flags = ITEM_FLAG_THICKMATERIAL | ITEM_FLAG_AIRTIGHT permeability_coefficient = 0 - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCK_ALL_HAIR body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES cold_protection = SLOT_HEAD min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE @@ -69,7 +69,7 @@ name = "damage control helmet" desc = "A helmet commonly used by engineers and first responders throughout the human space. Comes with a built-in flashlight." icon = 'icons/clothing/head/hardhat/damage_control.dmi' - flags_inv = HIDEEARS|BLOCKHEADHAIR + flags_inv = HIDEEARS|BLOCK_HEAD_HAIR /obj/item/clothing/head/hardhat/ems/dc_light name = "light damage control helmet" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 26d58170db1..d265fb3fa58 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -13,7 +13,7 @@ energy = ARMOR_ENERGY_SMALL, bomb = ARMOR_BOMB_PADDED ) - flags_inv = HIDEEARS|BLOCKHEADHAIR + flags_inv = HIDEEARS|BLOCK_HEAD_HAIR cold_protection = SLOT_HEAD min_cold_protection_temperature = HELMET_MIN_COLD_PROTECTION_TEMPERATURE heat_protection = SLOT_HEAD @@ -166,7 +166,7 @@ desc = "Ave, Imperator, morituri te salutant." icon = 'icons/clothing/head/armor/gladiator.dmi' valid_accessory_slots = null - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|BLOCKHEADHAIR + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|BLOCK_HEAD_HAIR body_parts_covered = SLOT_HEAD|SLOT_FACE siemens_coefficient = 1 @@ -182,7 +182,7 @@ energy = ARMOR_ENERGY_RESISTANT, bomb = ARMOR_BOMB_PADDED ) - flags_inv = HIDEEARS|HIDEEYES|BLOCKHEADHAIR + flags_inv = HIDEEARS|HIDEEYES|BLOCK_HEAD_HAIR body_parts_covered = SLOT_HEAD|SLOT_EYES cold_protection = SLOT_HEAD min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 688cb192576..1de0ea49b1f 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -32,7 +32,7 @@ name = "chaplain's hood" desc = "It's hood that covers the head. It keeps you warm during the space winters." icon = 'icons/clothing/head/chaplain.dmi' - flags_inv = HIDEEARS|BLOCKHEADHAIR + flags_inv = HIDEEARS|BLOCK_HEAD_HAIR body_parts_covered = SLOT_HEAD|SLOT_EARS //Chaplain @@ -40,7 +40,7 @@ name = "nun hood" desc = "Maximum piety in this star system." icon = 'icons/clothing/head/nun.dmi' - flags_inv = HIDEEARS|BLOCKHEADHAIR + flags_inv = HIDEEARS|BLOCK_HEAD_HAIR body_parts_covered = SLOT_HEAD|SLOT_EARS //Medical @@ -48,7 +48,7 @@ name = "surgical cap" desc = "A cap surgeons wear during operations. Keeps their hair from tickling your internal organs." icon = 'icons/clothing/head/surgery_cap.dmi' - flags_inv = BLOCKHEADHAIR + flags_inv = BLOCK_HEAD_HAIR /obj/item/clothing/head/surgery/purple name = "purple surgical cap" diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 9512e354339..d5132d0fb12 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -51,7 +51,7 @@ name = "hastur's hood" desc = "It's unspeakably stylish." icon = 'icons/clothing/head/hastur.dmi' - flags_inv = BLOCKHEADHAIR + flags_inv = BLOCK_HEAD_HAIR body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES /obj/item/clothing/head/nursehat @@ -152,7 +152,7 @@ name = "chicken suit head" desc = "Bkaw!" icon = 'icons/clothing/head/chicken.dmi' - flags_inv = BLOCKHAIR + flags_inv = BLOCK_ALL_HAIR siemens_coefficient = 0.7 body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES @@ -167,7 +167,7 @@ desc = "A helmet made out of chitinous alien hide." icon = 'icons/clothing/head/xeno.dmi' w_class = ITEM_SIZE_NORMAL - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCK_ALL_HAIR siemens_coefficient = 2.0 body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES|SLOT_EARS @@ -212,7 +212,7 @@ name = "padded cap" desc = "A padded skullcup for those prone to bumping their heads against hard surfaces." icon = 'icons/clothing/head/tank.dmi' - flags_inv = BLOCKHEADHAIR + flags_inv = BLOCK_HEAD_HAIR color = "#5f5f5f" armor = list( melee = ARMOR_MELEE_KNIVES, @@ -235,6 +235,6 @@ desc = "A helmet made of plastic. It's completely opaque. This will stop the stare." icon = 'icons/clothing/head/facecover.dmi' tint = TINT_BLIND - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCK_ALL_HAIR body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES flash_protection = FLASH_PROTECTION_MAJOR \ No newline at end of file diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 7758fc996d1..38bb1201446 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -108,7 +108,7 @@ desc = "Perfect for winter in Siberia, da?" icon_state = ICON_STATE_WORLD icon = 'icons/clothing/head/ushanka.dmi' - flags_inv = HIDEEARS|BLOCKHEADHAIR + flags_inv = HIDEEARS|BLOCK_HEAD_HAIR cold_protection = SLOT_HEAD | SLOT_EARS min_cold_protection_temperature = HELMET_MIN_COLD_PROTECTION_TEMPERATURE var/up = FALSE @@ -139,7 +139,7 @@ desc = "A jack o' lantern! Believed to ward off evil spirits." icon_state = ICON_STATE_WORLD icon = 'icons/clothing/head/pumpkin.dmi' - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCK_ALL_HAIR body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES brightness_on = 2 light_overlay = "helmet_light" @@ -164,4 +164,4 @@ icon_state = ICON_STATE_WORLD icon = 'icons/clothing/head/richard.dmi' body_parts_covered = SLOT_HEAD|SLOT_FACE - flags_inv = BLOCKHAIR + flags_inv = BLOCK_ALL_HAIR diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 5b0dfc177e0..891e4243ac6 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -3,10 +3,10 @@ desc = "Designed to both hide identities and keep your face comfy and warm." icon = 'icons/clothing/mask/balaclava.dmi' icon_state = ICON_STATE_WORLD - flags_inv = HIDEFACE|BLOCKHAIR|HIDEEARS + flags_inv = HIDEFACE|BLOCK_ALL_HAIR|HIDEEARS body_parts_covered = SLOT_FACE|SLOT_HEAD down_body_parts_covered = SLOT_HEAD - down_flags_inv = BLOCKHEADHAIR + down_flags_inv = BLOCK_HEAD_HAIR pull_mask = 1 w_class = ITEM_SIZE_SMALL material = /decl/material/solid/cloth @@ -20,7 +20,7 @@ desc = "Worn by robust fighters, flying high to defeat their foes!" icon = 'icons/clothing/mask/luchador.dmi' icon_state = ICON_STATE_WORLD - flags_inv = HIDEFACE|BLOCKHAIR|HIDEEARS + flags_inv = HIDEFACE|BLOCK_ALL_HAIR|HIDEEARS body_parts_covered = SLOT_HEAD|SLOT_FACE w_class = ITEM_SIZE_SMALL siemens_coefficient = 3.0 diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 925cfd7be01..27ea870ecd3 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -67,7 +67,7 @@ desc = "A rubber pig mask." icon = 'icons/clothing/mask/pig.dmi' icon_state = ICON_STATE_WORLD - flags_inv = HIDEFACE|BLOCKHAIR + flags_inv = HIDEFACE|BLOCK_ALL_HAIR w_class = ITEM_SIZE_SMALL siemens_coefficient = 0.9 body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES @@ -77,7 +77,7 @@ desc = "A mask made of soft vinyl and latex, representing the head of a horse." icon = 'icons/clothing/mask/horsehead.dmi' icon_state = ICON_STATE_WORLD - flags_inv = HIDEFACE|BLOCKHAIR + flags_inv = HIDEFACE|BLOCK_ALL_HAIR body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES w_class = ITEM_SIZE_SMALL siemens_coefficient = 0.9 @@ -124,7 +124,7 @@ desc = "A rubber mask." icon = 'icons/clothing/mask/balaclava.dmi' icon_state = ICON_STATE_WORLD - flags_inv = HIDEFACE|BLOCKHAIR + flags_inv = HIDEFACE|BLOCK_ALL_HAIR siemens_coefficient = 0.9 body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES material = /decl/material/solid/cloth diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm index f989eb06e24..48a8ec29dbc 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm @@ -15,7 +15,7 @@ /obj/item/clothing/head/helmet/space/rig name = "helmet" item_flags = ITEM_FLAG_THICKMATERIAL - flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR + flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|BLOCK_ALL_HAIR body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES heat_protection = SLOT_HEAD|SLOT_FACE|SLOT_EYES cold_protection = SLOT_HEAD|SLOT_FACE|SLOT_EYES diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index 0f83a8c0047..adc0b848742 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -12,7 +12,7 @@ bio = ARMOR_BIO_SHIELDED, rad = ARMOR_RAD_SMALL ) - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCK_ALL_HAIR body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES cold_protection = SLOT_HEAD min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE @@ -71,10 +71,10 @@ /obj/item/clothing/head/helmet/space/proc/update_tint() if(tinted) flash_protection = FLASH_PROTECTION_MAJOR - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCK_ALL_HAIR else flash_protection = FLASH_PROTECTION_NONE - flags_inv = HIDEEARS|BLOCKHEADHAIR + flags_inv = HIDEEARS|BLOCK_HEAD_HAIR update_icon() update_clothing_icon() diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index e7d37a07a58..b3563fb5a0a 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -8,7 +8,7 @@ bio = ARMOR_BIO_SHIELDED, rad = ARMOR_RAD_MINOR ) - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCK_ALL_HAIR item_flags = ITEM_FLAG_THICKMATERIAL body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES|SLOT_EARS siemens_coefficient = 0.9 diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index d3ad334f4a9..eb04acd3dd2 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -306,7 +306,7 @@ name = "Santa's hat" desc = "Ho ho ho. Merrry X-mas!" icon = 'icons/clothing/head/santa.dmi' - flags_inv = BLOCKHAIR //Has a fake beard + flags_inv = BLOCK_ALL_HAIR //Has a fake beard /obj/item/clothing/suit/santa name = "Santa's suit" diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index f825d8d6eb1..8a42f6f721b 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -91,7 +91,7 @@ icon = 'icons/clothing/head/hood_winter.dmi' body_parts_covered = SLOT_HEAD cold_protection = SLOT_HEAD - flags_inv = HIDEEARS | BLOCKHEADHAIR + flags_inv = HIDEEARS | BLOCK_HEAD_HAIR min_cold_protection_temperature = ARMOR_MIN_COLD_PROTECTION_TEMPERATURE protects_against_weather = TRUE @@ -173,4 +173,4 @@ body_parts_covered = SLOT_HEAD min_cold_protection_temperature = T0C - 20 cold_protection = SLOT_HEAD - flags_inv = HIDEEARS | BLOCKHEADHAIR + flags_inv = HIDEEARS | BLOCK_HEAD_HAIR diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 5665fbec958..6db1d22512a 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -51,7 +51,7 @@ energy = ARMOR_ENERGY_RESISTANT, bomb = ARMOR_BOMB_SHIELDED ) - flags_inv = HIDEMASK|HIDEEARS|BLOCKHEADHAIR + flags_inv = HIDEMASK|HIDEEARS|BLOCK_HEAD_HAIR body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES|SLOT_EARS siemens_coefficient = 0 @@ -94,7 +94,7 @@ name = "radiation hood" desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation." icon = 'icons/clothing/head/radsuit.dmi' - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCK_ALL_HAIR body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES|SLOT_EARS armor = list( bio = ARMOR_BIO_RESISTANT, @@ -144,7 +144,7 @@ bio = ARMOR_BIO_RESISTANT, rad = ARMOR_RAD_MINOR ) - flags_inv = HIDEEARS|BLOCKHEADHAIR + flags_inv = HIDEEARS|BLOCK_HEAD_HAIR item_flags = ITEM_FLAG_THICKMATERIAL body_parts_covered = SLOT_HEAD|SLOT_EARS siemens_coefficient = 0.9 diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 7f33d391bd5..20d3e28b59c 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -107,15 +107,15 @@ energy = ARMOR_ENERGY_MINOR ) siemens_coefficient = 0.9 - flags_inv = BLOCKHEADHAIR + flags_inv = BLOCK_HEAD_HAIR markings_icon = "band" markings_color = "#b2977c" material = /decl/material/solid/leather matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) /obj/item/clothing/head/det/attack_self(mob/user) - flags_inv ^= BLOCKHEADHAIR - to_chat(user, "[src] will now [flags_inv & BLOCKHEADHAIR ? "hide" : "show"] hair.") + flags_inv ^= BLOCK_HEAD_HAIR + to_chat(user, "[src] will now [flags_inv & BLOCK_HEAD_HAIR ? "hide" : "show"] hair.") ..() /obj/item/clothing/head/det/grey diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 90cb7cdf582..1096f2b6eb8 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -106,7 +106,7 @@ This saves us from having to call add_fingerprint() any time something is put in _head = null if(istype(W, /obj/item)) var/obj/item/I = W - if(I.flags_inv & (HIDEMASK|BLOCKHAIR|BLOCKHEADHAIR)) + if(I.flags_inv & (HIDEMASK|BLOCK_ALL_HAIR)) update_inv_wear_mask(0) if(src) var/obj/item/clothing/mask/mask = src.get_equipped_item(slot_wear_mask_str) @@ -200,7 +200,7 @@ This saves us from having to call add_fingerprint() any time something is put in update_inv_back(redraw_mob) if(slot_wear_mask_str) _wear_mask = W - if(_wear_mask.flags_inv & (BLOCKHAIR|BLOCKHEADHAIR)) + if(_wear_mask.flags_inv & BLOCK_ALL_HAIR) update_hair(redraw_mob) //rebuild hair update_inv_ears(0) W.equipped(src, slot) @@ -235,7 +235,7 @@ This saves us from having to call add_fingerprint() any time something is put in update_inv_gloves(redraw_mob) if(slot_head_str) _head = W - if(_head.flags_inv & (BLOCKHAIR|BLOCKHEADHAIR|HIDEMASK)) + if(_head.flags_inv & (BLOCK_ALL_HAIR|HIDEMASK)) update_hair(redraw_mob) //rebuild hair update_inv_ears(0) update_inv_wear_mask(0) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index c3663856597..10e8e941010 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -451,7 +451,7 @@ var/global/list/damage_icon_parts = list() //masks and helmets can obscure our hair. for(var/slot in global.airtight_slots) var/obj/item/gear = get_equipped_item(slot) - if(gear && (gear.flags_inv & BLOCKHAIR)) + if(gear && (gear.flags_inv & BLOCK_ALL_HAIR)) if(update_icons) queue_icon_update() return @@ -552,7 +552,7 @@ var/global/list/damage_icon_parts = list() overlays_standing[HO_EARS_LAYER] = null for(var/slot in global.airtight_slots) var/obj/item/gear = get_equipped_item(slot) - if(gear && (gear.flags_inv & (BLOCKHAIR|BLOCKHEADHAIR))) + if(gear && (gear.flags_inv & (BLOCK_ALL_HAIR))) if(update_icons) queue_icon_update() return diff --git a/code/modules/organs/external/head.dm b/code/modules/organs/external/head.dm index 2e1c10a615c..f6dacc32ade 100644 --- a/code/modules/organs/external/head.dm +++ b/code/modules/organs/external/head.dm @@ -138,7 +138,7 @@ if(owner.h_style) var/decl/sprite_accessory/hair/hair_style = GET_DECL(owner.h_style) var/obj/item/head = owner.get_equipped_item(slot_head_str) - if(head && (head.flags_inv & BLOCKHEADHAIR)) + if(head && (head.flags_inv & BLOCK_HEAD_HAIR)) if(!(hair_style.flags & VERY_SHORT)) hair_style = GET_DECL(/decl/sprite_accessory/hair/short) if(hair_style) diff --git a/mods/content/corporate/clothing/head/captain.dm b/mods/content/corporate/clothing/head/captain.dm index 93d470cc476..89e76a7a67a 100644 --- a/mods/content/corporate/clothing/head/captain.dm +++ b/mods/content/corporate/clothing/head/captain.dm @@ -5,7 +5,7 @@ item_flags = 0 max_pressure_protection = VOIDSUIT_MAX_PRESSURE min_pressure_protection = 0 - flags_inv = HIDEEARS|HIDEEYES|BLOCKHEADHAIR + flags_inv = HIDEEARS|HIDEEYES|BLOCK_HEAD_HAIR permeability_coefficient = 0.01 armor = list( melee = ARMOR_MELEE_MAJOR, From 4b2ef0459cf2e3bc80639f756b77f0951815f471 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Tue, 9 Aug 2022 17:27:11 -0400 Subject: [PATCH 0252/1518] Fixed bug when removing helmet --- code/modules/mob/living/carbon/human/update_icons.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 10e8e941010..644632c8b80 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -651,8 +651,6 @@ var/global/list/damage_icon_parts = list() update_hair(0) //rebuild hair update_inv_ears(0) - if(!(head && (head.item_flags & ITEM_FLAG_AIRTIGHT))) - set_internals(null) if(!(mask && (mask.item_flags & ITEM_FLAG_AIRTIGHT))) set_internals(null) From 1b4bdceb90260bf4a6eba03cd32bdc4bd3db1f65 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Thu, 11 Aug 2022 19:07:56 -0400 Subject: [PATCH 0253/1518] Make item icon update use overlay system --- code/datums/uplink/services.dm | 1 + .../stock_parts/power/battery.dm | 1 + code/game/machinery/doors/braces.dm | 1 + code/game/machinery/kitchen/icecream.dm | 2 +- code/game/machinery/slide_projector.dm | 1 + code/game/objects/alien_props.dm | 1 + code/game/objects/items/devices/aicard.dm | 2 +- code/game/objects/items/devices/boombox.dm | 1 + code/game/objects/items/devices/flash.dm | 1 + code/game/objects/items/devices/flashlight.dm | 32 ++++++++--------- code/game/objects/items/devices/geiger.dm | 1 + code/game/objects/items/devices/gps.dm | 3 +- .../game/objects/items/devices/holowarrant.dm | 1 + code/game/objects/items/devices/inducer.dm | 9 ++--- .../objects/items/devices/lightreplacer.dm | 2 +- code/game/objects/items/devices/oxycandle.dm | 1 + code/game/objects/items/devices/paicard.dm | 2 +- .../objects/items/devices/paint_sprayer.dm | 2 +- .../objects/items/devices/personal_shield.dm | 1 + code/game/objects/items/devices/pinpointer.dm | 2 +- code/game/objects/items/devices/powersink.dm | 2 +- .../objects/items/devices/radio/intercom.dm | 1 + .../devices/scanners/mass_spectrometer.dm | 1 + .../objects/items/devices/suit_cooling.dm | 2 +- .../items/devices/suit_sensor_jammer.dm | 23 ++++++------ code/game/objects/items/devices/t_scanner.dm | 7 ++-- .../objects/items/devices/taperecorder.dm | 14 ++++---- .../objects/items/devices/traitordevices.dm | 2 +- .../objects/items/devices/transfer_valve.dm | 8 +++-- code/game/objects/items/devices/tvcamera.dm | 6 ++-- code/game/objects/items/glassjar.dm | 2 +- code/game/objects/items/robot/robot_frame.dm | 7 ++-- code/game/objects/items/tools/power_tools.dm | 4 +-- code/game/objects/items/toys.dm | 2 ++ code/game/objects/items/umbrella.dm | 1 + code/game/objects/items/weapons/RCD.dm | 4 +-- .../objects/items/weapons/candle/candle.dm | 5 +-- code/game/objects/items/weapons/cane.dm | 1 + code/game/objects/items/weapons/cards_ids.dm | 8 ++--- code/game/objects/items/weapons/cosmetics.dm | 12 +++---- code/game/objects/items/weapons/defib.dm | 4 +-- code/game/objects/items/weapons/ecigs.dm | 2 +- .../objects/items/weapons/electric_welder.dm | 2 +- code/game/objects/items/weapons/flame.dm | 2 +- .../objects/items/weapons/flamethrower.dm | 9 ++--- .../items/weapons/grenades/chem_grenade.dm | 2 +- .../objects/items/weapons/grenades/grenade.dm | 6 ++-- .../items/weapons/grenades/supermatter.dm | 4 +-- .../items/weapons/implants/implantcase.dm | 2 +- .../items/weapons/implants/implanter.dm | 6 ++-- .../items/weapons/implants/implantpad.dm | 2 +- .../weapons/implants/implants/compressed.dm | 2 +- code/game/objects/items/weapons/lighter.dm | 13 ++++--- .../objects/items/weapons/material/ashtray.dm | 7 ++-- .../objects/items/weapons/material/folding.dm | 6 ++-- .../objects/items/weapons/material/knives.dm | 5 +-- .../objects/items/weapons/material/shards.dm | 7 ++-- .../objects/items/weapons/material/swiss.dm | 2 +- .../items/weapons/material/twohanded.dm | 12 +++---- .../objects/items/weapons/melee/energy.dm | 2 +- code/game/objects/items/weapons/paint.dm | 6 ++-- code/game/objects/items/weapons/shields.dm | 1 + code/game/objects/items/weapons/soap.dm | 6 ++-- .../objects/items/weapons/storage/backpack.dm | 2 +- .../objects/items/weapons/storage/bags.dm | 1 + .../objects/items/weapons/storage/belt.dm | 36 +++++++++++-------- .../objects/items/weapons/storage/fancy.dm | 28 ++++++++------- .../items/weapons/storage/laundry_basket.dm | 3 +- .../items/weapons/storage/med_pouch.dm | 7 ++-- .../objects/items/weapons/storage/misc.dm | 8 +++-- .../game/objects/items/weapons/storage/mre.dm | 7 ++-- .../objects/items/weapons/storage/secure.dm | 7 ++-- .../objects/items/weapons/storage/trays.dm | 2 +- .../objects/items/weapons/storage/wallets.dm | 6 ++-- code/game/objects/items/weapons/stunbaton.dm | 3 +- .../objects/items/weapons/swords_axes_etc.dm | 7 ++-- .../objects/items/weapons/tanks/jetpack.dm | 2 +- .../game/objects/items/weapons/tanks/tanks.dm | 12 +++---- code/game/objects/items/weapons/tech_disks.dm | 4 +-- .../objects/items/weapons/tools/crowbar.dm | 4 +-- .../items/weapons/tools/screwdriver.dm | 4 +-- .../items/weapons/tools/weldingtool.dm | 6 ++-- .../objects/items/weapons/tools/wirecutter.dm | 2 +- .../objects/items/weapons/tools/wrench.dm | 2 +- code/game/objects/items/weapons/traps.dm | 8 ++--- .../objects/items/weapons/weldbackpack.dm | 4 +-- .../stool_bed_chair_nest_sofa/stools.dm | 11 +++--- code/modules/assembly/holder.dm | 12 ++++--- code/modules/assembly/infrared.dm | 4 +-- code/modules/assembly/mousetrap.dm | 1 + code/modules/assembly/proximity.dm | 14 ++++---- code/modules/assembly/signaler.dm | 2 +- code/modules/assembly/timer.dm | 11 +++--- code/modules/clothing/_clothing.dm | 8 +++-- code/modules/clothing/glasses/_glasses.dm | 1 + code/modules/clothing/glasses/eyepatch.dm | 2 +- code/modules/clothing/gloves/thick.dm | 4 +-- code/modules/clothing/head/_head.dm | 6 ++-- code/modules/clothing/head/headphones.dm | 1 + code/modules/clothing/head/misc_special.dm | 4 +-- code/modules/clothing/head/soft_caps.dm | 2 +- code/modules/clothing/masks/chewable.dm | 7 ++-- code/modules/clothing/masks/monitor.dm | 5 ++- code/modules/clothing/masks/smokable.dm | 4 +-- code/modules/clothing/shoes/_shoes.dm | 2 +- code/modules/clothing/shoes/miscellaneous.dm | 2 +- code/modules/clothing/spacesuits/rig/rig.dm | 9 +++-- .../clothing/spacesuits/rig/rig_pieces.dm | 8 ++--- code/modules/clothing/suits/toggles.dm | 1 + .../under/accessories/accessory_toggleable.dm | 3 +- .../clothing/under/accessories/buddytag.dm | 1 + .../clothing/under/accessories/clothing.dm | 1 + 112 files changed, 287 insertions(+), 293 deletions(-) diff --git a/code/datums/uplink/services.dm b/code/datums/uplink/services.dm index f3ff5f0d933..1f154eb4408 100644 --- a/code/datums/uplink/services.dm +++ b/code/datums/uplink/services.dm @@ -111,6 +111,7 @@ visible_message("\The [src] shuts down with a spark.") /obj/item/uplink_service/on_update_icon() + . = ..() icon_state = get_world_inventory_state() switch(state) if(CURRENTLY_ACTIVE) diff --git a/code/game/machinery/_machines_base/stock_parts/power/battery.dm b/code/game/machinery/_machines_base/stock_parts/power/battery.dm index e873518f8c4..06b69176afa 100644 --- a/code/game/machinery/_machines_base/stock_parts/power/battery.dm +++ b/code/game/machinery/_machines_base/stock_parts/power/battery.dm @@ -143,6 +143,7 @@ charge_rate *= 1 + 0.5 * machine.total_component_rating_of_type(/obj/item/stock_parts/capacitor) /obj/item/stock_parts/power/battery/on_update_icon() + . = ..() icon_state = "battery[!!cell]" // Cell interaction diff --git a/code/game/machinery/doors/braces.dm b/code/game/machinery/doors/braces.dm index b20edcd991c..5bf8328940f 100644 --- a/code/game/machinery/doors/braces.dm +++ b/code/game/machinery/doors/braces.dm @@ -48,6 +48,7 @@ /obj/item/airlock_brace/on_update_icon() + . = ..() if(airlock) icon_state = "brace_closed" else diff --git a/code/game/machinery/kitchen/icecream.dm b/code/game/machinery/kitchen/icecream.dm index 6df0dcbc26f..46b3716fbda 100644 --- a/code/game/machinery/kitchen/icecream.dm +++ b/code/game/machinery/kitchen/icecream.dm @@ -202,7 +202,7 @@ update_icon() /obj/item/chems/food/icecream/on_update_icon() - cut_overlays() + . = ..() if(ice_creamed) add_overlay("icecream_[ice_creamed]") diff --git a/code/game/machinery/slide_projector.dm b/code/game/machinery/slide_projector.dm index 72f17d83697..22118a4ae0d 100644 --- a/code/game/machinery/slide_projector.dm +++ b/code/game/machinery/slide_projector.dm @@ -20,6 +20,7 @@ . = ..() /obj/item/storage/slide_projector/on_update_icon() + . = ..() icon_state = "projector[!!projection]" /obj/item/storage/slide_projector/get_mechanics_info() diff --git a/code/game/objects/alien_props.dm b/code/game/objects/alien_props.dm index 69be145f376..0c78194ae61 100644 --- a/code/game/objects/alien_props.dm +++ b/code/game/objects/alien_props.dm @@ -11,6 +11,7 @@ var/static/base_icon /obj/item/cell/alien/on_update_icon() + . = ..() if(!base_icon) base_icon = pick("instrument", "unknown1", "unknown3", "unknown4") icon_state = base_icon diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index e5365a95993..1c45380f002 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -71,7 +71,7 @@ return 1 /obj/item/aicard/on_update_icon() - cut_overlays() + . = ..() if(carded_ai) if (!carded_ai.control_disabled) add_overlay("[icon_state]-on") diff --git a/code/game/objects/items/devices/boombox.dm b/code/game/objects/items/devices/boombox.dm index a8b52624e15..8c89a1c4268 100644 --- a/code/game/objects/items/devices/boombox.dm +++ b/code/game/objects/items/devices/boombox.dm @@ -162,6 +162,7 @@ return TRUE /obj/item/boombox/on_update_icon() + . = ..() icon_state = playing ? "on" : "off" /obj/item/boombox/proc/stop() diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index ca107bb3001..fb46ce08e38 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -19,6 +19,7 @@ var/str_max = 7 //how powerful the effect COULD be /obj/item/flash/on_update_icon() + . = ..() icon_state = get_world_inventory_state() if(broken) icon_state = "[icon_state]-burnt" diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 689ebef69e8..ea79e16e032 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -33,6 +33,7 @@ update_icon() /obj/item/flashlight/on_update_icon() + . = ..() if (flashlight_flags & FLASHLIGHT_ALWAYS_ON) return // Prevent update_icon shennanigans with objects that won't have on/off variant sprites @@ -221,7 +222,7 @@ light_color = LIGHT_COLOR_FIRE /obj/item/flashlight/lantern/on_update_icon() - ..() + . = ..() if(on) item_state = "lantern-on" else @@ -343,7 +344,7 @@ damtype = initial(damtype) /obj/item/flashlight/flare/on_update_icon() - ..() + . = ..() if(!on && fuel <= 0) icon_state = "[initial(icon_state)]-empty" @@ -368,21 +369,18 @@ light_color = color /obj/item/flashlight/flare/glowstick/on_update_icon() - item_state = "glowstick" - overlays.Cut() - if(fuel <= 0) - icon_state = "glowstick-empty" + var/nofuel = fuel <= 0 + if(nofuel) on = FALSE - else if (on) - var/image/I = overlay_image(icon,"glowstick-on",color) + . = ..() + icon_state = nofuel? "glowstick-empty" : icon_state + item_state = initial(item_state) + if(on) + var/image/I = overlay_image(icon, "glowstick-on", color) I.blend_mode = BLEND_ADD - overlays += I + add_overlay(I) item_state = "glowstick-on" - else - icon_state = "glowstick" - var/mob/M = loc - if(istype(M)) - M.update_inv_hands() + update_held_icon() /obj/item/flashlight/flare/glowstick/activate(var/mob/user) if(istype(user)) @@ -459,10 +457,8 @@ matter = list(/decl/material/solid/glass = MATTER_AMOUNT_REINFORCEMENT) /obj/item/flashlight/lamp/lava/on_update_icon() - overlays.Cut() - var/image/I = image(icon = icon, icon_state = "lavalamp-[on ? "on" : "off"]") - I.color = light_color - overlays += I + . = ..() + add_overlay(overlay_image(icon, "lavalamp-[on ? "on" : "off"]", light_color)) /obj/item/flashlight/lamp/lava/red desc = "A kitchy red decorative light." diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm index ff86f593f30..e34fc692f00 100644 --- a/code/game/objects/items/devices/geiger.dm +++ b/code/game/objects/items/devices/geiger.dm @@ -57,6 +57,7 @@ to_chat(user, "[html_icon(src)] You switch [scanning ? "on" : "off"] [src].") /obj/item/geiger/on_update_icon() + . = ..() if(!scanning) icon_state = "geiger_off" update_sound(0) diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 6a6e827088e..98345362ce1 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -200,8 +200,7 @@ var/global/list/all_gps_units = list() to_chat(loc, SPAN_NOTICE("\The [src] appears to be functional again.")) /obj/item/gps/on_update_icon() - - cut_overlays() + . = ..() var/image/I for(var/decal in decals) diff --git a/code/game/objects/items/devices/holowarrant.dm b/code/game/objects/items/devices/holowarrant.dm index 435e839ce69..c714c501f05 100644 --- a/code/game/objects/items/devices/holowarrant.dm +++ b/code/game/objects/items/devices/holowarrant.dm @@ -98,6 +98,7 @@ M.examinate(src) /obj/item/holowarrant/on_update_icon() + . = ..() if(active) icon_state = "holowarrant_filled" else diff --git a/code/game/objects/items/devices/inducer.dm b/code/game/objects/items/devices/inducer.dm index 283e935b027..efbd8173d57 100644 --- a/code/game/objects/items/devices/inducer.dm +++ b/code/game/objects/items/devices/inducer.dm @@ -158,12 +158,9 @@ to_chat(M,"Its battery compartment is open.") /obj/item/inducer/on_update_icon() - overlays.Cut() + . = ..() if(opened) - if(!get_cell()) - overlays += image(icon, "inducer-nobat") - else - overlays += image(icon,"inducer-bat") + add_overlay(overlay_image(icon, "inducer-[get_cell()? "bat" : "nobat"]")) /obj/item/inducer/Destroy() . = ..() @@ -185,7 +182,7 @@ /obj/item/inducer/borg/on_update_icon() . = ..() - overlays += image("icons/obj/guns/gui.dmi","safety[safety()]") + add_overlay(overlay_image("icons/obj/guns/gui.dmi", "safety[safety()]")) /obj/item/inducer/borg/verb/toggle_safety(var/mob/user) set src in usr diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 8aaf1ad26e4..c5f6b852501 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -130,7 +130,7 @@ to_chat(usr, "It has [uses] lights remaining.") /obj/item/lightreplacer/on_update_icon() - cut_overlays() + . = ..() if(emagged) add_overlay("[icon_state]-emagged") diff --git a/code/game/objects/items/devices/oxycandle.dm b/code/game/objects/items/devices/oxycandle.dm index bf59af0d921..7c0c3fee18a 100644 --- a/code/game/objects/items/devices/oxycandle.dm +++ b/code/game/objects/items/devices/oxycandle.dm @@ -69,6 +69,7 @@ air_contents.adjust_multi(/decl/material/gas/oxygen, air_mix[/decl/material/gas/oxygen]) /obj/item/oxycandle/on_update_icon() + . = ..() if(on == 1) icon_state = "oxycandle_on" item_state = icon_state diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index f93188ee18d..8211de3d428 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -298,7 +298,7 @@ var/global/list/pai_cards = list() current_emotion = emotion /obj/item/paicard/on_update_icon() - cut_overlays() + . = ..() if(pai) switch(current_emotion) if(1) add_overlay("pai-happy") diff --git a/code/game/objects/items/devices/paint_sprayer.dm b/code/game/objects/items/devices/paint_sprayer.dm index 0d8ca120a3b..5e860b28aca 100644 --- a/code/game/objects/items/devices/paint_sprayer.dm +++ b/code/game/objects/items/devices/paint_sprayer.dm @@ -79,7 +79,7 @@ change_color(preset_colors[random_preset]) /obj/item/paint_sprayer/on_update_icon() - cut_overlays() + . = ..() add_overlay(overlay_image(icon, "[icon_state]_color", paint_color)) add_overlay(color_picker ? "[icon_state]_red" : "[icon_state]_blue") if(ismob(loc)) diff --git a/code/game/objects/items/devices/personal_shield.dm b/code/game/objects/items/devices/personal_shield.dm index ad841f106eb..1ac2353ec0c 100644 --- a/code/game/objects/items/devices/personal_shield.dm +++ b/code/game/objects/items/devices/personal_shield.dm @@ -28,6 +28,7 @@ return /obj/item/personal_shield/on_update_icon() + . = ..() if(uses) icon_state = "batterer" else diff --git a/code/game/objects/items/devices/pinpointer.dm b/code/game/objects/items/devices/pinpointer.dm index 6f9254bac3c..a403b1e4420 100644 --- a/code/game/objects/items/devices/pinpointer.dm +++ b/code/game/objects/items/devices/pinpointer.dm @@ -73,7 +73,7 @@ beeping-- /obj/item/pinpointer/on_update_icon() - cut_overlays() + . = ..() if(!active) return if(!target || !target.resolve()) diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 425eb03fe5c..c003da9db83 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -30,8 +30,8 @@ var/obj/structure/cable/attached // the attached cable /obj/item/powersink/on_update_icon() + . = ..() z_flags &= ~ZMM_MANGLE_PLANES - cut_overlays() if(mode == OPERATING) if(plane == HUD_PLANE) add_overlay("[icon_state]-on") diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index f1c292d6884..8e005a6f375 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -144,6 +144,7 @@ update_icon() /obj/item/radio/intercom/on_update_icon() + . = ..() if(!on) icon_state = "intercom-p" else diff --git a/code/game/objects/items/devices/scanners/mass_spectrometer.dm b/code/game/objects/items/devices/scanners/mass_spectrometer.dm index 422792dac05..33b77482166 100644 --- a/code/game/objects/items/devices/scanners/mass_spectrometer.dm +++ b/code/game/objects/items/devices/scanners/mass_spectrometer.dm @@ -20,6 +20,7 @@ update_icon() /obj/item/scanner/spectrometer/on_update_icon() + . = ..() icon_state = initial(icon_state) if(reagents.total_volume) icon_state += "_s" diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index 1086ad9ed33..a34abb69689 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -134,7 +134,7 @@ return ..() /obj/item/suit_cooling_unit/on_update_icon() - cut_overlays() + . = ..() if(cover_open) add_overlay("[icon_state]-open") if(cell) diff --git a/code/game/objects/items/devices/suit_sensor_jammer.dm b/code/game/objects/items/devices/suit_sensor_jammer.dm index 7225e5211f2..496f128d9fc 100644 --- a/code/game/objects/items/devices/suit_sensor_jammer.dm +++ b/code/game/objects/items/devices/suit_sensor_jammer.dm @@ -64,26 +64,29 @@ to_chat(user, "You're unable to insert the battery.") /obj/item/suit_sensor_jammer/on_update_icon() - overlays.Cut() + . = ..() if(bcell) + var/list/cur_overlays var/percent = bcell.percent() switch(percent) if(0 to 25) - overlays += "forth_quarter" + LAZYADD(cur_overlays, overlay_image(icon, "forth_quarter")) if(25 to 50) - overlays += "one_quarter" - overlays += "third_quarter" + LAZYADD(cur_overlays, overlay_image(icon, "one_quarter")) + LAZYADD(cur_overlays, overlay_image(icon, "third_quarter")) if(50 to 75) - overlays += "two_quarters" - overlays += "second_quarter" + LAZYADD(cur_overlays, overlay_image(icon, "two_quarters")) + LAZYADD(cur_overlays, overlay_image(icon, "second_quarter")) if(75 to 99) - overlays += "three_quarters" - overlays += "first_quarter" + LAZYADD(cur_overlays, overlay_image(icon, "three_quarters")) + LAZYADD(cur_overlays, overlay_image(icon, "first_quarter")) else - overlays += "four_quarters" + LAZYADD(cur_overlays, overlay_image(icon, "four_quarters")) if(active) - overlays += "active" + LAZYADD(cur_overlays, overlay_image(icon, "active")) + if(LAZYLEN(cur_overlays)) + add_overlay(cur_overlays) /obj/item/suit_sensor_jammer/emp_act(var/severity) ..() diff --git a/code/game/objects/items/devices/t_scanner.dm b/code/game/objects/items/devices/t_scanner.dm index b02d386f8a4..13ef8f616e3 100644 --- a/code/game/objects/items/devices/t_scanner.dm +++ b/code/game/objects/items/devices/t_scanner.dm @@ -25,11 +25,8 @@ set_active(FALSE) /obj/item/t_scanner/on_update_icon() - cut_overlays() - if(on) - add_overlay("[icon_state]-on") - else - add_overlay("[icon_state]-off") + . = ..() + add_overlay("[icon_state]-[on? "on" : "off"]") /obj/item/t_scanner/emp_act() audible_message(src, " \The [src] buzzes oddly.") diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 34d783a481f..501c5d3b633 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -368,6 +368,7 @@ /obj/item/taperecorder/on_update_icon() + . = ..() var/datum/extension/base_icon_state/bis = get_extension(src, /datum/extension/base_icon_state) if(!mytape) @@ -400,11 +401,12 @@ var/ruined = 0 var/doctored = 0 - -/obj/item/magnetic_tape/on_update_icon() - overlays.Cut() - if(ruined && max_capacity) - overlays += "ribbonoverlay" +//draw_ribbon: Whether we draw the ruined ribbon overlay. Only used by quantum tape. +//#FIXME: Probably should be handled better. +/obj/item/magnetic_tape/on_update_icon(var/draw_ribbon = TRUE) + . = ..() + if(draw_ribbon && ruined && max_capacity) + add_overlay(overlay_image(icon, "ribbonoverlay", flags = RESET_COLOR)) /obj/item/magnetic_tape/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) @@ -539,7 +541,7 @@ return /obj/item/magnetic_tape/loose/on_update_icon() - return + . = ..(FALSE) /obj/item/magnetic_tape/loose/get_loose_tape() return diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 3f9f3a31504..3e1aa1f5479 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -55,6 +55,6 @@ effective or pretty fucking useless. update_icon() /obj/item/batterer/on_update_icon() - cut_overlays() + . = ..() if(times_used < max_uses) add_overlay("[icon_state]-on") diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index e7eb1bc08e1..05118fa63e3 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -128,7 +128,7 @@ toggle = 1 /obj/item/transfer_valve/on_update_icon() - overlays.Cut() + . = ..() underlays.Cut() if(!tank_one && !tank_two && !attached_device) @@ -136,14 +136,16 @@ return icon_state = "valve" + var/list/cur_overlays if(tank_one) - overlays += "[tank_one.icon_state]" + LAZYADD(cur_overlays, new /mutable_appearance(tank_one)) if(tank_two) var/icon/J = new(icon, icon_state = "[tank_two.icon_state]") J.Shift(WEST, 13) underlays += J if(attached_device) - overlays += "device" + LAZYADD(cur_overlays, overlay_image(icon, "device")) + add_overlay(cur_overlays) /obj/item/transfer_valve/proc/remove_tank(obj/item/tank/T) if(tank_one == T) diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm index b9bc906431f..c44adcd3bed 100644 --- a/code/game/objects/items/devices/tvcamera.dm +++ b/code/game/objects/items/devices/tvcamera.dm @@ -84,12 +84,10 @@ . = ..() /obj/item/camera/tvcamera/on_update_icon() - cut_overlays() + . = ..() if(video_enabled) add_overlay("[icon_state]-on") - var/mob/living/carbon/human/H = loc - if(istype(H)) - H.update_inv_hands() + update_held_icon() /* Assembly by a roboticist */ /obj/item/robot_parts/head/attackby(var/obj/item/assembly/S, mob/user) diff --git a/code/game/objects/items/glassjar.dm b/code/game/objects/items/glassjar.dm index dfb2ffa0bfc..d7d3ec1f9b0 100644 --- a/code/game/objects/items/glassjar.dm +++ b/code/game/objects/items/glassjar.dm @@ -83,8 +83,8 @@ update_icon() /obj/item/glass_jar/on_update_icon() // Also updates name and desc + . = ..() underlays.Cut() - overlays.Cut() switch(contains) if(0) SetName(initial(name)) diff --git a/code/game/objects/items/robot/robot_frame.dm b/code/game/objects/items/robot/robot_frame.dm index d20bfece890..5218114348e 100644 --- a/code/game/objects/items/robot/robot_frame.dm +++ b/code/game/objects/items/robot/robot_frame.dm @@ -20,10 +20,13 @@ update_icon() /obj/item/robot_parts/robot_suit/on_update_icon() - overlays.Cut() + . = ..() + var/list/cur_overlays for(var/part in required_parts) if(parts[part]) - overlays += "[part]+o" + LAZYADD(overlay_image(icon, "[part]+o")) + if(LAZYLEN(cur_overlays)) + add_overlay(cur_overlays) /obj/item/robot_parts/robot_suit/proc/check_completion() for(var/part in required_parts) diff --git a/code/game/objects/items/tools/power_tools.dm b/code/game/objects/items/tools/power_tools.dm index 1298e8bf71e..02bd831732c 100644 --- a/code/game/objects/items/tools/power_tools.dm +++ b/code/game/objects/items/tools/power_tools.dm @@ -13,8 +13,8 @@ drop_sound = 'sound/foley/bardrop1.ogg' /obj/item/hydraulic_cutter/on_update_icon() + . = ..() icon_state = get_world_inventory_state() - cut_overlays() if(IS_CROWBAR(src)) add_overlay("[icon_state]-pry") else if(IS_WIRECUTTER(src)) @@ -51,8 +51,8 @@ tool.set_sound_overrides('sound/items/airwrench.ogg', 'sound/items/change_drill.ogg') /obj/item/power_drill/on_update_icon() + . = ..() icon_state = get_world_inventory_state() - cut_overlays() if(IS_SCREWDRIVER(src)) add_overlay("[icon_state]-screw") else if(IS_WRENCH(src)) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 5ea332483de..f5f9cd2d934 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -81,6 +81,7 @@ qdel(src) /obj/item/toy/water_balloon/on_update_icon() + . = ..() if(src.reagents.total_volume >= 1) icon_state = "waterballoon" item_state = "balloon" @@ -694,6 +695,7 @@ var/activation_sound = 'sound/effects/flashlight.ogg' /obj/item/toy/desk/on_update_icon() + . = ..() if(on) icon_state = "[initial(icon_state)]-on" else diff --git a/code/game/objects/items/umbrella.dm b/code/game/objects/items/umbrella.dm index 34346e8f7b1..eb0e14dec05 100644 --- a/code/game/objects/items/umbrella.dm +++ b/code/game/objects/items/umbrella.dm @@ -27,6 +27,7 @@ return TRUE /obj/item/umbrella/on_update_icon() + . = ..() icon_state = get_world_inventory_state() if(is_open) icon_state = "[icon_state]-open" diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index c9fc2493c3d..51fc7b45087 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -111,11 +111,11 @@ return 1 /obj/item/rcd/on_update_icon() //For the fancy "ammo" counter - overlays.Cut() + . = ..() var/ratio = 0 ratio = stored_matter / max_stored_matter ratio = max(round(ratio, 0.10) * 100, 10) - overlays += "rcd-[ratio]" + add_overlay(overlay_image(icon, "rcd-[ratio]")) /obj/item/rcd/proc/lowAmmo(var/mob/user) //Kludge to make it animate when out of ammo, but I guess you can make it blow up when it's out of ammo or something to_chat(user, "The \'Low Ammo\' light on the device blinks yellow.") diff --git a/code/game/objects/items/weapons/candle/candle.dm b/code/game/objects/items/weapons/candle/candle.dm index 7ebad5df9ff..5858bbddcaa 100644 --- a/code/game/objects/items/weapons/candle/candle.dm +++ b/code/game/objects/items/weapons/candle/candle.dm @@ -22,6 +22,7 @@ . = ..() /obj/item/flame/candle/on_update_icon() + //#FIXME: Candles handle their lit overlays weirdly switch(wax) if(1500 to INFINITY) icon_state = "[icon_set]1" @@ -32,9 +33,9 @@ if(lit != last_lit) last_lit = lit - overlays.Cut() + cut_overlays() if(lit) - overlays += overlay_image(icon, "[icon_state]_lit", flags = RESET_COLOR) + add_overlay(overlay_image(icon, "[icon_state]_lit", flags = RESET_COLOR)) /obj/item/flame/candle/attackby(obj/item/W, mob/user) ..() diff --git a/code/game/objects/items/weapons/cane.dm b/code/game/objects/items/weapons/cane.dm index 381fddd6796..bcc91699212 100644 --- a/code/game/objects/items/weapons/cane.dm +++ b/code/game/objects/items/weapons/cane.dm @@ -48,6 +48,7 @@ ..() /obj/item/cane/concealed/on_update_icon() + . = ..() if(concealed_blade) SetName(initial(name)) icon_state = initial(icon_state) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 799e184ac30..eda3986820c 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -62,10 +62,8 @@ update_icon() /obj/item/card/data/on_update_icon() - overlays.Cut() - var/image/detail_overlay = image('icons/obj/card.dmi', src,"[icon_state]-color") - detail_overlay.color = detail_color - overlays += detail_overlay + . = ..() + add_overlay(overlay_image(icon, "[icon_state]-color", detail_color)) /obj/item/card/data/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/integrated_electronics/detailer)) @@ -194,7 +192,7 @@ var/global/const/NO_EMAG_ACT = -50 . = ..() /obj/item/card/id/on_update_icon() - cut_overlays() + . = ..() if(detail_color) add_overlay(overlay_image(icon, "[icon_state]-colors", detail_color, RESET_COLOR)) for(var/detail in extra_details) diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 3c8fbf6fa3c..f547bc5c036 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -18,16 +18,16 @@ //'lipstick' and 'key' are both coloured by var color /obj/item/lipstick/on_update_icon() + . = ..() if(open) icon_state = "the_stick" else icon_state = "" - var/new_overlays - LAZYADD(new_overlays, overlay_image(icon, "lipstick_[open]", flags=RESET_COLOR)) - LAZYADD(new_overlays, overlay_image(icon, "key")) - if(blood_overlay) - LAZYADD(new_overlays, blood_overlay) - overlays = new_overlays + + add_overlay(list( + overlay_image(icon, "lipstick_[open]", flags=RESET_COLOR), + overlay_image(icon, "key") + )) /obj/item/lipstick/attack_self(mob/user) open = !open diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 369bc75164f..d682cb9e144 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -36,7 +36,7 @@ bcell = /obj/item/cell/apc /obj/item/defibrillator/on_update_icon() - cut_overlays() + . = ..() if(paddles) //in case paddles got destroyed somehow. if(paddles.loc == src) add_overlay("[icon_state]-paddles") @@ -231,7 +231,7 @@ ..() /obj/item/shockpaddles/on_update_icon() - cut_overlay() + . = ..() if(cooldown) add_overlay("[icon_state]-cooldown") diff --git a/code/game/objects/items/weapons/ecigs.dm b/code/game/objects/items/weapons/ecigs.dm index 50df823a981..c641fac3414 100644 --- a/code/game/objects/items/weapons/ecigs.dm +++ b/code/game/objects/items/weapons/ecigs.dm @@ -118,7 +118,7 @@ ec_cartridge.reagents.trans_to_mob(C, REM, CHEM_INGEST, 0.4) // Most of it is not inhaled... balance reasons. /obj/item/clothing/mask/smokable/ecig/on_update_icon() - ..() + . = ..() if(lit) set_light(brightness_on) else diff --git a/code/game/objects/items/weapons/electric_welder.dm b/code/game/objects/items/weapons/electric_welder.dm index eca2d81a29a..135fdadb22a 100644 --- a/code/game/objects/items/weapons/electric_welder.dm +++ b/code/game/objects/items/weapons/electric_welder.dm @@ -78,7 +78,7 @@ T.hotspot_expose(700, 5) /obj/item/weldingtool/electric/on_update_icon() - ..() + . = ..() if(cell) add_overlay("[icon_state]-cell") diff --git a/code/game/objects/items/weapons/flame.dm b/code/game/objects/items/weapons/flame.dm index f1d9272b651..ca1cd2a6a81 100644 --- a/code/game/objects/items/weapons/flame.dm +++ b/code/game/objects/items/weapons/flame.dm @@ -71,7 +71,7 @@ update_icon() /obj/item/flame/match/on_update_icon() - ..() + . = ..() if(burnt) icon_state = "[get_world_inventory_state()]_burnt" else if(lit) diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 482e5eb9e2c..de2da8c7905 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -70,19 +70,14 @@ location.hotspot_expose(700, 2) /obj/item/flamethrower/on_update_icon() - cut_overlays() + . = ..() add_overlay("_[initial(welding_tool.icon_state)]") if(igniter) add_overlay("igniter_[secured]") if(tank) - if(istype(tank, /obj/item/tank/hydrogen)) - add_overlay("tank_hydrogen") - else - var/mutable_appearance/M = mutable_appearance(icon, "tank") - M.color = tank.color - add_overlay(M) + add_overlay(mutable_appearance(icon, istype(tank, /obj/item/tank/hydrogen)? "tank_hydrogen" : "tank", tank.color)) if(lit) add_overlay("lit") diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 7f37d9cf51b..c1a2179a745 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -47,7 +47,7 @@ C.throw_mode_on() /obj/item/grenade/chem_grenade/on_update_icon() - ..() + . = ..() if(detonator) add_overlay("[icon_state]-assembled") if(path == 1) diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index e22d4aa5ae9..59d4a1082ea 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -25,15 +25,15 @@ update_icon() /obj/item/grenade/on_update_icon() - cut_overlays() + . = ..() if(active) if(check_state_in_icon("[icon_state]-active", icon)) if(plane == HUD_PLANE) - add_overlay(image(icon, "[icon_state]-active")) + add_overlay(overlay_image(icon, "[icon_state]-active")) else add_overlay(emissive_overlay(icon, "[icon_state]-active")) else if(check_state_in_icon("[icon_state]-pin", icon)) - add_overlay("[icon_state]-pin") + add_overlay(overlay_image(icon, "[icon_state]-pin")) /obj/item/grenade/proc/clown_check(var/mob/living/user) if((MUTATION_CLUMSY in user.mutations) && prob(50)) diff --git a/code/game/objects/items/weapons/grenades/supermatter.dm b/code/game/objects/items/weapons/grenades/supermatter.dm index 99c838b5b5b..eef3e2ef669 100644 --- a/code/game/objects/items/weapons/grenades/supermatter.dm +++ b/code/game/objects/items/weapons/grenades/supermatter.dm @@ -18,9 +18,9 @@ playsound(src, 'sound/weapons/wave.ogg', 100) /obj/item/grenade/supermatter/on_update_icon() - ..() + . = ..() if(implode_at) - add_overlay(image(icon = 'icons/obj/machines/power/fusion.dmi', icon_state = "emfield_s1")) + add_overlay(overlay_image('icons/obj/machines/power/fusion.dmi', "emfield_s1")) /obj/item/grenade/supermatter/Process() if(!isturf(loc)) diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index 8a73009016d..02edf341099 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -33,11 +33,11 @@ origin_tech = null /obj/item/implantcase/on_update_icon() + . = ..() if (imp) icon_state = "implantcase-[imp.implant_color]" else icon_state = "implantcase-0" - return /obj/item/implantcase/attackby(obj/item/I, mob/user) if (IS_PEN(I)) diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 5d4961da2c6..f7d4fbfda37 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -21,10 +21,8 @@ . = ..() /obj/item/implanter/on_update_icon() - if (imp) - icon_state = "implanter1" - else - icon_state = "implanter0" + . = ..() + icon_state = "implanter[imp == TRUE]" /obj/item/implanter/verb/remove_implant() set category = "Object" diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm index e1afdfa9d0e..ead0284759c 100644 --- a/code/game/objects/items/weapons/implants/implantpad.dm +++ b/code/game/objects/items/weapons/implants/implantpad.dm @@ -7,7 +7,7 @@ var/obj/item/implant/imp /obj/item/implantpad/on_update_icon() - cut_overlays() + . = ..() if(imp) add_overlay("[icon_state]-imp") diff --git a/code/game/objects/items/weapons/implants/implants/compressed.dm b/code/game/objects/items/weapons/implants/implants/compressed.dm index 16e5669bae8..9eb3000fcf5 100644 --- a/code/game/objects/items/weapons/implants/implants/compressed.dm +++ b/code/game/objects/items/weapons/implants/implants/compressed.dm @@ -40,6 +40,7 @@ imp = /obj/item/implant/compressed /obj/item/implanter/compressed/on_update_icon() + . = ..() if (imp) var/obj/item/implant/compressed/c = imp if(!c.scanned) @@ -48,7 +49,6 @@ icon_state = "cimplanter2" else icon_state = "cimplanter0" - return /obj/item/implanter/compressed/attack(mob/M, mob/user) var/obj/item/implant/compressed/c = imp diff --git a/code/game/objects/items/weapons/lighter.dm b/code/game/objects/items/weapons/lighter.dm index a177b3c8081..7288f0995b5 100644 --- a/code/game/objects/items/weapons/lighter.dm +++ b/code/game/objects/items/weapons/lighter.dm @@ -84,13 +84,12 @@ extinguish(user) /obj/item/flame/lighter/on_update_icon() + . = ..() var/datum/extension/base_icon_state/bis = get_extension(src, /datum/extension/base_icon_state) - - overlays.Cut() if(lit) - overlays += overlay_image(icon, "[bis.base_icon_state]_flame", flags=RESET_COLOR) + add_overlay(overlay_image(icon, "[bis.base_icon_state]_flame", flags=RESET_COLOR)) else - overlays += overlay_image(icon, "[bis.base_icon_state]_striker", flags=RESET_COLOR) + add_overlay(overlay_image(icon, "[bis.base_icon_state]_striker", flags=RESET_COLOR)) /obj/item/flame/lighter/attack(var/mob/living/M, var/mob/living/carbon/user) if(!istype(M, /mob)) @@ -166,13 +165,12 @@ ) /obj/item/flame/lighter/zippo/on_update_icon() + . = ..() var/datum/extension/base_icon_state/bis = get_extension(src, /datum/extension/base_icon_state) - - overlays.Cut() if(lit) icon_state = "[bis.base_icon_state]_open" item_state = "[bis.base_icon_state]_open" - overlays += overlay_image(icon, "[bis.base_icon_state]_flame", flags=RESET_COLOR) + add_overlay(overlay_image(icon, "[bis.base_icon_state]_flame", flags=RESET_COLOR)) else icon_state = "[bis.base_icon_state]" item_state = "[bis.base_icon_state]" @@ -222,6 +220,7 @@ color = null /obj/item/flame/lighter/zippo/custom/on_update_icon() + . = ..() var/datum/extension/base_icon_state/bis = get_extension(src, /datum/extension/base_icon_state) if(lit) diff --git a/code/game/objects/items/weapons/material/ashtray.dm b/code/game/objects/items/weapons/material/ashtray.dm index 3a2d4a0c119..931feba8901 100644 --- a/code/game/objects/items/weapons/material/ashtray.dm +++ b/code/game/objects/items/weapons/material/ashtray.dm @@ -21,12 +21,11 @@ to_chat(user, "It has [contents.len] cig butts in it.") /obj/item/ashtray/on_update_icon() - ..() - overlays.Cut() + . = ..() if (contents.len == max_butts) - overlays |= image('icons/obj/objects.dmi',"ashtray_full") + add_overlay(overlay_image(icon, "ashtray_full")) else if (contents.len >= max_butts/2) - overlays |= image('icons/obj/objects.dmi',"ashtray_half") + add_overlay(overlay_image(icon, "ashtray_half")) /obj/item/ashtray/attackby(obj/item/W, mob/user) if (health <= 0) diff --git a/code/game/objects/items/weapons/material/folding.dm b/code/game/objects/items/weapons/material/folding.dm index 92cce316705..ba4fb1cf849 100644 --- a/code/game/objects/items/weapons/material/folding.dm +++ b/code/game/objects/items/weapons/material/folding.dm @@ -44,13 +44,11 @@ ..() /obj/item/knife/folding/on_update_icon() + . = ..() icon_state = get_world_inventory_state() if(open) icon_state = "[get_world_inventory_state()]_open" - if(ismob(loc)) - var/mob/M = loc - M.update_inv_hands() - ..() + update_held_icon() /obj/item/knife/folding/get_mob_overlay(mob/user_mob, slot, bodypart) . = open ? ..() : new /image diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 99a699b3954..7fbabc37890 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -33,14 +33,11 @@ )) /obj/item/knife/on_update_icon() - ..() + . = ..() if(draw_handle) - cut_overlays() if(!handle_color && length(valid_handle_colors)) handle_color = pick(valid_handle_colors) add_overlay(overlay_image(icon, "[get_world_inventory_state()]_handle", handle_color, flags=RESET_COLOR|RESET_ALPHA)) - if(blood_overlay) - add_overlay(blood_overlay) /obj/item/knife/attack(mob/living/carbon/M, mob/living/carbon/user, target_zone) if(!istype(M)) diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index e65790aa83b..d707af2be38 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -54,6 +54,7 @@ qdel(src) /obj/item/shard/on_update_icon() + . = ..() if(material) color = material.color // 1-(1-x)^2, so that glass shards with 0.3 opacity end up somewhat visible at 0.51 opacity @@ -89,13 +90,9 @@ return ..() /obj/item/shard/on_update_icon() - overlays.Cut() . = ..() if(has_handle) - var/image/I = image(icon, "handle") - I.appearance_flags |= RESET_COLOR - I.color = has_handle - overlays += I + add_overlay(overlay_image(icon, "handle", has_handle, RESET_COLOR)) /obj/item/shard/Crossed(atom/movable/AM) ..() diff --git a/code/game/objects/items/weapons/material/swiss.dm b/code/game/objects/items/weapons/material/swiss.dm index 6f35713b592..4e8dfaef219 100644 --- a/code/game/objects/items/weapons/material/swiss.dm +++ b/code/game/objects/items/weapons/material/swiss.dm @@ -108,7 +108,7 @@ /obj/item/knife/folding/swiss/on_update_icon() ..() if(active_tool != null) - overlays += overlay_image(icon, active_tool) + add_overlay(overlay_image(icon, active_tool, flags = RESET_COLOR)) /obj/item/knife/folding/swiss/get_mob_overlay(mob/user_mob, slot, bodypart) . = (active_tool == SWISSKNF_LBLADE || active_tool == SWISSKNF_SBLADE) ? ..() : new /image diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm index c6bc5942fae..1bdaf095e87 100644 --- a/code/game/objects/items/weapons/material/twohanded.dm +++ b/code/game/objects/items/weapons/material/twohanded.dm @@ -128,12 +128,12 @@ ..() /obj/item/twohanded/spear/on_update_icon() - overlays.Cut() - if(applies_material_colour && material) - color = material.color - alpha = 100 + material.opacity * 255 - overlays += get_shaft_overlay("shaft") - overlays += mutable_appearance(icon, "cable", cable_color) + . = ..() + add_overlay(list( + get_shaft_overlay("shaft"), + mutable_appearance(icon, "cable", cable_color) + )) + /obj/item/twohanded/spear/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) if(overlay) diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 7b50812973c..1a313a924c0 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -141,7 +141,7 @@ . = active ? ITEM_SIZE_NO_CONTAINER : ..() /obj/item/energy_blade/on_update_icon() - cut_overlays() + . = ..() icon_state = get_world_inventory_state() if(active && check_state_in_icon("[icon_state]-extended", icon)) if(plane == HUD_PLANE) diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm index 447a276fd83..8f15058e33e 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -28,11 +28,9 @@ var/global/list/cached_icons = list() reagents.add_reagent(/decl/material/liquid/paint, reagents.maximum_volume) /obj/item/chems/glass/paint/on_update_icon() - overlays.Cut() + . = ..() if(reagents.total_volume) - var/image/filling = image('icons/obj/reagentfillings.dmi', src, "paintbucket") - filling.color = reagents.get_color() - overlays += filling + add_overlay(overlay_image('icons/obj/reagentfillings.dmi', "paintbucket", reagents.get_color())) /obj/item/chems/glass/paint/red name = "red paint bucket" diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 87ebc16d983..d118cfb9dc1 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -204,6 +204,7 @@ return /obj/item/shield/energy/on_update_icon() + . = ..() icon_state = "[initial(icon_state)][active]" if(active) set_light(1.5, 1.5, shield_light_color) diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index 8337f78a091..3a870f4db54 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -101,8 +101,8 @@ ..() /obj/item/soap/on_update_icon() - overlays.Cut() + . = ..() if(key_data) - overlays += image(icon, icon_state = "soap_key_overlay") + add_overlay(overlay_image(icon, "soap_key_overlay")) else if(decal_name) - overlays += overlay_image(icon, "decal-[decal_name]") \ No newline at end of file + add_overlay(overlay_image(icon, "decal-[decal_name]")) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index be3476c7a82..3027351812d 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -367,7 +367,7 @@ var/marking_colour /obj/item/storage/backpack/ert/on_update_icon() - cut_overlays() + . = ..() if(marking_state) var/image/I = image(icon, marking_state) I.color = marking_colour diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 2fd6d087514..1b4d009bc2d 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -56,6 +56,7 @@ update_icon() /obj/item/storage/bag/trash/on_update_icon() + . = ..() switch(w_class) if(2) icon_state = "[initial(icon_state)]" if(3) icon_state = "[initial(icon_state)]1" diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index a4c59583782..b799c8a9ae0 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -21,17 +21,23 @@ update_icon() /obj/item/storage/belt/on_update_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_belt() - - overlays.Cut() + . = ..() if(overlay_flags & BELT_OVERLAY_ITEMS) + var/list/cur_overlays for(var/obj/item/I in contents) if(I.use_single_icon) - overlays += I.get_on_belt_overlay() + LAZYADD(cur_overlays, I.get_on_belt_overlay()) else - overlays += image('icons/obj/clothing/obj_belt_overlays.dmi', "[I.icon_state]") + LAZYADD(cur_overlays, overlay_image('icons/obj/clothing/obj_belt_overlays.dmi', I.icon_state)) + + if(LAZYLEN(cur_overlays)) + add_overlay(cur_overlays) + update_clothing_icon() + +/obj/item/storage/belt/update_clothing_icon() + if(ismob(src.loc)) + var/mob/M = src.loc + M.update_inv_belt() /obj/item/storage/belt/get_mob_overlay(mob/user_mob, slot, bodypart) var/image/ret = ..() @@ -80,19 +86,21 @@ H.examine_holster(user) /obj/item/storage/belt/holster/on_update_icon() - if (ismob(src.loc)) - var/mob/M = src.loc - M.update_inv_belt() - - overlays.Cut() + . = ..() var/datum/extension/holster/H = get_extension(src, /datum/extension/holster) if(overlay_flags) + var/list/cur_overlays for(var/obj/item/I in contents) if(I == H.holstered) if(overlay_flags & BELT_OVERLAY_HOLSTER) - overlays += image('icons/obj/clothing/obj_belt_overlays.dmi', "[I.icon_state]") + LAZYADD(cur_overlays, overlay_image('icons/obj/clothing/obj_belt_overlays.dmi', I.icon_state)) else if(overlay_flags & BELT_OVERLAY_ITEMS) - overlays += image('icons/obj/clothing/obj_belt_overlays.dmi', "[I.icon_state]") + LAZYADD(cur_overlays, overlay_image('icons/obj/clothing/obj_belt_overlays.dmi', I.icon_state)) + + if(LAZYLEN(cur_overlays)) + add_overlay(cur_overlays) + + update_clothing_icon() /obj/item/storage/belt/utility name = "tool belt" diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 6c6ae10c4b3..6f3fcbf1695 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -15,11 +15,12 @@ var/obj/item/key_type //path of the key item that this "fancy" container is meant to store /obj/item/storage/fancy/on_update_icon() + . = ..() if(!opened) - src.icon_state = initial(icon_state) + icon_state = initial(icon_state) else var/key_count = count_by_type(contents, key_type) - src.icon_state = "[initial(icon_state)][key_count]" + icon_state = "[initial(icon_state)][key_count]" /obj/item/storage/fancy/examine(mob/user, distance) . = ..() @@ -95,10 +96,13 @@ ) /obj/item/storage/fancy/crayons/on_update_icon() - overlays = list() //resets list - overlays += image(icon,"crayonbox") + . = ..() + //#FIXME: This can't handle all crayons types and colors. + var/list/cur_overlays for(var/obj/item/pen/crayon/crayon in contents) - overlays += image(icon,crayon.stroke_colour_name) + LAZYADD(cur_overlays, overlay_image(icon, crayon.stroke_colour_name), flags = RESET_COLOR) + if(LAZYLEN(cur_overlays)) + add_overlay(cur_overlays) //////////// //CIG PACK// @@ -294,8 +298,9 @@ startswith = list(/obj/item/chems/glass/beaker/vial = 12) /obj/item/storage/fancy/vials/on_update_icon() + . = ..() var/key_count = count_by_type(contents, key_type) - src.icon_state = "[initial(icon_state)][FLOOR(key_count/2)]" + icon_state = "[initial(icon_state)][FLOOR(key_count/2)]" /* * Not actually a "fancy" storage... @@ -317,16 +322,15 @@ update_icon() /obj/item/storage/lockbox/vials/on_update_icon() + . = ..() var/total_contents = count_by_type(contents, /obj/item/chems/glass/beaker/vial) - src.icon_state = "vialbox[FLOOR(total_contents/2)]" - src.overlays.Cut() + icon_state = "vialbox[FLOOR(total_contents/2)]" if (!broken) - overlays += image(icon, src, "led[locked]") + add_overlay(overlay_image(icon, "led[locked]")) if(locked) - overlays += image(icon, src, "cover") + add_overlay(overlay_image(icon, "cover")) else - overlays += image(icon, src, "ledb") - return + add_overlay(overlay_image(icon, "ledb")) /obj/item/storage/lockbox/vials/attackby(obj/item/W, mob/user) . = ..() diff --git a/code/game/objects/items/weapons/storage/laundry_basket.dm b/code/game/objects/items/weapons/storage/laundry_basket.dm index 5ea3c21394d..7a631bd9d85 100644 --- a/code/game/objects/items/weapons/storage/laundry_basket.dm +++ b/code/game/objects/items/weapons/storage/laundry_basket.dm @@ -47,12 +47,11 @@ return /obj/item/storage/laundry_basket/on_update_icon() + . = ..() if(contents.len) icon_state = "laundry-full" else icon_state = "laundry-empty" - return - /obj/item/storage/laundry_basket/handle_mouse_drop(var/atom/over, var/mob/user) if(over == user) diff --git a/code/game/objects/items/weapons/storage/med_pouch.dm b/code/game/objects/items/weapons/storage/med_pouch.dm index fd48e10d392..608f1476142 100644 --- a/code/game/objects/items/weapons/storage/med_pouch.dm +++ b/code/game/objects/items/weapons/storage/med_pouch.dm @@ -35,11 +35,10 @@ Single Use Emergency Pouches A.update_icon() /obj/item/storage/med_pouch/on_update_icon() - overlays.Cut() + . = ..() if(!cross_overlay) - cross_overlay = image(icon, "cross") - cross_overlay.appearance_flags = RESET_COLOR - overlays += cross_overlay + cross_overlay = overlay_image(icon, "cross", flags = RESET_COLOR) + add_overlay(cross_overlay) icon_state = "pack[opened]" /obj/item/storage/med_pouch/examine(mob/user) diff --git a/code/game/objects/items/weapons/storage/misc.dm b/code/game/objects/items/weapons/storage/misc.dm index 479848b460c..e13d464f798 100644 --- a/code/game/objects/items/weapons/storage/misc.dm +++ b/code/game/objects/items/weapons/storage/misc.dm @@ -36,11 +36,15 @@ startswith = list(/obj/item/chems/food/donut = 6) /obj/item/storage/box/donut/on_update_icon() - overlays.Cut() + . = ..() + var/list/cur_overlays var/i = 0 for(var/obj/item/chems/food/donut/D in contents) - overlays += image('icons/obj/food.dmi', "[i][D.overlay_state]") + LAZYADD(cur_overlays, overlay_image('icons/obj/food.dmi', "[i][D.overlay_state]", flags = RESET_COLOR)) i++ + + if(LAZYLEN(cur_overlays)) + add_overlay(cur_overlays) /obj/item/storage/box/donut/empty startswith = null diff --git a/code/game/objects/items/weapons/storage/mre.dm b/code/game/objects/items/weapons/storage/mre.dm index 83f4c2a16a7..616e615d473 100644 --- a/code/game/objects/items/weapons/storage/mre.dm +++ b/code/game/objects/items/weapons/storage/mre.dm @@ -32,9 +32,9 @@ MRE Stuff to_chat(user, meal_desc) /obj/item/storage/mre/on_update_icon() + . = ..() if(opened) icon_state = "[initial(icon_state)][opened]" - . = ..() /obj/item/storage/mre/attack_self(mob/user) open(user) @@ -129,13 +129,10 @@ MRE Stuff open_sound = 'sound/effects/bubbles.ogg' startswith = list(/obj/item/chems/food/slice/meatpizza/filled) -/obj/item/storage/mrebag/Initialize() - . = ..() - /obj/item/storage/mrebag/on_update_icon() + . = ..() if(opened) icon_state = "[initial(icon_state)][opened]" - . = ..() /obj/item/storage/mrebag/attack_self(mob/user) open(user) diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 7a5dcff4be3..33693564c67 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -57,16 +57,13 @@ /obj/item/storage/secure/on_update_icon() . = ..() - var/datum/extension/lockable/lock = get_extension(src, /datum/extension/lockable) if(!istype(lock)) return - - overlays.Cut() if(lock.emagged) - overlays += image(icon, icon_locking) + add_overlay(overlay_image(icon, icon_locking)) else if(lock.open) - overlays += image(icon, icon_opened) + add_overlay(overlay_image(icon, icon_opened)) /obj/item/storage/secure/open(mob/user) var/datum/extension/lockable/lock = get_extension(src, /datum/extension/lockable) diff --git a/code/game/objects/items/weapons/storage/trays.dm b/code/game/objects/items/weapons/storage/trays.dm index 45f75ac2bbf..e2ff2e02a56 100644 --- a/code/game/objects/items/weapons/storage/trays.dm +++ b/code/game/objects/items/weapons/storage/trays.dm @@ -122,7 +122,7 @@ scatter_contents(FALSE, get_turf(hit_atom)) /obj/item/storage/tray/on_update_icon() - ..() + . = ..() clear_vis_contents(src) for(var/obj/item/I in contents) I.vis_flags |= VIS_INHERIT_PLANE | VIS_INHERIT_LAYER diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index db74d790d46..4f4ca8f1daa 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -80,14 +80,12 @@ front_stick = W /obj/item/storage/wallet/on_update_icon() - overlays.Cut() + . = ..() if(front_id) var/tiny_state = "id-generic" if(("id-"+front_id.icon_state) in icon_states(icon)) tiny_state = "id-"+front_id.icon_state - var/image/tiny_image = new/image(icon, icon_state = tiny_state) - tiny_image.appearance_flags = RESET_COLOR - overlays += tiny_image + add_overlay(overlay_image(icon, tiny_state, flags = RESET_COLOR)) /obj/item/storage/wallet/GetIdCards() . = ..() diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index ac005794a3c..a2f12792ab3 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -54,7 +54,7 @@ return null /obj/item/baton/on_update_icon() - cut_overlays() + . = ..() if(status) add_overlay("[icon_state]-active") set_light(1.5, 2, "#ff6a00") @@ -226,6 +226,7 @@ icon_state = "electrified_arm" /obj/item/baton/robot/electrified_arm/on_update_icon() + . = ..() if(status) icon_state = "electrified_arm_active" set_light(1.5, 2, "#006aff") diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index fd42b4f0c3b..6ae9ca8e7e9 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -61,14 +61,13 @@ update_held_icon() /obj/item/telebaton/on_update_icon() + if(length(blood_DNA)) + generate_blood_overlay(TRUE) // Force recheck. + . = ..() if(on) icon = 'icons/obj/items/weapon/telebaton_extended.dmi' else icon = 'icons/obj/items/weapon/telebaton.dmi' - if(length(blood_DNA)) - generate_blood_overlay(TRUE) // Force recheck. - overlays.Cut() - overlays += blood_overlay /obj/item/telebaton/attack(mob/target, mob/living/user) if(on) diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index efaac1378a2..0f47e52ab07 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -37,7 +37,7 @@ to_chat(usr, "You toggle the stabilization [stabilization_on? "on":"off"].") /obj/item/tank/jetpack/on_update_icon(override) - cut_overlays() + . = ..() if(on) add_overlay("[icon_state]-on") diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 067989824ff..e3394ede25d 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -376,13 +376,13 @@ var/global/list/global/tank_gauge_cache = list() check_status() /obj/item/tank/on_update_icon(var/override) - + . = ..() var/list/overlays_to_add if(override && (proxyassembly.assembly || wired)) - LAZYADD(overlays_to_add, image('icons/obj/items/tanks/tank_components.dmi',"bomb_assembly")) + LAZYADD(overlays_to_add, overlay_image('icons/obj/items/tanks/tank_components.dmi', "bomb_assembly")) if(proxyassembly.assembly) - var/image/bombthing = image(proxyassembly.assembly.icon, proxyassembly.assembly.icon_state) - bombthing.overlays |= proxyassembly.assembly.overlays + var/mutable_appearance/bombthing = new(proxyassembly.assembly) + bombthing.appearance_flags = RESET_COLOR bombthing.pixel_y = -1 bombthing.pixel_x = -3 LAZYADD(overlays_to_add, bombthing) @@ -401,8 +401,7 @@ var/global/list/global/tank_gauge_cache = list() tank_gauge_cache[indicator] = image('icons/obj/items/tanks/tank_indicators.dmi', indicator) LAZYADD(overlays_to_add, tank_gauge_cache[indicator]) previous_gauge_pressure = gauge_pressure - - overlays = overlays_to_add + add_overlay(overlays_to_add) //Handle exploding, leaking, and rupturing of the tank /obj/item/tank/proc/check_status() @@ -585,6 +584,7 @@ var/global/list/global/tank_gauge_cache = list() air_contents.add_thermal_energy(15000) /obj/item/tankassemblyproxy/on_update_icon() + . = ..() tank.update_icon() /obj/item/tankassemblyproxy/HasProximity(atom/movable/AM) diff --git a/code/game/objects/items/weapons/tech_disks.dm b/code/game/objects/items/weapons/tech_disks.dm index a696999f44d..8682e0274a4 100644 --- a/code/game/objects/items/weapons/tech_disks.dm +++ b/code/game/objects/items/weapons/tech_disks.dm @@ -9,9 +9,7 @@ /obj/item/disk/on_update_icon() . = ..() - cut_overlays() - var/list/details = list() - details += mutable_appearance(icon, "slider", flags = RESET_COLOR) + var/list/details = list(mutable_appearance(icon, "slider", flags = RESET_COLOR)) if(label) details += mutable_appearance(icon, label, flags = RESET_COLOR) add_overlay(details) diff --git a/code/game/objects/items/weapons/tools/crowbar.dm b/code/game/objects/items/weapons/tools/crowbar.dm index f0f886d5954..8a159c2db8b 100644 --- a/code/game/objects/items/weapons/tools/crowbar.dm +++ b/code/game/objects/items/weapons/tools/crowbar.dm @@ -35,13 +35,13 @@ . += "narrow" /obj/item/crowbar/on_update_icon() - ..() + . = ..() if(!shape_type) shape_type = rand(1,shape_variations) icon_state = "[get_world_inventory_state()][shape_type]" if(!handle_color) handle_color = pick(valid_colours) - overlays += mutable_appearance(icon, "[get_world_inventory_state()]_handle[shape_type]", handle_color) + add_overlay(mutable_appearance(icon, "[get_world_inventory_state()]_handle[shape_type]", handle_color)) /obj/item/crowbar/afterattack(atom/target, mob/user) . = ..() diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/weapons/tools/screwdriver.dm index 4370e0b7760..9727d5eb6b9 100644 --- a/code/game/objects/items/weapons/tools/screwdriver.dm +++ b/code/game/objects/items/weapons/tools/screwdriver.dm @@ -23,10 +23,10 @@ set_extension(src, /datum/extension/tool, list(TOOL_SCREWDRIVER = TOOL_QUALITY_DEFAULT)) /obj/item/screwdriver/on_update_icon() - ..() + . = ..() if(!handle_color) handle_color = pick(valid_colours) - overlays += mutable_appearance(icon, "[get_world_inventory_state()]_handle", handle_color) + add_overlay(mutable_appearance(icon, "[get_world_inventory_state()]_handle", handle_color)) /obj/item/screwdriver/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) if(overlay) diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 916c94873fc..3bfc7cc3163 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -246,7 +246,7 @@ return ..() /obj/item/weldingtool/on_update_icon() - cut_overlays() + . = ..() if(tank) add_overlay("[icon_state]-[tank.icon_state]") if(welding && check_state_in_icon("[icon_state]-lit", icon)) @@ -257,9 +257,7 @@ set_light(2.5, 0.6, lit_colour) else set_light(0) - var/mob/M = loc - if(istype(M)) - M.update_inv_hands() + update_held_icon() //Sets the welding state of the welding tool. If you see W.welding = 1 anywhere, please change it to W.setWelding(1) //so that the welding tool updates accordingly diff --git a/code/game/objects/items/weapons/tools/wirecutter.dm b/code/game/objects/items/weapons/tools/wirecutter.dm index a9a73f88bd5..cbd459039ee 100644 --- a/code/game/objects/items/weapons/tools/wirecutter.dm +++ b/code/game/objects/items/weapons/tools/wirecutter.dm @@ -25,7 +25,7 @@ . = ..() if(!handle_color) handle_color = pick(valid_colours) - overlays += overlay_image(icon, "[get_world_inventory_state()]_handle", handle_color, flags=RESET_COLOR) + add_overlay(overlay_image(icon, "[get_world_inventory_state()]_handle", handle_color, flags=RESET_COLOR)) /obj/item/wirecutters/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) if(overlay) diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm index 10d028d0255..28747905484 100644 --- a/code/game/objects/items/weapons/tools/wrench.dm +++ b/code/game/objects/items/weapons/tools/wrench.dm @@ -23,4 +23,4 @@ . = ..() if(!handle_color) handle_color = pick(valid_colours) - overlays += mutable_appearance(icon, "[get_world_inventory_state()]_handle", handle_color) \ No newline at end of file + add_overlay(mutable_appearance(icon, "[get_world_inventory_state()]_handle", handle_color)) \ No newline at end of file diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index e5c332d80da..7f36efd779f 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -103,9 +103,5 @@ ..() /obj/item/beartrap/on_update_icon() - ..() - - if(!deployed) - icon_state = "beartrap0" - else - icon_state = "beartrap1" + . = ..() + icon_state = "beartrap[deployed == TRUE]" diff --git a/code/game/objects/items/weapons/weldbackpack.dm b/code/game/objects/items/weapons/weldbackpack.dm index 0480ad1f7bd..c80ec96fa11 100644 --- a/code/game/objects/items/weapons/weldbackpack.dm +++ b/code/game/objects/items/weapons/weldbackpack.dm @@ -70,9 +70,9 @@ ..() /obj/item/weldpack/on_update_icon() - cut_overlays() + . = ..() if(welder) - var/image/welder_image = image(welder.icon, icon_state = welder.icon_state) + var/mutable_appearance/welder_image = new(welder) welder_image.pixel_x = 16 add_overlay(welder_image) diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm index 6923569b6be..9cad329aae8 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/stools.dm @@ -40,18 +40,15 @@ padding_material = /decl/material/solid/carpet /obj/item/stool/on_update_icon() + . = ..() // Prep icon. icon_state = "" // Base icon. - var/image/I = image(icon, "[base_icon]_base") - I.color = material.color - var/list/noverlays = list(I) + var/list/noverlays = list(overlay_image(icon, "[base_icon]_base", material.color)) // Padding overlay. if(padding_material) - I = image(icon, "[base_icon]_padding") - I.color = padding_material.color - noverlays += I - set_overlays(noverlays) + noverlays += overlay_image(icon, "[base_icon]_padding", padding_material.color) + add_overlay(noverlays) // Strings. if(padding_material) SetName("[padding_material.solid_name] [initial(name)]") //this is not perfect but it will do for now. diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 2cefcb30d45..e9053a4ebf8 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -219,15 +219,17 @@ to_chat(user, "\The [src] can be attached!") /obj/item/assembly_holder/on_update_icon() - overlays.Cut() + . = ..() if(a_left) - overlays += "[a_left.icon_state]_left" + var/list/left_overlays = list(overlay_image(icon, "[a_left.icon_state]_left")) for(var/O in a_left.attached_overlays) - overlays += "[O]_l" + left_overlays += "[O]_l" + add_overlay(left_overlays) if(a_right) - src.overlays += "[a_right.icon_state]_right" + var/list/right_overlays = list(overlay_image(icon, "[a_right.icon_state]_right")) for(var/O in a_right.attached_overlays) - overlays += "[O]_r" + right_overlays += "[O]_r" + add_overlay(right_overlays) if(master) master.update_icon() diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index f451f2707f4..02ba9167ec3 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -54,9 +54,9 @@ return secured /obj/item/assembly/infra/on_update_icon() - overlays.Cut() + . = ..() if(on) - overlays += "infrared_on" + add_overlay(overlay_image(icon, "infrared_on")) if(holder) holder.update_icon() update_beams() diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index fdb643327f1..119faac2abc 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -17,6 +17,7 @@ to_chat(user, "It looks like it's armed.") /obj/item/assembly/mousetrap/on_update_icon() + . = ..() if(armed) icon_state = "mousetraparmed" else diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 42a29d622bb..f8aace786a4 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -93,14 +93,16 @@ /obj/item/assembly/prox_sensor/on_update_icon() - overlays.Cut() - attached_overlays = list() + . = ..() + LAZYCLEARLIST(attached_overlays) if(timing) - overlays += "prox_timing" - attached_overlays += "prox_timing" + var/image/img = overlay_image(icon, "prox_timing") + add_overlay(img) + LAZYADD(attached_overlays, img) if(scanning) - overlays += "prox_scanning" - attached_overlays += "prox_scanning" + var/image/scanimg = overlay_image(icon, "prox_scanning") + add_overlay(scanimg) + LAZYADD(attached_overlays, scanimg) if(holder) holder.update_icon() diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index f6067976598..42bb7f2b23c 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -35,9 +35,9 @@ return 1 /obj/item/assembly/signaler/on_update_icon() + . = ..() if(holder) holder.update_icon() - return /obj/item/assembly/signaler/interact(mob/user, flag1) var/t1 = "-------" diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index 8bd130b9636..7f45cfc32e0 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -62,15 +62,14 @@ /obj/item/assembly/timer/on_update_icon() - overlays.Cut() - attached_overlays = list() + . = ..() + LAZYCLEARLIST(attached_overlays) if(timing) - overlays += "timer_timing" - attached_overlays += "timer_timing" + var/image/img = overlay_image(icon, "timer_timing") + add_overlay(img) + LAZYADD(attached_overlays, img) if(holder) holder.update_icon() - return - /obj/item/assembly/timer/interact(mob/user)//TODO: Have this use the wires if(!secured) diff --git a/code/modules/clothing/_clothing.dm b/code/modules/clothing/_clothing.dm index 18c53911b46..43deaa303ef 100644 --- a/code/modules/clothing/_clothing.dm +++ b/code/modules/clothing/_clothing.dm @@ -92,15 +92,17 @@ . = ..() /obj/item/clothing/on_update_icon() - ..() + . = ..() var/base_state = get_world_inventory_state() - cut_overlays() if(markings_icon && markings_color) add_overlay(mutable_appearance(icon, "[base_state][markings_icon]", markings_color)) + var/list/new_overlays for(var/obj/item/clothing/accessory/accessory in accessories) var/image/I = accessory.get_attached_inventory_overlay(base_state) if(I) - add_overlay(I) + LAZYADD(new_overlays, I) + if(LAZYLEN(new_overlays)) + add_overlay(new_overlays) /obj/item/clothing/proc/change_smell(smell = SMELL_DEFAULT) smell_state = smell diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index c6f1d88a2db..7efd2a70eaa 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -72,6 +72,7 @@ update_vision() /obj/item/clothing/glasses/on_update_icon() + . = ..() icon_state = ICON_STATE_WORLD if(active && check_state_in_icon("[icon_state]-active", icon)) icon_state = "[icon_state]-active" diff --git a/code/modules/clothing/glasses/eyepatch.dm b/code/modules/clothing/glasses/eyepatch.dm index a1de4282826..9f14aea8870 100644 --- a/code/modules/clothing/glasses/eyepatch.dm +++ b/code/modules/clothing/glasses/eyepatch.dm @@ -49,7 +49,7 @@ update_icon() /obj/item/clothing/glasses/eyepatch/hud/on_update_icon() - cut_overlays() + . = ..() if(active && check_state_in_icon("[icon_state]-eye", icon)) var/image/eye if(plane == HUD_PLANE) diff --git a/code/modules/clothing/gloves/thick.dm b/code/modules/clothing/gloves/thick.dm index 306234a212a..95dd69418c4 100644 --- a/code/modules/clothing/gloves/thick.dm +++ b/code/modules/clothing/gloves/thick.dm @@ -41,9 +41,7 @@ /obj/item/clothing/gloves/thick/botany/on_update_icon() . = ..() - var/image/I = image(icon, "[icon_state]-botany_fingertips") - I.appearance_flags |= RESET_COLOR - overlays = list(I) + add_overlay(overlay_image(icon, "[icon_state]-botany_fingertips", flags = RESET_COLOR)) /obj/item/clothing/gloves/thick/botany/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) . = ..() diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 2b03c199a25..f9b2d2a0b4f 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -64,12 +64,10 @@ return FALSE /obj/item/clothing/head/on_update_icon(var/mob/user) - ..() + . = ..() if(on) add_light_overlay() - if(istype(user,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - H.update_inv_head() + update_clothing_icon() /obj/item/clothing/head/proc/add_light_overlay() if(use_single_icon) diff --git a/code/modules/clothing/head/headphones.dm b/code/modules/clothing/head/headphones.dm index b2cac84816b..fcf94332c5e 100644 --- a/code/modules/clothing/head/headphones.dm +++ b/code/modules/clothing/head/headphones.dm @@ -17,6 +17,7 @@ sound_channel = global.sound_channels.RequestChannel(type) /obj/item/clothing/head/headphones/on_update_icon() + . = ..() icon_state = get_world_inventory_state() if(headphones_on) icon_state = "[icon_state]-on" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 717ca1849fe..41c94a97621 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -64,7 +64,7 @@ usr.update_action_buttons() /obj/item/clothing/head/welding/on_update_icon() - ..() + . = ..() icon_state = get_world_inventory_state() if(up && check_state_in_icon("[icon_state]_up", icon)) icon_state = "[icon_state]_up" @@ -120,7 +120,7 @@ update_icon() /obj/item/clothing/head/ushanka/on_update_icon() - ..() + . = ..() icon_state = get_world_inventory_state() if(up && check_state_in_icon("[icon_state]_up", icon)) icon_state = "[icon_state]_up" diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 69f449991d4..03d5f37f661 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -9,7 +9,7 @@ body_parts_covered = 0 /obj/item/clothing/head/soft/on_update_icon() - ..() + . = ..() if(flipped) icon_state = "[get_world_inventory_state()]_flipped" diff --git a/code/modules/clothing/masks/chewable.dm b/code/modules/clothing/masks/chewable.dm index daa196c3f29..9899fc46038 100644 --- a/code/modules/clothing/masks/chewable.dm +++ b/code/modules/clothing/masks/chewable.dm @@ -163,12 +163,9 @@ initial_payload_amount = 10 /obj/item/clothing/mask/chewable/candy/lolli/on_update_icon() + . = ..() icon_state = get_world_inventory_state() - cut_overlays() - var/image/I = image(icon, "[icon_state]-stick") - I.appearance_flags |= RESET_COLOR - I.color = color - add_overlay(I) + add_overlay(overlay_image(icon, "[icon_state]-stick", color, RESET_COLOR)) /obj/item/clothing/mask/chewable/candy/lolli/get_possible_initial_reagents() return list( diff --git a/code/modules/clothing/masks/monitor.dm b/code/modules/clothing/masks/monitor.dm index 8a7c3b166b3..d47db628db0 100644 --- a/code/modules/clothing/masks/monitor.dm +++ b/code/modules/clothing/masks/monitor.dm @@ -109,9 +109,8 @@ update_icon() /obj/item/clothing/mask/monitor/on_update_icon() + . = ..() if(!(monitor_state_index in monitor_states)) monitor_state_index = initial(monitor_state_index) icon_state = "[initial(icon_state)]-[monitor_states[monitor_state_index]]" - var/mob/living/carbon/human/H = loc - if(istype(H)) - H.update_inv_wear_mask() + update_clothing_icon() diff --git a/code/modules/clothing/masks/smokable.dm b/code/modules/clothing/masks/smokable.dm index 65024f52ec9..fa3f85b51b7 100644 --- a/code/modules/clothing/masks/smokable.dm +++ b/code/modules/clothing/masks/smokable.dm @@ -92,8 +92,7 @@ location.hotspot_expose(700, 5) /obj/item/clothing/mask/smokable/on_update_icon() - ..() - cut_overlays() + . = ..() if(lit && check_state_in_icon("[icon_state]-on", icon)) var/image/I if(plane == HUD_PLANE) @@ -102,6 +101,7 @@ I = emissive_overlay(icon, "[icon_state]-on") I.appearance_flags |= RESET_COLOR add_overlay(I) + if(ismob(loc)) var/mob/living/M = loc M.update_inv_wear_mask(0) diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 571f7dfe540..385d7e71d12 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -170,7 +170,7 @@ var/mutable_appearance/S = mutable_appearance(icon, "[icon_state]_shine") S.alpha = 127 * shine / 100 S.blend_mode = BLEND_ADD - overlays += S + add_overlay(S) /obj/item/clothing/shoes/adjust_mob_overlay(var/mob/living/user_mob, var/bodytype, var/image/overlay, var/slot, var/bodypart) if(overlay && shine > 0 && slot == slot_shoes_str) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 40be31672d5..c33853e848e 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -72,7 +72,7 @@ /obj/item/clothing/shoes/dress/on_update_icon() . = ..() if(check_state_in_icon("[icon_state]_inset", icon)) - overlays += overlay_image(icon, "[icon_state]_inset", inset_color, RESET_COLOR) + add_overlay(overlay_image(icon, "[icon_state]_inset", inset_color, RESET_COLOR)) /obj/item/clothing/shoes/dress/white name = "white dress shoes" diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 81a10686a4b..d85905a1e51 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -548,15 +548,14 @@ ui.set_auto_update(1) /obj/item/rig/on_update_icon() + . = ..() + for(var/obj/item/thing in list(chest, boots, gloves, helmet)) + thing.update_icon() - overlays.Cut() if(equipment_overlay_icon && LAZYLEN(installed_modules)) for(var/obj/item/rig_module/module in installed_modules) if(module.suit_overlay) - chest.overlays += image("icon" = equipment_overlay_icon, "icon_state" = "[module.suit_overlay]", "dir" = SOUTH) - - for(var/obj/item/thing in list(chest, boots, gloves, helmet)) - thing.update_icon() + chest.add_overlay(image("icon" = equipment_overlay_icon, "icon_state" = "[module.suit_overlay]", "dir" = SOUTH)) if(wearer) wearer.update_inv_shoes() diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm index f989eb06e24..e924edf56e1 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm @@ -24,7 +24,7 @@ bodytype_equip_flags = null /obj/item/clothing/head/helmet/space/rig/on_update_icon(mob/user) - ..() + . = ..() icon_state = get_world_inventory_state() if(user?.check_rig_status() && check_state_in_icon("[icon_state]-sealed", icon)) icon_state = "[icon_state]-sealed" @@ -44,7 +44,7 @@ gender = PLURAL /obj/item/clothing/gloves/rig/on_update_icon(mob/user) - ..() + . = ..() icon_state = get_world_inventory_state() if(user?.check_rig_status() && check_state_in_icon("[icon_state]-sealed", icon)) icon_state = "[icon_state]-sealed" @@ -64,7 +64,7 @@ gender = PLURAL /obj/item/clothing/shoes/magboots/rig/on_update_icon(mob/user) - ..() + . = ..() icon_state = get_world_inventory_state() if(user?.check_rig_status() && check_state_in_icon("[icon_state]-sealed", icon)) icon_state = "[icon_state]-sealed" @@ -90,7 +90,7 @@ var/list/supporting_limbs = list() //If not-null, automatically splints breaks. Checked when removing the suit. /obj/item/clothing/suit/space/rig/on_update_icon(mob/user) - ..() + . = ..() icon_state = get_world_inventory_state() if(user?.check_rig_status() && check_state_in_icon("[icon_state]-sealed", icon)) icon_state = "[icon_state]-sealed" diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 07e9578e2e5..55be083deb4 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -59,6 +59,7 @@ RemoveHood() /obj/item/clothing/suit/storage/hooded/on_update_icon() + . = ..() if(suittoggled) icon_state = "[initial(icon_state)]_t" else diff --git a/code/modules/clothing/under/accessories/accessory_toggleable.dm b/code/modules/clothing/under/accessories/accessory_toggleable.dm index b75013f4bb9..1c7712c3b0a 100644 --- a/code/modules/clothing/under/accessories/accessory_toggleable.dm +++ b/code/modules/clothing/under/accessories/accessory_toggleable.dm @@ -36,6 +36,7 @@ H.do_toggle(usr) /obj/item/clothing/accessory/toggleable/on_update_icon() + . = ..() icon_state = get_world_inventory_state() if(open && check_state_in_icon("[icon_state]-open", icon)) icon_state = "[icon_state]-open" @@ -147,7 +148,7 @@ H.update_clothing_icon() /obj/item/clothing/accessory/toggleable/flannel/on_update_icon() - ..() + . = ..() if(rolled && check_state_in_icon("[icon_state]-rolled", icon)) icon_state = "[icon_state]-rolled" if(tucked && check_state_in_icon("[icon_state]-tucked", icon)) diff --git a/code/modules/clothing/under/accessories/buddytag.dm b/code/modules/clothing/under/accessories/buddytag.dm index 61885ac9ffc..b6cd6761bf7 100644 --- a/code/modules/clothing/under/accessories/buddytag.dm +++ b/code/modules/clothing/under/accessories/buddytag.dm @@ -12,6 +12,7 @@ var/search_interval = 30 SECONDS /obj/item/clothing/accessory/buddytag/on_update_icon() + . = ..() icon_state = get_world_inventory_state() if(on && check_state_in_icon("[icon_state]-on", icon)) icon_state = "[icon_state]-on" diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/under/accessories/clothing.dm index c65ced46749..12acf925d78 100644 --- a/code/modules/clothing/under/accessories/clothing.dm +++ b/code/modules/clothing/under/accessories/clothing.dm @@ -90,6 +90,7 @@ var/sleeves_rolled = FALSE /obj/item/clothing/accessory/tangzhuang/on_update_icon() + . = ..() icon_state = get_world_inventory_state() if(sleeves_rolled && check_state_in_icon("[icon_state]-sleeves", icon)) icon_state = "[icon_state]-sleeves" From 48303f24241ed65cb8a713bbf134b194a71bfac2 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Thu, 11 Aug 2022 19:10:15 -0400 Subject: [PATCH 0254/1518] fix compile --- code/game/objects/items/devices/radio/beacon.dm | 1 + code/game/objects/items/robot/robot_frame.dm | 2 +- code/game/objects/items/weapons/storage/fancy.dm | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 819f145581f..47ab56f154b 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -45,6 +45,7 @@ var/global/list/radio_beacons = list() T.target_lost() /obj/item/radio/beacon/on_update_icon() + . = ..() if(!functioning) icon_state = "[initial(icon_state)]_dead" else diff --git a/code/game/objects/items/robot/robot_frame.dm b/code/game/objects/items/robot/robot_frame.dm index 5218114348e..70fd344cb08 100644 --- a/code/game/objects/items/robot/robot_frame.dm +++ b/code/game/objects/items/robot/robot_frame.dm @@ -24,7 +24,7 @@ var/list/cur_overlays for(var/part in required_parts) if(parts[part]) - LAZYADD(overlay_image(icon, "[part]+o")) + LAZYADD(cur_overlays, overlay_image(icon, "[part]+o")) if(LAZYLEN(cur_overlays)) add_overlay(cur_overlays) diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 6f3fcbf1695..895268809f5 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -100,7 +100,7 @@ //#FIXME: This can't handle all crayons types and colors. var/list/cur_overlays for(var/obj/item/pen/crayon/crayon in contents) - LAZYADD(cur_overlays, overlay_image(icon, crayon.stroke_colour_name), flags = RESET_COLOR) + LAZYADD(cur_overlays, overlay_image(icon, crayon.stroke_colour_name, flags = RESET_COLOR)) if(LAZYLEN(cur_overlays)) add_overlay(cur_overlays) From 9f382fec85c84a0961ad6bfa88fbfce849f491f6 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 12 Aug 2022 00:46:49 +0000 Subject: [PATCH 0255/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index f5407269937..c39c3c3256b 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -104,12 +104,6 @@

    PsyCommando updated:

  • Generic plants can now be cut. Trees can be chopped down with an axe.
  • Added several sound effects when dealing with generic plants.
  • - -

    10 June 2022

    -

    PsyCommando updated:

    -
      -
    • Fixed how some tool interactions wouldn't play tool sounds.
    • -
    From 550abeccdc9df924abe8ae88389e1232f7600409 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 16 Aug 2022 15:28:06 +1000 Subject: [PATCH 0256/1518] Revert "Updating dev from staging." --- code/modules/fabrication/designs/pipe/pipe_datums.dm | 2 +- code/modules/mob/living/carbon/human/human_damage.dm | 11 ++++------- code/modules/mob/living/living.dm | 2 +- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/code/modules/fabrication/designs/pipe/pipe_datums.dm b/code/modules/fabrication/designs/pipe/pipe_datums.dm index 34ca0f01300..58ca5c3bde8 100644 --- a/code/modules/fabrication/designs/pipe/pipe_datums.dm +++ b/code/modules/fabrication/designs/pipe/pipe_datums.dm @@ -191,7 +191,7 @@ rotate_class = PIPE_ROTATE_STANDARD /datum/fabricator_recipe/pipe/fuel/manifold4w - name = "four-way fuel pipe manifold fitting" + name = "four-way supply pipe manifold fitting" desc = "a four-way fuel pipe manifold segment" build_icon_state = "manifold4w" constructed_path = /obj/machinery/atmospherics/pipe/manifold4w/hidden/fuel diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 69afb7c395d..45930a41bc2 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -16,24 +16,22 @@ /mob/living/carbon/human/adjustBrainLoss(var/amount) if(status_flags & GODMODE) return 0 //godmode if(should_have_organ(BP_BRAIN)) - var/obj/item/organ/internal/sponge = GET_INTERNAL_ORGAN(src, BP_BRAIN) + var/obj/item/organ/internal/brain/sponge = get_organ(BP_BRAIN, /obj/item/organ/internal/brain) if(sponge) sponge.take_internal_damage(amount) /mob/living/carbon/human/setBrainLoss(var/amount) if(status_flags & GODMODE) return 0 //godmode if(should_have_organ(BP_BRAIN)) - var/obj/item/organ/internal/sponge = GET_INTERNAL_ORGAN(src, BP_BRAIN) + var/obj/item/organ/internal/brain/sponge = get_organ(BP_BRAIN, /obj/item/organ/internal/brain) if(sponge) sponge.damage = min(max(amount, 0),sponge.species.total_health) updatehealth() /mob/living/carbon/human/getBrainLoss() - if(status_flags & GODMODE) - return 0 //godmode - + if(status_flags & GODMODE) return 0 //godmode if(should_have_organ(BP_BRAIN)) - var/obj/item/organ/internal/sponge = GET_INTERNAL_ORGAN(src, BP_BRAIN) + var/obj/item/organ/internal/brain/sponge = get_organ(BP_BRAIN, /obj/item/organ/internal/brain) if(sponge) if(sponge.status & ORGAN_DEAD) return sponge.species.total_health @@ -41,7 +39,6 @@ return sponge.damage else return species.total_health - return 0 //Straight pain values, not affected by painkillers etc diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 3585a423202..95dcf8358de 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -475,7 +475,7 @@ default behaviour is: /mob/living/carbon/basic_revival(var/repair_brain = TRUE) if(repair_brain && should_have_organ(BP_BRAIN)) repair_brain = FALSE - var/obj/item/organ/internal/brain = GET_INTERNAL_ORGAN(src, BP_BRAIN) + var/obj/item/organ/internal/brain/brain = get_organ(BP_BRAIN, /obj/item/organ/internal/brain) if(brain) if(brain.damage > (brain.max_damage/2)) brain.damage = (brain.max_damage/2) From 6f0ce13764992aefb756ff751a4fc5acaeced89b Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Wed, 17 Aug 2022 00:54:28 +0000 Subject: [PATCH 0257/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 7 ------- 1 file changed, 7 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index c39c3c3256b..755b755cd88 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -97,13 +97,6 @@

    gyurka66 updated:

    • Randomised Ministation Asteroid Field
    - -

    15 June 2022

    -

    PsyCommando updated:

    -
      -
    • Generic plants can now be cut. Trees can be chopped down with an axe.
    • -
    • Added several sound effects when dealing with generic plants.
    • -
    From c7d0f9fb4ac895332cc884baec20ec81a18b54f9 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Wed, 17 Aug 2022 15:56:42 -0400 Subject: [PATCH 0258/1518] Added SHOULD_CALL_PARENT check to item/on_update_icon * Made everything comply with the check. * Shortened and cleaned up a few things. * Had to change a bit how chem overlay works for food and some other chems. Because they relied on not calling their parent. * A bunch of items just really don't want to call their parents, so marked them as such. * Moved whatever was left to the new overlay system. * Added a color parameter to the emissive_overlay proc for convenience, since it would often save a variable creation and a few extra lines. * Marked /atom/on_update_icon() as SHOULD_CALL_PARENT(FALSE) since its only a stub. * /obj/item/on_update_icon() is set to SHOULD_CALL_PARENT(TRUE) so items have to call it, but in turn I have to call the /atom/on_update_icon() stub to prevent complaints from the linter. Which might not be optimal to say the least? --- code/_helpers/emissive.dm | 4 +++- code/game/atoms.dm | 1 + code/game/objects/item_materials.dm | 6 ++++-- code/game/objects/items/devices/transfer_valve.dm | 6 ++---- code/game/objects/items/weapons/candle/candle.dm | 1 + .../objects/items/weapons/melee/energy_sword.dm | 4 +--- code/game/objects/items/weapons/policetape.dm | 7 +++---- code/modules/augment/active/tool/engineering.dm | 4 ++++ code/modules/awaymissions/pamphlet.dm | 1 + .../modules/clothing/under/accessories/lockets.dm | 1 + .../modules/clothing/under/accessories/storage.dm | 1 + code/modules/clothing/under/accessories/ties.dm | 1 + code/modules/codex/codex_cataloguer.dm | 2 +- code/modules/crafting/_crafting_holder.dm | 1 + code/modules/detectivework/tools/evidencebag.dm | 6 +++--- code/modules/detectivework/tools/rag.dm | 7 ++----- .../tools/sample_kits/fingerprinting.dm | 3 +++ .../detectivework/tools/sample_kits/swabs.dm | 4 ++-- code/modules/detectivework/tools/scene_cards.dm | 1 + code/modules/detectivework/tools/uvlight.dm | 2 +- code/modules/economy/worth_cash.dm | 2 +- code/modules/games/cards.dm | 1 + .../goals/definitions/department_clerical.dm | 1 + code/modules/hydroponics/grown.dm | 4 ++-- .../integrated_electronics/core/assemblies.dm | 6 ++---- .../integrated_electronics/core/detailer.dm | 6 ++---- code/modules/integrated_electronics/core/wirer.dm | 1 + code/modules/materials/material_sheets.dm | 1 + code/modules/mechs/equipment/utility.dm | 1 + code/modules/mining/mine_items.dm | 12 ++++-------- code/modules/mob/grab/grab_object.dm | 1 + code/modules/mob/living/carbon/brain/MMI.dm | 1 + code/modules/mob/living/carbon/brain/robot.dm | 1 + .../mob/living/silicon/robot/robot_items.dm | 1 + .../living/simple_animal/constructs/soulstone.dm | 2 +- .../computers/modular_computer/core.dm | 2 +- .../computers/subtypes/dev_holo.dm | 2 +- code/modules/organs/external/_external_icons.dm | 15 +++++++++------ code/modules/organs/internal/posibrain.dm | 4 ++-- code/modules/paperwork/carbonpaper.dm | 1 + code/modules/paperwork/folders.dm | 6 +++--- code/modules/paperwork/paper.dm | 2 ++ code/modules/paperwork/paper_bundle.dm | 8 +++++--- code/modules/paperwork/paper_sticky.dm | 2 ++ code/modules/paperwork/paperbin.dm | 1 + code/modules/paperwork/pen/retractable_pen.dm | 1 + code/modules/paperwork/photography.dm | 7 ++++--- code/modules/power/cable.dm | 2 +- code/modules/power/cell.dm | 12 +++++------- code/modules/power/fuel_assembly/fuel_assembly.dm | 3 ++- code/modules/power/lighting.dm | 3 ++- code/modules/projectiles/ammunition.dm | 3 ++- code/modules/projectiles/ammunition/boxes.dm | 2 +- code/modules/projectiles/gun.dm | 6 +++--- code/modules/projectiles/guns/energy/capacitor.dm | 2 +- .../modules/projectiles/guns/launcher/crossbow.dm | 7 ++++--- .../projectiles/guns/launcher/pneumatic.dm | 1 + .../projectiles/guns/launcher/syringe_gun.dm | 3 ++- .../reagents/reagent_containers/blood_pack.dm | 10 +++------- .../drinkingglass/drinkingglass.dm | 6 +++--- .../modules/reagents/reagent_containers/drinks.dm | 6 ++---- .../reagents/reagent_containers/drinks/bottle.dm | 1 + .../reagent_containers/drinks/juicebox.dm | 1 + .../reagents/reagent_containers/dropper.dm | 1 + code/modules/reagents/reagent_containers/food.dm | 10 ++++++---- .../reagents/reagent_containers/food/canned.dm | 4 ++++ .../reagent_containers/food/sliceable/pizza.dm | 12 ++++-------- .../reagents/reagent_containers/food/sushi.dm | 15 +++++++++------ code/modules/reagents/reagent_containers/glass.dm | 10 +++------- .../reagents/reagent_containers/hypospray.dm | 9 +++------ code/modules/reagents/reagent_containers/pill.dm | 1 + .../reagents/reagent_containers/syringes.dm | 10 ++-------- code/modules/reagents/storage/pill_bottle.dm | 7 ++----- code/modules/recycling/sortingmachinery.dm | 10 +++++----- code/modules/sealant_gun/sealant_gun.dm | 2 +- code/modules/sealant_gun/sealant_tank.dm | 2 +- .../shield_generators/handheld_diffuser.dm | 1 + code/modules/shuttles/landmarks.dm | 1 + .../xenoarcheaology/tools/ano_device_battery.dm | 2 ++ .../modules/xenoarcheaology/tools/core_sampler.dm | 1 + maps/away/errant_pisces/errant_pisces.dm | 1 + mods/content/psionics/items/id_card.dm | 2 ++ mods/content/xenobiology/slime/items.dm | 1 + mods/species/ascent/items/clustertool.dm | 1 + mods/species/ascent/items/id_control.dm | 1 + mods/species/bayliens/skrell/gear/clustertool.dm | 1 + mods/species/vox/gear/gear_head.dm | 2 +- mods/species/vox/gear/gear_suit.dm | 2 +- mods/species/vox/gear/gun_spikethrower.dm | 1 + 89 files changed, 181 insertions(+), 152 deletions(-) diff --git a/code/_helpers/emissive.dm b/code/_helpers/emissive.dm index bc7534cad05..18ef96c37f8 100644 --- a/code/_helpers/emissive.dm +++ b/code/_helpers/emissive.dm @@ -1,9 +1,11 @@ -/proc/emissive_overlay(var/icon, var/icon_state, var/loc, var/dir) +/proc/emissive_overlay(var/icon, var/icon_state, var/loc, var/dir, var/color) var/image/emissive/I = new(icon, icon_state) if(!isnull(loc)) I.loc = loc if(!isnull(dir)) I.dir = dir + if(!isnull(color)) + I.color = color return I /image/emissive/New() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 2c72eaae7fe..aa42080f630 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -175,6 +175,7 @@ on_update_icon(arglist(args)) /atom/proc/on_update_icon() + SHOULD_CALL_PARENT(FALSE) //Don't call the stub plz return /atom/proc/get_contained_external_atoms() diff --git a/code/game/objects/item_materials.dm b/code/game/objects/item_materials.dm index 60090ed36b0..07e8758d8fb 100644 --- a/code/game/objects/item_materials.dm +++ b/code/game/objects/item_materials.dm @@ -1,10 +1,12 @@ /obj/item/on_update_icon() - overlays.Cut() + . = ..() + SHOULD_CALL_PARENT(TRUE) + cut_overlays() if(applies_material_colour && material) color = material.color alpha = 100 + material.opacity * 255 if(blood_overlay) - overlays += blood_overlay + add_overlay(blood_overlay) /obj/item/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) . = ..() diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 05118fa63e3..7688329b657 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -136,16 +136,14 @@ return icon_state = "valve" - var/list/cur_overlays if(tank_one) - LAZYADD(cur_overlays, new /mutable_appearance(tank_one)) + add_overlay(new/mutable_appearance(tank_one)) if(tank_two) var/icon/J = new(icon, icon_state = "[tank_two.icon_state]") J.Shift(WEST, 13) underlays += J if(attached_device) - LAZYADD(cur_overlays, overlay_image(icon, "device")) - add_overlay(cur_overlays) + add_overlay("device") /obj/item/transfer_valve/proc/remove_tank(obj/item/tank/T) if(tank_one == T) diff --git a/code/game/objects/items/weapons/candle/candle.dm b/code/game/objects/items/weapons/candle/candle.dm index 5858bbddcaa..9ebeb23d8cf 100644 --- a/code/game/objects/items/weapons/candle/candle.dm +++ b/code/game/objects/items/weapons/candle/candle.dm @@ -22,6 +22,7 @@ . = ..() /obj/item/flame/candle/on_update_icon() + SHOULD_CALL_PARENT(FALSE) //#FIXME: Candles handle their lit overlays weirdly switch(wax) if(1500 to INFINITY) diff --git a/code/game/objects/items/weapons/melee/energy_sword.dm b/code/game/objects/items/weapons/melee/energy_sword.dm index 36c46795e76..43e5ed01e4e 100644 --- a/code/game/objects/items/weapons/melee/energy_sword.dm +++ b/code/game/objects/items/weapons/melee/energy_sword.dm @@ -46,9 +46,7 @@ /obj/item/energy_blade/sword/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart) . = ..() if(overlay && active && check_state_in_icon("[overlay.icon_state]-extended-glow", overlay.icon)) - var/image/I = emissive_overlay(overlay.icon, "[overlay.icon_state]-extended-glow") - I.color = blade_color - overlay.overlays += I + overlay.overlays += emissive_overlay(overlay.icon, "[overlay.icon_state]-extended-glow", color = blade_color) // Subtypes /obj/item/energy_blade/sword/green diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index 231aa268f5d..91be444aafa 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -41,8 +41,8 @@ var/global/list/tape_roll_applications = list() var/detail_color /obj/item/tape/on_update_icon() + . = ..() //Possible directional bitflags: 0 (AIRLOCK), 1 (NORTH), 2 (SOUTH), 4 (EAST), 8 (WEST), 3 (VERTICAL), 12 (HORIZONTAL) - overlays.Cut() var/new_state switch (tape_dir) if(0) // AIRLOCK @@ -56,9 +56,7 @@ var/global/list/tape_roll_applications = list() set_dir(tape_dir) icon_state = "[new_state]_[crumpled]" if(detail_overlay) - var/image/I = overlay_image(icon, "[new_state]_[detail_overlay]", flags=RESET_COLOR) - I.color = detail_color - overlays |= I + add_overlay(overlay_image(icon, "[new_state]_[detail_overlay]", detail_color, RESET_COLOR)) /obj/item/tape/Initialize() . = ..() @@ -152,6 +150,7 @@ var/global/list/tape_roll_applications = list() detail_color = COLOR_RED /obj/item/taperoll/on_update_icon() + SHOULD_CALL_PARENT(FALSE) //Paperwork PR will handle this one overlays.Cut() var/image/overlay = image(icon = src.icon) overlay.appearance_flags = RESET_COLOR diff --git a/code/modules/augment/active/tool/engineering.dm b/code/modules/augment/active/tool/engineering.dm index bf8ff6893e9..f733602225e 100644 --- a/code/modules/augment/active/tool/engineering.dm +++ b/code/modules/augment/active/tool/engineering.dm @@ -28,6 +28,7 @@ icon = 'icons/obj/augment_tools.dmi' /obj/item/wirecutters/finger/on_update_icon() + SHOULD_CALL_PARENT(FALSE) return /obj/item/screwdriver/finger @@ -37,6 +38,7 @@ icon = 'icons/obj/augment_tools.dmi' /obj/item/screwdriver/finger/on_update_icon() + SHOULD_CALL_PARENT(FALSE) return /obj/item/crowbar/finger @@ -46,6 +48,7 @@ icon = 'icons/obj/augment_tools.dmi' /obj/item/crowbar/finger/on_update_icon() + SHOULD_CALL_PARENT(FALSE) return /obj/item/wrench/finger @@ -55,6 +58,7 @@ icon = 'icons/obj/augment_tools.dmi' /obj/item/wrench/finger/on_update_icon() + SHOULD_CALL_PARENT(FALSE) return /obj/item/multitool/finger diff --git a/code/modules/awaymissions/pamphlet.dm b/code/modules/awaymissions/pamphlet.dm index 00c704947e3..a76578178fa 100644 --- a/code/modules/awaymissions/pamphlet.dm +++ b/code/modules/awaymissions/pamphlet.dm @@ -35,4 +35,5 @@ //we don't want the silly text overlay! /obj/item/paper/pamphlet/on_update_icon() + SHOULD_CALL_PARENT(FALSE) return \ No newline at end of file diff --git a/code/modules/clothing/under/accessories/lockets.dm b/code/modules/clothing/under/accessories/lockets.dm index 12e26a1d7c7..82df71c5ae7 100644 --- a/code/modules/clothing/under/accessories/lockets.dm +++ b/code/modules/clothing/under/accessories/lockets.dm @@ -22,6 +22,7 @@ return TRUE /obj/item/clothing/accessory/locket/on_update_icon() + . = ..() icon_state = get_world_inventory_state() if(open && check_state_in_icon("[icon_state]-open", icon)) icon_state = "[icon_state]-open" diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 25177457d7e..1d27793545f 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -110,6 +110,7 @@ update_icon() /obj/item/clothing/accessory/storage/knifeharness/on_update_icon() + . = ..() icon_state = get_world_inventory_state() var/contents_count = min(length(contents), 2) if(contents_count > 0 && check_state_in_icon("[icon_state]-[contents_count]", icon)) diff --git a/code/modules/clothing/under/accessories/ties.dm b/code/modules/clothing/under/accessories/ties.dm index 2fef3eefd98..282035a7942 100644 --- a/code/modules/clothing/under/accessories/ties.dm +++ b/code/modules/clothing/under/accessories/ties.dm @@ -81,6 +81,7 @@ . = ..() /obj/item/clothing/accessory/bowtie/on_update_icon() + . = ..() icon_state = get_world_inventory_state() if(!tied && check_state_in_icon("[icon_state]-untied", icon)) icon_state = "[icon_state]-untied" diff --git a/code/modules/codex/codex_cataloguer.dm b/code/modules/codex/codex_cataloguer.dm index 5f7dbf11bf8..d3afaeb8427 100644 --- a/code/modules/codex/codex_cataloguer.dm +++ b/code/modules/codex/codex_cataloguer.dm @@ -154,8 +154,8 @@ return TRUE /obj/item/cataloguer/on_update_icon() + . = ..() icon_state = get_world_inventory_state() - cut_overlays() if(scanning && check_state_in_icon("[icon_state]_glow", icon)) var/image/I if(plane == HUD_PLANE) diff --git a/code/modules/crafting/_crafting_holder.dm b/code/modules/crafting/_crafting_holder.dm index 954afe2d52c..f3659e2378a 100644 --- a/code/modules/crafting/_crafting_holder.dm +++ b/code/modules/crafting/_crafting_holder.dm @@ -75,6 +75,7 @@ update_strings() /obj/item/crafting_holder/on_update_icon() + . = ..() icon = current_crafting_stage.item_icon icon_state = current_crafting_stage.item_icon_state diff --git a/code/modules/detectivework/tools/evidencebag.dm b/code/modules/detectivework/tools/evidencebag.dm index 193a15f4215..5f35e7c0867 100644 --- a/code/modules/detectivework/tools/evidencebag.dm +++ b/code/modules/detectivework/tools/evidencebag.dm @@ -63,15 +63,15 @@ update_icon() /obj/item/evidencebag/on_update_icon() - overlays.Cut() + . = ..() if(stored_item) icon_state = "evidence" //copy the item's appearance and make its layer relative to its parent. var/image/img = image("icon"=stored_item, "layer"=FLOAT_LAYER) // (necessary to stop the underlays appearing under our inventory-HUD slots ~Carn img.pixel_x = 0 img.pixel_y = 0 - overlays += img - overlays += "evidence" //should look nicer for transparent stuff. not really that important, but hey. + add_overlay(img) + add_overlay("evidence") //should look nicer for transparent stuff. not really that important, but hey. desc = "An evidence bag containing [stored_item]." else diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 81afb62c415..11c271c975a 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -57,11 +57,8 @@ SetName("dry [initial(name)]") /obj/item/chems/glass/rag/on_update_icon() - if(on_fire) - icon_state = "raglit" - else - icon_state = "rag" - + . = ..() + icon_state = "rag[on_fire? "lit" : ""]" var/obj/item/chems/drinks/bottle/B = loc if(istype(B)) B.update_icon() diff --git a/code/modules/detectivework/tools/sample_kits/fingerprinting.dm b/code/modules/detectivework/tools/sample_kits/fingerprinting.dm index 0beebc488e0..e65fbaa97b0 100644 --- a/code/modules/detectivework/tools/sample_kits/fingerprinting.dm +++ b/code/modules/detectivework/tools/sample_kits/fingerprinting.dm @@ -20,8 +20,11 @@ possible_evidence_types = list(/datum/forensics/fingerprints) /obj/item/forensics/sample/print/on_update_icon() + . = ..() if(length(evidence)) icon_state = "fingerprint1" + else + icon_state = "fingerprint0" /obj/item/forensics/sample/print/merge_evidence_list(var/list/new_evidence) for(var/datum/fingerprint/newprint in new_evidence) diff --git a/code/modules/detectivework/tools/sample_kits/swabs.dm b/code/modules/detectivework/tools/sample_kits/swabs.dm index 9a2fcbec46c..0a9fdf54b34 100644 --- a/code/modules/detectivework/tools/sample_kits/swabs.dm +++ b/code/modules/detectivework/tools/sample_kits/swabs.dm @@ -80,5 +80,5 @@ ) /obj/item/forensics/sample/swab/on_update_icon() - if(length(evidence)) - icon_state = "swab_used" \ No newline at end of file + . = ..() + icon_state = "swab[length(evidence)? "_used" : ""]" \ No newline at end of file diff --git a/code/modules/detectivework/tools/scene_cards.dm b/code/modules/detectivework/tools/scene_cards.dm index 02b808535db..d4d4e973549 100644 --- a/code/modules/detectivework/tools/scene_cards.dm +++ b/code/modules/detectivework/tools/scene_cards.dm @@ -34,6 +34,7 @@ update_icon() /obj/item/csi_marker/on_update_icon() + . = ..() icon_state = "card[Clamp(number,1,7)]" /obj/item/csi_marker/n1 diff --git a/code/modules/detectivework/tools/uvlight.dm b/code/modules/detectivework/tools/uvlight.dm index 09e76c2d57a..6a71e3302e3 100644 --- a/code/modules/detectivework/tools/uvlight.dm +++ b/code/modules/detectivework/tools/uvlight.dm @@ -38,7 +38,7 @@ update_icon() /obj/item/uv_light/on_update_icon() - cut_overlays() + . = ..() if(on) if(plane == HUD_PLANE) add_overlay("[icon_state]-on") diff --git a/code/modules/economy/worth_cash.dm b/code/modules/economy/worth_cash.dm index 285fcfc5002..e89e314fc1a 100644 --- a/code/modules/economy/worth_cash.dm +++ b/code/modules/economy/worth_cash.dm @@ -59,9 +59,9 @@ L.absorb_cash(src, user) /obj/item/cash/on_update_icon() + . = ..() icon_state = "" var/draw_worth = get_worth() - cut_overlays() var/decl/currency/cur = GET_DECL(currency) var/i = 0 for(var/datum/denomination/denomination in cur.denominations) diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 46b5c5d77c0..c9d7ab8f3a2 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -344,6 +344,7 @@ var/global/list/card_decks = list() to_chat(user, "\The [APPEND_FULLSTOP_IF_NEEDED(P.name)]") /obj/item/hand/on_update_icon(var/direction = 0) + . = ..() if(!cards.len) qdel(src) return diff --git a/code/modules/goals/definitions/department_clerical.dm b/code/modules/goals/definitions/department_clerical.dm index 95bb7e09846..a4e6633d21f 100644 --- a/code/modules/goals/definitions/department_clerical.dm +++ b/code/modules/goals/definitions/department_clerical.dm @@ -116,6 +116,7 @@ . = ..() /obj/item/paperwork/on_update_icon() + . = ..() icon_state = "[icon_state][length(has_signed) || ""]" /obj/item/paperwork/examine(mob/user, distance) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 07676b8dbab..dce93f9e2d0 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -115,15 +115,15 @@ desc += ". Delicious! Probably." /obj/item/chems/food/grown/on_update_icon() + . = ..() if(!seed) return - overlays.Cut() icon_state = "[seed.get_trait(TRAIT_PRODUCT_ICON)]-product" color = seed.get_trait(TRAIT_PRODUCT_COLOUR) if("[seed.get_trait(TRAIT_PRODUCT_ICON)]-leaf" in icon_states('icons/obj/hydroponics/hydroponics_products.dmi')) var/image/fruit_leaves = image('icons/obj/hydroponics/hydroponics_products.dmi',"[seed.get_trait(TRAIT_PRODUCT_ICON)]-leaf") fruit_leaves.color = seed.get_trait(TRAIT_PLANT_COLOUR) - overlays |= fruit_leaves + add_overlay(fruit_leaves) /obj/item/chems/food/grown/Crossed(var/mob/living/M) set waitfor = FALSE diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index ddab3cd1559..5fb24d7dc29 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -287,16 +287,14 @@ return FALSE /obj/item/electronic_assembly/on_update_icon() + . = ..() if(opened) icon_state = initial(icon_state) + "-open" else icon_state = initial(icon_state) - overlays.Cut() if(detail_color == COLOR_ASSEMBLY_BLACK) //Black colored overlay looks almost but not exactly like the base sprite, so just cut the overlay and avoid it looking kinda off. return - var/image/detail_overlay = image('icons/obj/assemblies/electronic_setups.dmi', src,"[icon_state]-color") - detail_overlay.color = detail_color - overlays += detail_overlay + add_overlay(overlay_image('icons/obj/assemblies/electronic_setups.dmi', "[icon_state]-color", detail_color)) /obj/item/electronic_assembly/examine(mob/user) . = ..() diff --git a/code/modules/integrated_electronics/core/detailer.dm b/code/modules/integrated_electronics/core/detailer.dm index a14922c0389..d1d93bb12e3 100644 --- a/code/modules/integrated_electronics/core/detailer.dm +++ b/code/modules/integrated_electronics/core/detailer.dm @@ -33,10 +33,8 @@ update_icon() /obj/item/integrated_electronics/detailer/on_update_icon() - overlays.Cut() - var/image/detail_overlay = image('icons/obj/assemblies/electronic_tools.dmi',src, "detailer-color") - detail_overlay.color = detail_color - overlays += detail_overlay + . = ..() + add_overlay('icons/obj/assemblies/electronic_tools.dmi', "detailer-color", detail_color) /obj/item/integrated_electronics/detailer/attack_self(mob/user) var/color_choice = input(user, "Select color.", "Assembly Detailer") as null|anything in color_list diff --git a/code/modules/integrated_electronics/core/wirer.dm b/code/modules/integrated_electronics/core/wirer.dm index c9ae88ba9bb..6f10e46534f 100644 --- a/code/modules/integrated_electronics/core/wirer.dm +++ b/code/modules/integrated_electronics/core/wirer.dm @@ -22,6 +22,7 @@ ) /obj/item/integrated_electronics/wirer/on_update_icon() + . = ..() icon_state = "wirer-[mode]" /obj/item/integrated_electronics/wirer/proc/wire(var/datum/integrated_io/io, mob/user) diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index 6160bccc271..c3f27eefe47 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -131,6 +131,7 @@ return ..() /obj/item/stack/material/on_update_icon() + . = ..() color = material.color alpha = 100 + max(1, amount/25)*(material.opacity * 255) update_state_from_amount() diff --git a/code/modules/mechs/equipment/utility.dm b/code/modules/mechs/equipment/utility.dm index 31f0af6700d..54f3158fbbf 100644 --- a/code/modules/mechs/equipment/utility.dm +++ b/code/modules/mechs/equipment/utility.dm @@ -229,6 +229,7 @@ ..() /obj/item/mech_equipment/light/on_update_icon() + . = ..() if(on) icon_state = "[initial(icon_state)]-on" set_light(l_range, l_power) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 25ed448d3a5..1873e42ddb7 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -48,7 +48,7 @@ var/hardware_color /obj/item/pickaxe/on_update_icon() - cut_overlays() + . = ..() if(build_from_parts) color = hardware_color var/image/I = image(icon, "[icon_state]-handle") @@ -251,22 +251,18 @@ update_icon() /obj/item/stack/flag/on_update_icon() - overlays.Cut() + . = ..() if(upright) pixel_x = 0 pixel_y = 0 icon_state = "base" - var/image/addon = emissive_overlay(icon = icon, icon_state = "glowbit") - addon.color = light_color - overlays += addon + add_overlay(emissive_overlay(icon = icon, icon_state = "glowbit", color = light_color)) set_light(2, 0.1) // Very dim so the rest of the thingie is barely visible - if the turf is completely dark, you can't see anything on it, no matter what else pixel_x = rand(-randpixel, randpixel) pixel_y = rand(-randpixel, randpixel) icon_state = "folded" - var/image/addon = image(icon = icon, icon_state = "basebit") - addon.color = light_color - overlays += addon + add_overlay(overlay_image(icon, "basebit", light_color)) set_light(0) /obj/item/stack/flag/proc/knock_down() diff --git a/code/modules/mob/grab/grab_object.dm b/code/modules/mob/grab/grab_object.dm index 2091b1b6aec..f0661bbca45 100644 --- a/code/modules/mob/grab/grab_object.dm +++ b/code/modules/mob/grab/grab_object.dm @@ -230,6 +230,7 @@ update_icon() /obj/item/grab/on_update_icon() + . = ..() if(current_grab.icon) icon = current_grab.icon if(current_grab.icon_state) diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index e50159495a5..06fdede4628 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -182,4 +182,5 @@ ..() /obj/item/mmi/on_update_icon() + . = ..() icon_state = brainmob ? "mmi_full" : "mmi_empty" diff --git a/code/modules/mob/living/carbon/brain/robot.dm b/code/modules/mob/living/carbon/brain/robot.dm index 45420361c4c..1c4a5490ec4 100644 --- a/code/modules/mob/living/carbon/brain/robot.dm +++ b/code/modules/mob/living/carbon/brain/robot.dm @@ -11,4 +11,5 @@ src.brainmob.real_name = src.brainmob.name /obj/item/mmi/digital/robot/on_update_icon() + . = ..() icon_state = initial(icon_state) diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index d690a24f568..e6512d2a18c 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -87,6 +87,7 @@ activate_strobe() /obj/item/party_light/on_update_icon() + . = ..() if (activated) icon_state = "partylight-on" set_light(7, 1) diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm index c3898d01386..d1cd8d34940 100644 --- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm +++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm @@ -18,7 +18,7 @@ . = ..(mapload) /obj/item/soulstone/on_update_icon() - cut_overlays() + . = ..() if(full == SOULSTONE_ESSENCE) add_overlay("[icon_state]-glow") else if(full == SOULSTONE_CRACKED) diff --git a/code/modules/modular_computers/computers/modular_computer/core.dm b/code/modules/modular_computers/computers/modular_computer/core.dm index 494d12656b4..6fd9c50e844 100644 --- a/code/modules/modular_computers/computers/modular_computer/core.dm +++ b/code/modules/modular_computers/computers/modular_computer/core.dm @@ -89,7 +89,7 @@ return 1 /obj/item/modular_computer/on_update_icon() - cut_overlays() + . = ..() for(var/decal_state in decals) var/image/I = image(icon, "[icon_state]-[decal_state]") I.color = decals[decal_state] diff --git a/code/modules/modular_computers/computers/subtypes/dev_holo.dm b/code/modules/modular_computers/computers/subtypes/dev_holo.dm index 084ea62792e..f848b0176da 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_holo.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_holo.dm @@ -57,7 +57,7 @@ // Visual. /obj/item/modular_computer/holotablet/on_update_icon() - cut_overlays() + . = ..() var/datum/extension/interactive/os/os = get_extension(src, /datum/extension/interactive/os) var/datum/extension/assembly/modular_computer/assembly = get_extension(src, /datum/extension/assembly) if(assembly && assembly.enabled) diff --git a/code/modules/organs/external/_external_icons.dm b/code/modules/organs/external/_external_icons.dm index 1d888409809..8f0ea8a9d7c 100644 --- a/code/modules/organs/external/_external_icons.dm +++ b/code/modules/organs/external/_external_icons.dm @@ -4,13 +4,14 @@ var/global/list/limb_icon_cache = list() return ..(SOUTH) /obj/item/organ/external/proc/compile_icon() - overlays.Cut() + //#FIXME: We REALLY shouldn't be messing with overlays outside on_update_icon. And on_update_icon doesn't call this. + cut_overlays() // This is a kludge, only one icon has more than one generation of children though. for(var/obj/item/organ/external/organ in contents) if(organ.children && organ.children.len) for(var/obj/item/organ/external/child in organ.children) - overlays += child.mob_icon - overlays += organ.mob_icon + add_overlay(child.mob_icon) + add_overlay(organ.mob_icon) /obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/human) skin_tone = null @@ -59,7 +60,8 @@ var/global/list/limb_icon_cache = list() if (mark_style.draw_target == MARKING_TARGET_SKIN) var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") mark_s.Blend(markings[M], mark_style.blend) - overlays |= mark_s //So when it's not on your body, it has icons + //#TODO: This probably should be added to a list that's applied on update icon, otherwise its gonna act really wonky! + add_overlay(mark_s) //So when it's not on your body, it has icons mob_icon.Blend(mark_s, mark_style.layer_blend) //So when it's on your body, it has icons icon_cache_key += "[M][markings[M]]" @@ -78,7 +80,7 @@ var/global/list/limb_icon_cache = list() icon = bodytype.get_base_icon(owner) /obj/item/organ/external/on_update_icon(var/regenerate = 0) - + . = ..() icon_state = "[icon_name]" icon_cache_key = "[icon_state]_[species ? species.name : "unknown"][render_alpha]" if(model) @@ -93,7 +95,8 @@ var/global/list/limb_icon_cache = list() if (mark_style.draw_target == MARKING_TARGET_SKIN) var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") mark_s.Blend(markings[M], mark_style.blend) - overlays |= mark_s //So when it's not on your body, it has icons + //#TODO: This probably should be added to a list that's applied on update icon, otherwise its gonna act really wonky! + add_overlay(mark_s) //So when it's not on your body, it has icons mob_icon.Blend(mark_s, mark_style.layer_blend) //So when it's on your body, it has icons icon_cache_key += "[M][markings[M]]" diff --git a/code/modules/organs/internal/posibrain.dm b/code/modules/organs/internal/posibrain.dm index 860e4b03f0b..8300c14d2fe 100644 --- a/code/modules/organs/internal/posibrain.dm +++ b/code/modules/organs/internal/posibrain.dm @@ -138,14 +138,14 @@ update_icon() /obj/item/organ/internal/posibrain/on_update_icon() + . = ..() if(src.brainmob && src.brainmob.key) icon_state = "posibrain-occupied" else icon_state = "posibrain" - overlays.Cut() if(shackle) - overlays |= image('icons/obj/assemblies.dmi', "posibrain-shackles") + add_overlay("posibrain-shackles") /obj/item/organ/internal/posibrain/proc/transfer_identity(var/mob/living/carbon/H) if(H && H.mind) diff --git a/code/modules/paperwork/carbonpaper.dm b/code/modules/paperwork/carbonpaper.dm index d5b06c9f0e2..1750e17c040 100644 --- a/code/modules/paperwork/carbonpaper.dm +++ b/code/modules/paperwork/carbonpaper.dm @@ -7,6 +7,7 @@ /obj/item/paper/carbon/on_update_icon() + . = ..() if(iscopy) if(info) icon_state = "cpaper_words" diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index b796549371a..d1b156514a8 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -24,10 +24,9 @@ icon_state = "folder_cyan" /obj/item/folder/on_update_icon() - overlays.Cut() + . = ..() if(contents.len) - overlays += "folder_paper" - return + add_overlay("folder_paper") /obj/item/folder/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/paper) || istype(W, /obj/item/photo) || istype(W, /obj/item/paper_bundle)) @@ -112,6 +111,7 @@ var/sealed = 1 /obj/item/folder/envelope/on_update_icon() + . = ..() if(sealed) icon_state = "envelope_sealed" else diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index c3eed3edf98..4eac6a3e55c 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -71,6 +71,7 @@ updateinfolinks() /obj/item/paper/on_update_icon() + . = ..() if(icon_state == "paper_talisman") return else if(info) @@ -479,6 +480,7 @@ icon_state = "scrap" /obj/item/paper/crumpled/on_update_icon() + SHOULD_CALL_PARENT(FALSE) return /obj/item/paper/crumpled/bloody diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index e42f79b22d4..2f13750dc76 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -206,9 +206,11 @@ /obj/item/paper_bundle/on_update_icon() + . = ..() var/obj/item/paper/P = pages[1] icon_state = P.icon_state - overlays = P.overlays + if(length(P.overlays)) + set_overlays(P.overlays.Copy()) underlays.Cut() var/i = 0 var/photo @@ -227,12 +229,12 @@ var/obj/item/photo/Ph = O img = Ph.tiny photo = 1 - overlays += img + add_overlay(img) if(i>1) desc = "[i] papers clipped to each other." else desc = "A single sheet of paper." if(photo) desc += "\nThere is a photo attached to it." - overlays += image('icons/obj/bureaucracy.dmi', "clip") + add_overlay(image('icons/obj/bureaucracy.dmi', "clip")) return diff --git a/code/modules/paperwork/paper_sticky.dm b/code/modules/paperwork/paper_sticky.dm index a4b8c19311e..9583f2f42f3 100644 --- a/code/modules/paperwork/paper_sticky.dm +++ b/code/modules/paperwork/paper_sticky.dm @@ -22,6 +22,7 @@ update_matter() /obj/item/sticky_pad/on_update_icon() + . = ..() if(papers <= 15) icon_state = "pad_empty" else if(papers <= 50) @@ -106,6 +107,7 @@ . = ..() /obj/item/paper/sticky/on_update_icon() + . = ..() if(icon_state != "scrap") icon_state = info ? "paper_words" : "paper" diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 4e90023a5ec..46d9522bf5c 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -95,6 +95,7 @@ /obj/item/paper_bin/on_update_icon() + . = ..() if(amount < 1) icon_state = "paper_bin0" else diff --git a/code/modules/paperwork/pen/retractable_pen.dm b/code/modules/paperwork/pen/retractable_pen.dm index c96f0c08918..3e728611f78 100644 --- a/code/modules/paperwork/pen/retractable_pen.dm +++ b/code/modules/paperwork/pen/retractable_pen.dm @@ -23,6 +23,7 @@ desc = "It's a retractable [stroke_colour_name] [medium_name] pen." /obj/item/pen/retractable/on_update_icon() + . = ..() icon_state = get_world_inventory_state() if(pen_flag & PEN_FLAG_ACTIVE) icon_state = "[icon_state]-on" diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 29e6bd4ff97..fef285cc9e3 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -44,14 +44,14 @@ var/global/photo_count = 0 user.examinate(src) /obj/item/photo/on_update_icon() - overlays.Cut() + . = ..() var/scale = 8/(photo_size*32) var/image/small_img = image(img) small_img.transform *= scale small_img.pixel_x = -32*(photo_size-1)/2 - 3 small_img.pixel_y = -32*(photo_size-1)/2 - overlays |= small_img - + add_overlay(small_img) + tiny = image(img) tiny.transform *= 0.5*scale tiny.underlays += image('icons/obj/bureaucracy.dmi',"photo") @@ -150,6 +150,7 @@ var/global/photo_count = 0 var/size = 3 /obj/item/camera/on_update_icon() + . = ..() var/datum/extension/base_icon_state/bis = get_extension(src, /datum/extension/base_icon_state) if(on) icon_state = "[bis.base_icon_state]" diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 62c3fa54998..9984e31ad0c 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -548,7 +548,7 @@ By design, d1 is the smallest direction and d2 is the highest return ..() /obj/item/stack/cable_coil/on_update_icon() - cut_overlays() + . = ..() if (!color) var/list/possible_cable_colours = get_global_cable_colors() color = possible_cable_colours[pick(possible_cable_colours)] diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index dd138e7af5d..66c00a53646 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -39,7 +39,7 @@ return use(cell_amt) / CELLRATE /obj/item/cell/on_update_icon() - + . = ..() var/new_overlay_state = null switch(percent()) if(95 to 100) @@ -51,9 +51,8 @@ if(new_overlay_state != overlay_state) overlay_state = new_overlay_state - overlays.Cut() if(overlay_state) - overlays += image('icons/obj/power.dmi', overlay_state) + add_overlay(overlay_state) /obj/item/cell/proc/percent() // return % charge of cell return maxcharge && (100.0*charge/maxcharge) @@ -308,7 +307,6 @@ #endif /obj/item/cell/gun/on_update_icon() - cut_overlays() - var/image/A = image('icons/obj/power.dmi', icon_state = "gunbattery_charge") - A.color = gradient("#fa6a0a", "#9cdb43", clamp(percent(), 0, 100) ) //Color the battery charging overlay against the percentage of the battery capacity. However the index of gradient() is set to 1, instead of 100, so we divide it by 100. Colors were chosen by the sprite artist. - add_overlay(A) + . = ..() + //Color the battery charging overlay against the percentage of the battery capacity. However the index of gradient() is set to 1, instead of 100, so we divide it by 100. Colors were chosen by the sprite artist. + add_overlay(overlay_image(icon, "gunbattery_charge", gradient("#fa6a0a", "#9cdb43", clamp(percent(), 0, 100) ))) diff --git a/code/modules/power/fuel_assembly/fuel_assembly.dm b/code/modules/power/fuel_assembly/fuel_assembly.dm index 38fd9d0e61c..845948bed58 100644 --- a/code/modules/power/fuel_assembly/fuel_assembly.dm +++ b/code/modules/power/fuel_assembly/fuel_assembly.dm @@ -48,6 +48,7 @@ update_icon() /obj/item/fuel_assembly/on_update_icon() + . = ..() icon_state = "fuel_assembly" if(material) color = material.color @@ -59,7 +60,7 @@ color = MixColors(colors) var/image/I = image(icon, "fuel_assembly_bracket") I.appearance_flags |= RESET_COLOR - set_overlays(I) + add_overlay(I) /obj/item/fuel_assembly/Process() if(!radioactivity) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index ac5d222b292..4b54fc0fa3d 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -586,6 +586,7 @@ // update the icon state and description of the light /obj/item/light/on_update_icon() + . = ..() color = b_color var/broken switch(status) @@ -601,7 +602,7 @@ broken = TRUE var/image/I = image(icon, src, "[base_state]_attachment[broken ? "_broken" : ""]") I.color = null - overlays += I + add_overlay(I) /obj/item/light/Initialize(mapload, obj/machinery/light/fixture = null) . = ..() diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 1107fad09f3..a343f0a3888 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -99,8 +99,8 @@ else ..() /obj/item/ammo_casing/on_update_icon() + . = ..() if(use_single_icon) - cut_overlays() if(BB) var/image/I = overlay_image(icon, "[icon_state]-bullet", bullet_color, flags=RESET_COLOR) I.dir = dir @@ -210,6 +210,7 @@ return /obj/item/ammo_magazine/on_update_icon() + . = ..() if(multiple_sprites) //find the lowest key greater than or equal to stored_ammo.len var/new_state = null diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index e17ea9c1c10..cd4edddfc0c 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -15,7 +15,7 @@ ) /obj/item/ammo_magazine/speedloader/on_update_icon() - cut_overlays() + . = ..() if(!length(stored_ammo)) return switch(icon_state) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index b66d1cbb81d..11baec8d436 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -157,15 +157,15 @@ /obj/item/gun/on_update_icon() var/mob/living/M = loc - overlays.Cut() + . = ..() update_base_icon() if(istype(M)) if(has_safety && M.skill_check(SKILL_WEAPONS,SKILL_BASIC)) - overlays += image('icons/obj/guns/gui.dmi',"safety[safety()]") + add_overlay(image('icons/obj/guns/gui.dmi',"safety[safety()]")) if(src in M.get_held_items()) M.update_inv_hands() if(safety_icon) - overlays += get_safety_indicator() + add_overlay(get_safety_indicator()) /obj/item/gun/proc/update_base_icon() diff --git a/code/modules/projectiles/guns/energy/capacitor.dm b/code/modules/projectiles/guns/energy/capacitor.dm index 808155a7318..c501d18f789 100644 --- a/code/modules/projectiles/guns/energy/capacitor.dm +++ b/code/modules/projectiles/guns/energy/capacitor.dm @@ -185,7 +185,7 @@ var/global/list/laser_wavelengths . = round(power_supply?.charge / (total_charge_cost / capacitor_charge_constant)) /obj/item/gun/energy/capacitor/on_update_icon() - cut_overlays() + . = ..() var/image/I = image(icon, "[icon_state]-wiring") I.color = wiring_color I.appearance_flags |= RESET_COLOR diff --git a/code/modules/projectiles/guns/launcher/crossbow.dm b/code/modules/projectiles/guns/launcher/crossbow.dm index c61d665f7a5..64ab8343629 100644 --- a/code/modules/projectiles/guns/launcher/crossbow.dm +++ b/code/modules/projectiles/guns/launcher/crossbow.dm @@ -193,6 +193,7 @@ cell.use(500) /obj/item/gun/launcher/crossbow/on_update_icon() + . = ..() if(tension > 1) icon_state = "[get_world_inventory_state()]-drawn" else if(bolt) @@ -263,10 +264,10 @@ update_icon() /obj/item/gun/launcher/crossbow/rapidcrossbowdevice/on_update_icon() - overlays.Cut() + . = ..() if(bolt) - overlays += "[get_world_inventory_state()]-bolt" + add_overlay("[get_world_inventory_state()]-bolt") var/ratio = 0 if(stored_matter < boltcost) @@ -274,7 +275,7 @@ else ratio = stored_matter / max_stored_matter ratio = max(round(ratio, 0.25) * 100, 25) - overlays += "[get_world_inventory_state()][ratio]" + add_overlay("[get_world_inventory_state()][ratio]") if(tension > 1) icon_state = "[get_world_inventory_state()]-drawn" diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index 9cabeb7394a..b4687d6b6b6 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -126,6 +126,7 @@ ..() /obj/item/gun/launcher/pneumatic/on_update_icon() + . = ..() if(tank) icon_state = "[get_world_inventory_state()]-tank" else diff --git a/code/modules/projectiles/guns/launcher/syringe_gun.dm b/code/modules/projectiles/guns/launcher/syringe_gun.dm index 9d4a7d40f81..d9d545fcfb5 100644 --- a/code/modules/projectiles/guns/launcher/syringe_gun.dm +++ b/code/modules/projectiles/guns/launcher/syringe_gun.dm @@ -14,6 +14,7 @@ var/obj/item/chems/syringe/syringe /obj/item/syringe_cartridge/on_update_icon() + . = ..() underlays.Cut() if(syringe) underlays += image(syringe.icon, src, syringe.icon_state) @@ -148,7 +149,7 @@ release_force = 10 /obj/item/gun/launcher/syringe/disguised/on_update_icon() - cut_overlays() + . = ..() add_overlay("[icon_state]-loaded") /obj/item/gun/launcher/syringe/disguised/examine(mob/user, distance) diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index c6dc35bae99..dcd401438c2 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -30,15 +30,11 @@ w_class = ITEM_SIZE_TINY /obj/item/chems/ivbag/on_update_icon() - overlays.Cut() + . = ..() var/percent = round(reagents.total_volume / volume * 100) if(reagents.total_volume) - var/image/filling = image('icons/obj/bloodpack.dmi', "[round(percent,25)]") - filling.color = reagents.get_color() - overlays += filling - overlays += image('icons/obj/bloodpack.dmi', "top") - if(attached) - overlays += image('icons/obj/bloodpack.dmi', "dongle") + add_overlay(overlay_image(icon, "[round(percent,25)]", reagents.get_color())) + add_overlay(attached? "dongle" : "top") /obj/item/chems/ivbag/handle_mouse_drop(atom/over, mob/user) if(ismob(loc)) diff --git a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm index cfdd7a775ac..2e41511b3ca 100644 --- a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm @@ -125,8 +125,8 @@ var/global/const/DRINK_ICON_NOISY = "noise" return I /obj/item/chems/drinks/glass2/on_update_icon() + . = ..() underlays.Cut() - overlays.Cut() if (LAZYLEN(reagents?.reagent_volumes) > 0) var/decl/material/R = reagents.get_primary_reagent_decl() @@ -155,11 +155,11 @@ var/global/const/DRINK_ICON_NOISY = "noise" var/image/filling = get_filling_overlay(amnt, R.glass_icon) filling.color = reagents.get_color() if(filling_overlayed) - overlays += filling + add_overlay(filling) else underlays += filling - overlays += over_liquid + add_overlay(over_liquid) var/side = "left" for(var/item in extras) diff --git a/code/modules/reagents/reagent_containers/drinks.dm b/code/modules/reagents/reagent_containers/drinks.dm index ba6c4e6a937..9a47a2e7eb0 100644 --- a/code/modules/reagents/reagent_containers/drinks.dm +++ b/code/modules/reagents/reagent_containers/drinks.dm @@ -108,12 +108,10 @@ desc = R?.glass_desc || initial(desc) /obj/item/chems/drinks/on_update_icon() - overlays.Cut() + . = ..() if(LAZYLEN(reagents.reagent_volumes)) if(filling_states) - var/image/filling = image(icon, src, "[base_icon][get_filling_state()]") - filling.color = reagents.get_color() - overlays += filling + add_overlay(overlay_image(icon, "[base_icon][get_filling_state()]", reagents.get_color())) else SetName(initial(name)) desc = initial(desc) diff --git a/code/modules/reagents/reagent_containers/drinks/bottle.dm b/code/modules/reagents/reagent_containers/drinks/bottle.dm index 0ac78b52e8c..0fb0608b496 100644 --- a/code/modules/reagents/reagent_containers/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/drinks/bottle.dm @@ -143,6 +143,7 @@ ..() /obj/item/chems/drinks/bottle/on_update_icon() + . = ..() underlays.Cut() if(rag) var/underlay_image = image(icon='icons/obj/drinks.dmi', icon_state=rag.on_fire? "[rag_underlay]_lit" : rag_underlay) diff --git a/code/modules/reagents/reagent_containers/drinks/juicebox.dm b/code/modules/reagents/reagent_containers/drinks/juicebox.dm index d068a6dd155..e6d603d6cf5 100644 --- a/code/modules/reagents/reagent_containers/drinks/juicebox.dm +++ b/code/modules/reagents/reagent_containers/drinks/juicebox.dm @@ -27,6 +27,7 @@ update_icon() /obj/item/chems/drinks/juicebox/on_update_icon() + SHOULD_CALL_PARENT(FALSE) var/mutable_appearance/new_appearance = new(src) new_appearance.appearance_flags = RESET_COLOR new_appearance.color = primary_color diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 1d6a4180c1c..89f6abead24 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -83,6 +83,7 @@ update_icon() /obj/item/chems/dropper/on_update_icon() + . = ..() if(reagents.total_volume) icon_state = "dropper1" else diff --git a/code/modules/reagents/reagent_containers/food.dm b/code/modules/reagents/reagent_containers/food.dm index 88b9bbc447e..97b24659b56 100644 --- a/code/modules/reagents/reagent_containers/food.dm +++ b/code/modules/reagents/reagent_containers/food.dm @@ -265,8 +265,10 @@ update_icon() /obj/item/chems/food/on_update_icon() - cut_overlays() + . = ..() + //Since other things that don't have filling override this, slap it into its own proc to avoid the overhead of scanning through the icon file + apply_filling_overlay() //#TODO: Maybe generalise food item icons. + +/obj/item/chems/food/proc/apply_filling_overlay() if(check_state_in_icon("[icon_state]_filling", icon)) - var/image/I = image(icon, "[icon_state]_filling") - I.color = filling_color - add_overlay(I) \ No newline at end of file + add_overlay(overlay_image(icon, "[icon_state]_filling", filling_color)) \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/food/canned.dm b/code/modules/reagents/reagent_containers/food/canned.dm index 72eefe54548..8f88959d0cd 100644 --- a/code/modules/reagents/reagent_containers/food/canned.dm +++ b/code/modules/reagents/reagent_containers/food/canned.dm @@ -68,10 +68,14 @@ to_chat(user, SPAN_WARNING("You need a can-opener to open this!")) /obj/item/chems/food/can/on_update_icon() + . = ..() icon_state = initial(icon_state) if(ATOM_IS_OPEN_CONTAINER(src)) icon_state = "[initial(icon_state)]-open" +/obj/item/chems/food/can/apply_filling_overlay() + return //Bypass searching through the whole icon file for a filling icon + //Just a short line of Canned Consumables, great for treasure in faraway abandoned outposts /obj/item/chems/food/can/beef diff --git a/code/modules/reagents/reagent_containers/food/sliceable/pizza.dm b/code/modules/reagents/reagent_containers/food/sliceable/pizza.dm index e6edbf09fbc..44586435d24 100644 --- a/code/modules/reagents/reagent_containers/food/sliceable/pizza.dm +++ b/code/modules/reagents/reagent_containers/food/sliceable/pizza.dm @@ -135,8 +135,7 @@ var/boxtag = "" /obj/item/pizzabox/on_update_icon() - - overlays.Cut() + . = ..() // Set appropriate description if( open && pizza ) @@ -162,10 +161,9 @@ icon_state = "pizzabox_open" if( pizza ) - var/image/pizzaimg = image("food.dmi", icon_state = pizza.icon_state) + var/mutable_appearance/pizzaimg = new(pizza) pizzaimg.pixel_y = -3 - overlays += pizzaimg - + add_overlay(pizzaimg) return else // Stupid code because byondcode sucks @@ -179,9 +177,7 @@ doimgtag = 1 if( doimgtag ) - var/image/tagimg = image("food.dmi", icon_state = "pizzabox_tag") - tagimg.pixel_y = boxes.len * 3 - overlays += tagimg + add_overlay(image("food.dmi", "pizzabox_tag", pixel_y = (boxes.len * 3))) icon_state = "pizzabox[boxes.len+1]" diff --git a/code/modules/reagents/reagent_containers/food/sushi.dm b/code/modules/reagents/reagent_containers/food/sushi.dm index 5683153c11a..3a70b1a54c8 100644 --- a/code/modules/reagents/reagent_containers/food/sushi.dm +++ b/code/modules/reagents/reagent_containers/food/sushi.dm @@ -42,8 +42,12 @@ update_icon() /obj/item/chems/food/sushi/on_update_icon() + . = ..() name = "[fish_type] sushi" - overlays = list("[fish_type]", "nori") + add_overlay(list("[fish_type]", "nori")) + +/obj/item/chems/food/sushi/apply_filling_overlay() + return //Bypass searching through the whole icon file for a filling icon ///////////// // SASHIMI // @@ -65,15 +69,14 @@ update_icon() /obj/item/chems/food/sashimi/on_update_icon() + . = ..() icon_state = "sashimi_base" var/list/adding = list() var/slice_offset = (slices-1)*2 for(var/slice = 1 to slices) - var/image/I = image(icon = icon, icon_state = "sashimi") - I.pixel_x = slice_offset-((slice-1)*4) - I.pixel_y = I.pixel_x - adding += I - overlays = adding + var/offset = slice_offset-((slice-1)*4) + adding += image(icon = icon, icon_state = "sashimi", pixel_x = offset, pixel_y = offset) + add_overlay(adding) /obj/item/chems/food/sashimi/attackby(var/obj/item/I, var/mob/user) if(!(locate(/obj/structure/table) in loc)) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 26998ead25f..11a1ea0baaa 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -146,12 +146,8 @@ return ..() /obj/item/chems/glass/bucket/on_update_icon() - var/new_overlays + . = ..() if (!ATOM_IS_OPEN_CONTAINER(src)) - var/image/lid = image(icon, src, "lid_[initial(icon_state)]") - LAZYADD(new_overlays, lid) + add_overlay("lid_[initial(icon_state)]") else if(reagents && reagents.total_volume && round((reagents.total_volume / volume) * 100) > 80) - var/image/filling = image('icons/obj/reagentfillings.dmi', src, "bucket") - filling.color = reagents.get_color() - LAZYADD(new_overlays, filling) - overlays = new_overlays + add_overlay(overlay_image('icons/obj/reagentfillings.dmi', "bucket", reagents.get_color())) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 3ee9da59832..efd8673bc9d 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -167,12 +167,9 @@ update_icon() /obj/item/chems/hypospray/autoinjector/on_update_icon() - overlays.Cut() - if(reagents.total_volume > 0) - icon_state = "[initial(icon_state)]1" - else - icon_state = "[initial(icon_state)]0" - overlays+= overlay_image(icon,"injector_band",band_color,RESET_COLOR) + . = ..() + icon_state = "[initial(icon_state)][(reagents?.total_volume) > 0]" + add_overlay(overlay_image(icon, "injector_band", band_color, RESET_COLOR)) /obj/item/chems/hypospray/autoinjector/examine(mob/user) . = ..(user) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 0261f472f76..48c5c9435da 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -26,6 +26,7 @@ /obj/item/chems/pill/proc/initialize_reagents() /obj/item/chems/pill/on_update_icon() + . = ..() if(icon_state in colorizable_icon_states) color = reagents.get_color() alpha = 255 // above probably reset our alpha diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 02b2fac8d6d..dbff0448c00 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -80,7 +80,7 @@ handleTarget(target, user) /obj/item/chems/syringe/on_update_icon() - overlays.Cut() + . = ..() underlays.Cut() if(mode == SYRINGE_BROKEN) @@ -91,13 +91,7 @@ if (reagents.total_volume == 0) rounded_vol = 0 if(ismob(loc)) - var/injoverlay - switch(mode) - if (SYRINGE_DRAW) - injoverlay = "draw" - if (SYRINGE_INJECT) - injoverlay = "inject" - overlays += injoverlay + add_overlay((mode == SYRINGE_DRAW)? "draw" : "inject") icon_state = "[initial(icon_state)][rounded_vol]" item_state = "syringe_[rounded_vol]" diff --git a/code/modules/reagents/storage/pill_bottle.dm b/code/modules/reagents/storage/pill_bottle.dm index c64011d1f45..99136dc5df3 100644 --- a/code/modules/reagents/storage/pill_bottle.dm +++ b/code/modules/reagents/storage/pill_bottle.dm @@ -70,9 +70,6 @@ update_icon() /obj/item/storage/pill_bottle/on_update_icon() - cut_overlays() + . = ..() if(wrapper_color) - var/image/I = image(icon, "pillbottle_wrap") - I.color = wrapper_color - I.appearance_flags |= RESET_COLOR - add_overlay(I) \ No newline at end of file + add_overlay(overlay_image(icon, "pillbottle_wrap", wrapper_color, RESET_COLOR)) \ No newline at end of file diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 54580c1d7c9..2cb91359747 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -199,14 +199,14 @@ return /obj/item/smallDelivery/on_update_icon() - overlays.Cut() + . = ..() if((nameset || examtext) && icon_state != "deliverycrate1") - var/image/I = new/image(icon,"delivery_label") + var/image/I = new/image(icon, "delivery_label") if(icon_state == "deliverycrate5") I.pixel_y = -1 - overlays += I + add_overlay(I) if(src.sortTag) - var/image/I = new/image(icon,"delivery_tag") + var/image/I = new/image(icon, "delivery_tag") switch(icon_state) if("deliverycrate1") I.pixel_y = -5 @@ -221,7 +221,7 @@ I.pixel_y = 3 if("deliverycrate5") I.pixel_y = -3 - overlays += I + add_overlay(I) /obj/item/smallDelivery/examine(mob/user, distance) . = ..() diff --git a/code/modules/sealant_gun/sealant_gun.dm b/code/modules/sealant_gun/sealant_gun.dm index 5ec4fb1ed3b..367724e7a08 100644 --- a/code/modules/sealant_gun/sealant_gun.dm +++ b/code/modules/sealant_gun/sealant_gun.dm @@ -18,7 +18,7 @@ /obj/item/gun/launcher/sealant/on_update_icon() update_world_inventory_state() - cut_overlays() + . = ..() if(loaded_tank) add_overlay("[icon_state]-tank") diff --git a/code/modules/sealant_gun/sealant_tank.dm b/code/modules/sealant_gun/sealant_tank.dm index 7a8c239e5ac..1aa6d5bf934 100644 --- a/code/modules/sealant_gun/sealant_tank.dm +++ b/code/modules/sealant_gun/sealant_tank.dm @@ -7,7 +7,7 @@ var/max_foam_charges = 60 /obj/item/sealant_tank/on_update_icon() - cut_overlays() + . = ..() add_overlay("fill_[FLOOR((foam_charges/max_foam_charges) * 5)]") /obj/item/sealant_tank/examine(mob/user, distance) diff --git a/code/modules/shield_generators/handheld_diffuser.dm b/code/modules/shield_generators/handheld_diffuser.dm index 3de174032b2..03a2919b3e3 100644 --- a/code/modules/shield_generators/handheld_diffuser.dm +++ b/code/modules/shield_generators/handheld_diffuser.dm @@ -15,6 +15,7 @@ var/enabled = 0 /obj/item/shield_diffuser/on_update_icon() + . = ..() if(enabled) icon_state = "hdiffuser_on" else diff --git a/code/modules/shuttles/landmarks.dm b/code/modules/shuttles/landmarks.dm index afed3ebe384..93834fe27f2 100644 --- a/code/modules/shuttles/landmarks.dm +++ b/code/modules/shuttles/landmarks.dm @@ -197,6 +197,7 @@ var/global/list/shuttle_landmarks = list() update_icon() /obj/item/spaceflare/on_update_icon() + . = ..() if(active) icon_state = "bluflare_on" set_light(6, 2, "#85d1ff") \ No newline at end of file diff --git a/code/modules/xenoarcheaology/tools/ano_device_battery.dm b/code/modules/xenoarcheaology/tools/ano_device_battery.dm index f1fe52f798f..270cdfc8b68 100644 --- a/code/modules/xenoarcheaology/tools/ano_device_battery.dm +++ b/code/modules/xenoarcheaology/tools/ano_device_battery.dm @@ -8,6 +8,7 @@ var/stored_charge = 0 /obj/item/anobattery/on_update_icon() + . = ..() icon_state = "anobattery[round(percent(),25)]" /obj/item/anobattery/proc/percent() @@ -166,6 +167,7 @@ . = TOPIC_REFRESH /obj/item/anodevice/on_update_icon() + . = ..() if(inserted_battery) icon_state = "anodev[round(inserted_battery.percent(),25)]" else diff --git a/code/modules/xenoarcheaology/tools/core_sampler.dm b/code/modules/xenoarcheaology/tools/core_sampler.dm index 3b4d00d6075..918bea69669 100644 --- a/code/modules/xenoarcheaology/tools/core_sampler.dm +++ b/code/modules/xenoarcheaology/tools/core_sampler.dm @@ -26,6 +26,7 @@ to_chat(user, SPAN_WARNING("You are unable to take a geological sample of [item_to_sample].")) /obj/item/core_sampler/on_update_icon() + . = ..() icon_state = "sampler[!!sample]" /obj/item/core_sampler/attack_self(var/mob/user) diff --git a/maps/away/errant_pisces/errant_pisces.dm b/maps/away/errant_pisces/errant_pisces.dm index 825d4aec6ec..79f39632bdd 100644 --- a/maps/away/errant_pisces/errant_pisces.dm +++ b/maps/away/errant_pisces/errant_pisces.dm @@ -191,6 +191,7 @@ amount = 30 /obj/item/stack/net/on_update_icon() + . = ..() if(amount == 1) icon_state = "net" else diff --git a/mods/content/psionics/items/id_card.dm b/mods/content/psionics/items/id_card.dm index a935df4d5c8..0e512ff521a 100644 --- a/mods/content/psionics/items/id_card.dm +++ b/mods/content/psionics/items/id_card.dm @@ -5,6 +5,7 @@ detail_color = null /obj/item/card/id/foundation_civilian/on_update_icon() + SHOULD_CALL_PARENT(FALSE) return /obj/item/card/id/foundation @@ -37,6 +38,7 @@ to_chat(M, SPAN_WARNING("There is a psionic compulsion surrounding \the [src] in a flicker of indescribable light.")) /obj/item/card/id/foundation/on_update_icon() + SHOULD_CALL_PARENT(FALSE) return /obj/item/card/id/foundation/Initialize() diff --git a/mods/content/xenobiology/slime/items.dm b/mods/content/xenobiology/slime/items.dm index 5429683ba17..529c2c356f6 100644 --- a/mods/content/xenobiology/slime/items.dm +++ b/mods/content/xenobiology/slime/items.dm @@ -49,6 +49,7 @@ slime_data.handle_reaction(reagents) /obj/item/slime_extract/on_update_icon() + . = ..() icon_state = get_world_inventory_state() var/decl/slime_colour/slime_data = GET_DECL(slime_type) icon = slime_data.extract_icon diff --git a/mods/species/ascent/items/clustertool.dm b/mods/species/ascent/items/clustertool.dm index 92887581375..cf61fdc5f58 100644 --- a/mods/species/ascent/items/clustertool.dm +++ b/mods/species/ascent/items/clustertool.dm @@ -15,6 +15,7 @@ )) /obj/item/clustertool/on_update_icon() + . = ..() icon_state = initial(icon_state) if(IS_WRENCH(src)) icon_state = "[icon_state]-wrench" diff --git a/mods/species/ascent/items/id_control.dm b/mods/species/ascent/items/id_control.dm index 55b0b647968..e306d08127f 100644 --- a/mods/species/ascent/items/id_control.dm +++ b/mods/species/ascent/items/id_control.dm @@ -14,6 +14,7 @@ . = ..() /obj/item/card/id/ascent/on_update_icon() + SHOULD_CALL_PARENT(FALSE) return /obj/item/card/id/ascent/prevent_tracking() diff --git a/mods/species/bayliens/skrell/gear/clustertool.dm b/mods/species/bayliens/skrell/gear/clustertool.dm index 8a446357da6..31d153a593d 100644 --- a/mods/species/bayliens/skrell/gear/clustertool.dm +++ b/mods/species/bayliens/skrell/gear/clustertool.dm @@ -15,6 +15,7 @@ )) /obj/item/clustertool/on_update_icon() + . = ..() icon_state = initial(icon_state) if(IS_WRENCH(src)) icon_state = "[icon_state]-wrench" diff --git a/mods/species/vox/gear/gear_head.dm b/mods/species/vox/gear/gear_head.dm index fd827bc12b6..d49bc1f0ecd 100644 --- a/mods/species/vox/gear/gear_head.dm +++ b/mods/species/vox/gear/gear_head.dm @@ -38,7 +38,7 @@ . = ..() /obj/item/clothing/head/helmet/space/vox/carapace/on_update_icon() - cut_overlays() + . = ..() if(lights_color && check_state_in_icon("[icon_state]-lights", icon)) var/image/I = emissive_overlay(icon, "[icon_state]-lights") I.color = lights_color diff --git a/mods/species/vox/gear/gear_suit.dm b/mods/species/vox/gear/gear_suit.dm index 98ad561743d..9a5855f15fc 100644 --- a/mods/species/vox/gear/gear_suit.dm +++ b/mods/species/vox/gear/gear_suit.dm @@ -52,7 +52,7 @@ . = ..() /obj/item/clothing/suit/space/vox/carapace/on_update_icon() - cut_overlays() + . = ..() if(lights_color && check_state_in_icon("[icon_state]-lights", icon)) var/image/I = emissive_overlay(icon, "[icon_state]-lights") I.color = lights_color diff --git a/mods/species/vox/gear/gun_spikethrower.dm b/mods/species/vox/gear/gun_spikethrower.dm index e1f83098e09..607a7ba9576 100644 --- a/mods/species/vox/gear/gun_spikethrower.dm +++ b/mods/species/vox/gear/gun_spikethrower.dm @@ -50,6 +50,7 @@ fire_sound = 'sound/weapons/spike.ogg' /obj/item/gun/launcher/alien/spikethrower/on_update_icon() + . = ..() icon_state = "[get_world_inventory_state()][Clamp(ammo,0,3)]" /obj/item/arrow/quill From bfe3cf4869ff52d4b0d8c5e6ce57a20e9fd891b8 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Wed, 17 Aug 2022 16:14:28 -0400 Subject: [PATCH 0259/1518] Used add_overlay with a string param where possible --- code/game/objects/items/devices/inducer.dm | 2 +- .../items/devices/suit_sensor_jammer.dm | 21 ++++++++----------- code/game/objects/items/robot/robot_frame.dm | 5 +---- code/game/objects/items/weapons/RCD.dm | 2 +- .../objects/items/weapons/grenades/grenade.dm | 4 ++-- .../items/weapons/grenades/supermatter.dm | 2 +- .../objects/items/weapons/material/ashtray.dm | 4 ++-- code/game/objects/items/weapons/soap.dm | 4 ++-- .../objects/items/weapons/storage/fancy.dm | 6 +++--- .../objects/items/weapons/storage/secure.dm | 4 ++-- code/modules/assembly/infrared.dm | 2 +- 11 files changed, 25 insertions(+), 31 deletions(-) diff --git a/code/game/objects/items/devices/inducer.dm b/code/game/objects/items/devices/inducer.dm index efbd8173d57..f40c1263590 100644 --- a/code/game/objects/items/devices/inducer.dm +++ b/code/game/objects/items/devices/inducer.dm @@ -160,7 +160,7 @@ /obj/item/inducer/on_update_icon() . = ..() if(opened) - add_overlay(overlay_image(icon, "inducer-[get_cell()? "bat" : "nobat"]")) + add_overlay("inducer-[get_cell()? "bat" : "nobat"]") /obj/item/inducer/Destroy() . = ..() diff --git a/code/game/objects/items/devices/suit_sensor_jammer.dm b/code/game/objects/items/devices/suit_sensor_jammer.dm index 496f128d9fc..7163f79b575 100644 --- a/code/game/objects/items/devices/suit_sensor_jammer.dm +++ b/code/game/objects/items/devices/suit_sensor_jammer.dm @@ -66,27 +66,24 @@ /obj/item/suit_sensor_jammer/on_update_icon() . = ..() if(bcell) - var/list/cur_overlays var/percent = bcell.percent() switch(percent) if(0 to 25) - LAZYADD(cur_overlays, overlay_image(icon, "forth_quarter")) + add_overlay("forth_quarter") if(25 to 50) - LAZYADD(cur_overlays, overlay_image(icon, "one_quarter")) - LAZYADD(cur_overlays, overlay_image(icon, "third_quarter")) + add_overlay("one_quarter") + add_overlay("third_quarter") if(50 to 75) - LAZYADD(cur_overlays, overlay_image(icon, "two_quarters")) - LAZYADD(cur_overlays, overlay_image(icon, "second_quarter")) + add_overlay("two_quarters") + add_overlay("second_quarter") if(75 to 99) - LAZYADD(cur_overlays, overlay_image(icon, "three_quarters")) - LAZYADD(cur_overlays, overlay_image(icon, "first_quarter")) + add_overlay("three_quarters") + add_overlay("first_quarter") else - LAZYADD(cur_overlays, overlay_image(icon, "four_quarters")) + add_overlay("four_quarters") if(active) - LAZYADD(cur_overlays, overlay_image(icon, "active")) - if(LAZYLEN(cur_overlays)) - add_overlay(cur_overlays) + add_overlay("active") /obj/item/suit_sensor_jammer/emp_act(var/severity) ..() diff --git a/code/game/objects/items/robot/robot_frame.dm b/code/game/objects/items/robot/robot_frame.dm index 70fd344cb08..b507c8f6006 100644 --- a/code/game/objects/items/robot/robot_frame.dm +++ b/code/game/objects/items/robot/robot_frame.dm @@ -21,12 +21,9 @@ /obj/item/robot_parts/robot_suit/on_update_icon() . = ..() - var/list/cur_overlays for(var/part in required_parts) if(parts[part]) - LAZYADD(cur_overlays, overlay_image(icon, "[part]+o")) - if(LAZYLEN(cur_overlays)) - add_overlay(cur_overlays) + add_overlay("[part]+o") /obj/item/robot_parts/robot_suit/proc/check_completion() for(var/part in required_parts) diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 51fc7b45087..192761c6bb1 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -115,7 +115,7 @@ var/ratio = 0 ratio = stored_matter / max_stored_matter ratio = max(round(ratio, 0.10) * 100, 10) - add_overlay(overlay_image(icon, "rcd-[ratio]")) + add_overlay("rcd-[ratio]") /obj/item/rcd/proc/lowAmmo(var/mob/user) //Kludge to make it animate when out of ammo, but I guess you can make it blow up when it's out of ammo or something to_chat(user, "The \'Low Ammo\' light on the device blinks yellow.") diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 59d4a1082ea..2e450b2182b 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -29,11 +29,11 @@ if(active) if(check_state_in_icon("[icon_state]-active", icon)) if(plane == HUD_PLANE) - add_overlay(overlay_image(icon, "[icon_state]-active")) + add_overlay("[icon_state]-active") else add_overlay(emissive_overlay(icon, "[icon_state]-active")) else if(check_state_in_icon("[icon_state]-pin", icon)) - add_overlay(overlay_image(icon, "[icon_state]-pin")) + add_overlay("[icon_state]-pin") /obj/item/grenade/proc/clown_check(var/mob/living/user) if((MUTATION_CLUMSY in user.mutations) && prob(50)) diff --git a/code/game/objects/items/weapons/grenades/supermatter.dm b/code/game/objects/items/weapons/grenades/supermatter.dm index eef3e2ef669..f71e0b7e1fd 100644 --- a/code/game/objects/items/weapons/grenades/supermatter.dm +++ b/code/game/objects/items/weapons/grenades/supermatter.dm @@ -20,7 +20,7 @@ /obj/item/grenade/supermatter/on_update_icon() . = ..() if(implode_at) - add_overlay(overlay_image('icons/obj/machines/power/fusion.dmi', "emfield_s1")) + add_overlay(image('icons/obj/machines/power/fusion.dmi', "emfield_s1")) /obj/item/grenade/supermatter/Process() if(!isturf(loc)) diff --git a/code/game/objects/items/weapons/material/ashtray.dm b/code/game/objects/items/weapons/material/ashtray.dm index 931feba8901..f1388a5ad16 100644 --- a/code/game/objects/items/weapons/material/ashtray.dm +++ b/code/game/objects/items/weapons/material/ashtray.dm @@ -23,9 +23,9 @@ /obj/item/ashtray/on_update_icon() . = ..() if (contents.len == max_butts) - add_overlay(overlay_image(icon, "ashtray_full")) + add_overlay("ashtray_full") else if (contents.len >= max_butts/2) - add_overlay(overlay_image(icon, "ashtray_half")) + add_overlay("ashtray_half") /obj/item/ashtray/attackby(obj/item/W, mob/user) if (health <= 0) diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index 3a870f4db54..ecf5851591f 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -103,6 +103,6 @@ /obj/item/soap/on_update_icon() . = ..() if(key_data) - add_overlay(overlay_image(icon, "soap_key_overlay")) + add_overlay("soap_key_overlay") else if(decal_name) - add_overlay(overlay_image(icon, "decal-[decal_name]")) \ No newline at end of file + add_overlay("decal-[decal_name]") \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 895268809f5..37929ebfe05 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -326,11 +326,11 @@ var/total_contents = count_by_type(contents, /obj/item/chems/glass/beaker/vial) icon_state = "vialbox[FLOOR(total_contents/2)]" if (!broken) - add_overlay(overlay_image(icon, "led[locked]")) + add_overlay("led[locked]") if(locked) - add_overlay(overlay_image(icon, "cover")) + add_overlay("cover") else - add_overlay(overlay_image(icon, "ledb")) + add_overlay("ledb") /obj/item/storage/lockbox/vials/attackby(obj/item/W, mob/user) . = ..() diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 33693564c67..11e9c84987c 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -61,9 +61,9 @@ if(!istype(lock)) return if(lock.emagged) - add_overlay(overlay_image(icon, icon_locking)) + add_overlay(icon_locking) else if(lock.open) - add_overlay(overlay_image(icon, icon_opened)) + add_overlay(icon_opened) /obj/item/storage/secure/open(mob/user) var/datum/extension/lockable/lock = get_extension(src, /datum/extension/lockable) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 02ba9167ec3..328db14ff7d 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -56,7 +56,7 @@ /obj/item/assembly/infra/on_update_icon() . = ..() if(on) - add_overlay(overlay_image(icon, "infrared_on")) + add_overlay("infrared_on") if(holder) holder.update_icon() update_beams() From 1fe553c2dd6cbb015bb8421e6dba733b8d6fb788 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Thu, 18 Aug 2022 00:54:06 +0000 Subject: [PATCH 0260/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 755b755cd88..57474b1ef56 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -91,12 +91,6 @@

    MistakeNot4892 updated:

    • GPS units now provide a visual compass to track each other.
    - -

    16 June 2022

    -

    gyurka66 updated:

    -
      -
    • Randomised Ministation Asteroid Field
    • -
    From 155768ef1205f0806b5b22f03a28af39e4d3d891 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 3 Jun 2022 22:28:25 +1000 Subject: [PATCH 0261/1518] Overmap movement is now handled by a rapidly ticking subsystem. --- code/__defines/overmap.dm | 4 +- code/__defines/subsystem-priority.dm | 1 + .../subsystems/processing/overmap.dm | 25 ++++++ code/modules/overmap/contacts/_contacts.dm | 24 ++++-- .../overmap/contacts/contact_sensors.dm | 3 +- code/modules/overmap/exoplanets/_exoplanet.dm | 7 +- code/modules/overmap/overmap_object.dm | 74 ++++++++++++++---- code/modules/overmap/ships/landable.dm | 4 +- code/modules/overmap/ships/ship.dm | 9 +-- icons/obj/overmap.dmi | Bin 4509 -> 4560 bytes nebula.dme | 1 + 11 files changed, 115 insertions(+), 37 deletions(-) create mode 100644 code/controllers/subsystems/processing/overmap.dm diff --git a/code/__defines/overmap.dm b/code/__defines/overmap.dm index 914c0bb6dbc..28a74006101 100644 --- a/code/__defines/overmap.dm +++ b/code/__defines/overmap.dm @@ -17,8 +17,8 @@ #define KM_OVERMAP_RATE 100 #define SHIP_MOVE_RESOLUTION 0.001 -#define MOVING(speed, min_speed) abs(speed) >= min_speed -#define SANITIZE_SPEED(speed) SIGN(speed) * Clamp(abs(speed), 0, max_speed) +#define MOVING(speed, min_speed) (abs(speed) >= min_speed) +#define SANITIZE_SPEED(speed) (SIGN(speed) * Clamp(abs(speed), 0, max_speed)) #define CHANGE_SPEED_BY(speed_var, v_diff, min_speed) \ v_diff = SANITIZE_SPEED(v_diff);\ if(!MOVING(speed_var + v_diff, min_speed)) \ diff --git a/code/__defines/subsystem-priority.dm b/code/__defines/subsystem-priority.dm index 4187a517559..a569d3f7b0c 100644 --- a/code/__defines/subsystem-priority.dm +++ b/code/__defines/subsystem-priority.dm @@ -38,6 +38,7 @@ // SS_BACKGROUND #define SS_PRIORITY_OBJECTS 100 // processing_objects processing. +#define SS_PRIORITY_OVERMAP 95 // Moving objects on the overmap. #define SS_PRIORITY_PROCESSING 95 // Generic datum processor. Replaces objects processor. #define SS_PRIORITY_PLANTS 90 // Plant processing, slow ticks. #define SS_PRIORITY_VINES 50 // Spreading vine effects. diff --git a/code/controllers/subsystems/processing/overmap.dm b/code/controllers/subsystems/processing/overmap.dm new file mode 100644 index 00000000000..7eb6bd1784b --- /dev/null +++ b/code/controllers/subsystems/processing/overmap.dm @@ -0,0 +1,25 @@ +// Some duplicated behavior from SSprocessing in here so atoms can +// still process normally as well as handling overmap movement. + +SUBSYSTEM_DEF(overmap) + name = "Overmap" + priority = SS_PRIORITY_OVERMAP + wait = 2 + flags = SS_BACKGROUND | SS_POST_FIRE_TIMING | SS_NO_INIT + var/list/moving_entities = list() + var/list/current_run = list() + +// Processing boilerplate. +/datum/controller/subsystem/overmap/fire(resumed = 0) + if(!resumed) + src.current_run = moving_entities.Copy() + var/list/current_run = src.current_run + var/wait = src.wait + var/times_fired = src.times_fired + while(current_run.len) + var/obj/effect/overmap/entity = current_run[current_run.len] + current_run.len-- + if(QDELETED(entity) || entity.ProcessOvermap(wait, times_fired) == PROCESS_KILL) + moving_entities -= entity + if (MC_TICK_CHECK) + return diff --git a/code/modules/overmap/contacts/_contacts.dm b/code/modules/overmap/contacts/_contacts.dm index 1882753732a..6caa410e957 100644 --- a/code/modules/overmap/contacts/_contacts.dm +++ b/code/modules/overmap/contacts/_contacts.dm @@ -21,27 +21,35 @@ owner.contact_datums[effect] = src marker = new(loc = effect) - marker.appearance = effect - marker.alpha = 0 // Marker fades in on detection. + update_marker_icon() + marker.alpha = 0 // Marker fades in on detection. marker.appearance_flags |= RESET_TRANSFORM images += marker - + radar = image(loc = effect, icon = 'icons/obj/overmap.dmi', icon_state = "sensor_range") + radar.color = source.color radar.tag = "radar" radar.add_filter("blur", 1, list("blur", size = 1)) -/datum/overmap_contact/proc/update_marker_icon(var/range = 0) - marker.icon_state = effect.icon_state - marker.dir = effect.dir +/datum/overmap_contact/proc/update_marker_icon() + + marker.appearance = effect + marker.appearance_flags |= RESET_TRANSFORM + // Pixel offsets are included in appearance but since this marker's loc + // is the effect, it's already offset and we don't want to double it. + marker.pixel_x = 0 + marker.pixel_y = 0 + marker.transform = effect.transform marker.overlays.Cut() - if(check_effect_shield()) var/image/shield_image = image(icon = 'icons/obj/overmap.dmi', icon_state = "shield") shield_image.pixel_x = 8 marker.overlays += shield_image +/datum/overmap_contact/proc/ping_radar(var/range = 0) + radar.transform = null radar.alpha = 255 @@ -69,7 +77,7 @@ if(!visitable_effect || !istype(visitable_effect)) return FALSE for(var/thing in visitable_effect.get_linked_machines_of_type(/obj/machinery/shield_generator)) - var/obj/machinery/shield_generator/S = thing + var/obj/machinery/shield_generator/S = thing if(S.running == SHIELD_RUNNING) return TRUE return FALSE diff --git a/code/modules/overmap/contacts/contact_sensors.dm b/code/modules/overmap/contacts/contact_sensors.dm index 929e701b6d7..c0e181b8112 100644 --- a/code/modules/overmap/contacts/contact_sensors.dm +++ b/code/modules/overmap/contacts/contact_sensors.dm @@ -48,7 +48,8 @@ if(sensors?.use_power) sensor_range = round(sensors.range,1) var/datum/overmap_contact/self_record = contact_datums[linked] - self_record.update_marker_icon(sensor_range) + self_record.update_marker_icon() + self_record.ping_radar(sensor_range) self_record.show() // Update our 'sensor range' (ie. overmap lighting) diff --git a/code/modules/overmap/exoplanets/_exoplanet.dm b/code/modules/overmap/exoplanets/_exoplanet.dm index cf45737a78e..d98f52c0fd0 100644 --- a/code/modules/overmap/exoplanets/_exoplanet.dm +++ b/code/modules/overmap/exoplanets/_exoplanet.dm @@ -4,6 +4,7 @@ icon_state = "globe" sector_flags = OVERMAP_SECTOR_KNOWN free_landing = TRUE + var/area/planetary_area var/lightlevel = 0 //This default makes turfs not generate light. Adjust to have exoplanents be lit. @@ -154,7 +155,8 @@ engravings += "." return engravings -/obj/effect/overmap/visitable/sector/exoplanet/Process(wait, tick) +/obj/effect/overmap/visitable/sector/exoplanet/Process(tick, wait) + if(animals.len < 0.5*max_animal_count && !repopulating) repopulating = 1 max_animal_count = round(max_animal_count * 0.5) @@ -163,10 +165,11 @@ handle_repopulation() if(daycycle) + wait = max(1, wait) if(tick % round(daycycle / wait) == 0) night = !night daycolumn = 1 - if(daycolumn && tick % round(daycycle_column_delay / wait) == 0) + if(daycolumn && (tick % round(daycycle_column_delay / wait)) == 0) update_daynight() /obj/effect/overmap/visitable/sector/exoplanet/proc/update_daynight() diff --git a/code/modules/overmap/overmap_object.dm b/code/modules/overmap/overmap_object.dm index 6e4ca4662dd..7e96fb9c087 100644 --- a/code/modules/overmap/overmap_object.dm +++ b/code/modules/overmap/overmap_object.dm @@ -25,7 +25,8 @@ var/global/list/overmap_unknown_ids = list() var/last_burn = 0 // worldtime when ship last acceleated var/burn_delay = 1 SECOND // how often ship can do burns - var/overmap_id = OVERMAP_ID_SPACE + var/overmap_id = OVERMAP_ID_SPACE // Which overmap datum this object expects to be dealing with + var/adjacency_radius = 0 // draws a circle under the effect scaled to this size, 1 = 1 turf /obj/effect/overmap/proc/get_heading_angle() . = round(Atan2(speed[2], speed[1])) @@ -54,7 +55,7 @@ var/global/list/overmap_unknown_ids = list() if(scannable) unknown_id = "[pick(global.phonetic_alphabet)]-[random_id(/obj/effect/overmap, 100, 999)]" - update_icon() + update_moving() /obj/effect/overmap/Crossed(var/obj/effect/overmap/visitable/other) if(istype(other)) @@ -69,6 +70,17 @@ var/global/list/overmap_unknown_ids = list() /obj/effect/overmap/on_update_icon() add_filter("glow", 1, list("drop_shadow", color = color + "F0", size = 2, offset = 1,x = 0, y = 0)) + underlays.Cut() + if(adjacency_radius) + var/image/radius = image(icon = 'icons/obj/overmap.dmi', icon_state = "radius") + if(adjacency_radius != 1) + var/matrix/M = matrix() + M.Scale(adjacency_radius) + radius.transform = M + radius.appearance_flags = RESET_ALPHA + radius.alpha = 50 + radius.filters = filter(type="blur", size = 1) + underlays += radius /obj/effect/overmap/proc/handle_wraparound() @@ -120,8 +132,22 @@ var/global/list/overmap_unknown_ids = list() /obj/effect/overmap/proc/adjust_speed(n_x, n_y) CHANGE_SPEED_BY(speed[1], n_x, min_speed) CHANGE_SPEED_BY(speed[2], n_y, min_speed) + update_moving() + +/obj/effect/overmap/proc/update_moving() + if(is_still()) + SSovermap.moving_entities -= src + else if(!SSovermap.moving_entities[src]) + SSovermap.moving_entities[src] = TRUE update_icon() +/obj/effect/overmap/Destroy() + STOP_PROCESSING(SSobj, src) + SSovermap.moving_entities -= src + speed = list(0, 0) + position = list(0, 0) + . = ..() + /obj/effect/overmap/proc/can_burn() if(halted) return FALSE @@ -130,26 +156,40 @@ var/global/list/overmap_unknown_ids = list() else return TRUE -/obj/effect/overmap/Process() - if(!halted && !is_still() && can_move) - var/list/deltas = list(0,0) - for(var/i = 1 to 2) - if(MOVING(speed[i], min_speed)) - position[i] += speed[i] * OVERMAP_SPEED_CONSTANT - if(position[i] < 0) - deltas[i] = CEILING(position[i]) - else if(position[i] > 0) - deltas[i] = FLOOR(position[i]) - if(deltas[i] != 0) - position[i] -= deltas[i] - position[i] += (deltas[i] > 0) ? -1 : 1 +/obj/effect/overmap/proc/ProcessOvermap(wait, tick) - update_icon() + if(halted || is_still()) + return PROCESS_KILL + + if(!can_move) + return + + var/moved = FALSE + var/list/deltas = list(0,0) + for(var/i = 1 to 2) + if(!MOVING(speed[i], min_speed)) + continue + // Add speed to this dimension of our position. + position[i] += Clamp((speed[i] * OVERMAP_SPEED_CONSTANT) * (wait / (1 SECOND)), -1, 1) + if(position[i] < 0) + deltas[i] = CEILING(position[i]) + else if(position[i] > 0) + deltas[i] = FLOOR(position[i]) + moved = TRUE + // Delta over 0 means we've moved a turf, so we adjust our position accordingly. + if(deltas[i] != 0) + position[i] -= deltas[i] + // Note for future self when confused: this line offsets the effect within the new turf. + // Can probably be tidied up at some point but math is spooky. + position[i] += (deltas[i] > 0) ? -1 : 1 + + if(moved) var/turf/newloc = locate(x + deltas[1], y + deltas[2], z) if(newloc && loc != newloc) Move(newloc) handle_wraparound() - handle_overmap_pixel_movement() + update_icon() + handle_overmap_pixel_movement() /obj/effect/overmap/proc/accelerate(var/direction, var/accel_limit) var/actual_accel_limit = accel_limit / KM_OVERMAP_RATE diff --git a/code/modules/overmap/ships/landable.dm b/code/modules/overmap/ships/landable.dm index a001d3a661c..6e5a8f6cfb8 100644 --- a/code/modules/overmap/ships/landable.dm +++ b/code/modules/overmap/ships/landable.dm @@ -46,8 +46,8 @@ return FALSE // Cannot encounter a shuttle while it is landed elsewhere. . = ..() -/obj/effect/overmap/visitable/ship/landable/Process() - . = ..() +/obj/effect/overmap/visitable/ship/landable/Process(tick, wait) + ..() var/datum/shuttle/autodock/overmap/child_shuttle = SSshuttle.shuttles[shuttle] if(!child_shuttle || !istype(child_shuttle)) return diff --git a/code/modules/overmap/ships/ship.dm b/code/modules/overmap/ships/ship.dm index 0fefbac8b05..8e951486bbf 100644 --- a/code/modules/overmap/ships/ship.dm +++ b/code/modules/overmap/ships/ship.dm @@ -35,7 +35,6 @@ var/global/const/OVERMAP_SPEED_CONSTANT = (1 SECOND) base_sensor_visibility = round((vessel_mass/SENSOR_COEFFICENT),1) /obj/effect/overmap/visitable/ship/Destroy() - STOP_PROCESSING(SSobj, src) SSshuttle.ships -= src for(var/thing in get_linked_machines_of_type(/obj/machinery/computer/ship)) var/obj/machinery/computer/ship/machine = thing @@ -114,8 +113,7 @@ var/global/const/OVERMAP_SPEED_CONSTANT = (1 SECOND) var/burns_per_grid = 1/ (burn_delay * get_speed()) return round(num_burns / burns_per_grid) -/obj/effect/overmap/visitable/ship/Process() - . = ..() +/obj/effect/overmap/visitable/ship/Process(tick, wait) damping_strength = 0 for(var/datum/ship_inertial_damper/I in inertial_dampers) var/obj/machinery/inertial_damper/ID = I.holder @@ -156,11 +154,12 @@ var/global/const/OVERMAP_SPEED_CONSTANT = (1 SECOND) /obj/effect/overmap/visitable/ship/proc/halt() adjust_speed(-speed[1], -speed[2]) - halted = 1 + halted = TRUE /obj/effect/overmap/visitable/ship/proc/unhalt() if(!SSshuttle.overmap_halted) - halted = 0 + halted = FALSE + update_moving() /obj/effect/overmap/visitable/ship/Bump(var/atom/A) if(istype(A,/turf/unsimulated/map/edge)) diff --git a/icons/obj/overmap.dmi b/icons/obj/overmap.dmi index 18703002afd5baa64855669b4eca8e2cbc90681b..3dae2aeb162d5fcbf82c6c8df6352c2f3e87ddf6 100644 GIT binary patch delta 4456 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 diff --git a/nebula.dme b/nebula.dme index 4e8f5381400..7aac823b073 100644 --- a/nebula.dme +++ b/nebula.dme @@ -255,6 +255,7 @@ #include "code\controllers\subsystems\processing\mobs.dm" #include "code\controllers\subsystems\processing\nano.dm" #include "code\controllers\subsystems\processing\obj.dm" +#include "code\controllers\subsystems\processing\overmap.dm" #include "code\controllers\subsystems\processing\processing.dm" #include "code\controllers\subsystems\processing\projectiles.dm" #include "code\controllers\subsystems\processing\temperature.dm" From d969a4ba328b7780df7540393a6965f43df93dea Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 22 Jun 2022 11:08:46 +1000 Subject: [PATCH 0262/1518] Standardizing Process() arguments. --- code/datums/trading/_trade_hub.dm | 4 ++-- .../gamemodes/endgame/supermatter_cascade/cascade_blob.dm | 6 +++--- code/game/machinery/nuclear_bomb.dm | 2 +- code/game/objects/items/devices/suit_sensor_jammer.dm | 2 +- code/game/turfs/simulated/walls.dm | 4 ++-- .../components/binary_devices/oxyregenerator.dm | 4 ++-- code/modules/blob/blob.dm | 4 ++-- code/modules/fabrication/_fabricator.dm | 2 +- code/modules/overmap/exoplanets/_exoplanet.dm | 2 +- code/modules/overmap/overmap_object.dm | 2 +- code/modules/overmap/ships/landable.dm | 4 ++-- code/modules/overmap/ships/ship.dm | 2 +- 12 files changed, 19 insertions(+), 19 deletions(-) diff --git a/code/datums/trading/_trade_hub.dm b/code/datums/trading/_trade_hub.dm index b4fd7a0fda9..fbeb44ea9f8 100644 --- a/code/datums/trading/_trade_hub.dm +++ b/code/datums/trading/_trade_hub.dm @@ -29,7 +29,7 @@ SStrade.trade_hubs -= src QDEL_NULL_LIST(traders) . = ..() - + /datum/trade_hub/proc/get_possible_initial_trader_types() return subtypesof(/datum/trader) - typesof(/datum/trader/ship) @@ -52,7 +52,7 @@ /datum/trade_hub/proc/add_trader(var/trader_type) traders += new trader_type(src) -/datum/trade_hub/Process(var/resumed) +/datum/trade_hub/Process(wait, tick) for(var/datum/trader/trader in traders) trader.tick() diff --git a/code/game/gamemodes/endgame/supermatter_cascade/cascade_blob.dm b/code/game/gamemodes/endgame/supermatter_cascade/cascade_blob.dm index f8cf98508d0..026972df98b 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/cascade_blob.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/cascade_blob.dm @@ -22,13 +22,13 @@ try_supermatter_consume(null, A, src) /turf/unsimulated/wall/cascade/Destroy() - STOP_PROCESSING(SSturf, src) + STOP_PROCESSING(SSturf, src) . = ..() -/turf/unsimulated/wall/cascade/Process(wait, times_fired) +/turf/unsimulated/wall/cascade/Process(wait, tick) // Only check infrequently. var/how_often = max(round(5 SECONDS/wait), 1) - if(times_fired % how_often) + if(tick % how_often) return // No more available directions? Stop processing. diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index f1e3444a849..01e6dcce678 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -38,7 +38,7 @@ var/global/bomb_set auth = null return ..() -/obj/machinery/nuclearbomb/Process(var/wait) +/obj/machinery/nuclearbomb/Process(wait, tick) if(timing) timeleft = max(timeleft - (wait / 10), 0) playsound(loc, 'sound/items/timer.ogg', 50) diff --git a/code/game/objects/items/devices/suit_sensor_jammer.dm b/code/game/objects/items/devices/suit_sensor_jammer.dm index 7225e5211f2..353f3117515 100644 --- a/code/game/objects/items/devices/suit_sensor_jammer.dm +++ b/code/game/objects/items/devices/suit_sensor_jammer.dm @@ -164,7 +164,7 @@ set_method(method) return TOPIC_REFRESH -/obj/item/suit_sensor_jammer/Process(var/wait) +/obj/item/suit_sensor_jammer/Process(wait, tick) if(bcell) // With a range of 2 and jammer cost of 3 the default (high capacity) cell will last for almost 14 minutes, give or take // 10000 / (2^2 * 3 / 10) ~= 8333 ticks ~= 13.8 minutes diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index b0f5998f85a..229cd5db042 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -100,9 +100,9 @@ var/global/list/wall_fullblend_objects = list( var/obj/O = A return (istype(O) && O.hides_under_flooring()) || ..() -/turf/simulated/wall/Process(wait, times_fired) +/turf/simulated/wall/Process(wait, tick) var/how_often = max(round(2 SECONDS/wait), 1) - if(times_fired % how_often) + if(tick % how_often) return //We only work about every 2 seconds if(!radiate()) return PROCESS_KILL diff --git a/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm b/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm index e39d7006f19..ba878011801 100644 --- a/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm +++ b/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm @@ -47,7 +47,7 @@ . = ..() to_chat(user,"Its outlet port is to the [dir2text(dir)].") -/obj/machinery/atmospherics/binary/oxyregenerator/Process(var/delay) +/obj/machinery/atmospherics/binary/oxyregenerator/Process(wait, tick) ..() if((stat & (NOPOWER|BROKEN)) || !use_power) return @@ -70,7 +70,7 @@ if (phase == "processing")//processing CO2 in tank if (inner_tank.gas[/decl/material/gas/carbon_dioxide]) - var/co2_intake = between(0, inner_tank.gas[/decl/material/gas/carbon_dioxide], power_setting*delay/10) + var/co2_intake = between(0, inner_tank.gas[/decl/material/gas/carbon_dioxide], power_setting*wait/10) last_flow_rate = co2_intake inner_tank.adjust_gas(/decl/material/gas/carbon_dioxide, -co2_intake, 1) var/datum/gas_mixture/new_oxygen = new diff --git a/code/modules/blob/blob.dm b/code/modules/blob/blob.dm index 1b83c0bcee4..11348b09e82 100644 --- a/code/modules/blob/blob.dm +++ b/code/modules/blob/blob.dm @@ -51,9 +51,9 @@ else icon_state = "blob_damaged" -/obj/effect/blob/Process(wait, times_fired) +/obj/effect/blob/Process(wait, tick) regen() - if(times_fired % attack_freq) + if(tick % attack_freq) return attempt_attack(global.alldirs) diff --git a/code/modules/fabrication/_fabricator.dm b/code/modules/fabrication/_fabricator.dm index 486f4b1d48b..081e1eab925 100644 --- a/code/modules/fabrication/_fabricator.dm +++ b/code/modules/fabrication/_fabricator.dm @@ -185,7 +185,7 @@ /obj/machinery/fabricator/proc/is_functioning() . = use_power != POWER_USE_OFF && !(stat & NOPOWER) && !(stat & BROKEN) && !(fab_status_flags & FAB_DISABLED) -/obj/machinery/fabricator/Process(var/wait) +/obj/machinery/fabricator/Process(wait, tick) ..() if(use_power == POWER_USE_ACTIVE && (fab_status_flags & FAB_BUSY)) update_current_build(wait) diff --git a/code/modules/overmap/exoplanets/_exoplanet.dm b/code/modules/overmap/exoplanets/_exoplanet.dm index d98f52c0fd0..be428b2c5aa 100644 --- a/code/modules/overmap/exoplanets/_exoplanet.dm +++ b/code/modules/overmap/exoplanets/_exoplanet.dm @@ -155,7 +155,7 @@ engravings += "." return engravings -/obj/effect/overmap/visitable/sector/exoplanet/Process(tick, wait) +/obj/effect/overmap/visitable/sector/exoplanet/Process(wait, tick) if(animals.len < 0.5*max_animal_count && !repopulating) repopulating = 1 diff --git a/code/modules/overmap/overmap_object.dm b/code/modules/overmap/overmap_object.dm index 7e96fb9c087..1d388ae4224 100644 --- a/code/modules/overmap/overmap_object.dm +++ b/code/modules/overmap/overmap_object.dm @@ -137,7 +137,7 @@ var/global/list/overmap_unknown_ids = list() /obj/effect/overmap/proc/update_moving() if(is_still()) SSovermap.moving_entities -= src - else if(!SSovermap.moving_entities[src]) + else SSovermap.moving_entities[src] = TRUE update_icon() diff --git a/code/modules/overmap/ships/landable.dm b/code/modules/overmap/ships/landable.dm index 6e5a8f6cfb8..7c1b0f8ca27 100644 --- a/code/modules/overmap/ships/landable.dm +++ b/code/modules/overmap/ships/landable.dm @@ -26,7 +26,7 @@ return ..() /obj/effect/overmap/visitable/ship/landable/burn() - if(status != SHIP_STATUS_OVERMAP && status != SHIP_STATUS_ENCOUNTER) + if(status != SHIP_STATUS_OVERMAP && status != SHIP_STATUS_ENCOUNTER) return 0 return ..() @@ -46,7 +46,7 @@ return FALSE // Cannot encounter a shuttle while it is landed elsewhere. . = ..() -/obj/effect/overmap/visitable/ship/landable/Process(tick, wait) +/obj/effect/overmap/visitable/ship/landable/Process(wait, tick) ..() var/datum/shuttle/autodock/overmap/child_shuttle = SSshuttle.shuttles[shuttle] if(!child_shuttle || !istype(child_shuttle)) diff --git a/code/modules/overmap/ships/ship.dm b/code/modules/overmap/ships/ship.dm index 8e951486bbf..81f183b373d 100644 --- a/code/modules/overmap/ships/ship.dm +++ b/code/modules/overmap/ships/ship.dm @@ -113,7 +113,7 @@ var/global/const/OVERMAP_SPEED_CONSTANT = (1 SECOND) var/burns_per_grid = 1/ (burn_delay * get_speed()) return round(num_burns / burns_per_grid) -/obj/effect/overmap/visitable/ship/Process(tick, wait) +/obj/effect/overmap/visitable/ship/Process(wait, tick) damping_strength = 0 for(var/datum/ship_inertial_damper/I in inertial_dampers) var/obj/machinery/inertial_damper/ID = I.holder From 17a5e11f76b914039f40c0eb858244ee41d4b537 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 20 Aug 2022 02:19:02 -0400 Subject: [PATCH 0263/1518] CSRFZ --- code/modules/ZAS/Turf.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/ZAS/Turf.dm b/code/modules/ZAS/Turf.dm index 2b6bcfd481d..679b3b67748 100644 --- a/code/modules/ZAS/Turf.dm +++ b/code/modules/ZAS/Turf.dm @@ -56,6 +56,10 @@ var/check_dirs = get_zone_neighbours(src) var/unconnected_dirs = check_dirs + //src is only connected to the zone by a single direction, this is a safe removal. + if (!(. & (. - 1))) //Equivalent to: if(IsInteger(log(2, .))) + return TRUE + #ifdef MULTIZAS var/to_check = global.cornerdirsz #else From ca64d5bbef3b6b02958ebd69a198402049cde097 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 20 Aug 2022 02:25:33 -0400 Subject: [PATCH 0264/1518] converts to nebula format --- code/modules/ZAS/Turf.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/ZAS/Turf.dm b/code/modules/ZAS/Turf.dm index 679b3b67748..f979389d9ca 100644 --- a/code/modules/ZAS/Turf.dm +++ b/code/modules/ZAS/Turf.dm @@ -57,7 +57,7 @@ var/unconnected_dirs = check_dirs //src is only connected to the zone by a single direction, this is a safe removal. - if (!(. & (. - 1))) //Equivalent to: if(IsInteger(log(2, .))) + if (!(check_dirs & (check_dirs - 1))) //Equivalent to: if(IsInteger(log(2, .))) return TRUE #ifdef MULTIZAS From 326176358cffc0ba01269686b4e5f1c565a22b0d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 20 Aug 2022 15:43:44 +1000 Subject: [PATCH 0265/1518] Moving some oddly placed icon update code, wtf past me. --- code/modules/overmap/overmap_object.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/modules/overmap/overmap_object.dm b/code/modules/overmap/overmap_object.dm index 1d388ae4224..4b345c22a7a 100644 --- a/code/modules/overmap/overmap_object.dm +++ b/code/modules/overmap/overmap_object.dm @@ -57,6 +57,9 @@ var/global/list/overmap_unknown_ids = list() update_moving() + add_filter("glow", 1, list("drop_shadow", color = color + "F0", size = 2, offset = 1,x = 0, y = 0)) + update_icon() + /obj/effect/overmap/Crossed(var/obj/effect/overmap/visitable/other) if(istype(other)) for(var/obj/effect/overmap/visitable/O in loc) @@ -69,7 +72,7 @@ var/global/list/overmap_unknown_ids = list() SSskybox.rebuild_skyboxes(O.map_z) /obj/effect/overmap/on_update_icon() - add_filter("glow", 1, list("drop_shadow", color = color + "F0", size = 2, offset = 1,x = 0, y = 0)) + . = ..() underlays.Cut() if(adjacency_radius) var/image/radius = image(icon = 'icons/obj/overmap.dmi', icon_state = "radius") @@ -77,7 +80,7 @@ var/global/list/overmap_unknown_ids = list() var/matrix/M = matrix() M.Scale(adjacency_radius) radius.transform = M - radius.appearance_flags = RESET_ALPHA + radius.appearance_flags = (RESET_ALPHA | KEEP_APART) radius.alpha = 50 radius.filters = filter(type="blur", size = 1) underlays += radius @@ -188,7 +191,6 @@ var/global/list/overmap_unknown_ids = list() if(newloc && loc != newloc) Move(newloc) handle_wraparound() - update_icon() handle_overmap_pixel_movement() /obj/effect/overmap/proc/accelerate(var/direction, var/accel_limit) From 1790e3c3cfa44202a8dd020bf3995d008edae2f7 Mon Sep 17 00:00:00 2001 From: NataKilar Date: Thu, 28 Jul 2022 18:48:15 -0400 Subject: [PATCH 0266/1518] Allows HE pipes to interact with exterior turfs --- code/modules/atmospherics/datum_pipeline.dm | 70 +++++++++++---------- code/modules/atmospherics/he_pipes.dm | 13 ++-- 2 files changed, 45 insertions(+), 38 deletions(-) diff --git a/code/modules/atmospherics/datum_pipeline.dm b/code/modules/atmospherics/datum_pipeline.dm index a2163dc35ed..2cb917f0cd7 100644 --- a/code/modules/atmospherics/datum_pipeline.dm +++ b/code/modules/atmospherics/datum_pipeline.dm @@ -201,59 +201,65 @@ var/total_heat_capacity = air.heat_capacity() var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume) - if(istype(target, /turf/simulated)) + if(istype(target, /turf/simulated) && !target.blocks_air) var/turf/simulated/modeled_location = target - if(modeled_location.blocks_air) + var/delta_temperature = 0 + var/sharer_heat_capacity = 0 - if((modeled_location.heat_capacity>0) && (partial_heat_capacity>0)) - var/delta_temperature = air.temperature - modeled_location.temperature + if(modeled_location.zone) + delta_temperature = (air.temperature - modeled_location.zone.air.temperature) + sharer_heat_capacity = modeled_location.zone.air.heat_capacity() + else + delta_temperature = (air.temperature - modeled_location.air.temperature) + sharer_heat_capacity = modeled_location.air.heat_capacity() - var/heat = thermal_conductivity*delta_temperature* \ - (partial_heat_capacity*modeled_location.heat_capacity/(partial_heat_capacity+modeled_location.heat_capacity)) + var/self_temperature_delta = 0 + var/sharer_temperature_delta = 0 - air.temperature -= heat/total_heat_capacity - modeled_location.temperature += heat/modeled_location.heat_capacity + if((sharer_heat_capacity > 0) && (partial_heat_capacity > 0)) + var/heat = thermal_conductivity*delta_temperature* \ + (partial_heat_capacity*sharer_heat_capacity/(partial_heat_capacity+sharer_heat_capacity)) + self_temperature_delta = -heat/total_heat_capacity + sharer_temperature_delta = heat/sharer_heat_capacity else - var/delta_temperature = 0 - var/sharer_heat_capacity = 0 + return 1 - if(modeled_location.zone) - delta_temperature = (air.temperature - modeled_location.zone.air.temperature) - sharer_heat_capacity = modeled_location.zone.air.heat_capacity() - else - delta_temperature = (air.temperature - modeled_location.air.temperature) - sharer_heat_capacity = modeled_location.air.heat_capacity() + air.temperature += self_temperature_delta - var/self_temperature_delta = 0 - var/sharer_temperature_delta = 0 - - if((sharer_heat_capacity>0) && (partial_heat_capacity>0)) - var/heat = thermal_conductivity*delta_temperature* \ - (partial_heat_capacity*sharer_heat_capacity/(partial_heat_capacity+sharer_heat_capacity)) + if(modeled_location.zone) + modeled_location.zone.air.temperature += sharer_temperature_delta/modeled_location.zone.air.group_multiplier + else + modeled_location.air.temperature += sharer_temperature_delta - self_temperature_delta = -heat/total_heat_capacity - sharer_temperature_delta = heat/sharer_heat_capacity - else - return 1 + else if(istype(target, /turf/exterior) && !target.blocks_air) + var/turf/exterior/modeled_location = target + var/datum/gas_mixture/target_air = modeled_location.return_air() - air.temperature += self_temperature_delta + var/delta_temperature = air.temperature - target_air.temperature + var/sharer_heat_capacity = target_air.heat_capacity() - if(modeled_location.zone) - modeled_location.zone.air.temperature += sharer_temperature_delta/modeled_location.zone.air.group_multiplier - else - modeled_location.air.temperature += sharer_temperature_delta + if((sharer_heat_capacity > 0) && (partial_heat_capacity > 0)) + var/heat = thermal_conductivity*delta_temperature* \ + (partial_heat_capacity*sharer_heat_capacity/(partial_heat_capacity+sharer_heat_capacity)) + air.temperature += -heat/total_heat_capacity + else + return 1 else - if((target.heat_capacity>0) && (partial_heat_capacity>0)) + if((target.heat_capacity > 0) && (partial_heat_capacity > 0)) var/delta_temperature = air.temperature - target.temperature var/heat = thermal_conductivity*delta_temperature* \ (partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity)) air.temperature -= heat/total_heat_capacity + // Only increase the temperature of the target if it's simulated. + if(istype(target, /turf/simulated)) + target.temperature += heat/target.heat_capacity + if(network) network.update = 1 diff --git a/code/modules/atmospherics/he_pipes.dm b/code/modules/atmospherics/he_pipes.dm index 9054106ba7d..61bca32f23c 100644 --- a/code/modules/atmospherics/he_pipes.dm +++ b/code/modules/atmospherics/he_pipes.dm @@ -57,16 +57,17 @@ ..() else var/datum/gas_mixture/pipe_air = return_air() - if(istype(loc, /turf/simulated/)) + if(istype(loc, /turf/simulated) || istype(loc, /turf/exterior)) + var/turf/pipe_turf = loc var/environment_temperature = 0 - if(loc:blocks_air) - environment_temperature = loc:temperature + if(pipe_turf.blocks_air) + environment_temperature = pipe_turf.temperature else - var/datum/gas_mixture/environment = loc.return_air() + var/datum/gas_mixture/environment = pipe_turf.return_air() environment_temperature = environment.temperature if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) - parent.temperature_interact(loc, volume, thermal_conductivity) - else if(istype(loc, /turf/space/)) + parent.temperature_interact(pipe_turf, volume, thermal_conductivity) + else if(istype(loc, /turf/space)) parent.radiate_heat_to_space(surface, 1) if(buckled_mob) From 411e06dc3f6573397cb9099fa3aeb90daa1e0dda Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 20 Aug 2022 16:36:02 -0500 Subject: [PATCH 0267/1518] Rewrite cocktails to use an impurity tolerance var Co-authored-by: MistakeNot4892 --- .../codex/categories/category_cocktails.dm | 21 +- code/modules/reagents/cocktails.dm | 355 ++++++++++-------- 2 files changed, 205 insertions(+), 171 deletions(-) diff --git a/code/modules/codex/categories/category_cocktails.dm b/code/modules/codex/categories/category_cocktails.dm index 4f903aa2f4f..28b528bded5 100644 --- a/code/modules/codex/categories/category_cocktails.dm +++ b/code/modules/codex/categories/category_cocktails.dm @@ -14,16 +14,21 @@ continue var/mechanics_text = "Cocktails will change the name of bartending glasses when mixed properly.

    " - mechanics_text += "This cocktail is mixed with the following ingredients:
    " + mechanics_text += "This cocktail is mixed with the following ingredients:
    " var/list/ingredients = list() - for(var/rtype in cocktail.ratios) - // If anyone can think of a good way to find the lowest common - // divisor of these part values and make it a bit neater, please - // feel free to change this block to use it. - var/decl/material/mixer = GET_DECL(rtype) - var/ingredient = "[cocktail.ratios[rtype] >= 0.1 ? "[CEILING(cocktail.ratios[rtype] * 10)] part\s" : "a dash of"] [mixer.name]" + for(var/rtype in cocktail.display_ratios) + // Rather than normalising fractional values using the lowest + // common divisor, we instead let cocktails use user-readable values + // which we normalize internally for calculations. + var/decl/material/mixer = GET_DECL(rtype) + var/minimum_amount = cocktail.display_ratios[rtype] + var/ingredient = "[mixer.name]" + if(minimum_amount) + ingredient = "[minimum_amount] part\s [ingredient]" + else + ingredient += " to taste" ingredients += ingredient - + guide_html += "

    [capitalize(cocktail.name)]

    Mix [english_list(ingredients)] in a glass." mechanics_text += "
    • [jointext(ingredients, "
    • ")]
    " diff --git a/code/modules/reagents/cocktails.dm b/code/modules/reagents/cocktails.dm index 291c5394f81..8eca62fc051 100644 --- a/code/modules/reagents/cocktails.dm +++ b/code/modules/reagents/cocktails.dm @@ -1,19 +1,43 @@ // This is a system used to change the name and description of a glass of -// alcohol if it meets certain minimum proportions of ingredients. It +// alcohol if it meets certain minimum proportions of ingredients. It // replaces the previous system, which used chemical reactions. /decl/cocktail - var/name // Cocktail name, applied to the glass. - var/description // Cocktail description, applied to the glass. - var/list/ratios // Associative list of reagents to a minimum percentage of mix (<1). - // Reagents with no assoc value will count as valid for any amount (even 0.001u) - var/order_specific = FALSE // If set, cocktail will fail if ingredients were added out of ratio order. - var/hidden_from_codex // Doesn't generate a codex entry. - -// Shoot for total ratios of about 70% (0.7) for any cocktail that doesn't need -// to be super precise - this will leave room in a mix for people to spike your -// drink or to be comfortably over or under their proportions without having to -// be frustratingly picky with measurements. + /// Cocktail name, applied to the glass. + var/name + /// Cocktail description, applied to the glass. + var/description + /// Associative list of reagents. The actual amount only matters for defining proportions and will be normalized. + /// These should ideally be whole numbers in the lowest possible ratio, e.g. + /// 1, 2, 3 instead of 0.1, 0.2, 0.3 or 2, 4, 6. + /// Reagents with no assoc value will count as valid for any amount (even 0.001u). + var/list/ratios + /// The ratio displayed in the codex, which is the same as ratios prior to normalisation. + var/list/display_ratios + /// If TRUE, cocktail ingredients must be added in the order they're specified in the ratio. + var/order_specific = FALSE + /// If TRUE, doesn't generate a codex entry. + var/hidden_from_codex + + // Impurity tolerance gives a buffer for imprecise mixing, avoiding finnicky measurements + // and allowing for things like spiked drinks. The default is 0.3, meaning aside from ice, + // the drink can be at most 30% other reagents not part of the cocktail recipe. + + /// What fraction of the total volume of the drink (ignoring ice) can be unrelated chems? + var/impurity_tolerance = 0.3 + + +/decl/cocktail/Initialize() + . = ..() + // Normalize the ratios to ensure a specific degree of tolerance. + if(ratios) + display_ratios = ratios.Copy() // Copy the initial ratio to use for the codex. + var/ratio_wiggle_room = (1-impurity_tolerance) + var/ratio_sum = 0 + for(var/r in ratios) + ratio_sum += ratios[r] + for(var/r in ratios) + ratios[r] *= ratio_wiggle_room / ratio_sum /decl/cocktail/proc/get_presentation_name(var/obj/item/prop) . = name @@ -46,134 +70,134 @@ name = "grog" description = "Watered-down rum. Pirate approved!" ratios = list( - /decl/material/liquid/water = 0.5, - /decl/material/liquid/ethanol/rum = 0.2 + /decl/material/liquid/water = 1, + /decl/material/liquid/ethanol/rum = 1 ) /decl/cocktail/screwdriver name = "screwdriver" description = "A classic mixture of vodka and orange juice. Just the thing for the tired engineer." ratios = list( - /decl/material/liquid/drink/juice/orange = 0.6, - /decl/material/liquid/ethanol/vodka = 0.1 + /decl/material/liquid/drink/juice/orange = 4, + /decl/material/liquid/ethanol/vodka = 1 ) /decl/cocktail/tequila_sunrise name = "tequila sunrise" description = "A simple cocktail of tequila and orange juice. Much like a screwdriver." ratios = list( - /decl/material/liquid/drink/juice/orange = 0.6, - /decl/material/liquid/ethanol/tequila = 0.1 + /decl/material/liquid/drink/juice/orange = 4, + /decl/material/liquid/ethanol/tequila = 1 ) /decl/cocktail/classic_martini name = "gin martini" description = "Vermouth with gin. The classiest of all cocktails." ratios = list( - /decl/material/liquid/ethanol/gin = 0.4, - /decl/material/liquid/ethanol/vermouth = 0.3 + /decl/material/liquid/ethanol/gin = 4, + /decl/material/liquid/ethanol/vermouth = 1 ) /decl/cocktail/vodka_martini name = "vodka martini" description = "A bastardisation of the classic martini. Still great." ratios = list( - /decl/material/liquid/ethanol/vodka = 0.4, - /decl/material/liquid/ethanol/vermouth = 0.3 + /decl/material/liquid/ethanol/vodka = 4, + /decl/material/liquid/ethanol/vermouth = 1 ) /decl/cocktail/allies_cocktail name = "Allies Cocktail" description = "A drink made from your allies, not as sweet as when made from your enemies." ratios = list( - /decl/material/liquid/ethanol/vermouth = 0.3, - /decl/material/liquid/ethanol/vodka = 0.1, - /decl/material/liquid/ethanol/gin = 0.3 + /decl/material/liquid/ethanol/vermouth = 2, + /decl/material/liquid/ethanol/vodka = 2, + /decl/material/liquid/ethanol/gin = 2 ) /decl/cocktail/bilk name = "bilk" description = "A foul brew of milk and beer. For alcoholics who fear osteoporosis." ratios = list( - /decl/material/liquid/ethanol/beer = 0.35, - /decl/material/liquid/drink/milk = 0.35 + /decl/material/liquid/ethanol/beer = 1, + /decl/material/liquid/drink/milk = 1 ) /decl/cocktail/gin_and_tonic name = "gin and tonic" description = "A mild cocktail, widely considered an all-time classic." ratios = list( - /decl/material/liquid/drink/tonic = 0.4, - /decl/material/liquid/ethanol/gin = 0.3 + /decl/material/liquid/drink/tonic = 4, + /decl/material/liquid/ethanol/gin = 1 ) /decl/cocktail/cuba_libre name = "Cuba Libre" description = "A classic mix of rum and cola." ratios = list( - /decl/material/liquid/ethanol/rum = 0.2, - /decl/material/liquid/drink/cola = 0.5 + /decl/material/liquid/drink/cola = 4, + /decl/material/liquid/ethanol/rum = 1 ) /decl/cocktail/black_russian name = "black Russian" description = "Similar to a white Russian, but fit for the lactose-intolerant." ratios = list( - /decl/material/liquid/ethanol/vodka = 0.4, - /decl/material/liquid/ethanol/coffee = 0.2 + /decl/material/liquid/ethanol/vodka = 2, + /decl/material/liquid/ethanol/coffee = 1 ) /decl/cocktail/white_russian name = "white Russian" description = "A straightforward cocktail of coffee liqueur and vodka. Popular in a lot of places, but that's just, like, an opinion, man." ratios = list( - /decl/material/liquid/ethanol/vodka = 0.3, - /decl/material/liquid/ethanol/coffee = 0.15, - /decl/material/liquid/drink/milk/cream = 0.15 + /decl/material/liquid/ethanol/coffee = 2, + /decl/material/liquid/drink/milk/cream, + /decl/material/liquid/ethanol/vodka = 1 ) /decl/cocktail/whiskey_cola name = "whiskey cola" description = "Whiskey mixed with cola. Quite refreshing." ratios = list( - /decl/material/liquid/ethanol/whiskey = 0.2, - /decl/material/liquid/drink/cola = 0.5 + /decl/material/liquid/drink/cola = 4, + /decl/material/liquid/ethanol/whiskey = 1 ) /decl/cocktail/bloody_mary name = "Bloody Mary" description = "A cocktail of vodka, tomato and lime juice. Celery stalk optional." ratios = list( - /decl/material/liquid/drink/juice/tomato = 0.4, - /decl/material/liquid/ethanol/vodka = 0.15, - /decl/material/liquid/drink/juice/lime = 0.15 + /decl/material/liquid/drink/juice/tomato = 3, + /decl/material/liquid/ethanol/vodka = 1, + /decl/material/liquid/drink/juice/lime = 1 ) /decl/cocktail/livergeist name = "The Livergeist" description = "A cocktail pioneered by a small cabal with a vendetta against the liver. Drink very carefully." ratios = list( - /decl/material/liquid/ethanol/vodka = 0.1, - /decl/material/liquid/ethanol/gin = 0.1, - /decl/material/liquid/ethanol/aged_whiskey = 0.1, - /decl/material/liquid/ethanol/cognac = 0.1, - /decl/material/liquid/drink/juice/lime = 0.1 + /decl/material/liquid/ethanol/vodka = 1, + /decl/material/liquid/ethanol/gin = 1, + /decl/material/liquid/ethanol/aged_whiskey = 1, + /decl/material/liquid/ethanol/cognac = 1, + /decl/material/liquid/drink/juice/lime = 1 ) /decl/cocktail/brave_bull name = "Brave Bull" description = "A strong cocktail of tequila and coffee liquor." ratios = list( - /decl/material/liquid/ethanol/tequila = 0.45, - /decl/material/liquid/ethanol/coffee = 0.25 + /decl/material/liquid/ethanol/tequila = 2, + /decl/material/liquid/ethanol/coffee = 1 ) /decl/cocktail/toxins_special name = "H2 Special" description = "Raise a glass to the bomb technicians of yesteryear, wherever their ashes now reside." ratios = list( - /decl/material/liquid/ethanol/rum = 0.35, - /decl/material/liquid/ethanol/vermouth = 0.35, + /decl/material/liquid/ethanol/rum = 1, + /decl/material/liquid/ethanol/vermouth = 1, /decl/material/solid/metallic_hydrogen ) @@ -181,85 +205,88 @@ name = "Beepsky Smash" description = "A cocktail originating with stationside security forces. Rumoured to take the edge off being stunned with your own baton." ratios = list( - /decl/material/liquid/ethanol/whiskey = 0.4, - /decl/material/liquid/drink/juice/lime = 0.2, - /decl/material/solid/metal/iron = 0.1 + /decl/material/liquid/ethanol/whiskey = 2, + /decl/material/liquid/drink/juice/lime = 1, + /decl/material/solid/metal/iron ) /decl/cocktail/doctor_delight name = "Doctor's Delight" description = "A healthy mixture of juices and medication, guaranteed to keep you healthy until the next maintenance goblin decides to put a few new holes in you." ratios = list( - /decl/material/liquid/regenerator = 0.3, - /decl/material/liquid/drink/juice/lime = 0.1, - /decl/material/liquid/drink/juice/tomato = 0.1, - /decl/material/liquid/drink/juice/orange = 0.1, - /decl/material/liquid/drink/milk/cream = 0.1 + /decl/material/liquid/regenerator = 3, + /decl/material/liquid/drink/juice/lime = 1, + /decl/material/liquid/drink/juice/tomato = 1, + /decl/material/liquid/drink/juice/orange = 1, + /decl/material/liquid/drink/milk/cream ) /decl/cocktail/manly_dorf name = "The Manly Dorf" description = "A cocktail of old that claims to be for manly men, but is mostly for people who can't tell beer and ale apart." ratios = list( - /decl/material/liquid/ethanol/ale = 0.35, - /decl/material/liquid/ethanol/beer = 0.35 + /decl/material/liquid/ethanol/ale = 1, + /decl/material/liquid/ethanol/beer = 1 ) /decl/cocktail/irish_coffee name = "Irish coffee" description = "A cocktail of coffee, whiskey and cream, just the thing to kick you awake while also dulling the pain of existence." ratios = list( - /decl/material/liquid/drink/coffee = 0.5, - /decl/material/liquid/ethanol/irish_cream = 0.2 + /decl/material/liquid/drink/coffee = 4, + /decl/material/liquid/ethanol/irish_cream = 1 ) /decl/cocktail/b52 name = "B-52" description = "A semi-modern spin on an Irish coffee, featuring a dash of cognac. It will get you bombed." ratios = list( - /decl/material/liquid/ethanol/cognac = 0.3, - /decl/material/liquid/ethanol/irish_cream = 0.2, - /decl/material/liquid/ethanol/coffee = 0.2 + /decl/material/liquid/ethanol/coffee = 1, + /decl/material/liquid/ethanol/irish_cream = 1, + /decl/material/liquid/ethanol/cognac = 1 ) + order_specific = TRUE // layered cocktail /decl/cocktail/atomicbomb name = "Atomic Bomb" description = "A radioactive take on a B-52, popularized by asteroid miners with prosthetic organs and something to prove." ratios = list( - /decl/material/liquid/ethanol/cognac = 0.3, - /decl/material/liquid/ethanol/irish_cream = 0.2, - /decl/material/liquid/ethanol/coffee = 0.2, + /decl/material/liquid/ethanol/coffee = 1, + /decl/material/liquid/ethanol/irish_cream = 1, + /decl/material/liquid/ethanol/cognac = 1, /decl/material/solid/metal/uranium ) + order_specific = TRUE // layered cocktail +// todo: consider creating clear curacao for this /decl/cocktail/margarita name = "margarita" description = "A classic cocktail of antiquity." ratios = list( - /decl/material/liquid/ethanol/tequila = 0.35, - /decl/material/liquid/drink/juice/lime = 0.35 + /decl/material/liquid/ethanol/tequila = 3, + /decl/material/liquid/drink/juice/lime = 1 ) /decl/cocktail/longislandicedtea name = "Long Island Iced Tea" description = "Most of the liquor cabinet, brought together in a delicious mix. Designed for middle-aged alcoholics." ratios = list( - /decl/material/liquid/drink/cola = 0.2, - /decl/material/liquid/ethanol/rum = 0.1, - /decl/material/liquid/ethanol/vodka = 0.1, - /decl/material/liquid/ethanol/gin = 0.1, - /decl/material/liquid/ethanol/tequila = 0.1 + /decl/material/liquid/drink/cola = 2, + /decl/material/liquid/ethanol/rum = 1, + /decl/material/liquid/ethanol/vodka = 1, + /decl/material/liquid/ethanol/gin = 1, + /decl/material/liquid/ethanol/tequila = 1 ) /decl/cocktail/threemileisland name = "Three Mile Island Iced Tea" description = "Much like the Atomic Bomb, this cocktail was adapted by asteroid miners who couldn't enjoy a drink without a dose of radiation poisoning." ratios = list( - /decl/material/liquid/drink/cola = 0.2, - /decl/material/liquid/ethanol/rum = 0.1, - /decl/material/liquid/ethanol/vodka = 0.1, - /decl/material/liquid/ethanol/gin = 0.1, - /decl/material/liquid/ethanol/tequila = 0.1, + /decl/material/liquid/drink/cola = 2, + /decl/material/liquid/ethanol/rum = 1, + /decl/material/liquid/ethanol/vodka = 1, + /decl/material/liquid/ethanol/gin = 1, + /decl/material/liquid/ethanol/tequila = 1, /decl/material/solid/metal/uranium ) @@ -267,24 +294,24 @@ name = "whiskey soda" description = "A simple cocktail, considered to be cultured and refined." ratios = list( - /decl/material/liquid/ethanol/whiskey = 0.25, - /decl/material/liquid/drink/sodawater = 0.45 + /decl/material/liquid/drink/sodawater = 4, + /decl/material/liquid/ethanol/whiskey = 1 ) /decl/cocktail/manhattan name = "Manhattan" description = "Another classic cocktail of antiquity. Popular with private investigators." ratios = list( - /decl/material/liquid/ethanol/whiskey = 0.45, - /decl/material/liquid/ethanol/vermouth = 0.25 + /decl/material/liquid/ethanol/whiskey = 2, + /decl/material/liquid/ethanol/vermouth = 1 ) /decl/cocktail/manhattan_proj name = "Manhattan Project" description = "A classic cocktail with a spicy twist, pioneered by a robot detective." ratios = list( - /decl/material/liquid/ethanol/whiskey = 0.45, - /decl/material/liquid/ethanol/vermouth = 0.25, + /decl/material/liquid/ethanol/whiskey = 2, + /decl/material/liquid/ethanol/vermouth = 1, /decl/material/solid/metal/uranium ) @@ -292,35 +319,35 @@ name = "vodka and tonic" description = "A simple, refreshing cocktail with a kick to it." ratios = list( - /decl/material/liquid/ethanol/vodka = 0.2, - /decl/material/liquid/drink/tonic = 0.5 + /decl/material/liquid/drink/tonic = 4, + /decl/material/liquid/ethanol/vodka = 1 ) /decl/cocktail/gin_fizz name = "gin fizz" description = "A dry, refreshing cocktail with a tang of lime." ratios = list( - /decl/material/liquid/ethanol/gin = 0.3, - /decl/material/liquid/drink/sodawater = 0.2, - /decl/material/liquid/drink/juice/lime = 0.2 + /decl/material/liquid/ethanol/gin = 2, + /decl/material/liquid/drink/sodawater = 2, + /decl/material/liquid/drink/juice/lime = 1 ) /decl/cocktail/bahama_mama name = "Bahama Mama" description = "A sweet tropical cocktail that is deceptively strong." ratios = list( - /decl/material/liquid/ethanol/rum = 0.2, - /decl/material/liquid/drink/juice/orange = 0.2, - /decl/material/liquid/drink/juice/lime = 0.2, - /decl/material/liquid/drink/grenadine = 0.1 + /decl/material/liquid/ethanol/rum = 2, + /decl/material/liquid/drink/juice/orange = 2, + /decl/material/liquid/drink/juice/lime = 2, + /decl/material/liquid/drink/grenadine = 1 ) /decl/cocktail/singulo name = "Singulo" description = "Traditionally thrown together from maintenance stills and used to treat singularity exposure in engineers who forgot their meson goggles." ratios = list( - /decl/material/liquid/ethanol/vodka = 0.35, - /decl/material/liquid/ethanol/wine = 0.35, + /decl/material/liquid/ethanol/vodka = 1, + /decl/material/liquid/ethanol/wine = 1, /decl/material/solid/metal/radium ) @@ -328,171 +355,173 @@ name = "Demon's Blood" description = "A ghoulish cocktail that originated as a practical joke in a fringe habitat." ratios = list( - /decl/material/liquid/ethanol/rum = 0.2, - /decl/material/liquid/drink/citrussoda = 0.2, - /decl/material/liquid/blood = 0.1, - /decl/material/liquid/drink/cherrycola = 0.2 + /decl/material/liquid/ethanol/rum = 2, + /decl/material/liquid/drink/citrussoda = 2, + /decl/material/liquid/drink/cherrycola = 2, + /decl/material/liquid/blood = 1 ) /decl/cocktail/booger name = "Booger" description = "A thick and creamy cocktail." ratios = list( - /decl/material/liquid/drink/milk/cream = 0.2, - /decl/material/liquid/drink/juice/banana = 0.15, - /decl/material/liquid/ethanol/rum = 0.2, - /decl/material/liquid/drink/juice/watermelon = 0.15 + /decl/material/liquid/drink/milk/cream = 2, + /decl/material/liquid/ethanol/rum = 2, + /decl/material/liquid/drink/juice/banana = 1, + /decl/material/liquid/drink/juice/watermelon = 1 ) /decl/cocktail/antifreeze name = "Anti-freeze" description = "A chilled cocktail invented and popularized by corona miners." ratios = list( - /decl/material/liquid/ethanol/vodka = 0.3, - /decl/material/liquid/drink/milk/cream = 0.2, - /decl/material/solid/ice = 0.2 + /decl/material/liquid/ethanol/vodka = 3, + /decl/material/liquid/drink/milk/cream = 2, + /decl/material/solid/ice = 2 ) /decl/cocktail/barefoot name = "Barefoot" description = "A smooth cocktail that will take your mind off the broken glass you stepped on." ratios = list( - /decl/material/liquid/ethanol/vermouth = 0.4, - /decl/material/liquid/drink/juice/berry = 0.2, - /decl/material/liquid/drink/milk/cream = 0.1 + /decl/material/liquid/ethanol/vermouth = 4, + /decl/material/liquid/drink/juice/berry = 2, + /decl/material/liquid/drink/milk/cream = 1 ) /decl/cocktail/sbiten name = "sbiten" description = "A form of spiced mead that will bring tears to the eyes of the most hardened drinker." ratios = list( - /decl/material/liquid/ethanol/mead = 0.6, - /decl/material/liquid/capsaicin = 0.1 + /decl/material/liquid/ethanol/mead = 9, + /decl/material/liquid/capsaicin = 1 ) /decl/cocktail/red_mead name = "red mead" description = "Supposedly a traditional drink amongst mercenary groups prior to dangerous missions." ratios = list( - /decl/material/liquid/ethanol/mead = 0.6, - /decl/material/liquid/blood = 0.1 + /decl/material/liquid/ethanol/mead = 1, + /decl/material/liquid/blood = 1 ) /decl/cocktail/acidspit name = "Acid Spit" description = "A cocktail inspired by monsters of legend, popular with college students daring their friends to drink one." ratios = list( - /decl/material/liquid/ethanol/wine = 0.7, + /decl/material/liquid/ethanol/wine = 1, /decl/material/liquid/acid ) +// A screwdriver, with half the mixer replaced with other citrus juices. /decl/cocktail/changelingsting name = "Changeling Sting" description = "A deceptively simple cocktail with a complex flavour profile. Rumours of causing paralysis and voice loss are common but unsubstantiated." ratios = list( - /decl/material/liquid/ethanol/vodka = 0.4, - /decl/material/liquid/drink/juice/lime = 0.1, - /decl/material/liquid/drink/juice/lemon = 0.1, - /decl/material/liquid/drink/juice/orange = 0.1 + /decl/material/liquid/drink/juice/orange = 2, + /decl/material/liquid/drink/juice/lime = 1, + /decl/material/liquid/drink/juice/lemon = 1, + /decl/material/liquid/ethanol/vodka = 1 ) /decl/cocktail/neurotoxin name = "Neurotoxin" description = "A cocktail primarily intended for people with a grudge against their own brain." ratios = list( - /decl/material/liquid/ethanol/vodka = 0.1, - /decl/material/liquid/ethanol/gin = 0.1, - /decl/material/liquid/ethanol/aged_whiskey = 0.1, - /decl/material/liquid/ethanol/cognac = 0.1, - /decl/material/liquid/drink/juice/lime = 0.1, - /decl/material/liquid/sedatives = 0.1 + /decl/material/liquid/ethanol/vodka = 1, + /decl/material/liquid/ethanol/gin = 1, + /decl/material/liquid/ethanol/aged_whiskey = 1, + /decl/material/liquid/ethanol/cognac = 1, + /decl/material/liquid/drink/juice/lime = 1, + /decl/material/liquid/sedatives ) /decl/cocktail/snowwhite name = "Snow White" description = "A tangy, fizzy twist on beer." ratios = list( - /decl/material/liquid/ethanol/beer = 0.4, - /decl/material/liquid/drink/lemon_lime = 0.3 + /decl/material/liquid/drink/lemon_lime = 3, + /decl/material/liquid/ethanol/beer = 1 ) /decl/cocktail/irishslammer name = "Irish Slammer" description = "A rich cocktail of whiskey, stout and cream that was performed using a shot glass before glass-interleaving technology was lost." ratios = list( - /decl/material/liquid/ethanol/ale = 0.5, - /decl/material/liquid/ethanol/whiskey = 0.1, - /decl/material/liquid/ethanol/irish_cream = 0.1 + /decl/material/liquid/ethanol/ale = 5, + /decl/material/liquid/ethanol/whiskey = 1, + /decl/material/liquid/ethanol/irish_cream = 1 ) +// A whiskey cola with added beer. /decl/cocktail/syndicatebomb name = "Syndicate Bomb" description = "A murky cocktail reputed to have originated in criminal circles. It will definitely get you bombed." ratios = list( - /decl/material/liquid/ethanol/whiskey = 0.2, - /decl/material/liquid/ethanol/beer = 0.2, - /decl/material/liquid/drink/cola = 0.3 + /decl/material/liquid/ethanol/whiskey = 1, + /decl/material/liquid/ethanol/beer = 1, + /decl/material/liquid/drink/cola = 4 ) /decl/cocktail/devilskiss name = "Devil's Kiss" description = "A ghoulish cocktail popular in some of the weirder dive bars on the system fringe." ratios = list( - /decl/material/liquid/ethanol/rum = 0.4, - /decl/material/liquid/blood = 0.1, - /decl/material/liquid/ethanol/coffee = 0.2 + /decl/material/liquid/ethanol/rum = 4, + /decl/material/liquid/blood = 1, + /decl/material/liquid/ethanol/coffee = 2 ) /decl/cocktail/hippiesdelight name = "Hippy's Delight" description = "A complex cocktail that just might open your third eye." ratios = list( - /decl/material/liquid/ethanol/vodka = 0.1, - /decl/material/liquid/ethanol/gin = 0.1, - /decl/material/liquid/ethanol/aged_whiskey = 0.1, - /decl/material/liquid/ethanol/cognac = 0.1, - /decl/material/liquid/drink/juice/lime = 0.1, - /decl/material/liquid/psychotropics = 0.2 + /decl/material/liquid/ethanol/vodka = 1, + /decl/material/liquid/ethanol/gin = 1, + /decl/material/liquid/ethanol/aged_whiskey = 1, + /decl/material/liquid/ethanol/cognac = 1, + /decl/material/liquid/drink/juice/lime = 1, + /decl/material/liquid/psychotropics = 2 ) /decl/cocktail/bananahonk name = "Banana Honk" description = "A virgin cocktail intended for the class clown. If someone orders you one of these, it is probably an insult." ratios = list( - /decl/material/liquid/drink/juice/banana = 0.4, - /decl/material/liquid/drink/milk/cream = 0.2, - /decl/material/liquid/nutriment/sugar = 0.1 + /decl/material/liquid/drink/juice/banana = 4, + /decl/material/liquid/drink/milk/cream = 2, + /decl/material/liquid/nutriment/sugar = 1 ) /decl/cocktail/ships_surgeon name = "Ship's Surgeon" description = "A smooth, steady cocktail supposedly ordered by sawbones and surgeons of legend." ratios = list( - /decl/material/liquid/drink/cherrycola = 0.5, - /decl/material/liquid/ethanol/rum = 0.2 + /decl/material/liquid/drink/cherrycola = 4, + /decl/material/liquid/ethanol/rum = 2 ) /decl/cocktail/vodkacola name = "vodka cola" description = "A simple mix of cola and vodka, combining sweetness, fizz and a kick in the teeth." ratios = list( - /decl/material/liquid/ethanol/vodka = 0.5, - /decl/material/liquid/drink/cola = 0.2 + /decl/material/liquid/drink/cola = 2, + /decl/material/liquid/ethanol/vodka = 1 ) /decl/cocktail/sawbonesdismay name = "Sawbones' Dismay" description = "Legally, we are required to inform you that drinking this cocktail may invalidate your health insurance." ratios = list( - /decl/material/liquid/ethanol/jagermeister = 0.35, - /decl/material/liquid/drink/beastenergy = 0.35 + /decl/material/liquid/ethanol/jagermeister = 1, + /decl/material/liquid/drink/beastenergy = 1 ) /decl/cocktail/patron name = "Patron" description = "Tequila mixed with flaked silver, for those with moderate expensive tastes." ratios = list( - /decl/material/liquid/ethanol/tequila = 0.7, + /decl/material/liquid/ethanol/tequila = 1, /decl/material/solid/metal/silver ) @@ -500,8 +529,8 @@ name = "Rewriter" description = "A sickly concotion that college students and academics swear by for getting you through an all-nighter or six." ratios = list( - /decl/material/liquid/drink/coffee = 0.35, - /decl/material/liquid/drink/citrussoda = 0.35 + /decl/material/liquid/drink/coffee = 1, + /decl/material/liquid/drink/citrussoda = 1 ) // TODO: add schnapps @@ -509,7 +538,7 @@ name = "Goldschlager" description = "Schnapps mixed with flaked gold, for those with very expensive tastes." ratios = list( - /decl/material/liquid/ethanol/vodka = 0.7, + /decl/material/liquid/ethanol/vodka = 1, /decl/material/solid/metal/gold ) @@ -517,23 +546,23 @@ name = "Brown Dwarf" description = "A foamy chocolate beverage that has failed to sustain nuclear fusion." ratios = list( - /decl/material/liquid/drink/hot_coco = 0.4, - /decl/material/liquid/drink/citrussoda = 0.3 + /decl/material/liquid/drink/hot_coco = 2, + /decl/material/liquid/drink/citrussoda = 1 ) /decl/cocktail/snowball name = "Snowball" description = "A cold pick-me-up frequently drunk in scientific outposts and academic offices." ratios = list( - /decl/material/solid/ice = 0.3, - /decl/material/liquid/drink/coffee = 0.2, - /decl/material/liquid/drink/juice/watermelon = 0.2 + /decl/material/solid/ice = 3, + /decl/material/liquid/drink/coffee = 2, + /decl/material/liquid/drink/juice/watermelon = 1 ) /decl/cocktail/fools_gold name = "Fool's Gold" description = "Watered-down whiskey. Essentially grog, but without the pirates." ratios = list( - /decl/material/liquid/water = 0.5, - /decl/material/liquid/ethanol/whiskey = 0.2 + /decl/material/liquid/water = 1, + /decl/material/liquid/ethanol/whiskey = 1 ) From 4368bd3f51f1d36aa4444eec9dd469c5ef72208f Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 20 Aug 2022 19:56:58 -0500 Subject: [PATCH 0268/1518] Fix mapload consuming arguments passed in new() --- code/controllers/subsystems/atoms.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystems/atoms.dm b/code/controllers/subsystems/atoms.dm index e7740189d57..18964993b8d 100644 --- a/code/controllers/subsystems/atoms.dm +++ b/code/controllers/subsystems/atoms.dm @@ -38,9 +38,14 @@ SUBSYSTEM_DEF(atoms) var/count = created_atoms.len while(created_atoms.len) var/atom/A = created_atoms[created_atoms.len] + var/list/atom_args = created_atoms[A] created_atoms.len-- if(!QDELETED(A) && !(A.atom_flags & ATOM_FLAG_INITIALIZED)) - InitAtom(A, mapload_arg) + if(atom_args) + atom_args.Insert(1, TRUE) + InitAtom(A, atom_args) + else + InitAtom(A, mapload_arg) CHECK_TICK // If wondering why not just store all atoms in created_atoms and use the block above: that turns out unbearably expensive. From aa5696a13d0bf6a7a74e839f2d272c0e51ee8908 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 22 Aug 2022 00:52:38 +0000 Subject: [PATCH 0269/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 57474b1ef56..35e62116169 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -85,12 +85,6 @@

    NataKilar updated:

  • Adds PLEXUS uplinks, machinery which allows devices to connect to PLEXUS in conjunction with a PLEXUS repeater.
  • Network signal simulation has been adjusted slightly. Connection strengths should be comparable with old setups.
  • - -

    20 June 2022

    -

    MistakeNot4892 updated:

    -
      -
    • GPS units now provide a visual compass to track each other.
    • -
    From f3f5e3c659e3e7d70563b3fe98b7e6590dc75c82 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 22 Aug 2022 13:42:29 +1000 Subject: [PATCH 0270/1518] Automatic changelog generation for PR #2621 [ci skip] --- html/changelogs/AutoChangeLog-pr-2621.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2621.yml diff --git a/html/changelogs/AutoChangeLog-pr-2621.yml b/html/changelogs/AutoChangeLog-pr-2621.yml new file mode 100644 index 00000000000..950606d48cf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2621.yml @@ -0,0 +1,5 @@ +author: Penelope Haze +delete-after: true +changes: + - tweak: Broadly retools cocktail ratios, changing some cocktail ingredient amounts + and improving their display in the codex. From d988361dd37a7c7cff4a40be363db3d38a851809 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 22 Aug 2022 14:12:02 +1000 Subject: [PATCH 0271/1518] Automatic changelog generation for PR #2582 [ci skip] --- html/changelogs/AutoChangeLog-pr-2582.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2582.yml diff --git a/html/changelogs/AutoChangeLog-pr-2582.yml b/html/changelogs/AutoChangeLog-pr-2582.yml new file mode 100644 index 00000000000..9c93946833e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2582.yml @@ -0,0 +1,6 @@ +author: PsyCommando +delete-after: true +changes: + - bugfix: Fixed top hat not showing up on the mob sprite. + - bugfix: Fixed balaclava and other masks turning people bald. + - bugfix: Fixed a lot of hats not hiding hair under them. From e9dd2e313698bc3881c07043d14f6f10fbd85a3d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 9 Aug 2022 14:20:23 +1000 Subject: [PATCH 0272/1518] Fabs now generate their capacity list from available recipes, to avoid having to manually add random materials as needed. --- code/modules/fabrication/_fabricator.dm | 35 +++++++++++++------ .../designs/imprinter/_designs_imprinter.dm | 3 +- .../fabrication/fabricator_bioprinter.dm | 3 -- code/modules/fabrication/fabricator_books.dm | 4 --- code/modules/fabrication/fabricator_food.dm | 4 +-- .../fabrication/fabricator_imprinter.dm | 11 +----- .../fabrication/fabricator_industrial.dm | 15 +------- code/modules/fabrication/fabricator_intake.dm | 7 ++-- .../fabrication/fabricator_microlathe.dm | 7 +--- .../fabrication/fabricator_protolathe.dm | 12 +------ .../fabrication/fabricator_robotics.dm | 12 +------ .../modules/fabrication/fabricator_textile.dm | 18 +--------- 12 files changed, 39 insertions(+), 92 deletions(-) diff --git a/code/modules/fabrication/_fabricator.dm b/code/modules/fabrication/_fabricator.dm index 486f4b1d48b..33211d2b0cc 100644 --- a/code/modules/fabrication/_fabricator.dm +++ b/code/modules/fabrication/_fabricator.dm @@ -31,14 +31,8 @@ var/list/stored_material var/list/storage_capacity - var/list/base_storage_capacity = list( - /decl/material/solid/metal/steel = SHEET_MATERIAL_AMOUNT * 20, - /decl/material/solid/metal/aluminium = SHEET_MATERIAL_AMOUNT * 20, - /decl/material/solid/metal/copper = SHEET_MATERIAL_AMOUNT * 20, - /decl/material/solid/fiberglass = SHEET_MATERIAL_AMOUNT * 10, - /decl/material/solid/glass = SHEET_MATERIAL_AMOUNT * 10, - /decl/material/solid/plastic = SHEET_MATERIAL_AMOUNT * 10 - ) + var/base_storage_capacity_mult = 20 + var/list/base_storage_capacity var/show_category = "All" var/fab_status_flags = 0 @@ -109,8 +103,6 @@ var/decl/material/reg = mat stored_substances_to_names[mat] = lowertext(initial(reg.name)) - if(prefilled) - fill_to_capacity() if(SSfabrication.post_recipe_init) refresh_design_cache() @@ -152,6 +144,7 @@ design_cache |= unlocked_tech var/list/unique_categories + var/list/add_mat_to_storage_cap = list() for(var/datum/fabricator_recipe/R in design_cache) LAZYDISTINCTADD(unique_categories, R.category) if(!length(R.species_locked)) @@ -165,10 +158,32 @@ if(!(ispath(species_variation, species_type))) design_cache.Remove(R) return + + for(var/mat in R.resources) + add_mat_to_storage_cap |= mat design_cache = sortTim(design_cache, /proc/cmp_name_asc) ui_nb_categories = LAZYLEN(unique_categories) + if(length(add_mat_to_storage_cap)) + var/need_storage_recalc = FALSE + for(var/mat in add_mat_to_storage_cap) + if(mat in base_storage_capacity) + continue + if(!(mat in base_storage_capacity)) + LAZYSET(base_storage_capacity, mat, (SHEET_MATERIAL_AMOUNT * base_storage_capacity_mult)) + need_storage_recalc = TRUE + if(!(mat in stored_material)) + stored_material[mat] = 0 + + if(need_storage_recalc) + RefreshParts() + + // We handle this here, as we don't know what materials should be stocked prior to updating our recipes. + if(prefilled) + prefilled = FALSE + fill_to_capacity() + /obj/machinery/fabricator/state_transition(var/decl/machine_construction/default/new_state) . = ..() if(istype(new_state)) diff --git a/code/modules/fabrication/designs/imprinter/_designs_imprinter.dm b/code/modules/fabrication/designs/imprinter/_designs_imprinter.dm index cc843b65158..5f0207f8b75 100644 --- a/code/modules/fabrication/designs/imprinter/_designs_imprinter.dm +++ b/code/modules/fabrication/designs/imprinter/_designs_imprinter.dm @@ -4,4 +4,5 @@ /datum/fabricator_recipe/imprinter/get_resources() . = ..() - LAZYSET(resources, /decl/material/liquid/acid, 20) + // 1 sheet of matter is 20u of reagents, which is converted during fabricator input + LAZYSET(resources, /decl/material/liquid/acid, SHEET_MATERIAL_AMOUNT) diff --git a/code/modules/fabrication/fabricator_bioprinter.dm b/code/modules/fabrication/fabricator_bioprinter.dm index b26d2b2bfcf..f92e2d8526f 100644 --- a/code/modules/fabrication/fabricator_bioprinter.dm +++ b/code/modules/fabrication/fabricator_bioprinter.dm @@ -8,9 +8,6 @@ base_icon_state = "bioprinter" base_type = /obj/machinery/fabricator/bioprinter fabricator_class = FABRICATOR_CLASS_MEAT - base_storage_capacity = list( - /decl/material/solid/meat = SHEET_MATERIAL_AMOUNT * 100 - ) var/datum/dna/loaded_dna //DNA for biological organs /obj/machinery/fabricator/bioprinter/get_nano_template() diff --git a/code/modules/fabrication/fabricator_books.dm b/code/modules/fabrication/fabricator_books.dm index 60d7afa9097..5e9f2854c01 100644 --- a/code/modules/fabrication/fabricator_books.dm +++ b/code/modules/fabrication/fabricator_books.dm @@ -8,10 +8,6 @@ active_power_usage = 1000 base_type = /obj/machinery/fabricator/book fabricator_class = FABRICATOR_CLASS_BOOKS - base_storage_capacity = list( - /decl/material/solid/wood = SHEET_MATERIAL_AMOUNT * 20, - /decl/material/solid/plastic = SHEET_MATERIAL_AMOUNT * 20 - ) color_selectable = TRUE /obj/machinery/fabricator/book/make_order(datum/fabricator_recipe/recipe, multiplier) diff --git a/code/modules/fabrication/fabricator_food.dm b/code/modules/fabrication/fabricator_food.dm index 086832d7e68..65a3f51f109 100644 --- a/code/modules/fabrication/fabricator_food.dm +++ b/code/modules/fabrication/fabricator_food.dm @@ -5,10 +5,8 @@ icon = 'icons/obj/machines/fabricators/replicator.dmi' icon_state = "replicator" base_icon_state = "replicator" + base_storage_capacity_mult = 5 has_recycler = FALSE - base_storage_capacity = list( - /decl/material/liquid/nutriment = 100 - ) /obj/machinery/fabricator/replicator/hear_talk(var/mob/M, var/text, var/verb, var/decl/language/speaking) if(speaking && !speaking.machine_understands) diff --git a/code/modules/fabrication/fabricator_imprinter.dm b/code/modules/fabrication/fabricator_imprinter.dm index 118511c4dfc..8555b71fff6 100644 --- a/code/modules/fabrication/fabricator_imprinter.dm +++ b/code/modules/fabrication/fabricator_imprinter.dm @@ -9,13 +9,4 @@ base_type = /obj/machinery/fabricator/imprinter has_recycler = FALSE fabricator_class = FABRICATOR_CLASS_IMPRINTER - base_storage_capacity = list( - /decl/material/solid/glass = SHEET_MATERIAL_AMOUNT * 50, - /decl/material/solid/fiberglass = SHEET_MATERIAL_AMOUNT * 50, - /decl/material/solid/metal/gold = SHEET_MATERIAL_AMOUNT * 50, - /decl/material/solid/metal/silver = SHEET_MATERIAL_AMOUNT * 50, - /decl/material/solid/gemstone/diamond = SHEET_MATERIAL_AMOUNT * 50, - /decl/material/liquid/acid = 120, - /decl/material/liquid/acid/hydrochloric = 120, - /decl/material/liquid/acid/polyacid = 120 - ) \ No newline at end of file + base_storage_capacity_mult = 50 diff --git a/code/modules/fabrication/fabricator_industrial.dm b/code/modules/fabrication/fabricator_industrial.dm index 3e467d2472a..74c66828360 100644 --- a/code/modules/fabrication/fabricator_industrial.dm +++ b/code/modules/fabrication/fabricator_industrial.dm @@ -8,18 +8,5 @@ active_power_usage = 5000 base_type = /obj/machinery/fabricator/industrial fabricator_class = FABRICATOR_CLASS_INDUSTRIAL - base_storage_capacity = list( - /decl/material/solid/metal/steel = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/plasteel = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/fiberglass = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/osmium = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/aluminium = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/plastic = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/glass = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/gold = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/silver = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/uranium = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/gemstone/diamond = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/titanium = SHEET_MATERIAL_AMOUNT * 100 - ) + base_storage_capacity_mult = 100 output_dir = EAST diff --git a/code/modules/fabrication/fabricator_intake.dm b/code/modules/fabrication/fabricator_intake.dm index 0556fcfdb7f..f3ba1fb637a 100644 --- a/code/modules/fabrication/fabricator_intake.dm +++ b/code/modules/fabrication/fabricator_intake.dm @@ -9,11 +9,14 @@ for(var/R in thing.reagents.reagent_volumes) if(!base_storage_capacity[R]) continue - var/taking_reagent = min(REAGENT_VOLUME(thing.reagents, R), storage_capacity[R] - stored_material[R]) + var/taking_reagent = min(REAGENT_VOLUME(thing.reagents, R), FLOOR((storage_capacity[R] - stored_material[R]) * REAGENT_UNITS_PER_MATERIAL_UNIT)) if(taking_reagent <= 0) continue + var/reagent_matter = round(taking_reagent / REAGENT_UNITS_PER_MATERIAL_UNIT) + if(reagent_matter <= 0) + continue thing.reagents.remove_reagent(R, taking_reagent) - stored_material[R] += taking_reagent + stored_material[R] += reagent_matter // If we're destroying this, take everything. if(destructive) . = SUBSTANCE_TAKEN_ALL diff --git a/code/modules/fabrication/fabricator_microlathe.dm b/code/modules/fabrication/fabricator_microlathe.dm index 9f5eb06d8ff..bd00353f263 100644 --- a/code/modules/fabrication/fabricator_microlathe.dm +++ b/code/modules/fabrication/fabricator_microlathe.dm @@ -8,12 +8,7 @@ active_power_usage = 1000 base_type = /obj/machinery/fabricator/micro fabricator_class = FABRICATOR_CLASS_MICRO - base_storage_capacity = list( - /decl/material/solid/metal/aluminium = SHEET_MATERIAL_AMOUNT * 5, - /decl/material/solid/plastic = SHEET_MATERIAL_AMOUNT * 5, - /decl/material/solid/glass = SHEET_MATERIAL_AMOUNT * 5, - /decl/material/solid/fiberglass = SHEET_MATERIAL_AMOUNT * 5 - ) + base_storage_capacity_mult = 5 //Subtype for mapping, starts preloaded with glass and set to print glasses /obj/machinery/fabricator/micro/bartender diff --git a/code/modules/fabrication/fabricator_protolathe.dm b/code/modules/fabrication/fabricator_protolathe.dm index 711b4f71edf..4466b9efc7b 100644 --- a/code/modules/fabrication/fabricator_protolathe.dm +++ b/code/modules/fabrication/fabricator_protolathe.dm @@ -8,14 +8,4 @@ active_power_usage = 5000 base_type = /obj/machinery/fabricator/protolathe fabricator_class = FABRICATOR_CLASS_PROTOLATHE - base_storage_capacity = list( - /decl/material/solid/metal/steel = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/aluminium = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/plastic = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/glass = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/fiberglass = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/gold = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/silver = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/uranium = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/gemstone/diamond = SHEET_MATERIAL_AMOUNT * 100 - ) \ No newline at end of file + base_storage_capacity_mult = 100 diff --git a/code/modules/fabrication/fabricator_robotics.dm b/code/modules/fabrication/fabricator_robotics.dm index 4197f51c6dc..edeb7675785 100644 --- a/code/modules/fabrication/fabricator_robotics.dm +++ b/code/modules/fabrication/fabricator_robotics.dm @@ -8,17 +8,7 @@ active_power_usage = 5000 base_type = /obj/machinery/fabricator/robotics fabricator_class = FABRICATOR_CLASS_ROBOTICS - base_storage_capacity = list( - /decl/material/solid/metal/steel = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/aluminium = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/plastic = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/glass = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/fiberglass = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/gold = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/silver = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/uranium = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/gemstone/diamond = SHEET_MATERIAL_AMOUNT * 100 - ) + base_storage_capacity_mult = 100 var/picked_prosthetic_species //Prosthetics will be printed with this species /obj/machinery/fabricator/robotics/Initialize() diff --git a/code/modules/fabrication/fabricator_textile.dm b/code/modules/fabrication/fabricator_textile.dm index b4a35759913..39472bef502 100644 --- a/code/modules/fabrication/fabricator_textile.dm +++ b/code/modules/fabrication/fabricator_textile.dm @@ -8,20 +8,4 @@ active_power_usage = 5000 base_type = /obj/machinery/fabricator/textile fabricator_class = FABRICATOR_CLASS_TEXTILE - base_storage_capacity = list( - /decl/material/solid/metal/steel = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/aluminium = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/plastic = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/glass = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/fiberglass = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/gold = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/silver = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/uranium = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/gemstone/diamond = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/cloth = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/leather = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/cardboard = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/titanium = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/metal/plasteel = SHEET_MATERIAL_AMOUNT * 100, - /decl/material/solid/leather/synth = SHEET_MATERIAL_AMOUNT * 100 - ) \ No newline at end of file + base_storage_capacity_mult = 100 From 87ada8a72f810610912e935463d2348dcf747094 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 9 Aug 2022 14:50:06 +1000 Subject: [PATCH 0273/1518] Removed defunt recipe unit test. --- code/unit_tests/machine_tests.dm | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/code/unit_tests/machine_tests.dm b/code/unit_tests/machine_tests.dm index f5125dd8660..fc1da183105 100644 --- a/code/unit_tests/machine_tests.dm +++ b/code/unit_tests/machine_tests.dm @@ -66,24 +66,3 @@ else pass("All machines had valid construction states.") return 1 - - -/datum/unit_test/fabricator_recipes_shall_be_buildable - name = "MACHINE: All fabricators will be able to produce all of their recipes" - -/datum/unit_test/fabricator_recipes_shall_be_buildable/start_test() - var/failed = list() - for(var/thing in typesof(/obj/machinery/fabricator)) - var/obj/machinery/fabricator/fab = new thing - for(var/datum/fabricator_recipe/recipe in SSfabrication.get_all_recipes(fab.fabricator_class)) - for(var/mat in recipe.resources) - if(isnull(fab.storage_capacity[mat])) - log_bad("[fab.name] ([fab.type]) could not print [recipe.name] due to lacking [mat].") - failed += thing - break - qdel(fab) - if(length(failed)) - fail("One or more fabricators could not produce an associated recipe.") - else - pass("All fabricators could produce their associated recipes.") - return 1 \ No newline at end of file From 890df502673b514c797e0cafd0426366ee5aa1c6 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 9 Aug 2022 14:55:34 +1000 Subject: [PATCH 0274/1518] Adjusting bartender fab init. --- code/modules/fabrication/fabricator_microlathe.dm | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/code/modules/fabrication/fabricator_microlathe.dm b/code/modules/fabrication/fabricator_microlathe.dm index bd00353f263..9d550a92635 100644 --- a/code/modules/fabrication/fabricator_microlathe.dm +++ b/code/modules/fabrication/fabricator_microlathe.dm @@ -10,10 +10,7 @@ fabricator_class = FABRICATOR_CLASS_MICRO base_storage_capacity_mult = 5 -//Subtype for mapping, starts preloaded with glass and set to print glasses +//Subtype for mapping, starts preloaded and set to print glasses /obj/machinery/fabricator/micro/bartender show_category = "Drinking Glasses" - -/obj/machinery/fabricator/micro/bartender/Initialize() - . = ..() - stored_material[/decl/material/solid/glass] = base_storage_capacity[/decl/material/solid/glass] \ No newline at end of file + prefilled = TRUE From f0143ff9c448b1c598d0839fee96aa7b2fdd6737 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 9 Aug 2022 14:58:44 +1000 Subject: [PATCH 0275/1518] Fixes ordering of design cache mat collection. --- code/modules/fabrication/_fabricator.dm | 38 ++++++++----------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/code/modules/fabrication/_fabricator.dm b/code/modules/fabrication/_fabricator.dm index 33211d2b0cc..716dafd64c7 100644 --- a/code/modules/fabrication/_fabricator.dm +++ b/code/modules/fabrication/_fabricator.dm @@ -29,16 +29,15 @@ var/fabricator_class = FABRICATOR_CLASS_GENERAL var/filter_string - var/list/stored_material - var/list/storage_capacity + var/list/stored_material = list() + var/list/storage_capacity = list() var/base_storage_capacity_mult = 20 - var/list/base_storage_capacity + var/list/base_storage_capacity = list() var/show_category = "All" var/fab_status_flags = 0 var/mat_efficiency = 1.1 var/build_time_multiplier = 1 - var/static/list/stored_substances_to_names = list() var/list/design_cache = list() var/list/installed_designs = list() @@ -74,7 +73,8 @@ if(length(storage_capacity)) var/list/material_names = list() for(var/thing in storage_capacity) - material_names += "[storage_capacity[thing]] [stored_substances_to_names[thing]]" + var/decl/material/mat = GET_DECL(thing) + material_names += "[storage_capacity[thing]] [mat.use_name]" to_chat(user, SPAN_NOTICE("It can store [english_list(material_names)].")) if(has_recycler) to_chat(user, SPAN_NOTICE("It has a built-in shredder that can recycle most items, although any materials it cannot use will be wasted.")) @@ -88,22 +88,6 @@ // Get any local network we need to be part of. set_extension(src, /datum/extension/network_device, initial_network_id, initial_network_key, RECEIVER_STRONG_WIRELESS) - // Initialize material storage lists. - stored_material = list() - for(var/mat in base_storage_capacity) - stored_material[mat] = 0 - - // Update global type to string cache. - if(!stored_substances_to_names[mat]) - if(ispath(mat, /decl/material)) - var/decl/material/mat_instance = GET_DECL(mat) - if(istype(mat_instance)) - stored_substances_to_names[mat] = lowertext(mat_instance.name) - else if(ispath(mat, /decl/material)) - var/decl/material/reg = mat - stored_substances_to_names[mat] = lowertext(initial(reg.name)) - - if(SSfabrication.post_recipe_init) refresh_design_cache() else @@ -146,6 +130,10 @@ var/list/unique_categories var/list/add_mat_to_storage_cap = list() for(var/datum/fabricator_recipe/R in design_cache) + + for(var/mat in R.resources) + add_mat_to_storage_cap |= mat + LAZYDISTINCTADD(unique_categories, R.category) if(!length(R.species_locked)) continue @@ -158,9 +146,6 @@ if(!(ispath(species_variation, species_type))) design_cache.Remove(R) return - - for(var/mat in R.resources) - add_mat_to_storage_cap |= mat design_cache = sortTim(design_cache, /proc/cmp_name_asc) ui_nb_categories = LAZYLEN(unique_categories) @@ -171,7 +156,7 @@ if(mat in base_storage_capacity) continue if(!(mat in base_storage_capacity)) - LAZYSET(base_storage_capacity, mat, (SHEET_MATERIAL_AMOUNT * base_storage_capacity_mult)) + base_storage_capacity[mat] = (SHEET_MATERIAL_AMOUNT * base_storage_capacity_mult) need_storage_recalc = TRUE if(!(mat in stored_material)) stored_material[mat] = 0 @@ -228,9 +213,10 @@ ..() var/mb_rating = Clamp(total_component_rating_of_type(/obj/item/stock_parts/matter_bin), 0, 10) var/man_rating = Clamp(total_component_rating_of_type(/obj/item/stock_parts/manipulator), 0.5, 3.5) - storage_capacity = list() for(var/mat in base_storage_capacity) storage_capacity[mat] = mb_rating * base_storage_capacity[mat] + if(!(mat in stored_material)) + stored_material[mat] = 0 mat_efficiency = initial(mat_efficiency) - man_rating * 0.1 build_time_multiplier = initial(build_time_multiplier) * man_rating From c5c3f1991e54251164a19770ba6e43ece9088db8 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 9 Aug 2022 15:11:51 +1000 Subject: [PATCH 0276/1518] Updating UI to pass mat refs since this wass't done when reagents were unified. --- code/modules/fabrication/fabricator_topic.dm | 21 ++++++++++++-------- code/modules/fabrication/fabricator_ui.dm | 13 +++++++----- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/code/modules/fabrication/fabricator_topic.dm b/code/modules/fabrication/fabricator_topic.dm index 417b17cb8d2..25d9aa5730a 100644 --- a/code/modules/fabrication/fabricator_topic.dm +++ b/code/modules/fabrication/fabricator_topic.dm @@ -15,8 +15,10 @@ . = TOPIC_REFRESH if(href_list["eject_mat"]) - try_dump_material(href_list["eject_mat"]) - . = TOPIC_REFRESH + var/decl/material/mat = locate(href_list["eject_mat"]) + if(istype(mat)) + try_dump_material(mat.type) + . = TOPIC_REFRESH if(href_list["network_settings"]) var/datum/extension/network_device/D = get_extension(src, /datum/extension/network_device) @@ -60,11 +62,14 @@ queued_orders -= order qdel(order) -/obj/machinery/fabricator/proc/try_dump_material(var/mat_name) - mat_name = lowertext(mat_name) - for(var/mat_path in stored_substances_to_names) - if(stored_substances_to_names[mat_path] == mat_name && stored_material[mat_path] > SHEET_MATERIAL_AMOUNT) - var/sheet_count = FLOOR(stored_material[mat_path]/SHEET_MATERIAL_AMOUNT) +/obj/machinery/fabricator/proc/try_dump_material(var/mat_path) + if(!mat_path || !stored_material[mat_path]) + return + // TODO: proper liquid reagent ejection checks (acid sheet ejection...). + if(ispath(mat_path, /decl/material/gas) || ispath(mat_path, /decl/material/liquid)) + stored_material[mat_path] = 0 + else + var/sheet_count = FLOOR(stored_material[mat_path]/SHEET_MATERIAL_AMOUNT) + if(sheet_count >= 1) stored_material[mat_path] -= sheet_count * SHEET_MATERIAL_AMOUNT SSmaterials.create_object(mat_path, get_turf(src), sheet_count) - break diff --git a/code/modules/fabrication/fabricator_ui.dm b/code/modules/fabrication/fabricator_ui.dm index f985aa74e2b..26df6b0f136 100644 --- a/code/modules/fabrication/fabricator_ui.dm +++ b/code/modules/fabrication/fabricator_ui.dm @@ -18,14 +18,14 @@ /obj/machinery/fabricator/proc/ui_fabricator_resource_data() var/material_storage = list() for(var/material in storage_capacity) + var/decl/material/mat = GET_DECL(material) var/list/material_data = list() - var/mat_name = capitalize(stored_substances_to_names[material]) - material_data["name"] = mat_name + material_data["name"] = capitalize(mat.use_name) material_data["stored"] = stored_material[material] ? stored_material[material] : 0 material_data["max"] = storage_capacity[material] material_data["unit"] = SHEET_UNIT - material_data["eject_key"] = stored_substances_to_names[material] - material_data["eject_label"] = ispath(material, /decl/material) ? "Eject" : "Flush" + material_data["eject_key"] = "\ref[GET_DECL(material)]" + material_data["eject_label"] = ispath(material, /decl/material/liquid) ? "Flush" : "Eject" material_storage += list(material_data) return material_storage @@ -94,10 +94,13 @@ var/max_sheets = (!length(R.resources)) ? 100 : null var/has_missing_resource = FALSE for(var/material_path in R.resources) + var/required_amount = round(R.resources[material_path] * mat_efficiency) var/sheets = round(stored_material[material_path] / required_amount) var/has_enough = TRUE + var/decl/material/mat = GET_DECL(material_path) + if(isnull(max_sheets) || max_sheets > sheets) max_sheets = sheets if(stored_material[material_path] < required_amount) @@ -106,7 +109,7 @@ //Must make it a double list here or the fields are just overwriting eachothers material_components += list(list( - "name" = stored_substances_to_names[material_path], + "name" = capitalize(mat.use_name), "amount" = required_amount, "has_enough" = has_enough, )) From 10f9bb77e4547c416bab1b9fae43875ffbd69f3e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 9 Aug 2022 15:43:37 +1000 Subject: [PATCH 0277/1518] Trying to get circuit imprinters to work. :( --- code/modules/fabrication/_fabricator.dm | 7 +++---- code/modules/fabrication/designs/_design.dm | 4 ++-- code/modules/fabrication/fabricator_ui.dm | 5 +++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/fabrication/_fabricator.dm b/code/modules/fabrication/_fabricator.dm index 716dafd64c7..87dbb39c3e6 100644 --- a/code/modules/fabrication/_fabricator.dm +++ b/code/modules/fabrication/_fabricator.dm @@ -145,7 +145,7 @@ for(var/species_type in R.species_locked) if(!(ispath(species_variation, species_type))) design_cache.Remove(R) - return + continue design_cache = sortTim(design_cache, /proc/cmp_name_asc) ui_nb_categories = LAZYLEN(unique_categories) @@ -155,9 +155,8 @@ for(var/mat in add_mat_to_storage_cap) if(mat in base_storage_capacity) continue - if(!(mat in base_storage_capacity)) - base_storage_capacity[mat] = (SHEET_MATERIAL_AMOUNT * base_storage_capacity_mult) - need_storage_recalc = TRUE + need_storage_recalc = TRUE + base_storage_capacity[mat] = (SHEET_MATERIAL_AMOUNT * base_storage_capacity_mult) if(!(mat in stored_material)) stored_material[mat] = 0 diff --git a/code/modules/fabrication/designs/_design.dm b/code/modules/fabrication/designs/_design.dm index 9a2416c6ee7..b3ec5719dc3 100644 --- a/code/modules/fabrication/designs/_design.dm +++ b/code/modules/fabrication/designs/_design.dm @@ -64,7 +64,7 @@ .[M.type] = matter[material] if(reagents && length(reagents.reagent_volumes)) for(var/R in reagents.reagent_volumes) - .[R] = REAGENT_VOLUME(reagents, R) + .[R] = FLOOR(REAGENT_VOLUME(reagents, R) / REAGENT_UNITS_PER_MATERIAL_UNIT) /datum/fabricator_recipe/proc/build(var/turf/location, var/datum/fabricator_build_order/order) . = list() @@ -72,4 +72,4 @@ . += new path(location, order.multiplier) else for(var/i = 1, i <= order.multiplier, i++) - . += new path(location) \ No newline at end of file + . += new path(location) diff --git a/code/modules/fabrication/fabricator_ui.dm b/code/modules/fabrication/fabricator_ui.dm index 26df6b0f136..b0c9abe8bad 100644 --- a/code/modules/fabrication/fabricator_ui.dm +++ b/code/modules/fabrication/fabricator_ui.dm @@ -20,12 +20,13 @@ for(var/material in storage_capacity) var/decl/material/mat = GET_DECL(material) var/list/material_data = list() + // TODO proper state checks + var/is_solid = !ispath(material, /decl/material/liquid) && !ispath(material, /decl/material/gas) material_data["name"] = capitalize(mat.use_name) material_data["stored"] = stored_material[material] ? stored_material[material] : 0 material_data["max"] = storage_capacity[material] - material_data["unit"] = SHEET_UNIT + material_data["unit"] = is_solid ? SHEET_UNIT : "ml" material_data["eject_key"] = "\ref[GET_DECL(material)]" - material_data["eject_label"] = ispath(material, /decl/material/liquid) ? "Flush" : "Eject" material_storage += list(material_data) return material_storage From 19a21993243ef96a84e6f480ec86c70d548ad754 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 16 Aug 2022 13:59:07 +1000 Subject: [PATCH 0278/1518] Adding phase check to fab UI. --- code/modules/fabrication/fabricator_topic.dm | 3 ++- code/modules/fabrication/fabricator_ui.dm | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/fabrication/fabricator_topic.dm b/code/modules/fabrication/fabricator_topic.dm index 25d9aa5730a..e33131a59ac 100644 --- a/code/modules/fabrication/fabricator_topic.dm +++ b/code/modules/fabrication/fabricator_topic.dm @@ -66,7 +66,8 @@ if(!mat_path || !stored_material[mat_path]) return // TODO: proper liquid reagent ejection checks (acid sheet ejection...). - if(ispath(mat_path, /decl/material/gas) || ispath(mat_path, /decl/material/liquid)) + var/decl/material/mat = GET_DECL(mat_path) + if(mat?.phase_at_stp() != MAT_PHASE_SOLID) stored_material[mat_path] = 0 else var/sheet_count = FLOOR(stored_material[mat_path]/SHEET_MATERIAL_AMOUNT) diff --git a/code/modules/fabrication/fabricator_ui.dm b/code/modules/fabrication/fabricator_ui.dm index b0c9abe8bad..2e8dc0d0379 100644 --- a/code/modules/fabrication/fabricator_ui.dm +++ b/code/modules/fabrication/fabricator_ui.dm @@ -20,8 +20,7 @@ for(var/material in storage_capacity) var/decl/material/mat = GET_DECL(material) var/list/material_data = list() - // TODO proper state checks - var/is_solid = !ispath(material, /decl/material/liquid) && !ispath(material, /decl/material/gas) + var/is_solid = (mat.phase_at_stp() == MAT_PHASE_SOLID) material_data["name"] = capitalize(mat.use_name) material_data["stored"] = stored_material[material] ? stored_material[material] : 0 material_data["max"] = storage_capacity[material] From b6a8b10ffe0b104db03a12a3ba9ea4b219de285e Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 22 Aug 2022 22:21:57 +1000 Subject: [PATCH 0279/1518] Automatic changelog generation for PR #2604 [ci skip] --- html/changelogs/AutoChangeLog-pr-2604.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2604.yml diff --git a/html/changelogs/AutoChangeLog-pr-2604.yml b/html/changelogs/AutoChangeLog-pr-2604.yml new file mode 100644 index 00000000000..e908ed42177 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2604.yml @@ -0,0 +1,5 @@ +author: MistakeNot4892 +delete-after: true +changes: + - tweak: Fabricator recipes now use matter units universally, including for reagent + requirements. From 3b998321713411d03943f097fe8180d87410f420 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Tue, 23 Aug 2022 00:59:35 +0000 Subject: [PATCH 0280/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 16 ++++++++++++++++ html/changelogs/.all_changelog.yml | 11 +++++++++++ html/changelogs/AutoChangeLog-pr-2582.yml | 6 ------ html/changelogs/AutoChangeLog-pr-2604.yml | 5 ----- html/changelogs/AutoChangeLog-pr-2621.yml | 5 ----- 5 files changed, 27 insertions(+), 16 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2582.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2604.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2621.yml diff --git a/html/changelog.html b/html/changelog.html index 35e62116169..33f6f3f8add 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,22 @@ -->
    +

    23 August 2022

    +

    MistakeNot4892 updated:

    +
      +
    • Fabricator recipes now use matter units universally, including for reagent requirements.
    • +
    +

    Penelope Haze updated:

    +
      +
    • Broadly retools cocktail ratios, changing some cocktail ingredient amounts and improving their display in the codex.
    • +
    +

    PsyCommando updated:

    +
      +
    • Fixed top hat not showing up on the mob sprite.
    • +
    • Fixed balaclava and other masks turning people bald.
    • +
    • Fixed a lot of hats not hiding hair under them.
    • +
    +

    03 August 2022

    NataKilar updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 3e4cbe5af14..667ffe949d4 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14240,3 +14240,14 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. NataKilar: - rscadd: Adds stirling engines to the game. These engines produce power from a temperature differential of two gas sources. +2022-08-23: + MistakeNot4892: + - tweak: Fabricator recipes now use matter units universally, including for reagent + requirements. + Penelope Haze: + - tweak: Broadly retools cocktail ratios, changing some cocktail ingredient amounts + and improving their display in the codex. + PsyCommando: + - bugfix: Fixed top hat not showing up on the mob sprite. + - bugfix: Fixed balaclava and other masks turning people bald. + - bugfix: Fixed a lot of hats not hiding hair under them. diff --git a/html/changelogs/AutoChangeLog-pr-2582.yml b/html/changelogs/AutoChangeLog-pr-2582.yml deleted file mode 100644 index 9c93946833e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2582.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: PsyCommando -delete-after: true -changes: - - bugfix: Fixed top hat not showing up on the mob sprite. - - bugfix: Fixed balaclava and other masks turning people bald. - - bugfix: Fixed a lot of hats not hiding hair under them. diff --git a/html/changelogs/AutoChangeLog-pr-2604.yml b/html/changelogs/AutoChangeLog-pr-2604.yml deleted file mode 100644 index e908ed42177..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2604.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: MistakeNot4892 -delete-after: true -changes: - - tweak: Fabricator recipes now use matter units universally, including for reagent - requirements. diff --git a/html/changelogs/AutoChangeLog-pr-2621.yml b/html/changelogs/AutoChangeLog-pr-2621.yml deleted file mode 100644 index 950606d48cf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2621.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Penelope Haze -delete-after: true -changes: - - tweak: Broadly retools cocktail ratios, changing some cocktail ingredient amounts - and improving their display in the codex. From dd9b3211ea6784326f02d765e47ac56bb9f01667 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Wed, 24 Aug 2022 00:53:19 +0000 Subject: [PATCH 0281/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 33f6f3f8add..c7c1a2cd9a4 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -91,16 +91,6 @@

      MistakeNot4892 updated:

      • Species previews are no longer naked.
      - -

      22 June 2022

      -

      NataKilar updated:

      -
        -
      • Network machinery now has lower tech requirements across the board.
      • -
      • Network broadcasters now have their signal strength scale with the rating of installed microlasers.
      • -
      • Computer networks are now able to communicate over PLEXUS.
      • -
      • Adds PLEXUS uplinks, machinery which allows devices to connect to PLEXUS in conjunction with a PLEXUS repeater.
      • -
      • Network signal simulation has been adjusted slightly. Connection strengths should be comparable with old setups.
      • -
    From a4fe485a11fbc74724350b3d99d41d7137ab51b2 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Tue, 23 Aug 2022 20:59:36 -0400 Subject: [PATCH 0282/1518] Make window tint button not need a tesla link --- code/game/objects/items/buttons.dm | 2 +- code/game/objects/structures/window.dm | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/buttons.dm b/code/game/objects/items/buttons.dm index 8f23dd24150..14d4978bf7e 100644 --- a/code/game/objects/items/buttons.dm +++ b/code/game/objects/items/buttons.dm @@ -18,7 +18,7 @@ desc = "Used for building a window tint switch." icon = 'icons/obj/power.dmi' icon_state = "light-p" - build_machine_type = /obj/machinery/button/windowtint/buildable + build_machine_type = /obj/machinery/button/windowtint /obj/item/frame/button/light_switch/windowtint/kit name = "window tint switch kit" diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index dd2023557c5..e77f6e755ca 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -542,15 +542,9 @@ desc = "A remote control switch for electrochromic windows." var/range = 7 stock_part_presets = null // This isn't a radio-enabled button; it communicates with nearby structures in view. - uncreated_component_parts = list( - /obj/item/stock_parts/power/apc/buildable - ) frame_type = /obj/item/frame/button/light_switch/windowtint construct_state = /decl/machine_construction/wall_frame/panel_closed/simple - base_type = /obj/machinery/button/windowtint/buildable - -/obj/machinery/button/windowtint/buildable - uncreated_component_parts = null + base_type = /obj/machinery/button/windowtint /obj/machinery/button/windowtint/attackby(obj/item/W, mob/user) if(IS_MULTITOOL(W)) From cc6743248c4e5be1794a495e84fbef09e9fdaaaf Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Tue, 23 Aug 2022 21:04:01 -0400 Subject: [PATCH 0283/1518] Make buttons have a interactive transmitter again --- code/game/machinery/buttons.dm | 9 +++++++-- code/game/machinery/doors/airlock_control.dm | 4 ++-- code/game/machinery/doors/blast_door.dm | 4 ++-- code/game/machinery/wall_frames.dm | 2 +- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index f8f2a5134ce..29c0d211993 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -18,9 +18,9 @@ stock_part_presets = list(/decl/stock_part_preset/radio/basic_transmitter/button = 1) uncreated_component_parts = list( /obj/item/stock_parts/power/apc = 1, - /obj/item/stock_parts/radio/transmitter/basic = 1 + /obj/item/stock_parts/radio/transmitter/basic/buildable = 1 ) - base_type = /obj/machinery/button + base_type = /obj/machinery/button/buildable construct_state = /decl/machine_construction/wall_frame/panel_closed/simple frame_type = /obj/item/frame/button required_interaction_dexterity = DEXTERITY_SIMPLE_MACHINES @@ -30,6 +30,11 @@ var/state = FALSE var/cooldown = 1 SECOND +/obj/machinery/button/buildable + uncreated_component_parts = list( + /obj/item/stock_parts/radio/transmitter/basic = 1, + ) + /obj/machinery/button/Initialize() . = ..() update_icon() diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 1870c25ec0a..08857575040 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -107,7 +107,7 @@ stock_part_presets = list(/decl/stock_part_preset/radio/basic_transmitter/airlock_sensor = 1) uncreated_component_parts = list( /obj/item/stock_parts/power/apc, - /obj/item/stock_parts/radio/transmitter/basic + /obj/item/stock_parts/radio/transmitter/basic/buildable ) base_type = /obj/machinery/airlock_sensor construct_state = /decl/machine_construction/wall_frame/panel_closed/simple @@ -183,7 +183,7 @@ ) uncreated_component_parts = list( /obj/item/stock_parts/power/apc, - /obj/item/stock_parts/radio/transmitter/on_event + /obj/item/stock_parts/radio/transmitter/on_event/buildable ) var/command = "cycle" diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index efbb8ef6ed1..f77454cd541 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -265,8 +265,8 @@ ) uncreated_component_parts = list( /obj/item/stock_parts/power/apc, - /obj/item/stock_parts/radio/transmitter/on_event, - /obj/item/stock_parts/radio/receiver + /obj/item/stock_parts/radio/transmitter/on_event/buildable, + /obj/item/stock_parts/radio/receiver/buildable ) /obj/machinery/button/blast_door/Initialize(mapload) diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm index 6aaacbeed2a..95dc391af5e 100644 --- a/code/game/machinery/wall_frames.dm +++ b/code/game/machinery/wall_frames.dm @@ -135,7 +135,7 @@ icon = 'icons/obj/objects.dmi' icon_state = "launcherbtt" material = /decl/material/solid/metal/steel - build_machine_type = /obj/machinery/button + build_machine_type = /obj/machinery/button/buildable /obj/item/frame/camera name = "security camera frame" From 066d2065b27296221e0588c56c414e20d341cf79 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 24 Aug 2022 10:05:36 -0500 Subject: [PATCH 0284/1518] Fix incorrect arg type hint for ai_law/set_state_law --- code/datums/ai_laws.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index e0b39a25876..763ba5b481a 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -266,7 +266,7 @@ /datum/ai_laws/proc/set_state_law(var/datum/ai_law/law, var/state) law.set_state_law(src, state) -/datum/ai_law/proc/set_state_law(var/datum/ai_law/law, var/state) +/datum/ai_law/proc/set_state_law(var/datum/ai_laws/laws, var/state) /datum/ai_law/zero/set_state_law(var/datum/ai_laws/laws, var/state) if(src == laws.zeroth_law) From 2def0a99ec940c4c70652904c0590d49a5088cb6 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 24 Aug 2022 10:05:53 -0500 Subject: [PATCH 0285/1518] Fix incorrect type for igniter access_var proc --- code/game/machinery/igniter.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index d19d3f219bb..229c7ab1a63 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -67,7 +67,7 @@ can_write = FALSE has_updates = FALSE -/decl/public_access/public_variable/holosign_on/access_var(obj/machinery/igniter/igniter) +/decl/public_access/public_variable/igniter_on/access_var(obj/machinery/igniter/igniter) return igniter.on /decl/public_access/public_method/igniter_toggle From b41fd4af6ea2b88a2e4d811cb093c25d670a444e Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 24 Aug 2022 10:08:04 -0500 Subject: [PATCH 0286/1518] Removes broken stock_part/has_access override --- .../networking/device_types/stock_part.dm | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/code/modules/modular_computers/networking/device_types/stock_part.dm b/code/modules/modular_computers/networking/device_types/stock_part.dm index 452b359ef78..189560b6556 100644 --- a/code/modules/modular_computers/networking/device_types/stock_part.dm +++ b/code/modules/modular_computers/networking/device_types/stock_part.dm @@ -1,18 +1,7 @@ // Attached to a stock part for issuing commands to machinery via networks. /datum/extension/network_device/stock_part has_commands = TRUE - internet_allowed = TRUE // GOOSE devices, network locks, etc. can all connect over PLEXUS - -// Network receivers check the access of the parent machine, and do not check for network administrator access. -/datum/extension/network_device/stock_part/has_access(mob/user) - var/datum/computer_network/network = get_network() - if(!network) - return TRUE // If not on network, always TRUE for access, as there isn't anything to access. - if(!user) - return FALSE - var/atom/H = holder - var/obj/M = H.loc - return M.check_access(user) + internet_allowed = TRUE // GOOSE devices, network locks, etc. can all connect over PLEXUS /datum/extension/network_device/stock_part/get_wired_connection() var/atom/H = holder From 84f273eaeb27917618271fcb50891246949c63b4 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 25 Aug 2022 15:45:03 +1000 Subject: [PATCH 0287/1518] Removing now-deprecated reagent_tag setting and passing. --- code/modules/materials/_materials.dm | 30 ++++++------ .../gasses/material_gas_mundane.dm | 32 ++++++------- .../liquids/materials_liquid_toxins.dm | 26 +++++----- .../liquids/materials_liquid_water.dm | 6 +-- .../solids/materials_solid_elements.dm | 4 +- .../solids/materials_solid_metal.dm | 2 +- .../solids/materials_solid_mineral.dm | 4 +- code/modules/reagents/Chemistry-Metabolism.dm | 6 +-- code/modules/reagents/chems/chems_blood.dm | 8 ++-- .../modules/reagents/chems/chems_compounds.dm | 40 ++++++++-------- code/modules/reagents/chems/chems_drinks.dm | 34 ++++++------- code/modules/reagents/chems/chems_drugs.dm | 22 ++++----- code/modules/reagents/chems/chems_ethanol.dm | 16 +++---- code/modules/reagents/chems/chems_fuel.dm | 2 +- .../modules/reagents/chems/chems_medicines.dm | 48 +++++++++---------- .../modules/reagents/chems/chems_nutriment.dm | 17 ++++--- .../reagents/chems/chems_painkillers.dm | 4 +- code/modules/reagents/chems/chems_poisons.dm | 8 ++-- .../reagents/chems/random/chems_random.dm | 8 ++-- .../reagents/chems/random/random_effects.dm | 10 ++-- code/modules/species/species.dm | 2 +- mods/content/psionics/datum/chems.dm | 4 +- .../xenobiology/slime/slime_reagents.dm | 10 ++-- mods/species/ascent/ascent.dm | 2 - mods/species/ascent/datum/species.dm | 1 - mods/species/bayliens/skrell/_skrell.dm | 1 - mods/species/bayliens/skrell/datum/species.dm | 2 - mods/species/bayliens/unathi/_lizard.dm | 1 - mods/species/bayliens/unathi/datum/species.dm | 2 - mods/species/neoavians/_neoavians.dm | 1 - mods/species/neoavians/datum/species.dm | 2 - mods/species/serpentid/datum/species.dm | 1 - mods/species/serpentid/serpentid.dm | 1 - mods/species/vox/datum/species.dm | 3 -- 34 files changed, 169 insertions(+), 191 deletions(-) diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 1e3178743f7..a6039ace954 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -507,44 +507,44 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) T.assume_gas(vapor, (volume * vapor_products[vapor]), temperature) holder.remove_reagent(type, volume) -/decl/material/proc/on_mob_life(var/mob/living/M, var/alien, var/location, var/datum/reagents/holder) // Currently, on_mob_life is called on carbons. Any interaction with non-carbon mobs (lube) will need to be done in touch_mob. +/decl/material/proc/on_mob_life(var/mob/living/M, var/metabolism_class, var/datum/reagents/holder) // Currently, on_mob_life is called on carbons. Any interaction with non-carbon mobs (lube) will need to be done in touch_mob. if(QDELETED(src)) return // Something else removed us. if(!istype(M)) return if(!(flags & AFFECTS_DEAD) && M.stat == DEAD && (world.time - M.timeofdeath > 150)) return - if(overdose && (location != CHEM_TOUCH)) + if(overdose && (metabolism_class != CHEM_TOUCH)) var/overdose_threshold = overdose * (flags & IGNORE_MOB_SIZE? 1 : MOB_SIZE_MEDIUM/M.mob_size) if(REAGENT_VOLUME(holder, type) > overdose_threshold) - affect_overdose(M, alien, holder) + affect_overdose(M, holder) //determine the metabolism rate var/removed = metabolism - if(ingest_met && (location == CHEM_INGEST)) + if(ingest_met && (metabolism_class == CHEM_INGEST)) removed = ingest_met - if(touch_met && (location == CHEM_TOUCH)) + if(touch_met && (metabolism_class == CHEM_TOUCH)) removed = touch_met removed = M.get_adjusted_metabolism(removed) //adjust effective amounts - removed, dose, and max_dose - for mob size var/effective = removed - if(!(flags & IGNORE_MOB_SIZE) && location != CHEM_TOUCH) + if(!(flags & IGNORE_MOB_SIZE) && metabolism_class != CHEM_TOUCH) effective *= (MOB_SIZE_MEDIUM/M.mob_size) var/dose = LAZYACCESS(M.chem_doses, type) + effective LAZYSET(M.chem_doses, type, dose) if(effective >= (metabolism * 0.1) || effective >= 0.1) // If there's too little chemical, don't affect the mob, just remove it - switch(location) + switch(metabolism_class) if(CHEM_INJECT) - affect_blood(M, alien, effective, holder) + affect_blood(M, effective, holder) if(CHEM_INGEST) - affect_ingest(M, alien, effective, holder) + affect_ingest(M, effective, holder) if(CHEM_TOUCH) - affect_touch(M, alien, effective, holder) + affect_touch(M, effective, holder) holder.remove_reagent(type, removed) -/decl/material/proc/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/proc/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) if(radioactivity) M.apply_damage(radioactivity * removed, IRRADIATE, armor_pen = 100) @@ -578,11 +578,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) if(euphoriant) SET_STATUS_MAX(M, STAT_DRUGGY, euphoriant) -/decl/material/proc/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/proc/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) if(affect_blood_on_ingest) - affect_blood(M, alien, removed * 0.5, holder) + affect_blood(M, removed * 0.5, holder) -/decl/material/proc/affect_touch(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/proc/affect_touch(var/mob/living/M, var/removed, var/datum/reagents/holder) if(!istype(M)) return @@ -653,7 +653,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) if(!M.unacidable) M.take_organ_damage(0, min(removed * solvent_power * ((removed < solvent_melt_dose) ? 0.1 : 0.2), solvent_max_damage), override_droplimb = DISMEMBER_METHOD_ACID) -/decl/material/proc/affect_overdose(var/mob/living/M, var/alien, var/datum/reagents/holder) // Overdose effect. Doesn't happen instantly. +/decl/material/proc/affect_overdose(var/mob/living/M, var/datum/reagents/holder) // Overdose effect. Doesn't happen instantly. M.add_chemical_effect(CE_TOXIN, 1) M.adjustToxLoss(REM) diff --git a/code/modules/materials/definitions/gasses/material_gas_mundane.dm b/code/modules/materials/definitions/gasses/material_gas_mundane.dm index 73452fc1e1f..58c9a89a983 100644 --- a/code/modules/materials/definitions/gasses/material_gas_mundane.dm +++ b/code/modules/materials/definitions/gasses/material_gas_mundane.dm @@ -3,8 +3,8 @@ uid = "gas_oxygen" lore_text = "An ubiquitous oxidizing agent." flags = MAT_FLAG_FUSION_FUEL - gas_specific_heat = 20 - molar_mass = 0.032 + gas_specific_heat = 20 + molar_mass = 0.032 latent_heat = 213 boiling_point = -183 CELSIUS gas_flags = XGM_GAS_OXIDIZER @@ -28,7 +28,7 @@ metabolism = 0.05 value = 0.3 -/decl/material/gas/helium/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/gas/helium/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() M.add_chemical_effect(CE_SQUEAKY, 1) @@ -36,10 +36,10 @@ name = "carbon dioxide" uid = "gas_carbon_dioxide" lore_text = "A byproduct of respiration." - gas_specific_heat = 30 + gas_specific_heat = 30 molar_mass = 0.044 latent_heat = 380 - boiling_point = -78 CELSIUS + boiling_point = -78 CELSIUS gas_symbol_html = "CO2" gas_symbol = "CO2" @@ -50,13 +50,13 @@ gas_specific_heat = 30 molar_mass = 0.028 latent_heat = 216 - boiling_point = -192 CELSIUS + boiling_point = -192 CELSIUS gas_symbol_html = "CO" gas_symbol = "CO" taste_description = "stale air" metabolism = 0.05 // As with helium. -/decl/material/gas/carbon_monoxide/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/gas/carbon_monoxide/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) if(!istype(M)) return var/warning_message @@ -90,10 +90,10 @@ name = "methyl bromide" uid = "gas_methyl_bromide" lore_text = "A once-popular fumigant and weedkiller." - gas_specific_heat = 42.59 + gas_specific_heat = 42.59 molar_mass = 0.095 latent_heat = 253 - boiling_point = 4 CELSIUS + boiling_point = 4 CELSIUS gas_symbol_html = "CH3Br" gas_symbol = "CH3Br" taste_description = "pestkiller" @@ -102,7 +102,7 @@ ) value = 0.25 -/decl/material/gas/methyl_bromide/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/gas/methyl_bromide/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) . = ..() if(!ishuman(M)) return @@ -119,10 +119,10 @@ name = "sleeping agent" uid = "gas_sleeping_agent" lore_text = "A mild sedative. Also known as laughing gas." - gas_specific_heat = 40 + gas_specific_heat = 40 molar_mass = 0.044 latent_heat = 376 - boiling_point = -90 CELSIUS + boiling_point = -90 CELSIUS gas_tile_overlay = "sleeping_agent" gas_overlay_limit = 1 gas_flags = XGM_GAS_OXIDIZER //N2O is a powerful oxidizer @@ -131,7 +131,7 @@ metabolism = 0.05 // So that low dosages have a chance to build up in the body. value = 0.25 -/decl/material/gas/nitrous_oxide/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/gas/nitrous_oxide/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/dosage = LAZYACCESS(M.chem_doses, type) if(dosage >= 1) if(prob(5)) SET_STATUS_MAX(M, STAT_ASLEEP, 3) @@ -149,7 +149,7 @@ name = "nitrogen" uid = "gas_nitrogen" lore_text = "An ubiquitous noble gas." - gas_specific_heat = 20 + gas_specific_heat = 20 molar_mass = 0.028 latent_heat = 199 boiling_point = -195 CELSIUS @@ -183,7 +183,7 @@ /decl/material/gas/methane name = "methane" uid = "gas_methane" - gas_specific_heat = 30 + gas_specific_heat = 30 molar_mass = 0.016 latent_heat = 510 boiling_point = -162 CELSIUS @@ -254,7 +254,7 @@ gas_symbol = "Xe" value = 0.25 -/decl/material/gas/xenon/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/gas/xenon/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/dosage = LAZYACCESS(M.chem_doses, type) if(dosage >= 1) if(prob(5)) SET_STATUS_MAX(M, STAT_ASLEEP, 3) diff --git a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm index aaaab3b49ce..0fa27635b17 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm @@ -74,7 +74,7 @@ metabolism = REM * 0.25 exoplanet_rarity = MAT_RARITY_UNCOMMON -/decl/material/liquid/venom/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/venom/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) if(prob(REAGENT_VOLUME(holder, type)*2)) SET_STATUS_MAX(M, STAT_CONFUSE, 3) ..() @@ -90,7 +90,7 @@ toxicity_targets_organ = BP_HEART exoplanet_rarity = MAT_RARITY_UNCOMMON -/decl/material/liquid/cyanide/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/cyanide/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() ADJ_STATUS(M, STAT_ASLEEP, 1) @@ -107,11 +107,11 @@ taste_mult = 1.2 exoplanet_rarity = MAT_RARITY_UNCOMMON -/decl/material/liquid/heartstopper/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/heartstopper/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() ADJ_STATUS(M, STAT_CONFUSE, 1.5) -/decl/material/liquid/heartstopper/affect_overdose(var/mob/living/M, var/alien, var/datum/reagents/holder) +/decl/material/liquid/heartstopper/affect_overdose(var/mob/living/M, var/datum/reagents/holder) ..() if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -133,14 +133,14 @@ toxicity_targets_organ = BP_BRAIN heating_message = "melts into a liquid slurry." heating_products = list( - /decl/material/liquid/carpotoxin = 0.2, - /decl/material/liquid/sedatives = 0.4, + /decl/material/liquid/carpotoxin = 0.2, + /decl/material/liquid/sedatives = 0.4, /decl/material/solid/metal/copper = 0.4 ) taste_mult = 1.2 exoplanet_rarity = MAT_RARITY_EXOTIC -/decl/material/liquid/zombiepowder/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/zombiepowder/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() M.status_flags |= FAKEDEATH M.adjustOxyLoss(3 * removed) @@ -176,7 +176,7 @@ color = "#49002e" toxicity = 4 heating_products = list( - /decl/material/liquid/bromide = 0.4, + /decl/material/liquid/bromide = 0.4, /decl/material/liquid/water = 0.6 ) metabolism = REM * 0.25 @@ -192,7 +192,7 @@ toxicity = 4 heating_products = list( /decl/material/liquid/acetone = 0.4, - /decl/material/solid/carbon = 0.4, + /decl/material/solid/carbon = 0.4, /decl/material/liquid/ethanol = 0.2 ) heating_point = 145 CELSIUS @@ -213,7 +213,7 @@ taste_mult = 1.2 metabolism = REM * 0.25 -/decl/material/liquid/hair_remover/affect_touch(var/mob/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/hair_remover/affect_touch(var/mob/M, var/removed, var/datum/reagents/holder) M.lose_hair() holder.remove_reagent(type, REAGENT_VOLUME(holder, type)) @@ -231,10 +231,10 @@ exoplanet_rarity = MAT_RARITY_EXOTIC var/amount_to_zombify = 5 -/decl/material/liquid/zombie/affect_touch(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) - affect_blood(M, alien, removed * 0.5, holder) +/decl/material/liquid/zombie/affect_touch(var/mob/living/M, var/removed, var/datum/reagents/holder) + affect_blood(M, removed * 0.5, holder) -/decl/material/liquid/zombie/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/zombie/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if (istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M diff --git a/code/modules/materials/definitions/liquids/materials_liquid_water.dm b/code/modules/materials/definitions/liquids/materials_liquid_water.dm index a40ac3711e3..2e3d729e692 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_water.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_water.dm @@ -28,7 +28,7 @@ /decl/material/solid/ice = 1 ) -/decl/material/liquid/water/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/water/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(ishuman(M)) var/list/data = REAGENT_DATA(holder, type) @@ -49,10 +49,10 @@ if(prob(10)) //Only annoy them a /bit/ to_chat(M,"You feel your insides curdle and burn! \[Give Into Purity\]") -/decl/material/liquid/water/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/water/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() M.adjust_hydration(removed * 10) - affect_blood(M, alien, removed, holder) + affect_blood(M, removed, holder) #define WATER_LATENT_HEAT 9500 // How much heat is removed when applied to a hot turf, in J/unit (9500 makes 120 u of water roughly equivalent to 2L /decl/material/liquid/water/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) diff --git a/code/modules/materials/definitions/solids/materials_solid_elements.dm b/code/modules/materials/definitions/solids/materials_solid_elements.dm index e698fe9bec1..1c199fb3f45 100644 --- a/code/modules/materials/definitions/solids/materials_solid_elements.dm +++ b/code/modules/materials/definitions/solids/materials_solid_elements.dm @@ -34,7 +34,7 @@ value = 0.5 dirtiness = 30 -/decl/material/solid/carbon/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/solid/carbon/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) var/datum/reagents/ingested = M.get_ingested_reagents() if(ingested && LAZYLEN(ingested.reagent_volumes) > 1) var/effect = 1 / (LAZYLEN(ingested.reagent_volumes) - 1) @@ -81,7 +81,7 @@ color = "#a0a0a0" value = 0.5 -/decl/material/solid/potassium/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/solid/potassium/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/volume = REAGENT_VOLUME(holder, type) if(volume > 3) M.add_chemical_effect(CE_PULSE, 1) diff --git a/code/modules/materials/definitions/solids/materials_solid_metal.dm b/code/modules/materials/definitions/solids/materials_solid_metal.dm index acd7844f7f1..28a760b9253 100644 --- a/code/modules/materials/definitions/solids/materials_solid_metal.dm +++ b/code/modules/materials/definitions/solids/materials_solid_metal.dm @@ -389,7 +389,7 @@ reflectiveness = MAT_VALUE_MATTE taste_description = "metal" -/decl/material/solid/metal/iron/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/solid/metal/iron/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) if(M.HasTrait(/decl/trait/metabolically_inert)) return diff --git a/code/modules/materials/definitions/solids/materials_solid_mineral.dm b/code/modules/materials/definitions/solids/materials_solid_mineral.dm index a0ec5e43486..56312991cb7 100644 --- a/code/modules/materials/definitions/solids/materials_solid_mineral.dm +++ b/code/modules/materials/definitions/solids/materials_solid_mineral.dm @@ -89,7 +89,7 @@ rich_material_weight = 1 dissolves_into = list( /decl/material/solid/sulfur = 0.75, - /decl/material/solid/metal/iron = 0.25 + /decl/material/solid/metal/iron = 0.25 ) /decl/material/solid/spodumene @@ -179,7 +179,7 @@ /decl/material/solid/potassium = 1 ) -/decl/material/solid/potassium/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/solid/potassium/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/volume = REAGENT_VOLUME(holder, type) if(volume > 3) M.add_chemical_effect(CE_PULSE, 1) diff --git a/code/modules/reagents/Chemistry-Metabolism.dm b/code/modules/reagents/Chemistry-Metabolism.dm index 60a93a1efd2..4ab928789a5 100644 --- a/code/modules/reagents/Chemistry-Metabolism.dm +++ b/code/modules/reagents/Chemistry-Metabolism.dm @@ -19,11 +19,7 @@ /datum/reagents/metabolism/proc/metabolize() if(parent && world.time > last_metabolize_time) last_metabolize_time = world.time // prevents mobs that reuse a holder between functions (ingested/injected) from metabolizing twice in a tick - var/metabolism_type = 0 //non-human mobs - if(ishuman(parent)) - var/mob/living/carbon/human/H = parent - metabolism_type = H.species.reagent_tag for(var/rtype in reagent_volumes) var/decl/material/current = GET_DECL(rtype) - current.on_mob_life(parent, metabolism_type, metabolism_class, src) + current.on_mob_life(parent, metabolism_class, src) update_total() \ No newline at end of file diff --git a/code/modules/reagents/chems/chems_blood.dm b/code/modules/reagents/chems/chems_blood.dm index f5b5a21c4ac..e11c484fd78 100644 --- a/code/modules/reagents/chems/chems_blood.dm +++ b/code/modules/reagents/chems/chems_blood.dm @@ -32,7 +32,7 @@ if(.) .["species"] = .["species"] || global.using_map.default_species -/decl/material/liquid/blood/mix_data(var/datum/reagents/reagents, var/list/newdata, var/amount) +/decl/material/liquid/blood/mix_data(var/datum/reagents/reagents, var/list/newdata, var/amount) var/list/data = REAGENT_DATA(reagents, type) if(LAZYACCESS(newdata, "trace_chem")) var/list/other_chems = LAZYACCESS(newdata, "trace_chem") @@ -62,7 +62,7 @@ if(B) B.blood_DNA["UNKNOWN DNA STRUCTURE"] = "X*" -/decl/material/liquid/blood/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/blood/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) if(M.HasTrait(/decl/trait/metabolically_inert)) return if(LAZYACCESS(M.chem_doses, type) > 5) @@ -70,13 +70,13 @@ if(LAZYACCESS(M.chem_doses, type) > 15) M.adjustToxLoss(removed) -/decl/material/liquid/blood/affect_touch(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/blood/affect_touch(var/mob/living/M, var/removed, var/datum/reagents/holder) if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.isSynthetic()) return -/decl/material/liquid/blood/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/blood/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) if(ishuman(M)) var/volume = REAGENT_VOLUME(holder, type) var/mob/living/carbon/H = M diff --git a/code/modules/reagents/chems/chems_compounds.dm b/code/modules/reagents/chems/chems_compounds.dm index b5fbf13ce26..a5572971694 100644 --- a/code/modules/reagents/chems/chems_compounds.dm +++ b/code/modules/reagents/chems/chems_compounds.dm @@ -19,10 +19,10 @@ color = "#9eefff" uid = "chem_glowsap" -/decl/material/liquid/glowsap/affect_ingest(mob/living/M, alien, removed, var/datum/reagents/holder) - affect_blood(M, alien, removed, holder) +/decl/material/liquid/glowsap/affect_ingest(mob/living/M, removed, var/datum/reagents/holder) + affect_blood(M, removed, holder) -/decl/material/liquid/glowsap/affect_blood(mob/living/M, alien, removed, var/datum/reagents/holder) +/decl/material/liquid/glowsap/affect_blood(mob/living/M, removed, var/datum/reagents/holder) M.add_chemical_effect(CE_GLOWINGEYES, 1) if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -34,7 +34,7 @@ addtimer(CALLBACK(H, /mob/living/carbon/human/proc/update_eyes), 5 SECONDS) . = ..() -/decl/material/liquid/glowsap/affect_overdose(var/mob/living/M, var/alien, var/datum/reagents/holder) +/decl/material/liquid/glowsap/affect_overdose(var/mob/living/M, var/datum/reagents/holder) . = ..() M.add_chemical_effect(CE_TOXIN, 1) M.set_hallucination(60, 20) @@ -67,7 +67,7 @@ fruit_descriptor = "numbing" uid = "chem_frostoil" -/decl/material/liquid/frostoil/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/frostoil/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) M.bodytemperature = max(M.bodytemperature - 10 * TEMPERATURE_DAMAGE_COEFFICIENT, 0) if(prob(1)) M.emote("shiver") @@ -94,10 +94,10 @@ var/discomfort_message = "Your insides feel uncomfortably hot!" var/slime_temp_adj = 10 -/decl/material/liquid/capsaicin/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/capsaicin/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) M.adjustToxLoss(0.5 * removed) -/decl/material/liquid/capsaicin/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/capsaicin/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) holder.remove_reagent(/decl/material/liquid/frostoil, 5) if(M.HasTrait(/decl/trait/metabolically_inert)) @@ -132,7 +132,7 @@ value = 2 uid = "chem_capsaicin_condensed" -/decl/material/liquid/capsaicin/condensed/affect_touch(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/capsaicin/condensed/affect_touch(var/mob/living/M, var/removed, var/datum/reagents/holder) var/eyes_covered = 0 var/mouth_covered = 0 var/partial_mouth_covered = 0 @@ -182,7 +182,7 @@ M.custom_emote(2, "[pick("coughs!","coughs hysterically!","splutters!")]") SET_STATUS_MAX(M, STAT_STUN, 3) -/decl/material/liquid/capsaicin/condensed/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/capsaicin/condensed/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) holder.remove_reagent(/decl/material/liquid/frostoil, 5) if(M.HasTrait(/decl/trait/metabolically_inert)) @@ -209,15 +209,15 @@ color = "#13bc5e" uid = "chem_mutagenics" -/decl/material/liquid/mutagenics/affect_touch(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/mutagenics/affect_touch(var/mob/living/M, var/removed, var/datum/reagents/holder) if(prob(33)) - affect_blood(M, alien, removed, holder) + affect_blood(M, removed, holder) -/decl/material/liquid/mutagenics/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/mutagenics/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) if(prob(67)) - affect_blood(M, alien, removed, holder) + affect_blood(M, removed, holder) -/decl/material/liquid/mutagenics/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/mutagenics/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) if(M.isSynthetic()) return @@ -248,7 +248,7 @@ exoplanet_rarity = MAT_RARITY_NOWHERE uid = "chem_lactate" -/decl/material/liquid/lactate/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/lactate/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/volume = REAGENT_VOLUME(holder, type) M.add_chemical_effect(CE_PULSE, 1) if(volume >= 10) @@ -269,7 +269,7 @@ exoplanet_rarity = MAT_RARITY_NOWHERE uid = "chem_nanoblood" -/decl/material/liquid/nanoblood/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/nanoblood/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/mob/living/carbon/human/H = M if(!istype(H)) return @@ -294,7 +294,7 @@ var/nicotine = REM * 0.2 -/decl/material/solid/tobacco/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/solid/tobacco/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() M.reagents.add_reagent(/decl/material/liquid/nicotine, nicotine) @@ -339,7 +339,7 @@ hidden_from_codex = TRUE uid = "chem_tobacco_menthol" -/decl/material/liquid/menthol/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/menthol/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) if(world.time > REAGENT_DATA(holder, type) + 3 MINUTES) LAZYSET(holder.reagent_data, type, world.time) to_chat(M, SPAN_NOTICE("You feel faintly sore in the throat.")) @@ -353,7 +353,7 @@ flags = IGNORE_MOB_SIZE uid = "chem_nanite_fluid" -/decl/material/liquid/nanitefluid/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/nanitefluid/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) M.add_chemical_effect(CE_CRYO, 1) if(M.bodytemperature < 170) M.heal_organ_damage(30 * removed, 30 * removed, affect_robo = 1) @@ -382,7 +382,7 @@ /decl/material/liquid/crystal_agent/proc/do_material_check(var/mob/living/carbon/M) . = /decl/material/solid/gemstone/crystal -/decl/material/liquid/crystal_agent/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/crystal_agent/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/result_mat = do_material_check(M) if(ishuman(M)) var/mob/living/carbon/human/H = M diff --git a/code/modules/reagents/chems/chems_drinks.dm b/code/modules/reagents/chems/chems_drinks.dm index 01992387ea3..f9b08d1a5b9 100644 --- a/code/modules/reagents/chems/chems_drinks.dm +++ b/code/modules/reagents/chems/chems_drinks.dm @@ -13,10 +13,10 @@ var/adj_sleepy = 0 var/adj_temp = 0 -/decl/material/liquid/drink/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/drink/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) M.adjustToxLoss(removed) // Probably not a good idea; not very deadly though -/decl/material/liquid/drink/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/drink/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) if(M.HasTrait(/decl/trait/metabolically_inert)) return @@ -38,7 +38,7 @@ uid = "chem_drink_juice" fruit_descriptor = "sweet" -/decl/material/liquid/drink/juice/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/drink/juice/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.HasTrait(/decl/trait/metabolically_inert)) return @@ -76,7 +76,7 @@ glass_name = "carrot juice" glass_desc = "It is just like a carrot but without crunching." -/decl/material/liquid/drink/juice/carrot/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/drink/juice/carrot/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() M.reagents.add_reagent(/decl/material/liquid/eyedrops, removed * 0.2) @@ -114,7 +114,7 @@ glass_name = "lime juice" glass_desc = "A glass of sweet-sour lime juice" -/decl/material/liquid/drink/juice/lime/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/drink/juice/lime/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.HasTrait(/decl/trait/metabolically_inert)) @@ -133,7 +133,7 @@ glass_name = "orange juice" glass_desc = "Vitamins! Yay!" -/decl/material/liquid/drink/juice/orange/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/drink/juice/orange/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.HasTrait(/decl/trait/metabolically_inert)) @@ -195,7 +195,7 @@ glass_name = "tomato juice" glass_desc = "Are you sure this is tomato juice?" -/decl/material/liquid/drink/juice/tomato/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/drink/juice/tomato/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.HasTrait(/decl/trait/metabolically_inert)) @@ -266,7 +266,7 @@ glass_name = "chocolate milk" glass_desc = "Deliciously fattening!" -/decl/material/liquid/drink/milk/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/drink/milk/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() holder.remove_reagent(/decl/material/liquid/capsaicin, 10 * removed) @@ -328,7 +328,7 @@ if(!inserted) flavour_modifiers += syrup -/decl/material/liquid/drink/coffee/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/drink/coffee/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(adj_temp > 0) holder.remove_reagent(/decl/material/liquid/frostoil, 10 * removed) @@ -342,11 +342,11 @@ if(volume > 45) M.add_chemical_effect(CE_PULSE, 1) -/decl/material/liquid/drink/coffee/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/drink/coffee/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() M.add_chemical_effect(CE_PULSE, 2) -/decl/material/liquid/drink/coffee/affect_overdose(var/mob/living/M, var/alien, var/datum/reagents/holder) +/decl/material/liquid/drink/coffee/affect_overdose(var/mob/living/M, var/datum/reagents/holder) ADJ_STATUS(M, STAT_JITTER, 5) M.add_chemical_effect(CE_PULSE, 1) @@ -494,7 +494,7 @@ glass_desc = "The unstable energy of a radioactive isotope in beverage form." glass_special = list(DRINK_FIZZ) -/decl/material/liquid/drink/mutagencola/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/drink/mutagencola/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.HasTrait(/decl/trait/metabolically_inert)) @@ -614,7 +614,7 @@ exoplanet_rarity = MAT_RARITY_NOWHERE uid = "chem_drink_hellramen" -/decl/material/liquid/drink/hell_ramen/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/drink/hell_ramen/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.HasTrait(/decl/trait/metabolically_inert)) @@ -633,9 +633,9 @@ . = "mint [.]" . = ..(prop, .) -/decl/material/liquid/drink/tea/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/drink/tea/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - + if(M.HasTrait(/decl/trait/metabolically_inert)) return @@ -797,9 +797,9 @@ exoplanet_rarity = MAT_RARITY_NOWHERE uid = "chem_drink_energydrink" -/decl/material/liquid/drink/beastenergy/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/drink/beastenergy/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() - + if(M.HasTrait(/decl/trait/metabolically_inert)) return diff --git a/code/modules/reagents/chems/chems_drugs.dm b/code/modules/reagents/chems/chems_drugs.dm index ec97f58af2f..86779725263 100644 --- a/code/modules/reagents/chems/chems_drugs.dm +++ b/code/modules/reagents/chems/chems_drugs.dm @@ -1,7 +1,7 @@ /decl/material/liquid/amphetamines name = "amphetamines" - lore_text = "A powerful, long-lasting stimulant." + lore_text = "A powerful, long-lasting stimulant." taste_description = "acid" color = "#ff3300" metabolism = REM * 0.15 @@ -9,7 +9,7 @@ value = 2 uid = "chem_amphetamines" -/decl/material/liquid/amphetamines/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/amphetamines/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) if(prob(5)) M.emote(pick("twitch", "blink_r", "shiver")) M.add_chemical_effect(CE_SPEEDBOOST, 1) @@ -24,7 +24,7 @@ value = 2 uid = "chem_narcotics" -/decl/material/liquid/narcotics/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/narcotics/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ADJ_STATUS(M, STAT_JITTER, -5) if(prob(80)) M.adjustBrainLoss(5.25 * removed) @@ -44,7 +44,7 @@ value = 2 uid = "chem_nicotine" -/decl/material/liquid/nicotine/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/nicotine/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/volume = REAGENT_VOLUME(holder, type) if(prob(volume*20)) M.add_chemical_effect(CE_PULSE, 1) @@ -55,7 +55,7 @@ LAZYSET(holder.reagent_data, type, world.time) to_chat(M, "You feel invigorated and calm.") -/decl/material/liquid/nicotine/affect_overdose(var/mob/living/M, var/alien, var/datum/reagents/holder) +/decl/material/liquid/nicotine/affect_overdose(var/mob/living/M, var/datum/reagents/holder) ..() M.add_chemical_effect(CE_PULSE, 2) @@ -69,7 +69,7 @@ value = 2 uid = "chem_sedatives" -/decl/material/liquid/sedatives/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/sedatives/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ADJ_STATUS(M, STAT_JITTER, -50) var/threshold = 1 var/dose = LAZYACCESS(M.chem_doses, type) @@ -103,7 +103,7 @@ euphoriant = 15 uid = "chem_psychoactives" -/decl/material/liquid/psychoactives/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/psychoactives/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() SET_STATUS_MAX(M, STAT_DRUGGY, 15) M.add_chemical_effect(CE_PULSE, -1) @@ -118,7 +118,7 @@ value = 2 uid = "chem_hallucinogenics" -/decl/material/liquid/hallucinogenics/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/hallucinogenics/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) M.add_chemical_effect(CE_MIND, -2) M.set_hallucination(50, 50) @@ -134,7 +134,7 @@ fruit_descriptor = "hallucinogenic" uid = "chem_psychotropics" -/decl/material/liquid/psychotropics/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/psychotropics/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/threshold = 1 var/dose = LAZYACCESS(M.chem_doses, type) if(dose < 1 * threshold) @@ -200,7 +200,7 @@ "THE LIGHT THE DARK A STAR IN CHAINS" ) -/decl/material/liquid/glowsap/gleam/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/glowsap/gleam/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) . = ..() M.add_client_color(/datum/client_color/noir/thirdeye) M.add_chemical_effect(CE_THIRDEYE, 1) @@ -221,7 +221,7 @@ if(istype(M)) M.remove_client_color(/datum/client_color/noir/thirdeye) -/decl/material/liquid/glowsap/gleam/affect_overdose(var/mob/living/M, var/alien, var/datum/reagents/holder) +/decl/material/liquid/glowsap/gleam/affect_overdose(var/mob/living/M, var/datum/reagents/holder) M.adjustBrainLoss(rand(1, 5)) if(ishuman(M) && prob(10)) var/mob/living/carbon/human/H = M diff --git a/code/modules/reagents/chems/chems_ethanol.dm b/code/modules/reagents/chems/chems_ethanol.dm index d9f9d878de1..717abe35afb 100644 --- a/code/modules/reagents/chems/chems_ethanol.dm +++ b/code/modules/reagents/chems/chems_ethanol.dm @@ -37,12 +37,12 @@ glass_desc = "A well-known alcohol with a variety of applications." value = 1.2 -/decl/material/liquid/ethanol/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/ethanol/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() M.adjustToxLoss(removed * 2 * alcohol_toxicity) M.add_chemical_effect(CE_ALCOHOL_TOXIC, alcohol_toxicity) -/decl/material/liquid/ethanol/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/ethanol/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.HasTrait(/decl/trait/metabolically_inert)) @@ -129,7 +129,7 @@ codex_name = "premium beer" taste_description = "beer" -/decl/material/liquid/ethanol/beer/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/ethanol/beer/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.HasTrait(/decl/trait/metabolically_inert)) return @@ -187,7 +187,7 @@ glass_desc = "Guaranteed to perk you up." overdose = 45 -/decl/material/liquid/ethanol/coffee/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/ethanol/coffee/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.HasTrait(/decl/trait/metabolically_inert)) @@ -199,7 +199,7 @@ if(M.bodytemperature > 310) M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) -/decl/material/liquid/ethanol/coffee/affect_overdose(var/mob/living/M, var/alien, var/datum/reagents/holder) +/decl/material/liquid/ethanol/coffee/affect_overdose(var/mob/living/M, var/datum/reagents/holder) ADJ_STATUS(M, STAT_JITTER, 5) /decl/material/liquid/ethanol/melonliquor @@ -264,7 +264,7 @@ glass_name = "Thirteen Loko" glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass." -/decl/material/liquid/ethanol/thirteenloko/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/ethanol/thirteenloko/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.HasTrait(/decl/trait/metabolically_inert)) @@ -421,7 +421,7 @@ exoplanet_rarity = MAT_RARITY_NOWHERE uid = "chem_ethanol_poisonwine" -/decl/material/liquid/ethanol/pwine/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/ethanol/pwine/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.HasTrait(/decl/trait/metabolically_inert)) @@ -439,7 +439,7 @@ else heart.take_internal_damage(100, 0) -/decl/material/liquid/ethanol/aged_whiskey // I have no idea what this is and where it comes from. //It comes from Dinnlan now +/decl/material/liquid/ethanol/aged_whiskey // I have no idea what this is and where it comes from. //It comes from Dinnlan now name = "aged whiskey" lore_text = "A well-aged whiskey of high quality. Probably imported. Just a sip'll do it, but that burn will leave you wanting more." color = "#523600" diff --git a/code/modules/reagents/chems/chems_fuel.dm b/code/modules/reagents/chems/chems_fuel.dm index e60364e9819..e09982d3e2d 100644 --- a/code/modules/reagents/chems/chems_fuel.dm +++ b/code/modules/reagents/chems/chems_fuel.dm @@ -14,7 +14,7 @@ glass_desc = "Unless you are an industrial tool, this is probably not safe for consumption." value = 1.5 -/decl/material/liquid/fuel/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/fuel/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) M.adjustToxLoss(2 * removed) /decl/material/liquid/fuel/explosion_act(obj/item/chems/holder, severity) diff --git a/code/modules/reagents/chems/chems_medicines.dm b/code/modules/reagents/chems/chems_medicines.dm index 92e90fd0833..ad656a7fed8 100644 --- a/code/modules/reagents/chems/chems_medicines.dm +++ b/code/modules/reagents/chems/chems_medicines.dm @@ -9,12 +9,12 @@ value = 1.5 uid = "chem_eyedrops" -/decl/material/liquid/eyedrops/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/eyedrops/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) if(ishuman(M)) var/mob/living/carbon/human/H = M var/obj/item/organ/internal/E = GET_INTERNAL_ORGAN(H, BP_EYES) if(E && istype(E) && !E.is_broken()) - ADJ_STATUS(M, STAT_BLURRY, -5) + ADJ_STATUS(M, STAT_BLURRY, -5) ADJ_STATUS(M, STAT_BLIND, -5) E.damage = max(E.damage - 5 * removed, 0) @@ -30,7 +30,7 @@ value = 1.5 uid = "chem_antirads" -/decl/material/liquid/antirads/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/antirads/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) M.radiation = max(M.radiation - 30 * removed, 0) /decl/material/liquid/brute_meds @@ -47,7 +47,7 @@ uid = "chem_styptic" var/effectiveness = 1 -/decl/material/liquid/brute_meds/affect_overdose(mob/living/M, alien, var/datum/reagents/holder) +/decl/material/liquid/brute_meds/affect_overdose(mob/living/M, var/datum/reagents/holder) ..() if(ishuman(M)) M.add_chemical_effect(CE_BLOCKAGE, (15 + REAGENT_VOLUME(holder, type))/100) @@ -58,7 +58,7 @@ //This is a logistic function that effectively doubles the healing rate as brute amounts get to around 200. Any injury below 60 is essentially unaffected and there's a scaling inbetween. #define ADJUSTED_REGEN_VAL(X) (6+(6/(1+200*2.71828**(-0.05*(X))))) -/decl/material/liquid/brute_meds/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/brute_meds/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() M.add_chemical_effect_max(CE_REGEN_BRUTE, round(effectiveness*ADJUSTED_REGEN_VAL(M.getBruteLoss()))) M.add_chemical_effect(CE_PAINKILLER, 10) @@ -75,7 +75,7 @@ uid = "chem_synthskin" var/effectiveness = 1 -/decl/material/liquid/burn_meds/affect_blood(mob/living/M, alien, removed, var/datum/reagents/holder) +/decl/material/liquid/burn_meds/affect_blood(mob/living/M, removed, var/datum/reagents/holder) ..() M.add_chemical_effect_max(CE_REGEN_BURN, round(effectiveness*ADJUSTED_REGEN_VAL(M.getFireLoss()))) M.add_chemical_effect(CE_PAINKILLER, 10) @@ -93,10 +93,10 @@ glass_name = "liquid gold" glass_desc = "It's magic. We don't have to explain it." -/decl/material/liquid/adminordrazine/affect_touch(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) - affect_blood(M, alien, removed, holder) +/decl/material/liquid/adminordrazine/affect_touch(var/mob/living/M, var/removed, var/datum/reagents/holder) + affect_blood(M, removed, holder) -/decl/material/liquid/adminordrazine/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/adminordrazine/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) M.rejuvenate() /decl/material/liquid/antitoxins @@ -114,7 +114,7 @@ /decl/material/liquid/zombiepowder ) -/decl/material/liquid/antitoxins/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/antitoxins/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) if(remove_generic) ADJ_STATUS(M, STAT_DROWSY, -6 * removed) M.adjust_hallucination(-9 * removed) @@ -145,12 +145,12 @@ scannable = 1 uid = "chem_immunobooster" -/decl/material/liquid/immunobooster/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/immunobooster/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) if(ishuman(M) && REAGENT_VOLUME(holder, type) < REAGENTS_OVERDOSE) var/mob/living/carbon/human/H = M H.immunity = min(H.immunity_norm * 0.5, removed + H.immunity) // Rapidly brings someone up to half immunity. -/decl/material/liquid/immunobooster/affect_overdose(var/mob/living/M, var/alien, var/datum/reagents/holder) +/decl/material/liquid/immunobooster/affect_overdose(var/mob/living/M, var/datum/reagents/holder) ..() M.add_chemical_effect(CE_TOXIN, 1) var/mob/living/carbon/human/H = M @@ -167,7 +167,7 @@ value = 1.5 uid = "chem_stimulants" -/decl/material/liquid/stimulants/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/stimulants/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/volume = REAGENT_VOLUME(holder, type) if(volume <= 0.1 && LAZYACCESS(M.chem_doses, type) >= 0.5 && world.time > REAGENT_DATA(holder, type) + 5 MINUTES) LAZYSET(holder.reagent_data, type, world.time) @@ -191,7 +191,7 @@ value = 1.5 uid = "chem_antidepressants" -/decl/material/liquid/antidepressants/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/antidepressants/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/volume = REAGENT_VOLUME(holder, type) if(volume <= 0.1 && LAZYACCESS(M.chem_doses, type) >= 0.5 && world.time > REAGENT_DATA(holder, type) + 5 MINUTES) LAZYSET(holder.reagent_data, type, world.time) @@ -214,7 +214,7 @@ value = 1.5 uid = "chem_antibiotics" -/decl/material/liquid/antibiotics/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/antibiotics/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/mob/living/carbon/human/H = M if(!istype(H)) return @@ -226,7 +226,7 @@ if(LAZYACCESS(H.chem_doses, type) > 15) H.immunity = max(H.immunity - 0.25, 0) -/decl/material/liquid/antibiotics/affect_overdose(var/mob/living/M, var/alien, var/datum/reagents/holder) +/decl/material/liquid/antibiotics/affect_overdose(var/mob/living/M, var/datum/reagents/holder) ..() var/mob/living/carbon/human/H = M if(!istype(H)) @@ -245,7 +245,7 @@ value = 1.5 uid = "chem_retrovirals" -/decl/material/liquid/retrovirals/affect_overdose(mob/living/M, alien, datum/reagents/holder) +/decl/material/liquid/retrovirals/affect_overdose(mob/living/M, datum/reagents/holder) . = ..() if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -253,8 +253,8 @@ if(!BP_IS_PROSTHETIC(E) && prob(25) && !(E.status & ORGAN_MUTATED)) E.mutate() E.limb_flags |= ORGAN_FLAG_DEFORMED - -/decl/material/liquid/retrovirals/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) + +/decl/material/liquid/retrovirals/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) M.adjustCloneLoss(-20 * removed) if(LAZYACCESS(M.chem_doses, type) > 10) ADJ_STATUS(M, STAT_DIZZY, 5) @@ -280,7 +280,7 @@ value = 1.5 uid = "chem_adrenaline" -/decl/material/liquid/adrenaline/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/adrenaline/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/volume = REAGENT_VOLUME(holder, type) var/dose = LAZYACCESS(M.chem_doses, type) if(dose < 0.2) //not that effective after initial rush @@ -309,7 +309,7 @@ value = 1.5 uid = "chem_stabilizer" -/decl/material/liquid/stabilizer/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/stabilizer/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() M.add_chemical_effect(CE_STABLE) @@ -323,7 +323,7 @@ value = 1.5 uid = "chem_regenerative_serum" -/decl/material/liquid/regenerator/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/regenerator/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() M.add_chemical_effect_max(CE_REGEN_BRUTE, 3 * removed) M.add_chemical_effect_max(CE_REGEN_BURN, 3 * removed) @@ -340,7 +340,7 @@ value = 1.5 uid = "chem_neuroannealer" -/decl/material/liquid/neuroannealer/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/neuroannealer/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) M.add_chemical_effect(CE_PAINKILLER, 10) M.add_chemical_effect(CE_BRAIN_REGEN, 1) if(ishuman(M)) @@ -356,6 +356,6 @@ color = COLOR_GRAY80 uid = "chem_oxygel" -/decl/material/liquid/oxy_meds/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/oxy_meds/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) M.add_chemical_effect(CE_OXYGENATED, 1) holder.remove_reagent(/decl/material/gas/carbon_monoxide, 2 * removed) diff --git a/code/modules/reagents/chems/chems_nutriment.dm b/code/modules/reagents/chems/chems_nutriment.dm index eaf2fd6ca58..61cd6a93e2d 100644 --- a/code/modules/reagents/chems/chems_nutriment.dm +++ b/code/modules/reagents/chems/chems_nutriment.dm @@ -38,22 +38,22 @@ data -= taste . = data -/decl/material/liquid/nutriment/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/nutriment/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) if(!injectable) M.adjustToxLoss(0.2 * removed) return - affect_ingest(M, alien, removed, holder) + affect_ingest(M, removed, holder) -/decl/material/liquid/nutriment/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) - adjust_nutrition(M, alien, removed) +/decl/material/liquid/nutriment/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) + adjust_nutrition(M, removed) if(M.HasTrait(/decl/trait/metabolically_inert)) return - M.heal_organ_damage(0.5 * removed, 0) //what + M.heal_organ_damage(0.5 * removed, 0) //what M.add_chemical_effect(CE_BLOODRESTORE, 4 * removed) -/decl/material/liquid/nutriment/proc/adjust_nutrition(var/mob/living/carbon/M, var/alien, var/removed) +/decl/material/liquid/nutriment/proc/adjust_nutrition(var/mob/living/carbon/M, var/removed) var/nut_removed = removed var/hyd_removed = removed if(nutriment_factor) @@ -91,10 +91,9 @@ color = "#440000" uid = "chem_nutriment_protein" -/decl/material/liquid/nutriment/protein/adjust_nutrition(mob/living/carbon/M, alien, removed) +/decl/material/liquid/nutriment/protein/adjust_nutrition(mob/living/carbon/M, removed) var/malus_level = M.GetTraitLevel(/decl/trait/malus/animal_protein) var/malus_factor = malus_level ? malus_level * 0.25 : 0 - M.adjustToxLoss(removed * malus_factor) M.adjust_nutrition(nutriment_factor * removed * (1 - malus_factor)) @@ -166,7 +165,7 @@ fruit_descriptor = "bitter" uid = "chem_nutriment_coffeepowder" -/decl/material/liquid/nutriment/coffee/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/nutriment/coffee/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() M.add_chemical_effect(CE_PULSE, 2) diff --git a/code/modules/reagents/chems/chems_painkillers.dm b/code/modules/reagents/chems/chems_painkillers.dm index 25130134f68..3e4b6d8912d 100644 --- a/code/modules/reagents/chems/chems_painkillers.dm +++ b/code/modules/reagents/chems/chems_painkillers.dm @@ -24,7 +24,7 @@ var/dizziness_severity = 1 var/narcotic = TRUE -/decl/material/liquid/painkillers/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/painkillers/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/volume = REAGENT_VOLUME(holder, type) var/effectiveness = 1 var/dose = LAZYACCESS(M.chem_doses, type) @@ -93,7 +93,7 @@ M.add_chemical_effect(CE_ALCOHOL_TOXIC, 1) M.add_chemical_effect(CE_BREATHLOSS, 1 * boozed) //drinking and opiating suppresses breathing. -/decl/material/liquid/painkillers/affect_overdose(var/mob/living/M, var/alien, var/datum/reagents/holder) +/decl/material/liquid/painkillers/affect_overdose(var/mob/living/M, var/datum/reagents/holder) ..() if(!narcotic) return diff --git a/code/modules/reagents/chems/chems_poisons.dm b/code/modules/reagents/chems/chems_poisons.dm index 781f2c1767c..3f4ade65383 100644 --- a/code/modules/reagents/chems/chems_poisons.dm +++ b/code/modules/reagents/chems/chems_poisons.dm @@ -8,7 +8,7 @@ value = 1.5 uid = "chem_pigment_paralytics" -/decl/material/liquid/paralytics/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/paralytics/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/threshold = 2 var/dose = LAZYACCESS(M.chem_doses, type) if(dose >= metabolism * threshold * 0.5) @@ -35,14 +35,14 @@ overdose = REAGENTS_OVERDOSE heating_point = 61 CELSIUS heating_products = list( - /decl/material/solid/potassium = 0.3, - /decl/material/liquid/acetone = 0.3, + /decl/material/solid/potassium = 0.3, + /decl/material/liquid/acetone = 0.3, /decl/material/liquid/nutriment/sugar = 0.4 ) value = 1.5 uid = "chem_pigment_presyncopics" -/decl/material/liquid/presyncopics/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/presyncopics/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) var/drug_strength = 4 ADJ_STATUS(M, STAT_DIZZY, drug_strength) SET_STATUS_MAX(M, STAT_CONFUSE, drug_strength * 5) diff --git a/code/modules/reagents/chems/random/chems_random.dm b/code/modules/reagents/chems/random/chems_random.dm index 50a8ddf1da9..cc4a43ac784 100644 --- a/code/modules/reagents/chems/random/chems_random.dm +++ b/code/modules/reagents/chems/random/chems_random.dm @@ -30,12 +30,12 @@ var/global/list/random_chem_interaction_blacklist = list( shuffle(effects_to_get) effects_to_get.Cut(max_effect_number + 1) effects_to_get += subtypesof(/decl/random_chem_effect/general_properties) - + var/list/decls = decls_repository.get_decls_unassociated(effects_to_get) for(var/item in decls) var/decl/random_chem_effect/effect = item effect.prototype_process(src, temperature) - + var/whitelist = subtypesof(/decl/material) for(var/bad_type in global.random_chem_interaction_blacklist) whitelist -= typesof(bad_type) @@ -56,10 +56,10 @@ var/global/list/random_chem_interaction_blacklist = list( if(temperature > chilling_point && temperature < heating_point) return TRUE -/decl/material/liquid/random/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/random/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) FOR_ALL_EFFECTS var/data = REAGENT_DATA(holder, type) - effect.affect_blood(M, alien, removed, LAZYACCESS(data, effect.type)) + effect.affect_blood(M, removed, LAZYACCESS(data, effect.type)) /decl/material/liquid/random/proc/on_chemicals_analyze(mob/user) to_chat(user, get_scan_data(user)) diff --git a/code/modules/reagents/chems/random/random_effects.dm b/code/modules/reagents/chems/random/random_effects.dm index 9be9e71b863..cec658a1c78 100644 --- a/code/modules/reagents/chems/random/random_effects.dm +++ b/code/modules/reagents/chems/random/random_effects.dm @@ -25,7 +25,7 @@ /decl/random_chem_effect/proc/on_property_recompute(var/decl/material/liquid/random/reagent, var/value) -/decl/random_chem_effect/proc/affect_blood(var/mob/living/M, var/alien, var/removed, var/value) +/decl/random_chem_effect/proc/affect_blood(var/mob/living/M, var/removed, var/value) // This is referring to monetary value. /decl/random_chem_effect/proc/get_value(var/value) @@ -96,7 +96,7 @@ /decl/random_chem_effect/random_properties var/chem_effect_define //If it corresponds to a CE_WHATEVER define, place here and it will do generic affect blood based on it -/decl/random_chem_effect/random_properties/affect_blood(var/mob/living/M, var/alien, var/removed, var/value) +/decl/random_chem_effect/random_properties/affect_blood(var/mob/living/M, var/removed, var/value) if(chem_effect_define) M.add_chemical_effect(chem_effect_define, value) @@ -227,7 +227,7 @@ mode = RANDOM_CHEM_EFFECT_INT desc = "acute toxicity" -/decl/random_chem_effect/random_properties/heal_brute/affect_blood(var/mob/living/M, var/alien, var/removed, var/value) +/decl/random_chem_effect/random_properties/heal_brute/affect_blood(var/mob/living/M, var/removed, var/value) M.adjustToxLoss(value * removed) /decl/random_chem_effect/random_properties/heal_brute @@ -235,7 +235,7 @@ maximum = 10 desc = "tissue repair" -/decl/random_chem_effect/random_properties/heal_brute/affect_blood(var/mob/living/M, var/alien, var/removed, var/value) +/decl/random_chem_effect/random_properties/heal_brute/affect_blood(var/mob/living/M, var/removed, var/value) M.heal_organ_damage(removed * value, 0) /decl/random_chem_effect/random_properties/heal_burns @@ -243,7 +243,7 @@ maximum = 10 desc = "burn repair" -/decl/random_chem_effect/random_properties/heal_brute/affect_blood(var/mob/living/M, var/alien, var/removed, var/value) +/decl/random_chem_effect/random_properties/heal_brute/affect_blood(var/mob/living/M, var/removed, var/value) M.heal_organ_damage(0, removed * value) #undef RANDOM_CHEM_EFFECT_TRUE diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index ff1aaaf71f5..5197fb28313 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -111,8 +111,8 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 var/sniff_message_1p = "You sniff the air." var/spawns_with_stack = 0 + // Environment tolerance/life processes vars. - var/reagent_tag // Used for metabolizing reagents. var/breath_pressure = 16 // Minimum partial pressure safe for breathing, kPa var/breath_type = /decl/material/gas/oxygen // Non-oxygen gas breathed, if any. var/poison_types = list(/decl/material/gas/chlorine = TRUE) // Noticeably poisonous air - ie. updates the toxins indicator on the HUD. diff --git a/mods/content/psionics/datum/chems.dm b/mods/content/psionics/datum/chems.dm index 6c76ba1527d..e32f2c4a236 100644 --- a/mods/content/psionics/datum/chems.dm +++ b/mods/content/psionics/datum/chems.dm @@ -1,8 +1,8 @@ /decl/material/liquid/crystal_agent/do_material_check(var/mob/living/carbon/M) var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) . = (M.psi || (M.mind && wizards.is_antagonist(M.mind))) ? MAT_NULLGLASS : ..() - -/decl/material/liquid/glowsap/gleam/affect_overdose(var/mob/living/M, var/alien, var/datum/reagents/holder) + +/decl/material/liquid/glowsap/gleam/affect_overdose(var/mob/living/M, var/datum/reagents/holder) ..() if(M.psi) M.psi.check_latency_trigger(30, "a [name] overdose") diff --git a/mods/content/xenobiology/slime/slime_reagents.dm b/mods/content/xenobiology/slime/slime_reagents.dm index e5aef189d9f..8d253dd4665 100644 --- a/mods/content/xenobiology/slime/slime_reagents.dm +++ b/mods/content/xenobiology/slime/slime_reagents.dm @@ -13,7 +13,7 @@ color = "#cf3600" metabolism = REM * 0.25 -/decl/material/liquid/water/affect_touch(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/water/affect_touch(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(isslime(M)) M.adjustToxLoss(10 * removed) @@ -32,22 +32,22 @@ if(istype(slime_ai)) slime_ai.attacked = max(slime_ai.attacked, rand(7,10)) // angery -/decl/material/liquid/water/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/water/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(isslime(M)) M.adjustToxLoss(2 * removed) -/decl/material/liquid/frostoil/affect_blood(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/frostoil/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(isslime(M)) M.bodytemperature = max(M.bodytemperature - rand(10,20), 0) -/decl/material/liquid/capsaicin/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/capsaicin/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(isslime(M)) M.bodytemperature += rand(0, 15) + slime_temp_adj -/decl/material/liquid/capsaicin/condensed/affect_ingest(var/mob/living/M, var/alien, var/removed, var/datum/reagents/holder) +/decl/material/liquid/capsaicin/condensed/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(isslime(M)) M.bodytemperature += rand(15, 30) diff --git a/mods/species/ascent/ascent.dm b/mods/species/ascent/ascent.dm index fab1c882806..954c1ae5065 100644 --- a/mods/species/ascent/ascent.dm +++ b/mods/species/ascent/ascent.dm @@ -8,8 +8,6 @@ #define BODY_FLAG_ALATE BITFLAG(4) #define BODY_FLAG_GYNE BITFLAG(5) -#define IS_MANTID "mantid" - #define BP_L_HAND_UPPER "l_u_hand" #define BP_R_HAND_UPPER "r_u_hand" #define BP_M_HAND "midlimb" diff --git a/mods/species/ascent/datum/species.dm b/mods/species/ascent/datum/species.dm index c9981f6490b..a7446544a13 100644 --- a/mods/species/ascent/datum/species.dm +++ b/mods/species/ascent/datum/species.dm @@ -69,7 +69,6 @@ exhale_type = /decl/material/gas/methane poison_types = list(/decl/material/gas/chlorine) - reagent_tag = IS_MANTID available_pronouns = list(/decl/pronouns/male) appearance_flags = 0 diff --git a/mods/species/bayliens/skrell/_skrell.dm b/mods/species/bayliens/skrell/_skrell.dm index ae2742c0930..4070265d784 100644 --- a/mods/species/bayliens/skrell/_skrell.dm +++ b/mods/species/bayliens/skrell/_skrell.dm @@ -1,5 +1,4 @@ #define SPECIES_SKRELL "Skrell" -#define IS_SKRELL "skrell" #define BODYTYPE_SKRELL "skrellian body" /mob/living/carbon/human/skrell/Initialize(mapload) diff --git a/mods/species/bayliens/skrell/datum/species.dm b/mods/species/bayliens/skrell/datum/species.dm index a25138eec07..d34e8e3b260 100644 --- a/mods/species/bayliens/skrell/datum/species.dm +++ b/mods/species/bayliens/skrell/datum/species.dm @@ -75,8 +75,6 @@ cold_discomfort_level = 292 //Higher than perhaps it should be, to avoid big speed reduction at normal room temp heat_discomfort_level = 368 - reagent_tag = IS_SKRELL - appearance_descriptors = list( /datum/appearance_descriptor/height = 1, /datum/appearance_descriptor/build = 0.8, diff --git a/mods/species/bayliens/unathi/_lizard.dm b/mods/species/bayliens/unathi/_lizard.dm index 5c62cbf76cd..faaf60f4cf4 100644 --- a/mods/species/bayliens/unathi/_lizard.dm +++ b/mods/species/bayliens/unathi/_lizard.dm @@ -1,6 +1,5 @@ #define SPECIES_LIZARD "Unathi" #define LANGUAGE_LIZARD "Sinta'unathi" -#define IS_LIZARD "lizard" /mob/living/carbon/human/lizard/Initialize(mapload) ..(mapload, SPECIES_LIZARD) diff --git a/mods/species/bayliens/unathi/datum/species.dm b/mods/species/bayliens/unathi/datum/species.dm index 9066c80ddc5..5851229d848 100644 --- a/mods/species/bayliens/unathi/datum/species.dm +++ b/mods/species/bayliens/unathi/datum/species.dm @@ -58,8 +58,6 @@ spawn_flags = SPECIES_CAN_JOIN | SPECIES_NO_ROBOTIC_INTERNAL_ORGANS appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR - reagent_tag = IS_LIZARD - flesh_color = "#34af10" base_color = "#066000" default_h_style = /decl/sprite_accessory/hair/lizard/frills_long diff --git a/mods/species/neoavians/_neoavians.dm b/mods/species/neoavians/_neoavians.dm index fa0b83fd1a1..497a09ee25e 100644 --- a/mods/species/neoavians/_neoavians.dm +++ b/mods/species/neoavians/_neoavians.dm @@ -1,6 +1,5 @@ #define SPECIES_AVIAN "Neo-Avian" #define BODYTYPE_AVIAN "avian body" -#define IS_AVIAN "avian" #define BODY_FLAG_AVIAN BITFLAG(6) /decl/modpack/neoavians diff --git a/mods/species/neoavians/datum/species.dm b/mods/species/neoavians/datum/species.dm index 5598c54fe4d..1e3e988a9de 100644 --- a/mods/species/neoavians/datum/species.dm +++ b/mods/species/neoavians/datum/species.dm @@ -30,8 +30,6 @@ preview_outfit = /decl/hierarchy/outfit/job/generic/assistant/avian - reagent_tag = IS_AVIAN - available_bodytypes = list( /decl/bodytype/avian, /decl/bodytype/avian/additive, diff --git a/mods/species/serpentid/datum/species.dm b/mods/species/serpentid/datum/species.dm index 1271e3a3b40..defadc491cd 100644 --- a/mods/species/serpentid/datum/species.dm +++ b/mods/species/serpentid/datum/species.dm @@ -65,7 +65,6 @@ body_temperature = null flesh_color = "#525252" blood_oxy = 0 - reagent_tag = IS_SERPENTID available_bodytypes = list( /decl/bodytype/serpentid, diff --git a/mods/species/serpentid/serpentid.dm b/mods/species/serpentid/serpentid.dm index 941a18bc874..4e5b98d9ce5 100644 --- a/mods/species/serpentid/serpentid.dm +++ b/mods/species/serpentid/serpentid.dm @@ -1,4 +1,3 @@ #define SPECIES_SERPENTID "Serpentid" #define BODYTYPE_SNAKE "snakelike body" -#define IS_SERPENTID "serpentid" #define BODY_FLAG_SNAKE BITFLAG(3) \ No newline at end of file diff --git a/mods/species/vox/datum/species.dm b/mods/species/vox/datum/species.dm index 79929dce901..60fd66ae5b4 100644 --- a/mods/species/vox/datum/species.dm +++ b/mods/species/vox/datum/species.dm @@ -11,8 +11,6 @@ "withered" = 65 ) -#define IS_VOX "vox" - /decl/blood_type/vox name = "vox ichor" antigen_category = "vox" @@ -81,7 +79,6 @@ flesh_color = "#808d11" default_h_style = /decl/sprite_accessory/hair/vox - reagent_tag = IS_VOX maneuvers = list(/decl/maneuver/leap/grab) standing_jump_range = 5 From 4882a208aa48aff11d040fa81316ab86ef2dcb48 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Thu, 25 Aug 2022 15:01:07 -0400 Subject: [PATCH 0288/1518] fix big derp --- code/game/machinery/buttons.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 29c0d211993..1ff34b6cfd2 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -32,7 +32,7 @@ /obj/machinery/button/buildable uncreated_component_parts = list( - /obj/item/stock_parts/radio/transmitter/basic = 1, + /obj/item/stock_parts/power/apc = 1, ) /obj/machinery/button/Initialize() From 0fbb4026ea11d31ab02b18bb6493d47ad54d04f8 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Thu, 25 Aug 2022 15:14:06 -0400 Subject: [PATCH 0289/1518] Fixed airlock sensors having the wrong uncreated components --- code/game/machinery/doors/airlock_control.dm | 14 +++++++++----- code/game/machinery/wall_frames.dm | 5 +++++ .../objects/items/weapons/circuitboards/wall.dm | 1 - 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 08857575040..29a50d1cef8 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -95,8 +95,7 @@ icon = 'icons/obj/airlock_machines.dmi' icon_state = "airlock_sensor_off" layer = ABOVE_WINDOW_LAYER - - anchored = 1 + anchored = TRUE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED power_channel = ENVIRON public_variables = list( @@ -106,16 +105,21 @@ public_methods = list(/decl/public_access/public_method/toggle_input_toggle) stock_part_presets = list(/decl/stock_part_preset/radio/basic_transmitter/airlock_sensor = 1) uncreated_component_parts = list( - /obj/item/stock_parts/power/apc, - /obj/item/stock_parts/radio/transmitter/basic/buildable + /obj/item/stock_parts/power/apc = 1, + /obj/item/stock_parts/radio/transmitter/basic/buildable = 1 ) - base_type = /obj/machinery/airlock_sensor + base_type = /obj/machinery/airlock_sensor/buildable construct_state = /decl/machine_construction/wall_frame/panel_closed/simple frame_type = /obj/item/frame/button/airlock_sensor var/alert = 0 var/pressure +/obj/machinery/airlock_sensor/buildable + uncreated_component_parts = list( + /obj/item/stock_parts/power/apc = 1 + ) + /obj/machinery/airlock_sensor/on_update_icon() if(!(stat & (NOPOWER | BROKEN))) if(alert) diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm index 95dc391af5e..82e8a464f93 100644 --- a/code/game/machinery/wall_frames.dm +++ b/code/game/machinery/wall_frames.dm @@ -244,6 +244,11 @@ icon_state = "airlock_sensor_off" name = "airlock sensor" desc = "An airlock sensor frame." + +/obj/item/frame/button/airlock_sensor/kit + fully_construct = TRUE + name = "airlock sensor kit" + desc = "An all-in-one airlock sensor kit, comes preassembled with a radio transmitter." build_machine_type = /obj/machinery/airlock_sensor /obj/item/frame/button/airlock_controller diff --git a/code/game/objects/items/weapons/circuitboards/wall.dm b/code/game/objects/items/weapons/circuitboards/wall.dm index 5fc545cabe3..624b7326aa9 100644 --- a/code/game/objects/items/weapons/circuitboards/wall.dm +++ b/code/game/objects/items/weapons/circuitboards/wall.dm @@ -70,7 +70,6 @@ additional_spawn_components = list( /obj/item/stock_parts/console_screen = 1, /obj/item/stock_parts/keyboard = 1, - /obj/item/stock_parts/power/apc/buildable = 1, ) buildtype_select = TRUE From 5784c6e45717e180b02dbcf5f161d339bf15725a Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Thu, 30 Jun 2022 17:44:06 -0400 Subject: [PATCH 0290/1518] Reworked paper shredder and added icon overlays for feedback * Use alt interactions * Store matter units instead of making up arbitrary amounts of shredded paper. * Now properly uses power and sets a bunch of newer machinery vars that weren't being set before. --- code/modules/paperwork/papershredder.dm | 332 ++++++++++++++++-------- 1 file changed, 218 insertions(+), 114 deletions(-) diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index dc13cb371cf..d8918ba8a22 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -1,148 +1,252 @@ +////////////////////////////////////////////////////////////////// +// Paper Shredder +////////////////////////////////////////////////////////////////// /obj/machinery/papershredder - name = "paper shredder" - desc = "For those documents you don't want seen." - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "papershredder0" - density = 1 - anchored = 1 - atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE - obj_flags = OBJ_FLAG_ANCHORABLE - var/max_paper = 10 - var/paperamount = 0 - - var/list/shred_amounts = list( - /obj/item/photo = 1, - /obj/item/shreddedp = 1, - /obj/item/paper = 1, - /obj/item/newspaper = 3, - /obj/item/card/id = 3, - /obj/item/paper_bundle = 3, - /obj/item/forensics/sample/print = 1 - ) + name = "paper shredder" + desc = "For those documents you don't want seen." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "papershredder0" + density = TRUE + anchored = TRUE + atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_CLIMBABLE + obj_flags = OBJ_FLAG_ANCHORABLE + idle_power_usage = 0 + stat_immune = NOSCREEN | NOINPUT + waterproof = FALSE + construct_state = /decl/machine_construction/default/panel_closed + required_interaction_dexterity = DEXTERITY_SIMPLE_MACHINES + uncreated_component_parts = list( + /obj/item/stock_parts/power/apc = 1, + ) + var/list/shredder_bin //List of shreded material type to matter amount + var/cached_total_matter = 0 //Total of all the matter units we put in the shredder so far + var/tmp/max_total_matter = SHEET_MATERIAL_AMOUNT * 10 //Maximum amount of matter that can be stored inside the bin + +/obj/machinery/papershredder/Initialize() + . = ..() + update_icon() -/obj/machinery/papershredder/attackby(var/obj/item/W, var/mob/user) +/obj/machinery/papershredder/on_component_failure(obj/item/stock_parts/component) + . = ..() - if(istype(W, /obj/item/storage)) - empty_bin(user, W) + if(istype(component, /obj/item/stock_parts/circuitboard)) + spark_at(get_turf(src), 30, FALSE, src) + empty_bin(violent = TRUE) + +/**Shreds the given object. */ +/obj/machinery/papershredder/proc/shred(var/obj/item/I, var/mob/user) + if(inoperable()) + to_chat(user, SPAN_WARNING("\The [src] doesn't seem to work.")) return - else - var/paper_result - for(var/shred_type in shred_amounts) - if(istype(W, shred_type)) - paper_result = shred_amounts[shred_type] - if(paper_result) - if(paperamount == max_paper) - to_chat(user, "\The [src] is full; please empty it before you continue.") - return - paperamount += paper_result - qdel(W) - playsound(src.loc, 'sound/items/pshred.ogg', 75, 1) - if(paperamount > max_paper) - to_chat(user, "\The [src] was too full, and shredded paper goes everywhere!") - for(var/i=(paperamount-max_paper);i>0;i--) - var/obj/item/shreddedp/SP = get_shredded_paper() - SP.dropInto(loc) - SP.throw_at(get_edge_target_turf(src,pick(global.alldirs)),1,5) - paperamount = max_paper - update_icon() - return - ..() - return - -/obj/machinery/papershredder/verb/empty_contents() - set name = "Empty bin" - set category = "Object" - set src in range(1) - - if(usr.incapacitated()) + if(is_bin_full()) + visible_message(SPAN_WARNING("The \"bin full\" warning light is flashing on \the [src]!")) return + //#TODO: Uncomment this once the bug is fixed, so we check for available power before actually working + // if(!powered() || can_use_power_oneoff(60) <= 0) + // to_chat(user, SPAN_WARNING("\The [src] seems to be lacking power...")) + // return + use_power_oneoff(60) + user.unEquip(I, src) + + //If the material is too hard damage the shredder + var/decl/material/M = I.material + if(M.hardness > MAT_VALUE_FLEXIBLE && M.hardness < MAT_VALUE_RIGID) + audible_message(SPAN_WARNING("You hear a loud mechanical grinding!")) + take_damage(1, BRUTE, TRUE) + spark_at(get_turf(src), 1, FALSE, src) + . = TRUE + + else if(M.hardness >= MAT_VALUE_RIGID) + audible_message(SPAN_DANGER("You hear rattling and then a loud bang!")) + use_power_oneoff(200) + take_damage(25, BRUTE, TRUE) + set_broken(TRUE, MACHINE_BROKEN_GENERIC) + . = FALSE - if(!paperamount) - to_chat(usr, "\The [src] is empty.") - return + else + visible_message(SPAN_NOTICE("\The [src] happily consumes \the [I].")) + . = TRUE + + if(.) + //Move over the matter + for(var/key in I.matter) + if(I.matter[key] < 1) + continue + var/new_matter = LAZYACCESS(shredder_bin, key) + I.matter[key] + cached_total_matter += new_matter + LAZYSET(shredder_bin, key, new_matter) + + I.physically_destroyed() + playsound(get_turf(src), 'sound/items/pshred.ogg', 50, TRUE) + else + I.dropInto(get_turf(user)) + playsound(get_turf(src), 'sound/effects/metalscrape1.ogg', 40, TRUE) + update_icon() - empty_bin(usr) +/obj/machinery/papershredder/proc/is_bin_full() + return cached_total_matter >= max_total_matter -/obj/machinery/papershredder/proc/empty_bin(var/mob/living/user, var/obj/item/storage/empty_into) - - if(empty_into) // If the user tries to empty the bin into something +/obj/machinery/papershredder/proc/is_bin_empty() + return !(length(shredder_bin) > 0 && cached_total_matter) - if(paperamount == 0) // Can't empty what is already empty - to_chat(user, "\The [src] is empty.") - return +/obj/machinery/papershredder/proc/can_shred(var/obj/item/I, var/mob/user = null) + if(!istype(I)) + if(user) + to_chat(user, SPAN_WARNING("\The [I] cannot be shredded by \the [src]!")) + return - if(empty_into && !istype(empty_into)) // Make sure we can store paper in the thing - to_chat(user, "You cannot put shredded paper into the [empty_into].") - return + //Being one of those types bypasses the checks + if(istype(I, /obj/item/paper) || istype(I, /obj/item/paper_bundle) || istype(I, /obj/item/folder) || istype(I, /obj/item/newspaper) || istype(I, /obj/item/photo)) + return TRUE - // Move papers one by one as they fit; stop when we are empty or can't fit any more - while(paperamount > 0) + //Generic tests for random objects + if(I.w_class > ITEM_SIZE_TINY) + if(user) + to_chat(user, SPAN_WARNING("\The [I] is too big to be inserted into \the [src]!")) + return - var/obj/item/shred_temp = get_shredded_paper() + var/decl/material/M = I.material + if(!istype(M) || M.hardness >= MAT_VALUE_HARD) + if(user) + to_chat(user, SPAN_WARNING("\The [I] is obviously not shreddable.")) + return + return TRUE - if(empty_into.can_be_inserted(shred_temp, user, 0)) - empty_into.handle_item_insertion(shred_temp) - else - qdel(shred_temp) - paperamount++ - break +/obj/machinery/papershredder/attackby(var/obj/item/W, var/mob/user) + if(!has_extension(W, /datum/extension/tool)) //Silently skip tools + var/trying_to_smack = !(W.item_flags & ITEM_FLAG_NO_BLUDGEON) && user && user.a_intent == I_HURT + if(istype(W, /obj/item/storage)) + empty_bin(user, W) + return TRUE + + else if(!trying_to_smack && can_shred(W)) + shred(W, user) + return TRUE + return ..() + +/**Creates shredded products, and empty the matter bin */ +/obj/machinery/papershredder/proc/create_shredded() + for(var/key in shredder_bin) + var/decl/material/M = GET_DECL(key) + var/amt_per_shard = atom_info_repository.get_matter_for(M.shard_type, key, 1) + if(shredder_bin[key] > amt_per_shard) + LAZYADD(., M.place_cuttings(src, shredder_bin[key])) + + //Anything leftover we just assume the machine ate or something + cached_total_matter = 0 + LAZYCLEARLIST(shredder_bin) + +/**Empties the paper bin into the given container, and/or on the floor. If violent is on, and there's no container passed, we're going to throw around the trash. */ +/obj/machinery/papershredder/proc/empty_bin(var/mob/living/user, var/obj/item/storage/empty_into, var/violent = FALSE) + if(is_bin_empty()) + if(user) + to_chat(user, SPAN_NOTICE("\The [src] is empty.")) + return + if(empty_into && !istype(empty_into)) // Make sure we can store paper in the thing + if(user) + to_chat(user, SPAN_NOTICE("You cannot put shredded paper into the [empty_into].")) + return + + //If we got a container put what we can into it + var/list/shredded = create_shredded() + if(empty_into) + for(var/obj/item/I in shredded) + if(empty_into.can_be_inserted(I, user, !isnull(user))) + empty_into.handle_item_insertion(I, TRUE) + LAZYREMOVE(shredded, I) // Report on how we did - if(paperamount == 0) - to_chat(user, "You empty \the [src] into \the [empty_into].") - if(paperamount > 0) - to_chat(user, "\The [empty_into] will not fit any more shredded paper.") + if(user) + if(length(shredded) < 1) + to_chat(user, SPAN_NOTICE("You empty \the [src] into \the [empty_into].")) + else + to_chat(user, SPAN_NOTICE("\The [empty_into] will not fit any more shredded paper.")) - else // Just dump the paper out on the floor - while(paperamount > 0) - get_shredded_paper() + //Drop the leftovers + if(LAZYLEN(shredded)) + var/turf/T = get_turf(user? user : src) + for(var/obj/item/I in shredded) + I.dropInto(T) + if(violent) + I.throw_at(get_edge_target_turf(src, pick(global.alldirs)), I.throw_range, I.throw_speed) update_icon() - -/obj/machinery/papershredder/proc/get_shredded_paper() - if(paperamount) - paperamount-- - return new /obj/item/shreddedp(get_turf(src)) + return TRUE /obj/machinery/papershredder/on_update_icon() - icon_state = "papershredder[max(0,min(5,FLOOR(paperamount/2)))]" + cut_overlays() + var/ratio = ((cached_total_matter * 5) / max_total_matter) + icon_state = "papershredder[between(0, CEILING(ratio), 5)]" + if(!is_unpowered()) + add_overlay(overlay_image('icons/obj/bureaucracy.dmi', "papershredder_power")) + if(is_broken() || is_bin_full()) + add_overlay(overlay_image('icons/obj/bureaucracy.dmi', "papershredder_bad")) + +/obj/machinery/papershredder/get_alt_interactions(mob/user) + . = ..() + LAZYADD(., /decl/interaction_handler/empty/paper_shredder) + +////////////////////////////////////////////////////////////////// +// Empty Bin Interaction +////////////////////////////////////////////////////////////////// +/decl/interaction_handler/empty/paper_shredder + name = "Empty Bin" + expected_target_type = /obj/machinery/papershredder + +/decl/interaction_handler/empty/paper_shredder/is_possible(obj/machinery/papershredder/target, mob/user, obj/item/prop) + return ..() && !target.is_bin_empty() + +/decl/interaction_handler/empty/paper_shredder/invoked(obj/machinery/papershredder/target, mob/user) + target.empty_bin(user) + +////////////////////////////////////////////////////////////////// +// Shredded Paper +////////////////////////////////////////////////////////////////// +/obj/item/shreddedp + name = "shredded" + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "shredp" + randpixel = 5 + throw_range = 3 + throw_speed = 2 + throwforce = 0 + w_class = ITEM_SIZE_TINY + material = /decl/material/solid/paper + applies_material_colour = TRUE + applies_material_name = TRUE + +/obj/item/shreddedp/get_matter_amount_modifier() + return 0.2 + +/obj/item/shreddedp/set_material(new_material) + . = ..() + if(material) + SetName("[initial(name)] [material.solid_name]") /obj/item/shreddedp/attackby(var/obj/item/W, var/mob/user) if(istype(W, /obj/item/flame/lighter)) burnpaper(W, user) - else - ..() + return TRUE + return ..() /obj/item/shreddedp/proc/burnpaper(var/obj/item/flame/lighter/P, var/mob/user) - if(user.restrained()) + if(!CanPhysicallyInteractWith(user, src) && material?.fuel_value) return if(!P.lit) - to_chat(user, "\The [P] is not lit.") + to_chat(user, SPAN_WARNING("\The [P] is not lit.")) return var/decl/pronouns/G = user.get_pronouns() - user.visible_message("\The [user] holds \the [P] up to \the [src]. It looks like [G.he] [G.is] trying to burn it!", \ - "You hold \the [P] up to \the [src], burning it slowly.") + user.visible_message(\ + SPAN_WARNING("\The [user] holds \the [P] up to \the [src]. It looks like [G.he] [G.is] trying to burn it!"), \ + SPAN_WARNING("You hold \the [P] up to \the [src], burning it slowly.")) if(!do_after(user,20, src)) - to_chat(user, "You must hold \the [P] steady to burn \the [src].") + to_chat(user, SPAN_WARNING("You must hold \the [P] steady to burn \the [src].")) return - user.visible_message("\The [user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.", \ - "You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.") - FireBurn() + user.visible_message( \ + SPAN_DANGER("\The [user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap."), \ + SPAN_DANGER("You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.")) + fire_act() -/obj/item/shreddedp/proc/FireBurn() +/obj/item/shreddedp/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) new /obj/effect/decal/cleanable/ash(get_turf(src)) - qdel(src) - -/obj/item/shreddedp - name = "shredded paper" - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "shredp" - randpixel = 5 - throwforce = 0 - w_class = ITEM_SIZE_TINY - throw_range = 3 - throw_speed = 1 - -/obj/item/shreddedp/Initialize() - . = ..() - if(prob(65)) color = pick("#bababa","#7f7f7f") + physically_destroyed() From 8b21c9b797b55964c85511da447d8f4ff85003b8 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Thu, 30 Jun 2022 17:47:31 -0400 Subject: [PATCH 0291/1518] Added circuitboard for paper shredded Because there's no support for simple machines that don't have a circuit board right now, especially in terms of damage. --- .../items/weapons/circuitboards/machinery/household.dm | 10 +++++++++- .../designs/imprinter/designs_misc_circuits.dm | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/circuitboards/machinery/household.dm b/code/game/objects/items/weapons/circuitboards/machinery/household.dm index 3762cb31248..bcc108137fc 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/household.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/household.dm @@ -185,4 +185,12 @@ buildtype_select = TRUE /obj/item/stock_parts/circuitboard/jukebox/get_buildable_types() - return typesof(/obj/machinery/media/jukebox) \ No newline at end of file + return typesof(/obj/machinery/media/jukebox) + +/obj/item/stock_parts/circuitboard/paper_shredder + name = "circuitboard (paper shredder)" + build_path = /obj/machinery/papershredder + board_type = "machine" + origin_tech = "{'engineering':1}" + req_components = list(/obj/item/stock_parts/manipulator = 1) + additional_spawn_components = null \ No newline at end of file diff --git a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm index 672cc53eaa8..ddb23e0e9ef 100644 --- a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm +++ b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm @@ -443,6 +443,9 @@ /datum/fabricator_recipe/imprinter/circuit/jukebox path = /obj/item/stock_parts/circuitboard/jukebox +/datum/fabricator_recipe/imprinter/circuit/paper_shredder + path = /obj/item/stock_parts/circuitboard/paper_shredder + /datum/fabricator_recipe/imprinter/circuit/forensic path = /obj/item/stock_parts/circuitboard/forensic From b183317945a32f601716894a0915d5d0e120a6ea Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Thu, 25 Aug 2022 15:56:50 -0400 Subject: [PATCH 0292/1518] Placed stubs for paperwork pr --- code/modules/materials/_materials.dm | 4 ++++ .../materials/definitions/solids/materials_solid_organic.dm | 3 +++ 2 files changed, 7 insertions(+) diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index a6039ace954..a8c833d2a78 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -429,6 +429,10 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) if(shard_type) return create_object(target, 1, /obj/item/shard) +/**Places downa as many shards as needed for the given amount of matter units. Returns a list of all the cuttings. */ +/decl/material/proc/place_cuttings(var/turf/target, var/matter_units) + //STUB: Waiting on papwerork PR + // Used by walls and weapons to determine if they break or not. /decl/material/proc/is_brittle() return !!(flags & MAT_FLAG_BRITTLE) diff --git a/code/modules/materials/definitions/solids/materials_solid_organic.dm b/code/modules/materials/definitions/solids/materials_solid_organic.dm index 82f90fa22e6..35572408544 100644 --- a/code/modules/materials/definitions/solids/materials_solid_organic.dm +++ b/code/modules/materials/definitions/solids/materials_solid_organic.dm @@ -84,6 +84,9 @@ . += new/datum/stack_recipe/cardborg_helmet(src) . += new/datum/stack_recipe_list("folders", create_recipe_list(/datum/stack_recipe/folder)) +/decl/material/solid/paper + //STUB: Waiting on papwerork PR + /decl/material/solid/cloth //todo name = "cotton" uid = "solid_cotton" From 8e8d2259c7604d06c3a7a0ab64d892fbe88f69c4 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Thu, 25 Aug 2022 16:06:56 -0400 Subject: [PATCH 0293/1518] Update materials_solid_organic.dm --- .../materials/definitions/solids/materials_solid_organic.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/materials/definitions/solids/materials_solid_organic.dm b/code/modules/materials/definitions/solids/materials_solid_organic.dm index 35572408544..90c3b9f7038 100644 --- a/code/modules/materials/definitions/solids/materials_solid_organic.dm +++ b/code/modules/materials/definitions/solids/materials_solid_organic.dm @@ -85,6 +85,7 @@ . += new/datum/stack_recipe_list("folders", create_recipe_list(/datum/stack_recipe/folder)) /decl/material/solid/paper + uid = "solid_paper" //STUB: Waiting on papwerork PR /decl/material/solid/cloth //todo From d389afc63f16cb6cc9eaeb8c37ebdf494572c949 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 26 Aug 2022 11:03:40 +1000 Subject: [PATCH 0294/1518] Automatic changelog generation for PR #2646 [ci skip] --- html/changelogs/AutoChangeLog-pr-2646.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2646.yml diff --git a/html/changelogs/AutoChangeLog-pr-2646.yml b/html/changelogs/AutoChangeLog-pr-2646.yml new file mode 100644 index 00000000000..477683fe019 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2646.yml @@ -0,0 +1,4 @@ +author: PsyCommando +delete-after: true +changes: + - tweak: Paper shredder gives better user feedback. From c9075a779a3daa66ebf27e2eeb287b85e43a0c62 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Fri, 24 Jun 2022 22:14:34 -0400 Subject: [PATCH 0295/1518] Sorts the spawn material stack verb type list Material types are now sorted, so you can actually find something in that overcrowded listbox. A browser window might work better in the future though. --- code/modules/admin/verbs/debug.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index caf6ed3a00c..44f292bbe25 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -468,7 +468,8 @@ set name = "Spawn Material Stack" if(!check_rights(R_DEBUG)) return - var/decl/material/material = input("Select material to spawn") as null|anything in SSmaterials.materials + var/list/mat_types = sortTim(SSmaterials.materials_by_name, /proc/cmp_name_or_type_asc, TRUE) + var/material = input("Select material to spawn") as null|anything in mat_types if(!material) return SSmaterials.create_object(material.type, get_turf(mob), 50) From 38d8da5dbac98ce84599fa77ff64db78db8885df Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Fri, 24 Jun 2022 23:05:36 -0400 Subject: [PATCH 0296/1518] Actually pass the type --- code/modules/admin/verbs/debug.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 44f292bbe25..36319acf547 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -472,7 +472,8 @@ var/material = input("Select material to spawn") as null|anything in mat_types if(!material) return - SSmaterials.create_object(material.type, get_turf(mob), 50) + var/decl/material/M = SSmaterials.materials_by_name[material] + SSmaterials.create_object(M.type, get_turf(mob), 50) /client/proc/force_ghost_trap_trigger() set category = "Debug" From d27933d4380ee87fce50ab18558dc1d45c92e6dd Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Wed, 24 Aug 2022 14:26:22 -0400 Subject: [PATCH 0297/1518] sort lists --- code/controllers/subsystems/initialization/materials.dm | 2 ++ code/modules/admin/verbs/debug.dm | 5 ++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystems/initialization/materials.dm b/code/controllers/subsystems/initialization/materials.dm index dde82d0e56d..ca980c8befb 100644 --- a/code/controllers/subsystems/initialization/materials.dm +++ b/code/controllers/subsystems/initialization/materials.dm @@ -59,6 +59,8 @@ SUBSYSTEM_DEF(materials) // Various other material functions. build_material_lists() // Build core material lists. build_fusion_reaction_list() // Build fusion reaction tree. + materials = sortTim(SSmaterials.materials, /proc/cmp_name_asc) + materials_by_name = sortTim(SSmaterials.materials_by_name, /proc/cmp_name_or_type_asc, TRUE) var/alpha_inc = 256 / DAMAGE_OVERLAY_COUNT for(var/i = 1; i <= DAMAGE_OVERLAY_COUNT; i++) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 36319acf547..4c305f0c0f7 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -468,12 +468,11 @@ set name = "Spawn Material Stack" if(!check_rights(R_DEBUG)) return - var/list/mat_types = sortTim(SSmaterials.materials_by_name, /proc/cmp_name_or_type_asc, TRUE) - var/material = input("Select material to spawn") as null|anything in mat_types + var/material = input("Select material to spawn") as null|anything in SSmaterials.materials_by_name if(!material) return var/decl/material/M = SSmaterials.materials_by_name[material] - SSmaterials.create_object(M.type, get_turf(mob), 50) + M.create_object(get_turf(mob), 50) /client/proc/force_ghost_trap_trigger() set category = "Debug" From 10fa5ad548a52d74d10c2f941ff914cc8dbe102a Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 26 Aug 2022 11:34:48 +1000 Subject: [PATCH 0298/1518] Automatic changelog generation for PR #2553 [ci skip] --- html/changelogs/AutoChangeLog-pr-2553.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2553.yml diff --git a/html/changelogs/AutoChangeLog-pr-2553.yml b/html/changelogs/AutoChangeLog-pr-2553.yml new file mode 100644 index 00000000000..30fe39b4d9f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2553.yml @@ -0,0 +1,5 @@ +author: PsyCommando +delete-after: true +changes: + - admin: The list for spawning material stacks is now sorted by type name. So its + a bit more useful. From 0a1fa19ec529cc8dd1e7752418beb9cd7295ca9f Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Fri, 24 Jun 2022 20:31:23 -0400 Subject: [PATCH 0299/1518] Reworked tape rolls base types and more Reworked tape rolls base types * Duct tape and barricade tape now have the same base class. * All tape rolls are now stacks and have limited uses. * Added a way to allow obj/item/stack subtypes to prevent the stack being split and recombined. This is to prevent doing that with tape rolls. * Rewrote the barricade tape placement logic completely from scratch. So now more placement options are available. * Rewrote barricade tape icon handling and interactions. * Tape barricade lines are now actually a structure instead of an item to be more consistent with everything else. * Tape barricades now update their icons from nearby neighbors. * Unrolling the tape is now handled by event. * Barricade tape and its structure now use datums to tell their properties and appearance instead of it being done by subclassing. * Updated duct tape to use the new tape_roll stuff. * Brought duct tape a bit more up to date in general. * A lot of text formating stuff. --- code/__defines/flags.dm | 1 + code/datums/supplypacks/operations.dm | 2 +- code/datums/supplypacks/security.dm | 2 +- code/datums/uplink/devices and tools.dm | 4 +- code/game/machinery/vending/engineering.dm | 2 +- code/game/objects/items/stacks/rods.dm | 15 +- code/game/objects/items/stacks/stack.dm | 32 +- code/game/objects/items/weapons/policetape.dm | 860 +++++++++++------- .../objects/items/weapons/storage/belt.dm | 13 +- .../objects/items/weapons/storage/boxes.dm | 14 +- code/game/objects/items/weapons/tape.dm | 315 ++++--- code/game/objects/random/random.dm | 2 +- .../closets/secure/engineering.dm | 6 +- .../crates_lockers/closets/secure/medical.dm | 2 +- .../crates_lockers/closets/secure/security.dm | 8 +- code/game/objects/structures/inflatable.dm | 8 +- code/game/objects/structures/watercloset.dm | 65 +- code/modules/clothing/spacesuits/breaches.dm | 19 +- code/modules/clothing/suits/jobs.dm | 2 +- code/modules/crafting/_crafting_stage.dm | 7 +- .../robot/flying/module_flying_emergency.dm | 2 +- .../robot/flying/module_flying_forensics.dm | 2 +- .../robot/flying/module_flying_repair.dm | 4 +- .../robot/modules/module_engineering.dm | 4 +- .../silicon/robot/modules/module_medical.dm | 2 +- .../silicon/robot/modules/module_security.dm | 2 +- code/modules/paperwork/paper.dm | 4 +- code/modules/paperwork/paper_bundle.dm | 2 +- code/modules/power/cable.dm | 2 +- code/modules/supermatter/supermatter.dm | 23 +- code/modules/surgery/organs_internal.dm | 2 +- .../xenoarcheaology/tools/equipment.dm | 2 +- code/modules/xenoarcheaology/tools/misc.dm | 4 +- icons/policetape.dmi | Bin 3858 -> 7619 bytes maps/antag_spawn/ert/ert_base.dmm | 24 +- maps/away/bearcat/bearcat-1.dmm | 12 +- maps/away/bearcat/bearcat-2.dmm | 2 +- maps/away/errant_pisces/errant_pisces.dmm | 2 +- maps/exodus/exodus-2.dmm | 22 +- maps/ministation/ministation.dmm | 2 +- .../exoplanet_ruins/playablecolony/colony.dmm | 4 +- maps/tradeship/tradeship-1.dmm | 8 +- maps/tradeship/tradeship-2.dmm | 6 +- maps/tradeship/tradeship-3.dmm | 2 +- 44 files changed, 904 insertions(+), 614 deletions(-) diff --git a/code/__defines/flags.dm b/code/__defines/flags.dm index e5f89e3caaa..04f257d7a16 100644 --- a/code/__defines/flags.dm +++ b/code/__defines/flags.dm @@ -80,6 +80,7 @@ The latter will result in a linter warning and will not work correctly. #define ITEM_FLAG_CAN_HIDE_IN_SHOES BITFLAG(12) // Items that can be hidden in shoes that permit it #define ITEM_FLAG_PADDED BITFLAG(13) // When set on gloves, will act like pulling punches in unarmed combat. #define ITEM_FLAG_HOLLOW BITFLAG(14) // Modifies initial matter values to be lower than w_class normally sets. +#define ITEM_FLAG_CAN_TAPE BITFLAG(15) //Whether the item can be be taped onto something using tape // Flags for pass_flags (/atom/var/pass_flags) #define PASS_FLAG_TABLE BITFLAG(0) diff --git a/code/datums/supplypacks/operations.dm b/code/datums/supplypacks/operations.dm index cb594f257ea..68fa5a03ee2 100644 --- a/code/datums/supplypacks/operations.dm +++ b/code/datums/supplypacks/operations.dm @@ -90,7 +90,7 @@ /obj/item/folder/red, /obj/item/folder/yellow, /obj/item/hand_labeler, - /obj/item/ducttape, + /obj/item/stack/tape_roll/duct_tape, /obj/structure/filingcabinet/chestdrawer, /obj/item/paper_bin) name = "Office supplies" diff --git a/code/datums/supplypacks/security.dm b/code/datums/supplypacks/security.dm index ee8d8a83703..9441d5f9021 100644 --- a/code/datums/supplypacks/security.dm +++ b/code/datums/supplypacks/security.dm @@ -194,7 +194,7 @@ name = "Forensics - investigation equipment" contains = list(/obj/item/storage/box/evidence = 2, /obj/item/radio/headset/headset_sec, - /obj/item/taperoll/police, + /obj/item/stack/tape_roll/barricade_tape/police, /obj/item/clothing/glasses/sunglasses, /obj/item/camera, /obj/item/folder/red, diff --git a/code/datums/uplink/devices and tools.dm b/code/datums/uplink/devices and tools.dm index c7e67d8857d..636f9d4f2b8 100644 --- a/code/datums/uplink/devices and tools.dm +++ b/code/datums/uplink/devices and tools.dm @@ -13,9 +13,9 @@ /datum/uplink_item/item/tools/ductape name = "Duct Tape" - desc = "A roll of duct tape. changes \"HELP\" into sexy \"mmm\"." + desc = "A roll of duct tape. Will silence anyone, just like a particularly bad duck pun." item_cost = 2 - path = /obj/item/ducttape + path = /obj/item/stack/tape_roll/duct_tape /datum/uplink_item/item/tools/money name = "Operations Funding" diff --git a/code/game/machinery/vending/engineering.dm b/code/game/machinery/vending/engineering.dm index d09812099b9..c2359cfc264 100644 --- a/code/game/machinery/vending/engineering.dm +++ b/code/game/machinery/vending/engineering.dm @@ -18,7 +18,7 @@ /obj/item/screwdriver = 5, /obj/item/flashlight/flare/glowstick = 3, /obj/item/flashlight/flare/glowstick/red = 3, - /obj/item/ducttape = 8, + /obj/item/stack/tape_roll/duct_tape = 8, /obj/item/clothing/gloves/insulated/cheap = 2 ) contraband = list( diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index a1a757a7deb..6eb916ad554 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -70,14 +70,21 @@ use(2) return - if (istype(W, /obj/item/ducttape)) + if (istype(W, /obj/item/stack/tape_roll/duct_tape)) + var/obj/item/stack/tape_roll/duct_tape/T = W + if(!T.can_use(4)) + to_chat(user, SPAN_WARNING("You need 4 [T.plural_name] to make a splint!")) + return + T.use(4) + var/obj/item/stack/medical/splint/ghetto/new_splint = new(user.loc) new_splint.dropInto(loc) new_splint.add_fingerprint(user) - - user.visible_message("\The [user] constructs \a [new_splint] out of a [singular_name].", \ - "You use make \a [new_splint] out of a [singular_name].") + playsound(user, 'sound/effects/tape.ogg', 50, TRUE) + user.visible_message(SPAN_NOTICE("\The [user] constructs \a [new_splint] out of a [singular_name]."), \ + SPAN_NOTICE("You use make \a [new_splint] out of a [singular_name].")) src.use(1) + return ..() diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 74b8aaa88bb..87ea138af40 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -258,9 +258,7 @@ //creates a new stack with the specified amount /obj/item/stack/proc/split(var/tamount, var/force=FALSE) - if (!amount) - return null - if(uses_charge && !force) + if (!can_split() || !amount || (uses_charge && !force)) return null var/transfer = max(min(tamount, src.amount, initial(max_amount)), 0) @@ -304,6 +302,8 @@ return max_amount /obj/item/stack/proc/add_to_stacks(mob/user, check_hands) + if(!can_merge()) + return var/list/stacks = list() if(check_hands && user) for(var/obj/item/stack/item in user.get_held_items()) @@ -325,7 +325,7 @@ . = CEILING(. * amount / max_amount) /obj/item/stack/attack_hand(mob/user) - if(user.is_holding_offhand(src)) + if(user.is_holding_offhand(src) && can_split()) var/N = input("How many stacks of [src] would you like to split off?", "Split stacks", 1) as num|null if(N) var/obj/item/stack/F = src.split(N) @@ -336,19 +336,29 @@ spawn(0) if (src && usr.machine==src) src.interact(usr) - else - ..() - return + return TRUE + return FALSE + return ..() + /obj/item/stack/attackby(obj/item/W, mob/user) - if (istype(W, /obj/item/stack)) + if (istype(W, /obj/item/stack) && can_merge()) var/obj/item/stack/S = W - src.transfer_to(S) + . = src.transfer_to(S) spawn(0) //give the stacks a chance to delete themselves if necessary if (S && usr.machine==S) S.interact(usr) if (src && usr.machine==src) src.interact(usr) - else - return ..() + return + + return ..() + +/**Whether a stack has the capability to be split. */ +/obj/item/stack/proc/can_split() + return !(uses_charge && !force) //#TODO: The !force was a hacky way to tell if its a borg or rigsuit module. Probably would be good to find a better way.. + +/**Whether a stack type has the capability to be merged. */ +/obj/item/stack/proc/can_merge() + return !(uses_charge && !force) \ No newline at end of file diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index 91be444aafa..dbf47c19059 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -1,397 +1,555 @@ -//Define all tape types in policetape.dm -/obj/item/taperoll - name = "tape roll" - icon = 'icons/policetape.dmi' - icon_state = "tape" - w_class = ITEM_SIZE_SMALL - var/turf/start - var/turf/end - var/tape_type = /obj/item/tape - var/icon_base = "tape" - - var/apply_tape = FALSE - -/obj/item/taperoll/Initialize() +#define MAX_BARRICADE_TAPE_LENGTH 32 //Maximum length of a continuous line of tape someone can place down. +#define TAPE_BARRICADE_V_NEIGHBORS (NORTH | SOUTH) +#define TAPE_BARRICADE_H_NEIGHBORS (EAST | WEST) +#define TAPE_BARRICADE_IS_CORNER_NEIGHBORS(X) ((X ^ TAPE_BARRICADE_V_NEIGHBORS) && (X ^ TAPE_BARRICADE_H_NEIGHBORS)) +#define TAPE_BARRICADE_IS_V_NEIGHBORS(X) ((X & TAPE_BARRICADE_V_NEIGHBORS) == TAPE_BARRICADE_V_NEIGHBORS && !((X & TAPE_BARRICADE_H_NEIGHBORS) == TAPE_BARRICADE_H_NEIGHBORS)) //Check we have neighbors connection on the vertical plane +#define TAPE_BARRICADE_IS_H_NEIGHBORS(X) ((X & TAPE_BARRICADE_H_NEIGHBORS) == TAPE_BARRICADE_H_NEIGHBORS && !((X & TAPE_BARRICADE_V_NEIGHBORS) == TAPE_BARRICADE_V_NEIGHBORS)) //Check we have neighbors connection on the horizontal plane +#define TAPE_BARRICADE_IS_3W_V_NEIGHBORS(X) (TAPE_BARRICADE_IS_V_NEIGHBORS(X) && ((X & TAPE_BARRICADE_H_NEIGHBORS) > 0)) +#define TAPE_BARRICADE_IS_3W_H_NEIGHBORS(X) (TAPE_BARRICADE_IS_H_NEIGHBORS(X) && ((X & TAPE_BARRICADE_V_NEIGHBORS) > 0)) +#define TAPE_BARRICADE_IS_4W_NEIGHBORS(X) (((X & TAPE_BARRICADE_V_NEIGHBORS) == TAPE_BARRICADE_V_NEIGHBORS) && ((X & TAPE_BARRICADE_H_NEIGHBORS) == TAPE_BARRICADE_H_NEIGHBORS)) +#define CONNECTION_BITS_TO_TEXT(X) "[(X & WEST) > 0][(X & EAST) > 0][(X & SOUTH) > 0][(X & NORTH) > 0]" +#define TAPE_BARRICADE_GET_NB_NEIGHBORS(X) (((X & NORTH) > 0) + ((X & SOUTH) > 0) + ((X & EAST) > 0) + ((X & WEST) > 0)) + +var/global/list/image/hazard_overlays //Cached hazard floor overlays for the barricade tape + +//////////////////////////////////////////////////////////////////// +// Barricade Tape Template +//////////////////////////////////////////////////////////////////// +//Singletons with data on the various templates of barricade tape +/decl/barricade_tape_template + var/tape_kind = "barricade" //Used as a prefix to the word "tape" when refering to the tape and roll + var/tape_desc = "A tape barricade." //Description for the tape barricade + var/roll_desc = "A roll of barricade tape." //Description for the tape roll + var/icon_file = 'icons/policetape.dmi' //Icon file used for both the tape and roll + var/base_icon_state = "tape" //For the barricade. Icon state used to fetch the applied tape directional icons for various states + var/list/req_access //Access required to automatically pass through tape barricades + var/tape_color //Color of the tape + var/detail_overlay //Overlay for the applied tape + var/detail_color //Color for the detail overlay + +/decl/barricade_tape_template/proc/make_line_barricade(var/mob/user, var/turf/T, var/pdir) + var/obj/structure/tape_barricade/bar = new(T,,,src) + bar.add_fingerprint(user) + return bar + +/decl/barricade_tape_template/proc/make_door_barricade(var/mob/user, var/obj/door) + var/obj/structure/tape_barricade/door/bar = new(get_turf(door)) + bar.set_tape_template(src) + bar.set_dir(door.dir) + bar.add_fingerprint(user) + return bar + +//////////////////////////////////////////////////////////////////// +// Barricade Tape Roll +//////////////////////////////////////////////////////////////////// +/obj/item/stack/tape_roll/barricade_tape + name = "barricade tape roll" + desc = "A roll of high visibility, non-sticky barricade tape. Used to deter passersby from crossing it." + icon = 'icons/policetape.dmi' + icon_state = "tape" + w_class = ITEM_SIZE_SMALL + var/tmp/unrolled = 0 //The amount of tape lenghts we've used so far while laying down a barricade + var/tmp/turf/start //The turf we started unrolling from + var/tmp/weakref/unroller //The mob currently unrolling us + var/decl/barricade_tape_template/tape_template //Template containing details on how the tape roll will look and behave, along with what it will place down + +/obj/item/stack/tape_roll/barricade_tape/Initialize() . = ..() - if(apply_tape) - var/turf/T = get_turf(src) - if(!T) - return - var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in T - if(airlock) - afterattack(airlock, null, TRUE) - return INITIALIZE_HINT_QDEL - - -var/global/list/image/hazard_overlays -var/global/list/tape_roll_applications = list() - -/obj/item/tape - name = "tape" - icon = 'icons/policetape.dmi' - icon_state = "tape" - layer = ABOVE_DOOR_LAYER - randpixel = 0 - anchored = 1 - var/lifted = 0 - var/crumpled = 0 - var/tape_dir = 0 - var/icon_base = "tape" - var/detail_overlay - var/detail_color - -/obj/item/tape/on_update_icon() - . = ..() - //Possible directional bitflags: 0 (AIRLOCK), 1 (NORTH), 2 (SOUTH), 4 (EAST), 8 (WEST), 3 (VERTICAL), 12 (HORIZONTAL) - var/new_state - switch (tape_dir) - if(0) // AIRLOCK - new_state = "[icon_base]_door" - if(3) // VERTICAL - new_state = "[icon_base]_v" - if(12) // HORIZONTAL - new_state = "[icon_base]_h" - else // END POINT (1|2|4|8) - new_state = "[icon_base]_dir" - set_dir(tape_dir) - icon_state = "[new_state]_[crumpled]" - if(detail_overlay) - add_overlay(overlay_image(icon, "[new_state]_[detail_overlay]", detail_color, RESET_COLOR)) - -/obj/item/tape/Initialize() - . = ..() - if(!hazard_overlays) - hazard_overlays = list() - hazard_overlays["[NORTH]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "N") - hazard_overlays["[EAST]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "E") - hazard_overlays["[SOUTH]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "S") - hazard_overlays["[WEST]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "W") - -/obj/item/taperoll/police - name = "police tape" - desc = "A roll of police tape used to block off crime scenes from the public." - tape_type = /obj/item/tape/police - color = COLOR_RED - -/obj/item/tape/police - name = "police tape" - desc = "A length of police tape. Do not cross." - req_access = list(access_security) - color = COLOR_RED - -/obj/item/taperoll/engineering - name = "engineering tape" - desc = "A roll of engineering tape used to block off working areas from the public." - tape_type = /obj/item/tape/engineering - color = COLOR_ORANGE + apply_template() -/obj/item/taperoll/engineering/applied - apply_tape = TRUE +/obj/item/stack/tape_roll/barricade_tape/Destroy() + stop_unrolling() + return ..() -/obj/item/tape/engineering - name = "engineering tape" - desc = "A length of engineering tape. Better not cross it." - req_access = list(list(access_engine,access_atmospherics)) - color = COLOR_ORANGE +/**Update our appearence and data to match the specified tape template. */ +/obj/item/stack/tape_roll/barricade_tape/proc/apply_template() + if(ispath(tape_template)) + tape_template = GET_DECL(tape_template) + if(!tape_template) + return -/obj/item/taperoll/atmos - name = "atmospherics tape" - desc = "A roll of atmospherics tape used to block off working areas from the public." - tape_type = /obj/item/tape/atmos - color = COLOR_BLUE_LIGHT + SetName("[tape_template.tape_kind] tape roll") + desc = tape_template.roll_desc + icon = tape_template.icon_file + set_color(tape_template.tape_color) + update_icon() -/obj/item/tape/atmos - name = "atmospherics tape" - desc = "A length of atmospherics tape. Better not cross it." - req_access = list(list(access_engine,access_atmospherics)) - color = COLOR_BLUE_LIGHT - icon_base = "stripetape" - detail_overlay = "stripes" - detail_color = COLOR_YELLOW - -/obj/item/taperoll/research - name = "research tape" - desc = "A roll of research tape used to block off working areas from the public." - tape_type = /obj/item/tape/research - color = COLOR_WHITE - -/obj/item/tape/research - name = "research tape" - desc = "A length of research tape. Better not cross it." - req_access = list(access_research) - color = COLOR_WHITE - -/obj/item/taperoll/medical - name = "medical tape" - desc = "A roll of medical tape used to block off working areas from the public." - tape_type = /obj/item/tape/medical - color = COLOR_PALE_BLUE_GRAY - -/obj/item/tape/medical - name = "medical tape" - desc = "A length of medical tape. Better not cross it." - req_access = list(access_medical) - icon_base = "stripetape" - detail_overlay = "stripes" - detail_color = COLOR_PALE_BLUE_GRAY - -/obj/item/taperoll/bureaucracy - name = "red tape" - desc = "A roll of bureaucratic red tape used to block any meaningful work from being done." - tape_type = /obj/item/tape/bureaucracy - color = COLOR_RED - -/obj/item/tape/bureaucracy - name = "red tape" - desc = "A length of bureaucratic red tape. Safely ignored, but darn obstructive sometimes." - icon_base = "stripetape" - color = COLOR_RED - detail_overlay = "stripes" - detail_color = COLOR_RED - -/obj/item/taperoll/on_update_icon() - SHOULD_CALL_PARENT(FALSE) //Paperwork PR will handle this one - overlays.Cut() - var/image/overlay = image(icon = src.icon) - overlay.appearance_flags = RESET_COLOR +/obj/item/stack/tape_roll/barricade_tape/on_update_icon() + . = ..() if(ismob(loc)) - if(!start) - overlay.icon_state = "start" - else - overlay.icon_state = "stop" - overlays += overlay + add_overlay(overlay_image(icon, start? "stop" : "start", flags = RESET_COLOR)) -/obj/item/taperoll/dropped(mob/user) +/obj/item/stack/tape_roll/barricade_tape/dropped(mob/user) + stop_unrolling() update_icon() return ..() -/obj/item/taperoll/pickup(mob/user) +/obj/item/stack/tape_roll/barricade_tape/pickup(mob/user) + stop_unrolling() update_icon() return ..() -/obj/item/taperoll/attack_hand() +/obj/item/stack/tape_roll/barricade_tape/attack_hand() update_icon() return ..() -/obj/item/taperoll/attack_self(mob/user) - if(!start) - start = get_turf(src) - to_chat(usr, "You place the first end of \the [src].") - update_icon() - else - end = get_turf(src) - if(start.y != end.y && start.x != end.x || start.z != end.z) - start = null - update_icon() - to_chat(usr, "\The [src] can only be laid horizontally or vertically.") - return +/**Callback used when whoever holds us moved to a new turf. */ +/obj/item/stack/tape_roll/barricade_tape/proc/user_moved_unrolling(var/mob/M, var/atom/old_loc, var/atom/new_loc) + if(QDELETED(src)) + return //Destructor will handle the rest + if(QDELETED(M) || !can_use(1) || M.incapacitated()) + stop_unrolling() + return - if(start == end) - // spread tape in all directions, provided there is a wall/window - var/turf/T - var/possible_dirs = 0 - for(var/dir in global.cardinal) - T = get_step(start, dir) - if(T && T.density) - possible_dirs += dir - else - for(var/obj/structure/window/W in T) - if(W.is_fulltile() || W.dir == global.reverse_dir[dir]) - possible_dirs += dir - if(!possible_dirs) - start = null - update_icon() - to_chat(usr, "You can't place \the [src] here.") - return - if(possible_dirs & (NORTH|SOUTH)) - var/obj/item/tape/TP = new tape_type(start) - for(var/dir in list(NORTH, SOUTH)) - if (possible_dirs & dir) - TP.tape_dir += dir - TP.add_fingerprint(user) - TP.update_icon() - if(possible_dirs & (EAST|WEST)) - var/obj/item/tape/TP = new tape_type(start) - for(var/dir in list(EAST, WEST)) - if (possible_dirs & dir) - TP.tape_dir += dir - TP.add_fingerprint(user) - TP.update_icon() - start = null - update_icon() - to_chat(usr, "You finish placing \the [src].") - return + if((old_loc.x != new_loc.x && old_loc.y != new_loc.y) || old_loc.z != new_loc.z) + to_chat(M, SPAN_WARNING("\The [src] can only be laid horizontally or vertically.")) + stop_unrolling() + return - var/turf/cur = start - var/orientation = get_dir(start, end) - var/dir = 0 - switch(orientation) - if(NORTH, SOUTH) set_dir(NORTH|SOUTH) // North-South taping - if(EAST, WEST) set_dir(EAST|WEST) // East-West taping - - var/can_place = 1 - while (can_place) - if(cur.density == 1) - can_place = 0 - else if (isspaceturf(cur)) - can_place = 0 - else - for(var/obj/O in cur) - if(O.density) - can_place = 0 - break - if(cur == end) - break - cur = get_step_towards(cur,end) - if (!can_place) - start = null - update_icon() - to_chat(usr, "You can't run \the [src] through that!") - return + //Use a length of tape and place a barricade line + if(!place_line(M, new_loc, get_dir(old_loc, new_loc))) + stop_unrolling() + return - cur = start - var/tapetest - var/tape_dir - while (1) - tapetest = 0 - tape_dir = dir - if(cur == start) - var/turf/T = get_step(start, global.reverse_dir[orientation]) - if(T && !T.density) - tape_dir = orientation - for(var/obj/structure/window/W in T) - if(W.is_fulltile() || W.dir == orientation) - tape_dir = dir - else if(cur == end) - var/turf/T = get_step(end, orientation) - if(T && !T.density) - tape_dir = global.reverse_dir[orientation] - for(var/obj/structure/window/W in T) - if(W.is_fulltile() || W.dir == global.reverse_dir[orientation]) - tape_dir = dir - for(var/obj/item/tape/T in cur) - if((T.tape_dir == tape_dir) && (T.icon_base == icon_base)) - tapetest = 1 - break - if(!tapetest) - var/obj/item/tape/T = new tape_type(cur) - T.add_fingerprint(user) - T.tape_dir = tape_dir - T.update_icon() - if(tape_dir & SOUTH) - T.layer += 0.1 // Must always show above other tapes - if(cur == end) - break - cur = get_step_towards(cur,end) - start = null + if(get_dist(start, new_loc) >= MAX_BARRICADE_TAPE_LENGTH) + to_chat(M, SPAN_WARNING("You've stretched this line of tape to the maximum!")) + stop_unrolling() + return + +/obj/item/stack/tape_roll/barricade_tape/proc/stop_unrolling() + if(!start && !unroller) + return + var/mob/_uroller = unroller.resolve() + if(_uroller) + events_repository.unregister(/decl/observ/moved, _uroller, src, .proc/user_moved_unrolling) + unroller = null + start = null + slowdown_general = initial(slowdown_general) + + if(_uroller) + to_chat(_uroller, SPAN_NOTICE("You stop unrolling \the [src].")) + if(!QDELETED(src)) update_icon() - to_chat(usr, "You finish placing \the [src].") + return TRUE + +/obj/item/stack/tape_roll/barricade_tape/proc/start_unrolling(var/mob/user) + if(start && unroller) + return + start = get_turf(src) + unroller = weakref(user) + slowdown_general = initial(slowdown_general) + 2 //While unrolling you're slightly slower + events_repository.unregister(/decl/observ/moved, user, src, .proc/user_moved_unrolling) + events_repository.register(/decl/observ/moved, user, src, .proc/user_moved_unrolling) + to_chat(user, SPAN_NOTICE("You start unrolling \the [src].")) + //Place the first one immediately + place_line(user, get_turf(user), user.dir) + update_icon() + return TRUE + +/**Place a tape line on the current turf. */ +/obj/item/stack/tape_roll/barricade_tape/proc/place_line(var/mob/user, var/turf/T, var/pdir) + if(T.is_open() || T.is_wall()) + to_chat(user, SPAN_WARNING("You can't place tape here!")) + return + if(locate(/obj/structure/tape_barricade) in T) + return //Can't place 2 on the same tile! + + if(!can_use(1)) + to_chat(user, SPAN_WARNING("You are out of [tape_template.tape_kind] tape!")) return + use(1) + playsound(user, 'sound/effects/pageturn2.ogg', 50, TRUE) + + var/obj/structure/tape_barricade/barricade = tape_template.make_line_barricade(user, T, pdir) + if(barricade) + barricade.update_neighbors() + return barricade -/obj/item/taperoll/afterattack(var/atom/A, mob/user, proximity) +/obj/item/stack/tape_roll/barricade_tape/attack_self(mob/user) + if(start) + stop_unrolling() + return + + if(!can_use(1)) + return //This shouldn't happen, but if it does, don't let them exploit it + + start_unrolling(user) + +/obj/item/stack/tape_roll/barricade_tape/afterattack(var/atom/A, mob/user, proximity) if(!proximity) return if (istype(A, /obj/machinery/door/airlock)) - var/turf/T = get_turf(A) - var/obj/item/tape/P = new tape_type(T) - P.add_fingerprint(user) - P.update_icon() - P.layer = ABOVE_DOOR_LAYER - to_chat(user, "You finish placing \the [src].") - - if (istype(A, /turf/simulated/floor) ||istype(A, /turf/unsimulated/floor)) - var/turf/F = A - var/direction = user.loc == F ? user.dir : turn(user.dir, 180) - var/icon/hazard_overlay = hazard_overlays["[direction]"] - if(tape_roll_applications[F] == null) - tape_roll_applications[F] = 0 - - if(tape_roll_applications[F] & direction) // hazard_overlay in F.overlays wouldn't work. - user.visible_message("\The [user] uses the adhesive of \the [src] to remove area markings from \the [F].", "You use the adhesive of \the [src] to remove area markings from \the [F].") - F.overlays -= hazard_overlay - tape_roll_applications[F] &= ~direction - else - user.visible_message("\The [user] applied \the [src] on \the [F] to create area markings.", "You apply \the [src] on \the [F] to create area markings.") - F.overlays |= hazard_overlay - tape_roll_applications[F] |= direction + if(!can_use(4)) + to_chat(user, SPAN_WARNING("There isn't enough [plural_name] in \the [src] to barricade \the [A]. You need at least 4 [plural_name].")) + return + tape_template.make_door_barricade(user, A) + to_chat(user, SPAN_NOTICE("You finish placing \the [src].")) + +//////////////////////////////////////////////////////////////////// +// Tape Line Barricade +//////////////////////////////////////////////////////////////////// +/obj/structure/tape_barricade + name = "tape line" + desc = "A line of barricade tape." + icon = 'icons/policetape.dmi' + icon_state = "tape_2w_0" + dir = SOUTH //This structure will try to turn its icon depending on what neighbors it has + layer = ABOVE_DOOR_LAYER + pass_flags = PASS_FLAG_TABLE //About the height of table + anchored = TRUE + material = /decl/material/solid/plastic + var/neighbors = 0 //Contains all the direction flags of all the neighboring tape_barricades + var/nb_neighbors = 0 //Keep track of our cached neighbors number + var/is_lifted = 0 //Whether the tape is lifted and we're allowing everyone passage. + var/is_crumpled = 0 //Whether the tape was damaged + var/decl/barricade_tape_template/tape_template //Details about the behavior and looks of the barricade + +/obj/structure/tape_barricade/Initialize(ml, _mat, _reinf_mat, var/decl/barricade_tape_template/_tape_template) + . = ..() + if(!hazard_overlays) + hazard_overlays = list() + hazard_overlays["[NORTH]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "N") + hazard_overlays["[EAST]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "E") + hazard_overlays["[SOUTH]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "S") + hazard_overlays["[WEST]"] = new/image('icons/effects/warning_stripes.dmi', icon_state = "W") + set_tape_template(_tape_template) + +/obj/structure/tape_barricade/LateInitialize() + . = ..() + build_connection_bits() + update_neighbors() + +/obj/structure/tape_barricade/Destroy() + var/turf/old_loc = get_turf(src) + . = ..() + if(istype(old_loc)) + update_neighbors(old_loc) + +/obj/structure/tape_barricade/proc/set_tape_template(var/decl/barricade_tape_template/tmpl) + if(tmpl) + tape_template = tmpl + if(ispath(tape_template)) + tape_template = GET_DECL(tape_template) + if(!tape_template) return -/obj/item/tape/proc/crumple() - if(!crumpled) - crumpled = 1 + SetName("[tape_template.tape_kind] tape line") + desc = tape_template.tape_desc + icon = tape_template.icon_file + req_access = tape_template.req_access + set_color(tape_template.tape_color) + update_icon() + +/**Cause neighbors to update their icon. */ +/obj/structure/tape_barricade/proc/update_neighbors(var/location = loc) + for (var/look_dir in global.cardinal) + var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade, get_step(location, look_dir)) + if(B && !QDELETED(B)) + B.update_icon() + + if(!QDELETED(src)) update_icon() - SetName("crumpled [name]") -/obj/item/tape/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(!lifted && ismob(mover)) +/**Updates our connection bits to keep track of the things we're connected to */ +/obj/structure/tape_barricade/proc/build_connection_bits() + neighbors = 0 + for (var/look_dir in global.cardinal) + var/turf/target_turf = get_step(src, look_dir) + var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade, target_turf) + //We connect to walls and other tape_barricades + if((B && !QDELETED(B)) || (!B && target_turf.is_wall())) + neighbors |= look_dir + +/**Allow sutypes to override with their own forced icon state name.*/ +/obj/structure/tape_barricade/proc/icon_name_override() + return + +/obj/structure/tape_barricade/on_update_icon() + . = ..() + if(isnull(tape_template) || ispath(tape_template)) + return + //Look up our neighbors + build_connection_bits() + + var/icon_name = icon_name_override() + if(!icon_name) + //Build the icon state from whethere we've got a right angle with out neighbors or not + if(TAPE_BARRICADE_IS_4W_NEIGHBORS(neighbors)) + set_dir(SOUTH) + icon_name = "4w" + + //3 Ways + else if(TAPE_BARRICADE_IS_3W_H_NEIGHBORS(neighbors)) + set_dir(neighbors & TAPE_BARRICADE_V_NEIGHBORS) + icon_name = "3w" + else if(TAPE_BARRICADE_IS_3W_V_NEIGHBORS(neighbors)) + set_dir(neighbors & TAPE_BARRICADE_H_NEIGHBORS) + icon_name = "3w" + + //Lines + else if(TAPE_BARRICADE_IS_H_NEIGHBORS(neighbors)) + set_dir(EAST) + icon_name = "2w" + else if(TAPE_BARRICADE_IS_V_NEIGHBORS(neighbors)) + set_dir(SOUTH) + icon_name = "2w" + + //Endpoints/corners + else + if(neighbors > 0) + set_dir(neighbors) //Make sure if we have no connections we don't set a bad dir + icon_name = "dir" + + icon_state = "[tape_template.base_icon_state]_[icon_name]_[is_crumpled]" + + //Overlays + if(tape_template.detail_overlay) + var/image/ovr = overlay_image(icon, "[tape_template.base_icon_state]_[icon_name]_[tape_template.detail_overlay]", tape_template.detail_color, RESET_COLOR) + ovr.dir = dir + add_overlay(ovr) + +/obj/structure/tape_barricade/attack_hand(mob/user) + if (user.a_intent == I_HELP && allowed(user)) + if(TAPE_BARRICADE_IS_CORNER_NEIGHBORS(neighbors) || (TAPE_BARRICADE_GET_NB_NEIGHBORS(neighbors) > 2)) + to_chat(user, SPAN_WARNING("You can't lift up the pole. Try lifting the line itself.")) + return + + if(!allowed(user)) + user.visible_message(SPAN_NOTICE("\The [user] carelessly pulls \the [src] out of the way.")) + crumple() + else + user.visible_message(SPAN_NOTICE("\The [user] lifts \the [src], officially allowing passage.")) + + for(var/obj/structure/tape_barricade/B in get_tape_line()) + B.lift(10 SECONDS) //~10 seconds + return TRUE + . = ..() + +/obj/structure/tape_barricade/dismantle() + for (var/obj/structure/tape_barricade/B in get_tape_line()) + if(B == src || QDELETED(B)) + continue + if(B.neighbors & get_dir(B, src)) + B.physically_destroyed() + . = ..() + +/obj/structure/tape_barricade/CanPass(atom/movable/mover, turf/target, height, air_group) + if(!is_lifted && ismob(mover)) var/mob/M = mover + if (!allowed(M) && M.a_intent == I_HELP) + return FALSE + return ..() + +/obj/structure/tape_barricade/Crossed(O) + . = ..() + if(!is_lifted && ismob(O)) + var/mob/M = O add_fingerprint(M) + shake_animation(2) if (!allowed(M)) //only select few learn art of not crumpling the tape - to_chat(M, "You are not supposed to go past [src]...") - if(M.a_intent == I_HELP) - return 0 - crumple() - return ..(mover) - -/obj/item/tape/attackby(obj/item/W, mob/user) - breaktape(user) - -/obj/item/tape/attack_hand(mob/user) - if (user.a_intent == I_HELP && src.allowed(user)) - user.show_viewers("\The [user] lifts \the [src], allowing passage.") - for(var/obj/item/tape/T in gettapeline()) - T.lift(100) //~10 seconds - else - breaktape(user) - -/obj/item/tape/proc/lift(time) - lifted = 1 - layer = ABOVE_HUMAN_LAYER - spawn(time) - lifted = 0 - reset_plane_and_layer() + to_chat(M, SPAN_NOTICE("You are not supposed to go past \the [src]...")) + if(M.a_intent != I_HELP) + crumple() + +/obj/structure/tape_barricade/proc/crumple() + if(!is_crumpled) + playsound(src, 'sound/effects/rip1.ogg', 60, TRUE) + take_damage(5) + is_crumpled = TRUE + update_icon() + +/**Temporarily lifts the tape line, allowing passage to anyone for the specified time, until the timer expires. */ +/obj/structure/tape_barricade/proc/lift(var/time) + if(!is_lifted) + is_lifted = TRUE + layer = ABOVE_HUMAN_LAYER + pass_flags = PASS_FLAG_MOB + pixel_y += 8 + addtimer(CALLBACK(src, .proc/on_unlift), time, TIMER_UNIQUE) + playsound(src, 'sound/effects/pageturn2.ogg', 50, TRUE) + +/**Called by timer when the tape line falls back in place. */ +/obj/structure/tape_barricade/proc/on_unlift() + is_lifted = FALSE + pass_flags = initial(pass_flags) + reset_plane_and_layer() + pixel_y -= 8 + playsound(src, 'sound/effects/pageturn2.ogg', 20, TRUE) // Returns a list of all tape objects connected to src, including itself. -/obj/item/tape/proc/gettapeline() +/obj/structure/tape_barricade/proc/get_tape_line(var/list/ignored, var/line_index = 0) + //Don't include more in the line than this + if(line_index >= MAX_BARRICADE_TAPE_LENGTH) + return list() + var/list/dirs = list() - if(tape_dir & NORTH) + if(neighbors & NORTH) dirs += NORTH - if(tape_dir & SOUTH) + if(neighbors & SOUTH) dirs += SOUTH - if(tape_dir & WEST) + if(neighbors & WEST) dirs += WEST - if(tape_dir & EAST) + if(neighbors & EAST) dirs += EAST - var/list/obj/item/tape/tapeline = list() - for (var/obj/item/tape/T in get_turf(src)) - tapeline += T - for(var/dir in dirs) - var/turf/cur = get_step(src, dir) - var/not_found = 0 - while (!not_found) - not_found = 1 - for (var/obj/item/tape/T in cur) - tapeline += T - not_found = 0 - cur = get_step(cur, dir) + //Grab all cached connected neighbors + LAZYDISTINCTADD(ignored, src) + var/list/obj/structure/tape_barricade/tapeline = list(src) + for(var/look_dir in dirs) + var/turf/T = get_step(src, look_dir) + var/obj/structure/tape_barricade/B = locate() in T + if(!QDELETED(B) && !(B in ignored)) + if(TAPE_BARRICADE_IS_CORNER_NEIGHBORS(neighbors) || (TAPE_BARRICADE_GET_NB_NEIGHBORS(neighbors) > 2)) + continue //We stop at intersections, and corners + tapeline += B.get_tape_line(ignored, line_index + 1) //Pass us to prevent infinite loops, and adding us to the resulting line return tapeline +//////////////////////////////////////////////////////////////////// +// Door Tape Barricade +//////////////////////////////////////////////////////////////////// + +//Barricade over a single door +/obj/structure/tape_barricade/door + icon_state = "tape_door_0" + layer = ABOVE_DOOR_LAYER + +/obj/structure/tape_barricade/door/update_neighbors() + //We completely ignore neighbors + neighbors = 0 + +/obj/structure/tape_barricade/door/icon_name_override() + return "door" //Override the icon picking to pick this icon label instead + +//////////////////////////////////////////////////////////////////// +// Police Tape +//////////////////////////////////////////////////////////////////// +/decl/barricade_tape_template/police + tape_kind = "police" + tape_desc = "A length of police tape. Do not cross." + roll_desc = "A roll of police tape used to block off crime scenes from the public." + tape_color = COLOR_RED + req_access = list(access_security) +/obj/item/stack/tape_roll/barricade_tape/police + tape_template = /decl/barricade_tape_template/police + +//mapper type +/obj/structure/tape_barricade/police + icon_state = "tape_h_0" + color = COLOR_RED + tape_template = /decl/barricade_tape_template/police + +//////////////////////////////////////////////////////////////////// +// Engineering Tape +//////////////////////////////////////////////////////////////////// +/decl/barricade_tape_template/engineering + tape_kind = "engineering" + tape_desc = "A length of engineering tape. Better not cross it." + roll_desc = "A roll of engineering tape used to block off working areas from the public." + tape_color = COLOR_ORANGE + req_access = list(list(access_engine,access_atmospherics)) +/obj/item/stack/tape_roll/barricade_tape/engineering + tape_template = /decl/barricade_tape_template/engineering + +//mapper type +/obj/structure/tape_barricade/engineering + icon_state = "tape_h_0" + color = COLOR_ORANGE + tape_template = /decl/barricade_tape_template/engineering + +//////////////////////////////////////////////////////////////////// +// Atmospheric Tape +//////////////////////////////////////////////////////////////////// +/decl/barricade_tape_template/atmos + tape_kind = "atmospherics" + tape_desc = "A length of atmospherics tape. Better not cross it." + roll_desc = "A roll of atmospherics tape used to block off working areas from the public." + tape_color = COLOR_BLUE_LIGHT + req_access = list(list(access_engine,access_atmospherics)) + base_icon_state = "stripetape" + detail_overlay = "stripes" + detail_color = COLOR_YELLOW + +/obj/item/stack/tape_roll/barricade_tape/atmos + tape_template = /decl/barricade_tape_template/atmos + +//mapper type +/obj/structure/tape_barricade/atmos + icon_state = "stripetape_h_0" + color = COLOR_BLUE_LIGHT + tape_template = /decl/barricade_tape_template/atmos + +//////////////////////////////////////////////////////////////////// +// Research Tape +//////////////////////////////////////////////////////////////////// +/decl/barricade_tape_template/research + tape_kind = "research" + tape_desc = "A length of research tape. Better not cross it." + roll_desc = "A roll of research tape used to block off working areas from the public." + tape_color = COLOR_WHITE + req_access = list(access_research) -/obj/item/tape/proc/breaktape(mob/user) - if(user.a_intent == I_HELP) - to_chat(user, "You refrain from breaking \the [src].") - return - user.visible_message("\The [user] breaks \the [src]!","You break \the [src].") - - for (var/obj/item/tape/T in gettapeline()) - if(T == src) - continue - if(T.tape_dir & get_dir(T, src)) - qdel(T) - - qdel(src) //TODO: Dropping a trash item holding fibers/fingerprints of all broken tape parts - return +/obj/item/stack/tape_roll/barricade_tape/research + tape_template = /decl/barricade_tape_template/research + +//mapper type +/obj/structure/tape_barricade/research + color = COLOR_WHITE + tape_template = /decl/barricade_tape_template/research + +//////////////////////////////////////////////////////////////////// +// Medical Tape +//////////////////////////////////////////////////////////////////// +/decl/barricade_tape_template/medical + tape_kind = "medical" + tape_desc = "A length of medical tape. Better not cross it." + roll_desc = "A roll of medical tape used to block off working areas from the public." + tape_color = COLOR_PALE_BLUE_GRAY + req_access = list(access_medical) + base_icon_state = "stripetape" + detail_overlay = "stripes" + detail_color = COLOR_PALE_BLUE_GRAY + +/obj/item/stack/tape_roll/barricade_tape/medical + tape_template = /decl/barricade_tape_template/medical + +//mapper type +/obj/structure/tape_barricade/medical + icon_state = "stripetape_h_0" + color = COLOR_PALE_BLUE_GRAY + tape_template = /decl/barricade_tape_template/medical + +//////////////////////////////////////////////////////////////////// +// Bureacratic Tape +//////////////////////////////////////////////////////////////////// +/decl/barricade_tape_template/bureaucracy + tape_kind = "red" + tape_desc = "A length of bureaucratic red tape. Safely ignored, but darn obstructive sometimes." + roll_desc = "A roll of bureaucratic red tape used to block any meaningful work from being done." + tape_color = COLOR_RED + base_icon_state = "stripetape" + detail_overlay = "stripes" + detail_color = COLOR_RED + +/obj/item/stack/tape_roll/barricade_tape/bureaucracy + tape_template = /decl/barricade_tape_template/bureaucracy + +//mapper type +/obj/structure/tape_barricade/bureaucracy + icon_state = "stripetape_h_0" + color = COLOR_RED + tape_template = /decl/barricade_tape_template/bureaucracy + +#undef MAX_BARRICADE_TAPE_LENGTH +#undef TAPE_BARRICADE_IS_CORNER_NEIGHBORS +#undef TAPE_BARRICADE_V_NEIGHBORS +#undef TAPE_BARRICADE_H_NEIGHBORS +#undef TAPE_BARRICADE_IS_V_NEIGHBORS +#undef TAPE_BARRICADE_IS_H_NEIGHBORS +#undef TAPE_BARRICADE_IS_3W_V_NEIGHBORS +#undef TAPE_BARRICADE_IS_3W_H_NEIGHBORS +#undef TAPE_BARRICADE_IS_4W_NEIGHBORS +#undef CONNECTION_BITS_TO_TEXT +#undef TAPE_BARRICADE_GET_NB_NEIGHBORS \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index b799c8a9ae0..0f0754769cc 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -119,13 +119,12 @@ /obj/item/stack/cable_coil, /obj/item/t_scanner, /obj/item/scanner/gas, - /obj/item/taperoll/engineering, /obj/item/inducer/, /obj/item/robotanalyzer, /obj/item/minihoe, /obj/item/hatchet, /obj/item/scanner/plant, - /obj/item/taperoll, + /obj/item/stack/tape_roll, /obj/item/extinguisher/mini, /obj/item/marshalling_wand, /obj/item/geiger, @@ -177,7 +176,7 @@ /obj/item/clothing/glasses/hud/health, /obj/item/crowbar, /obj/item/flashlight, - /obj/item/taperoll, + /obj/item/stack/tape_roll, /obj/item/extinguisher/mini, /obj/item/storage/med_pouch, /obj/item/bodybag, @@ -215,7 +214,7 @@ /obj/item/megaphone, /obj/item/energy_blade, /obj/item/baton, - /obj/item/taperoll, + /obj/item/stack/tape_roll, /obj/item/holowarrant, /obj/item/magnetic_ammo, /obj/item/binoculars, @@ -247,7 +246,7 @@ /obj/item/megaphone, /obj/item/energy_blade, /obj/item/baton, - /obj/item/taperoll, + /obj/item/stack/tape_roll, /obj/item/holowarrant, /obj/item/magnetic_ammo, /obj/item/binoculars, @@ -272,7 +271,7 @@ /obj/item/modular_computer/pda, /obj/item/radio/headset, /obj/item/megaphone, - /obj/item/taperoll, + /obj/item/stack/tape_roll, /obj/item/magnetic_tape, /obj/item/holowarrant, /obj/item/radio, @@ -319,7 +318,7 @@ /obj/item/telebaton, /obj/item/taperecorder, /obj/item/magnetic_tape, - /obj/item/taperoll, + /obj/item/stack/tape_roll, /obj/item/folder, /obj/item/paper, /obj/item/clipboard, diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 487a64c82bc..c7b6db30f5f 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -511,18 +511,18 @@ /obj/item/storage/box/taperolls name = "box of spare taperolls" desc = "A box full of mixed barricade tapes." - startswith = list(/obj/item/taperoll/police, - /obj/item/taperoll/engineering, - /obj/item/taperoll/atmos, - /obj/item/taperoll/research, - /obj/item/taperoll/medical, - /obj/item/taperoll/bureaucracy + startswith = list( /obj/item/stack/tape_roll/barricade_tape/police, + /obj/item/stack/tape_roll/barricade_tape/engineering, + /obj/item/stack/tape_roll/barricade_tape/atmos, + /obj/item/stack/tape_roll/barricade_tape/research, + /obj/item/stack/tape_roll/barricade_tape/medical, + /obj/item/stack/tape_roll/barricade_tape/bureaucracy ) /obj/item/storage/box/bogrolls name = "box of spare bogrolls" desc = "A box full of toilet paper." - startswith = list(/obj/item/taperoll/bog = 6) + startswith = list(/obj/item/stack/tape_roll/barricade_tape/toilet = 6) /obj/item/storage/box/cola name = "box of sodas" diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index 669612a0c57..567382a74cd 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -1,149 +1,231 @@ -/obj/item/ducttape - name = "duct tape" - desc = "A roll of sticky tape. Possibly for taping ducks... or was that ducts?" - icon = 'icons/obj/bureaucracy.dmi' +/////////////////////////////////////////////// +// Tape Roll +/////////////////////////////////////////////// +/**Base class for all things tape, with a limit amount of uses. */ +/obj/item/stack/tape_roll + name = "roll of tape" + gender = NEUTER + singular_name = "length of tape" + plural_name = "lengths of tape" + amount = 32 + max_amount = 32 + w_class = ITEM_SIZE_SMALL + material = /decl/material/solid/plastic + +/obj/item/stack/tape_roll/can_split() + return FALSE +/obj/item/stack/tape_roll/can_merge() + return FALSE + +/////////////////////////////////////////////// +// Duct Tape +/////////////////////////////////////////////// +/obj/item/stack/tape_roll/duct_tape + name = "duct tape roll" + desc = "A roll of durable, one-sided sticky tape. Possibly for taping ducks... or was that ducts?" + icon = 'icons/obj/bureaucracy.dmi' icon_state = "taperoll" - w_class = ITEM_SIZE_SMALL + item_flags = ITEM_FLAG_NO_BLUDGEON -/obj/item/ducttape/Initialize() +/obj/item/stack/tape_roll/duct_tape/Initialize(mapload, amount, material) . = ..() set_extension(src, /datum/extension/tool/variable, list( TOOL_BONE_GEL = TOOL_QUALITY_MEDIOCRE, TOOL_SUTURES = TOOL_QUALITY_BAD )) -/obj/item/ducttape/attack(var/mob/living/carbon/human/H, var/mob/user) - if(istype(H)) - if(user.zone_sel.selecting == BP_EYES) - - if(!GET_EXTERNAL_ORGAN(H, BP_HEAD)) - to_chat(user, "\The [H] doesn't have a head.") - return - if(!H.check_has_eyes()) - to_chat(user, "\The [H] doesn't have any eyes.") - return - if(H.get_equipped_item(slot_glasses_str)) - to_chat(user, "\The [H] is already wearing somethign on their eyes.") - return - - var/obj/item/head = H.get_equipped_item(slot_head_str) - if(head && (head.body_parts_covered & SLOT_FACE)) - to_chat(user, "Remove their [head] first.") - return - user.visible_message("\The [user] begins taping over \the [H]'s eyes!") - - if(!do_mob(user, H, 30)) - return - - // Repeat failure checks. - if(!H || !src || !GET_EXTERNAL_ORGAN(H, BP_HEAD) || !H.check_has_eyes() || H.get_equipped_item(slot_glasses_str)) - return - head = H.get_equipped_item(slot_head_str) - if(head && (head.body_parts_covered & SLOT_FACE)) - return - - playsound(src, 'sound/effects/tape.ogg',25) - user.visible_message("\The [user] has taped up \the [H]'s eyes!") - H.equip_to_slot_or_del(new /obj/item/clothing/glasses/blindfold/tape(H), slot_glasses_str) - - else if(user.zone_sel.selecting == BP_MOUTH || user.zone_sel.selecting == BP_HEAD) - if(!GET_EXTERNAL_ORGAN(H, BP_HEAD)) - to_chat(user, "\The [H] doesn't have a head.") - return - if(!H.check_has_mouth()) - to_chat(user, "\The [H] doesn't have a mouth.") - return - if(H.get_equipped_item(slot_wear_mask_str)) - to_chat(user, "\The [H] is already wearing a mask.") - return - var/obj/item/head = H.get_equipped_item(slot_head_str) - if(head && (head.body_parts_covered & SLOT_FACE)) - to_chat(user, "Remove their [head] first.") - return - playsound(src, 'sound/effects/tape.ogg',25) - user.visible_message("\The [user] begins taping up \the [H]'s mouth!") - - if(!do_mob(user, H, 30)) - return - - // Repeat failure checks. - if(!H || !src || !GET_EXTERNAL_ORGAN(H, BP_HEAD) || !H.check_has_mouth() || H.get_equipped_item(slot_wear_mask_str)) - return - head = H.get_equipped_item(slot_head_str) - if(head && (head.body_parts_covered & SLOT_FACE)) - return - playsound(src, 'sound/effects/tape.ogg',25) - user.visible_message("\The [user] has taped up \the [H]'s mouth!") - H.equip_to_slot_or_del(new /obj/item/clothing/mask/muzzle/tape(H), slot_wear_mask_str) - - else if(user.zone_sel.selecting == BP_R_HAND || user.zone_sel.selecting == BP_L_HAND) - playsound(src, 'sound/effects/tape.ogg',25) - var/obj/item/handcuffs/cable/tape/T = new(user) - if(!T.place_handcuffs(H, user)) - qdel(T) - - else if(user.zone_sel.selecting == BP_CHEST) - var/obj/item/clothing/suit/space/suit = H.get_equipped_item(slot_wear_suit_str) - if(istype(suit)) - suit.attackby(src, user)//everything is handled by attackby - else - to_chat(user, "\The [H] isn't wearing a spacesuit for you to reseal.") +/obj/item/stack/tape_roll/duct_tape/attack(var/mob/living/carbon/human/H, var/mob/user) + if(!istype(H)) + return + if(user.zone_sel.selecting == BP_EYES) + + if(!GET_EXTERNAL_ORGAN(H, BP_HEAD)) + to_chat(user, SPAN_WARNING("\The [H] doesn't have a head.")) + return + if(!H.check_has_eyes()) + to_chat(user, SPAN_WARNING("\The [H] doesn't have any eyes.")) + return + if(H.get_equipped_item(slot_glasses_str)) + to_chat(user, SPAN_WARNING("\The [H] is already wearing somethign on their eyes.")) + return + + var/obj/item/head = H.get_equipped_item(slot_head_str) + if(head && (head.body_parts_covered & SLOT_FACE)) + to_chat(user, SPAN_WARNING("Remove their [head] first.")) + return + + if(!can_use(2)) + to_chat(user, SPAN_WARNING("There's not enough [plural_name] in your [src] to tape \the [H]'s eyes! You need at least 2 [plural_name].")) + return + + user.visible_message(SPAN_WARNING("\The [user] begins taping over \the [H]'s eyes!")) + if(!do_mob(user, H, 30)) + return + + // Repeat failure checks. + if(!H || !src || !GET_EXTERNAL_ORGAN(H, BP_HEAD) || !H.check_has_eyes() || H.get_equipped_item(slot_glasses_str)) + return + head = H.get_equipped_item(slot_head_str) + if(head && (head.body_parts_covered & SLOT_FACE)) + return + + use(2) + playsound(src, 'sound/effects/tape.ogg',25) + user.visible_message(SPAN_WARNING("\The [user] has taped up \the [H]'s eyes!")) + H.equip_to_slot_or_del(new /obj/item/clothing/glasses/blindfold/tape(H), slot_glasses_str) + return TRUE + + else if(user.zone_sel.selecting == BP_MOUTH || user.zone_sel.selecting == BP_HEAD) + if(!GET_EXTERNAL_ORGAN(H, BP_HEAD)) + to_chat(user, SPAN_WARNING("\The [H] doesn't have a head.")) + return + if(!H.check_has_mouth()) + to_chat(user, SPAN_WARNING("\The [H] doesn't have a mouth.")) + return + if(H.get_equipped_item(slot_wear_mask_str)) + to_chat(user, SPAN_WARNING("\The [H] is already wearing a mask.")) + return + var/obj/item/head = H.get_equipped_item(slot_head_str) + if(head && (head.body_parts_covered & SLOT_FACE)) + to_chat(user, SPAN_WARNING("Remove their [head] first.")) + return + + if(!can_use(2)) + to_chat(user, SPAN_WARNING("There's not enough [plural_name] in your [src] to tape \the [H]'s mouth! You need at least 2 [plural_name].")) + return + + playsound(src, 'sound/effects/tape.ogg',25) + user.visible_message(SPAN_WARNING("\The [user] begins taping up \the [H]'s mouth!")) + + if(!do_mob(user, H, 30)) + return + + // Repeat failure checks. + if(!H || !src || !GET_EXTERNAL_ORGAN(H, BP_HEAD) || !H.check_has_mouth() || H.get_equipped_item(slot_wear_mask_str)) + return + head = H.get_equipped_item(slot_head_str) + if(head && (head.body_parts_covered & SLOT_FACE)) + return + + use(2) + playsound(src, 'sound/effects/tape.ogg',25) + user.visible_message(SPAN_WARNING("\The [user] has taped up \the [H]'s mouth!")) + H.equip_to_slot_or_del(new /obj/item/clothing/mask/muzzle/tape(H), slot_wear_mask_str) + return TRUE + else if(user.zone_sel.selecting == BP_R_HAND || user.zone_sel.selecting == BP_L_HAND) + if(!can_use(4)) + to_chat(user, SPAN_WARNING("There's not enough [plural_name] in your [src] to tape \the [H]'s hands! You need at least 4 [plural_name].")) + return + use(4) + playsound(src, 'sound/effects/tape.ogg',25) + var/obj/item/handcuffs/cable/tape/T = new(user) + if(!T.place_handcuffs(H, user)) + qdel(T) + return TRUE + + else if(user.zone_sel.selecting == BP_CHEST) + var/obj/item/clothing/suit/space/suit = H.get_equipped_item(slot_wear_suit_str) + if(istype(suit)) + suit.attackby(src, user)//everything is handled by attackby else - return ..() - return 1 + to_chat(user, SPAN_WARNING("\The [H] isn't wearing a spacesuit for you to reseal.")) + return TRUE + return ..() -/obj/item/ducttape/proc/stick(var/obj/item/W, mob/user) - if(!istype(W, /obj/item/paper) || istype(W, /obj/item/paper/sticky) || !user.unEquip(W)) +/obj/item/stack/tape_roll/duct_tape/proc/stick(var/obj/item/W, mob/user) + if(!(W.item_flags & ITEM_FLAG_CAN_TAPE) || !user.unEquip(W)) return - var/obj/item/ducttape/tape = new(get_turf(src)) + if(!can_use(1)) + return + use(1) + var/obj/item/duct_tape/tape = new(get_turf(src)) tape.attach(W) user.put_in_hands(tape) + return TRUE -/obj/item/ducttape - name = "piece of tape" - desc = "A piece of sticky tape." - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "tape" - w_class = ITEM_SIZE_TINY - layer = ABOVE_OBJ_LAYER - +/////////////////////////////////////////////////////////// +// Piece of Duct Tape +/////////////////////////////////////////////////////////// +/obj/item/duct_tape + name = "piece of tape" + desc = "A piece of sticky tape." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "tape" + w_class = ITEM_SIZE_TINY + layer = ABOVE_OBJ_LAYER + material = /decl/material/solid/plastic var/obj/item/stuck = null + var/crumpled = FALSE //If crumpled we become useless trash -/obj/item/ducttape/attack_hand(var/mob/user) - anchored = FALSE // Unattach it from whereever it's on, if anything. - return ..() - -/obj/item/ducttape/Initialize() +/obj/item/duct_tape/Initialize(ml, material_key) . = ..() item_flags |= ITEM_FLAG_NO_BLUDGEON -/obj/item/ducttape/examine() +/obj/item/duct_tape/get_matter_amount_modifier() + return 0.2 + +/obj/item/duct_tape/attack_hand(var/mob/user) + if(user.has_dexterity(DEXTERITY_GRIP)) + anchored = FALSE // Unattach it from whereever it's on, if anything. + return ..() + +/obj/item/duct_tape/attackby(obj/item/W, mob/user) + return stuck? stuck.attackby(W, user) : ..() + +/obj/item/duct_tape/examine() return stuck ? stuck.examine(arglist(args)) : ..() -/obj/item/ducttape/proc/attach(var/obj/item/W) - stuck = W - anchored = TRUE +/obj/item/duct_tape/proc/attach(var/obj/item/W) + stuck = W + anchored = TRUE + SetName("[W.name] (taped)") W.forceMove(src) - icon_state = W.icon_state + "_taped" - name = W.name + " (taped)" - overlays = W.overlays + playsound(src, 'sound/effects/tape.ogg', 25) + update_icon() -/obj/item/ducttape/attack_self(mob/user) +/obj/item/duct_tape/on_update_icon() + . = ..() + underlays.Cut() + if(stuck) + icon_state = "tape_short" + var/mutable_appearance/MA = new(stuck) + switch(dir) + if(NORTH) + MA.pixel_x = 0 + MA.pixel_y = 8 + if(SOUTH) + MA.pixel_x = 0 + MA.pixel_y = -8 + if(EAST) + MA.pixel_x = 8 + MA.pixel_y = 0 + if(WEST) + MA.pixel_x = -8 + MA.pixel_y = 0 + underlays += MA + + else if(crumpled) + icon_state = "tape_crumpled" + else + icon_state = "tape" + +/obj/item/duct_tape/attack_self(mob/user) if(!stuck) return - - to_chat(user, "You remove \the [initial(name)] from [stuck].") + SetName(initial(name)) + to_chat(user, "You remove \the [name] from [stuck].") user.put_in_hands(stuck) stuck = null - qdel(src) + crumpled = TRUE + user.unEquip(src, get_turf(user)) -/obj/item/ducttape/afterattack(var/A, mob/user, flag, params) +/obj/item/duct_tape/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(!in_range(user, A) || istype(A, /obj/machinery/door) || !stuck) + if(!CanPhysicallyInteractWith(user, target) || istype(target, /obj/machinery/door) || !stuck || crumpled) return - var/turf/target_turf = get_turf(A) + var/turf/target_turf = get_turf(target) var/turf/source_turf = get_turf(user) var/dir_offset = 0 @@ -157,10 +239,11 @@ return playsound(src, 'sound/effects/tape.ogg',25) + set_dir(dir_offset) layer = ABOVE_WINDOW_LAYER - if(params) - var/list/mouse_control = params2list(params) + if(click_parameters) + var/list/mouse_control = params2list(click_parameters) if(mouse_control["icon-x"]) default_pixel_x = text2num(mouse_control["icon-x"]) - 16 if(dir_offset & EAST) diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index 67eb6906c95..dfdf57996b0 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -131,7 +131,7 @@ /obj/item/storage/belt/utility = 2, /obj/item/storage/belt/utility/atmostech = 1, /obj/random/tool = 5, - /obj/item/ducttape = 2) + /obj/item/stack/tape_roll/duct_tape = 2) /obj/random/medical name = "Random Medical equipment" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index aa98dac6420..3a20c7223bf 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -19,7 +19,7 @@ /obj/item/clothing/mask/gas, /obj/item/multitool, /obj/item/flash, - /obj/item/taperoll/engineering, + /obj/item/stack/tape_roll/barricade_tape/engineering, /obj/item/crowbar/brace_jack, /obj/item/storage/belt/utility/full ) @@ -67,7 +67,7 @@ /obj/item/clothing/suit/storage/hazardvest, /obj/item/clothing/mask/gas, /obj/item/clothing/glasses/meson, - /obj/item/taperoll/engineering, + /obj/item/stack/tape_roll/barricade_tape/engineering, /obj/item/storage/belt/utility/full ) @@ -87,6 +87,6 @@ /obj/item/radio/headset/headset_eng, /obj/item/clothing/suit/storage/hazardvest, /obj/item/clothing/mask/gas, - /obj/item/taperoll/atmos, + /obj/item/stack/tape_roll/barricade_tape/atmos, /obj/item/storage/belt/utility/atmostech ) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 2ec2efb2655..fada3529d74 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -48,7 +48,7 @@ /obj/item/clothing/suit/storage/toggle/fr_jacket, /obj/item/clothing/shoes/color/white, /obj/item/radio/headset/headset_med, - /obj/item/taperoll/medical, + /obj/item/stack/tape_roll/barricade_tape/medical, /obj/item/storage/belt/medical/emt, RANDOM_SCRUBS, RANDOM_SCRUBS diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 84284463266..e354dbafc83 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -73,7 +73,7 @@ /obj/item/clothing/suit/armor/hos, /obj/item/radio/headset/heads/hos, /obj/item/clothing/glasses/sunglasses/sechud, - /obj/item/taperoll/police, + /obj/item/stack/tape_roll/barricade_tape/police, /obj/item/shield/riot, /obj/item/storage/box/flashbangs, /obj/item/storage/belt/holster/security, @@ -100,7 +100,7 @@ /obj/item/clothing/head/warden, /obj/item/radio/headset/headset_sec, /obj/item/clothing/glasses/sunglasses/sechud, - /obj/item/taperoll/police, + /obj/item/stack/tape_roll/barricade_tape/police, /obj/item/storage/box/flashbangs, /obj/item/storage/box/teargas, /obj/item/storage/belt/holster/security, @@ -128,7 +128,7 @@ /obj/item/grenade/chem_grenade/teargas, /obj/item/baton/loaded, /obj/item/clothing/glasses/sunglasses/sechud, - /obj/item/taperoll/police, + /obj/item/stack/tape_roll/barricade_tape/police, /obj/item/hailer, /obj/item/clothing/accessory/storage/vest/black, /obj/item/gun/energy/taser, @@ -177,7 +177,7 @@ /obj/item/storage/box/evidence, /obj/item/radio/headset/headset_sec, /obj/item/clothing/suit/armor/pcarrier/detective, - /obj/item/taperoll/police, + /obj/item/stack/tape_roll/barricade_tape/police, /obj/item/gun/projectile/pistol, /obj/item/clothing/accessory/storage/holster/armpit, /obj/item/chems/drinks/flask/detflask, diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index d59a46b645f..b42f380f35d 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -118,12 +118,18 @@ add_fingerprint(user) /obj/structure/inflatable/can_repair_with(obj/item/tool) - . = istype(tool, /obj/item/ducttape) && (health < maxhealth) + . = istype(tool, /obj/item/stack/tape_roll/duct_tape) && (health < maxhealth) /obj/structure/inflatable/handle_repair(mob/user, obj/item/tool) + var/obj/item/stack/tape_roll/duct_tape/T = tool if(taped) to_chat(user, SPAN_WARNING("You cannot tape up \the [src] any further.")) return + if(T.can_use(2)) + to_chat(user, SPAN_WARNING("You need 2 [T.plural_name] to repair \the [src].")) + return + T.use(2) + playsound(src, 'sound/effects/tape.ogg', 50, TRUE) last_damage_message = null to_chat(user, SPAN_NOTICE("You tape up some of the damage to \the [src].")) health = Clamp(health + 3, 0, maxhealth) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index c2062b7e7bd..1440ac47fcf 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -474,9 +474,8 @@ var/global/list/hygiene_props = list() //toilet paper interaction for clogging toilets and other facilities /obj/structure/hygiene/attackby(obj/item/I, mob/user) - if (!istype(I, /obj/item/taperoll/bog)) - ..() - return + if (!istype(I, /obj/item/stack/tape_roll/barricade_tape/toilet)) + return ..() if (clogged == -1) to_chat(user, SPAN_WARNING("Try as you might, you can not clog \the [src] with \the [I].")) return @@ -492,43 +491,47 @@ var/global/list/hygiene_props = list() clog(1) qdel(I) -/obj/item/taperoll/bog - name = "toilet paper roll" - icon = 'icons/obj/toiletpaper.dmi' - icon_state = ICON_STATE_WORLD - desc = "A unbranded roll of standard issue two ply toilet paper. Refined from carefully rendered down sea shells due to the government's 'Abuse Of The Trees Act'." - tape_type = /obj/item/tape/bog - slot_flags = SLOT_HEAD | SLOT_OVER_BODY - var/sheets = 30 - -/obj/item/tape/bog - name = "toilet paper" - desc = "A length of toilet paper. Seems like custodia is marking their territory again." - icon_base = "stripetape" - color = COLOR_WHITE - detail_overlay = "stripes" - detail_color = COLOR_WHITE - -/obj/item/taperoll/bog/verb/tear_sheet() +//////////////////////////////////////////////////// +// Toilet Paper Roll +//////////////////////////////////////////////////// +/decl/barricade_tape_template/toilet + tape_kind = "toilet paper" + tape_desc = "A length of toilet paper. Seems like custodia is marking their territory again." + roll_desc = "A unbranded roll of standard issue two ply toilet paper. Refined from carefully rendered down sea shells due to the government's 'Abuse Of The Trees Act'." + base_icon_state = "stripetape" + tape_color = COLOR_WHITE + detail_overlay = "stripes" + detail_color = COLOR_WHITE + +/obj/item/stack/tape_roll/barricade_tape/toilet + icon = 'icons/obj/toiletpaper.dmi' + icon_state = ICON_STATE_WORLD + slot_flags = SLOT_HEAD | SLOT_OVER_BODY + amount = 30 + max_amount = 30 + tape_template = /decl/barricade_tape_template/toilet + +/obj/item/stack/tape_roll/barricade_tape/toilet/verb/tear_sheet() set category = "Object" - set name = "Tear Sheet" - set desc = "Tear a sheet of toilet paper." + set name = "Tear Sheet" + set desc = "Tear a sheet of toilet paper." set src in usr + if (usr.incapacitated()) return - if(sheets > 0) + + if(can_use(1)) visible_message(SPAN_NOTICE("\The [usr] tears a sheet from \the [src]."), SPAN_NOTICE("You tear a sheet from \the [src].")) var/obj/item/paper/crumpled/bog/C = new(loc) usr.put_in_hands(C) - sheets-- - if (sheets < 1) - to_chat(usr, SPAN_WARNING("\The [src] is depleted.")) - qdel(src) +//////////////////////////////////////////////////// +// Toilet Paper Sheet +//////////////////////////////////////////////////// /obj/item/paper/crumpled/bog - name = "sheet of toilet paper" - desc = "A single sheet of toilet paper. Two ply." - icon = 'icons/obj/toiletpaper.dmi' + name = "sheet of toilet paper" + desc = "A single sheet of toilet paper. Two ply." + icon = 'icons/obj/toiletpaper.dmi' icon_state = "bogroll_sheet" /obj/structure/hygiene/faucet diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm index d96fdf9fbdb..69b09bc4883 100644 --- a/code/modules/clothing/spacesuits/breaches.dm +++ b/code/modules/clothing/spacesuits/breaches.dm @@ -228,7 +228,7 @@ repair_breaches(BRUTE, 3, user) return - else if(istype(W, /obj/item/ducttape)) + else if(istype(W, /obj/item/stack/tape_roll/duct_tape)) var/datum/breach/target_breach //Target the largest unpatched breach. for(var/datum/breach/B in breaches) if(B.patched) @@ -239,13 +239,22 @@ if(!target_breach) to_chat(user, "There are no open breaches to seal with \the [W].") else - playsound(src, 'sound/effects/tape.ogg',25) var/mob/living/carbon/human/H = user - if(!istype(H)) return + if(!istype(H)) + return + + var/obj/item/stack/tape_roll/duct_tape/D = W + var/amount_needed = CEILING(target_breach.class * 2) + if(!D.can_use(amount_needed)) + to_chat(user, SPAN_WARNING("There's not enough [D.plural_name] in your [src] to seal \the [target_breach.descriptor] on \the [src]! You need at least [amount_needed] [D.plural_name].")) + return + if(do_after(user, H.get_equipped_item(slot_wear_suit_str) == src? 60 : 30, istype(loc,/mob/living)? loc : null)) //Sealing a breach on your own suit is awkward and time consuming + D.use(amount_needed) + playsound(src, 'sound/effects/tape.ogg',25) user.visible_message( - SPAN_NOTICE("\The [user] uses \the [W] to seal \the [target_breach.descriptor] on \the [src]."), - SPAN_NOTICE("You use \the [W] to seal \the [target_breach.descriptor] on \the [src].") + SPAN_NOTICE("\The [user] uses some [D.plural_name] to seal \the [target_breach.descriptor] on \the [src]."), + SPAN_NOTICE("You use [amount_needed] [D.plural_name] of \the [W] to seal \the [target_breach.descriptor] on \the [src].") ) target_breach.patched = TRUE target_breach.update_descriptor() diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 5bff1d39d43..f9171c24690 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -133,7 +133,7 @@ /obj/item/wrench, /obj/item/tank/emergency, /obj/item/clothing/mask/gas, - /obj/item/taperoll/engineering + /obj/item/stack/tape_roll/barricade_tape/engineering ) body_parts_covered = SLOT_UPPER_BODY diff --git a/code/modules/crafting/_crafting_stage.dm b/code/modules/crafting/_crafting_stage.dm index 47d00f44726..f7d1b856875 100644 --- a/code/modules/crafting/_crafting_stage.dm +++ b/code/modules/crafting/_crafting_stage.dm @@ -91,8 +91,13 @@ . = ..() && IS_SCREWDRIVER(thing) /decl/crafting_stage/tape + stack_consume_amount = 4 consume_completion_trigger = FALSE - completion_trigger_type = /obj/item/ducttape + completion_trigger_type = /obj/item/stack/tape_roll/duct_tape + +/decl/crafting_stage/tape/on_progress(var/mob/user) + ..() + playsound(user.loc, 'sound/effects/tape.ogg', 100, 1) /decl/crafting_stage/pipe completion_trigger_type = /obj/item/pipe diff --git a/code/modules/mob/living/silicon/robot/flying/module_flying_emergency.dm b/code/modules/mob/living/silicon/robot/flying/module_flying_emergency.dm index 79905caa915..dbb16808cac 100644 --- a/code/modules/mob/living/silicon/robot/flying/module_flying_emergency.dm +++ b/code/modules/mob/living/silicon/robot/flying/module_flying_emergency.dm @@ -17,7 +17,7 @@ /obj/item/scanner/reagent/adv, /obj/item/chems/borghypo/crisis, /obj/item/extinguisher/mini, - /obj/item/taperoll/medical, + /obj/item/stack/tape_roll/barricade_tape/medical, /obj/item/inflatable_dispenser/robot, /obj/item/weldingtool/mini, /obj/item/screwdriver, diff --git a/code/modules/mob/living/silicon/robot/flying/module_flying_forensics.dm b/code/modules/mob/living/silicon/robot/flying/module_flying_forensics.dm index f90bfcbf65e..06d167b6f44 100644 --- a/code/modules/mob/living/silicon/robot/flying/module_flying_forensics.dm +++ b/code/modules/mob/living/silicon/robot/flying/module_flying_forensics.dm @@ -19,7 +19,7 @@ /obj/item/gripper/clerical, /obj/item/flash, /obj/item/borg/sight/hud/sec, - /obj/item/taperoll/police, + /obj/item/stack/tape_roll/barricade_tape/police, /obj/item/scalpel/laser, /obj/item/scanner/autopsy, /obj/item/chems/spray/luminol, diff --git a/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm b/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm index 11701438ddc..bbc8e76b5d5 100644 --- a/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm +++ b/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm @@ -23,8 +23,8 @@ /obj/item/t_scanner, /obj/item/scanner/gas, /obj/item/geiger, - /obj/item/taperoll/engineering, - /obj/item/taperoll/atmos, + /obj/item/stack/tape_roll/barricade_tape/engineering, + /obj/item/stack/tape_roll/barricade_tape/atmos, /obj/item/gripper, /obj/item/gripper/no_use/loader, /obj/item/lightreplacer, diff --git a/code/modules/mob/living/silicon/robot/modules/module_engineering.dm b/code/modules/mob/living/silicon/robot/modules/module_engineering.dm index 43a29345688..43b61d0601d 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_engineering.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_engineering.dm @@ -34,8 +34,8 @@ /obj/item/t_scanner, /obj/item/scanner/gas, /obj/item/geiger, - /obj/item/taperoll/engineering, - /obj/item/taperoll/atmos, + /obj/item/stack/tape_roll/barricade_tape/engineering, + /obj/item/stack/tape_roll/barricade_tape/atmos, /obj/item/gripper, /obj/item/gripper/no_use/loader, /obj/item/lightreplacer, diff --git a/code/modules/mob/living/silicon/robot/modules/module_medical.dm b/code/modules/mob/living/silicon/robot/modules/module_medical.dm index 8301a2f3561..f1e185db3a6 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_medical.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_medical.dm @@ -110,7 +110,7 @@ /obj/item/chems/syringe, /obj/item/gripper/chemistry, /obj/item/extinguisher/mini, - /obj/item/taperoll/medical, + /obj/item/stack/tape_roll/barricade_tape/medical, /obj/item/inflatable_dispenser/robot, /obj/item/stack/medical/ointment, /obj/item/stack/medical/bruise_pack, diff --git a/code/modules/mob/living/silicon/robot/modules/module_security.dm b/code/modules/mob/living/silicon/robot/modules/module_security.dm index 15890fc3384..1a2421bb265 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_security.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_security.dm @@ -50,7 +50,7 @@ /obj/item/handcuffs/cyborg, /obj/item/baton/robot, /obj/item/gun/energy/gun/secure/mounted, - /obj/item/taperoll/police, + /obj/item/stack/tape_roll/barricade_tape/police, /obj/item/megaphone, /obj/item/holowarrant, /obj/item/crowbar, diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 4eac6a3e55c..e4d6edca358 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -360,8 +360,8 @@ if(user.mind && (user.mind.assigned_role == "Clown")) clown = 1 - if(istype(P, /obj/item/ducttape)) - var/obj/item/ducttape/tape = P + if(istype(P, /obj/item/stack/tape_roll/duct_tape)) + var/obj/item/stack/tape_roll/duct_tape/tape = P tape.stick(src, user) return diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 2f13750dc76..01f87cb1528 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -46,7 +46,7 @@ to_chat(user, "You add \the [W.name] to [(src.name == "paper bundle") ? "the paper bundle" : src.name].") qdel(W) else - if(istype(W, /obj/item/ducttape)) + if(istype(W, /obj/item/stack/tape_roll/duct_tape)) return 0 if(IS_PEN(W)) show_browser(user, "", "window=[name]") //Closes the dialog diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 9984e31ad0c..be8d9a8e86f 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -622,7 +622,7 @@ By design, d1 is the smallest direction and d2 is the highest // Items usable on a cable coil : // - Wirecutters : cut them duh ! // - Cable coil : merge cables -/obj/item/stack/cable_coil/proc/can_merge(var/obj/item/stack/cable_coil/C) +/obj/item/stack/cable_coil/can_merge(var/obj/item/stack/cable_coil/C) return color == C.color /obj/item/stack/cable_coil/cyborg/can_merge() diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index a3d57dddd24..fe09b769692 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -621,15 +621,24 @@ var/global/list/supermatter_delam_accent_sounds = list( /obj/machinery/power/supermatter/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/ducttape)) - to_chat(user, "You repair some of the damage to \the [src] with \the [W].") + if(istype(W, /obj/item/stack/tape_roll/duct_tape)) + var/obj/item/stack/tape_roll/duct_tape/T = W + if(!T.can_use(20)) + to_chat(user, SPAN_WARNING("You need at least 20 [T.plural_name] to repair \the [src].")) + return + T.use(20) + playsound(src, 'sound/effects/tape.ogg', 100, TRUE) + to_chat(user, SPAN_NOTICE("You begin to repair some of the damage to \the [src] with \the [W].")) damage = max(damage -10, 0) - user.visible_message("\The [user] touches \a [W] to \the [src] as a silence fills the room...",\ - "You touch \the [W] to \the [src] when everything suddenly goes silent.\"\n\The [W] flashes into dust as you flinch away from \the [src].",\ - "Everything suddenly goes silent.") - user.drop_from_inventory(W) - Consume(user, W, TRUE) + if(!QDELETED(W)) + user.visible_message(SPAN_WARNING("\The [user] touches \the [src] with \a [W] as silence fills the room..."),\ + SPAN_DANGER("You touch \the [W] to \the [src] when everything suddenly goes quiet."),\ + SPAN_WARNING("Everything suddenly goes silent.")) + + to_chat(user, SPAN_NOTICE("\The [W] flashes into dust as you flinch away from \the [src].")) + user.drop_from_inventory(W) + Consume(user, W, TRUE) user.apply_damage(150, IRRADIATE, damage_flags = DAM_DISPERSED) /obj/machinery/power/supermatter/Bumped(atom/AM) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 282a5bd1667..fb5b9e2d11d 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -19,7 +19,7 @@ allowed_tools = list( /obj/item/stack/medical/advanced/bruise_pack = 100, /obj/item/stack/medical/bruise_pack = 40, - /obj/item/ducttape = 20 + /obj/item/stack/tape_roll/duct_tape = 20 ) min_duration = 70 max_duration = 90 diff --git a/code/modules/xenoarcheaology/tools/equipment.dm b/code/modules/xenoarcheaology/tools/equipment.dm index 367c4eac061..68fccc8ebc6 100644 --- a/code/modules/xenoarcheaology/tools/equipment.dm +++ b/code/modules/xenoarcheaology/tools/equipment.dm @@ -68,5 +68,5 @@ /obj/item/storage/excavation, /obj/item/anobattery, /obj/item/ano_scanner, - /obj/item/taperoll, + /obj/item/stack/tape_roll/barricade_tape/research, /obj/item/pickaxe/xeno/hand) \ No newline at end of file diff --git a/code/modules/xenoarcheaology/tools/misc.dm b/code/modules/xenoarcheaology/tools/misc.dm index c1b347dd23d..6da96295d56 100644 --- a/code/modules/xenoarcheaology/tools/misc.dm +++ b/code/modules/xenoarcheaology/tools/misc.dm @@ -31,7 +31,7 @@ new /obj/item/clipboard(src) new /obj/item/storage/belt/archaeology(src) new /obj/item/storage/excavation(src) - new /obj/item/taperoll/research(src) + new /obj/item/stack/tape_roll/barricade_tape/research(src) /obj/structure/closet/excavation name = "excavation tools" @@ -53,7 +53,7 @@ new /obj/item/pickaxe/xeno/hand(src) new /obj/item/storage/bag/fossils(src) new /obj/item/hand_labeler(src) - new /obj/item/taperoll/research(src) + new /obj/item/stack/tape_roll/barricade_tape/research(src) /obj/machinery/alarm/isolation req_access = list(list(access_research, access_atmospherics, access_engine_equip)) diff --git a/icons/policetape.dmi b/icons/policetape.dmi index b3e2e02b9c9f6a0142d7c69a20bc5b33958d6e52..5a14da3d9e78caadf294a13a92437888870671c9 100644 GIT binary patch literal 7619 zcmZu$XH*kix1JCQ%@}$W5(NcOilTy)1gQeAR1py&D58K=1!*A(h*XgxMFk8}6tI8_ zf+7h@70`f!G$phU=_H{fBqW#jyZ8RN>;9Ot&+Pr|XVzJ>&zWbhNp-ZhhKeeR0ssKD zIb-1r03iIomoRw8^FYBeW5*af{&UW=PM)St_unVeHY^#J!rdYm#eF*y1M%8 z?5vWK(hjh$u1;KBoI;_fsi}#HiP_lL7#JArB%u4 z!uOWXP5;nv|Bzq+h$<@1JH01CSKM-F>5$@|YS7%53?=Z^gQ?#qv_rb}F(>JA!{_qaIQefMyk zr}sILpi6L{@P2A>eZ95K36T-!H#qUBABqPGfBJkZeK8)WC4Hmqy1GfjEB79cL1-EO z*Ou+V2Qw8l?rVjJzrnlyAmeTZ`UxC7^e|91<8yk)gk`+i-K;wcgztk=_#f+0jvXp6 z+Zbq*t^%p;`F(wq9xDtgtGU0?k;Wo2)gb6kk21ZhvO-oR(>;T zm49p?mwWO9-QU7`b;GTuH9SxaTwbaNsFIhd-$Lup6d3W~*-DywAaAnxtPeRnIy0F+ zO$)}8+7W6UO0K-EQMo@Q*6tUBQ*uV7AS%GK!)p89yi-4_f;h32m84K;9H>gQQ$H zy$U?DWU0D=$b!DRCq5#Yg_(Znewv`!$%#7t2C#M^p+Psimfv`#uQ26!P&hG-ti+T1 zaeSM3gByvtHytg8nGg+CIQx@jm&xy3Val@F5PvlvW4AA!t>x)&W3OtNX0+-PISO7M zOR<}__RIU=f1I{H-GAov$a@F%1S_NE_)_q27xwD9gVNL+kXiH_Ot>}u-SFdskAI1j zJi{L|9|tUSEu;Wr6ivXbDbw-2obY1?$dNZ3JTy zejV?t=23nUCdoDHJ*zCs6w44p%K!-XF|YD~_lXwOAYe{@x|j)6@F<6?Tn%C$gy(L4 zk8Uv(3|CogD#6hW3gr_c>|+F^*LB`e#u4a`aTe9XB00+wu@3QyJI13%z*X(f=g2*Y z!SheblZQHCIDZ(2ei$E~MW>(63NPB8jW!juiCkTO4!n>n?l{$uF(mkO!-?(Mrf}vZ zw8%)`^iAA3qCpizQded%anzdXbLDjoYy+3+@M6Al{-3Ayd8D-78uTU~J?3_VGETBu(+(2Ng6fi)K3I*5C>ax# z+2_O(Tzpe@iE#kD9+QUd!{9DZO#^lyf2_{gd(2fMB6#9N*yhzCx`mJYb0BgLC z4^_cSN^B^Y8o!y!%S^~k{7Hkc5YgPcw)|R`{7?{!SI)G$;ka1 zm#WU8vK{Q(9#Ye%nIGtzKQL#0up)xF&Bx(6$3s(;SZd#r!<8mZnhuF_A>ghj?l-}N za&}fQ_&4P5#rOu0R}pN^D{;lLaY2HstbHa5vO2X=!Oj}Kj@RXRJ%+`5ri#w@MY%cM zBRSN;@^tD*)!YiMg-;qJMK)WFCq3zM3*&;5LiHohAt^j5MokcZm+ag*q5WKwFElyU zGu}aLX^i^!K+DqylO@PBO7ZDUQK#BpnKNv-c^`OJGA9q z@NzM3XQ3^fN_e?uJ4?7r|F$^9;ck^{2HD zXmUNaEEYtuZ#WI0a;RxXO+jiJ>G>2VcA~&jT!G|uP?Ps0ZDplchmdk~niETd{U8e= zu5@nd#R6yMTS{(#@f+FfE^DTg!7-_w%2vb`@B7khZGG*>uFN$*jQqiyQpWG34-O!Y z;iPY${?TV)G36wxUj-4?F|#yVQe{3@*^SVEO9a64P~n&H_qA3*dL>ND#z+h*uT5^B zDWO(45(#dEotvTfS++Jr@}^wr3ZYYMfB-L9E?PNte7v5zzW<^Is+upd-GfADCHP%@ zHuP$r_p>e9A4yGNEoW^>*NEXMm-V5g7~&_lOY^po6r3%CTvXcj|XdB~1C)wEOSClVIaA;ziz!aop$=gvS z!_k?&q0slt+Z&;Z;&V;g6<5`Zu6&l}-iZsXGG6O{!}rgpbcEbI+GVLshAmRf1@Bmf zE_v5=MfH3m++>4M1Z^~*hfUxfL`GzvT_ZOs)|D`Ioi8D?HRt(@4FwcPBQ#WLq8SSG zeHKTNwQ##8-1krNjw%7u(~l^x_sqK$hP{jptHmus5L2{A)CC1cSyRT6dEMDA>c9md)M`NFS92ntH+oXyFV6`EDD&)Rx2iG((m zXl2Fpfu@9~wKLCf*}^G=WYH4#g=I#{!ATN9w?)+`5YdOxL=xmEI(vGrbPm}S2(@kJ zY6Js%M6Zv=``OpqCLV>JaxH+^JC(^tcxeX%CEj%fU>P-cm2Ak76s3|bq0?p=0)joN z&g(r&6A!NAqf~&)N@q?pbXpOLrYB)pUTW=fm*5_@7r*8(j;9Djj3W4d{p7@Oye92wdB)Y!Ya^cmw0 zsL@`8yH)woGb;MM)=ZudD`sVT>wOl?>klhQVRB)t$66H9RP``Kw{46j@0qY3OHGD4 z2O$QOuz!f@*m`Skpu!tYSjl%QybPLBY(`U(Lpp14&+{`O;-kUVqQA#{P-S+t*cxu_ zy7|ym`a!Gy9h#Yw@>&p3WIX1f?WjUP@} zrN^hIdhUIL8NmLai0$E$wJFWJ7B;(KE_LH0?fdFW%jIlnhrbLxe*z0_uaJ$t$UXy# z%C^K<_=0nJMAOa8)Eu_PcN!KcKvNiS6WR<0t}Px)Y!`p?bV{^*=PZa#gPOJ`{m@^S zfjW){PU{21i+3i@OA?=?k<|;5Ion)VW!7#y?4OBvD3suEBy*E9^5zXi7n~*|PG`3< zqDTaI(LZ{?df$_jodk7a^R_5BOKy@eMl$MzN>IkJf`)~`_$g?!(gc->S16xVbEyN2X_LF6(Jx;=WrUXLNj1^Of|1Nb@IvLl>lu#QGKpSk6- zxxJu#!LnkRqrUBy(pbgerSkLkU7IK3#PwTyY0s89ks_~?>d<7nos4@g_Ax%}KqBDk zQva{9A>u5!pQ4KHRkrf#PcNv9Gr>na;p#(AK{cg~xB*`4R@^0j*S&?EoqBCwkFrj1 zEg}s_2Szhl|Aq#Kl+m7YowM|j-C;Kqg)-@rRHNS%=OrOb0RQr~m(={!urcz1@U_`^&f`1ieV71Jen?331v!fYh0WFvFi7_WrViTl^fi3aqsUR%ca zQPjo`miuWf8mPxD(m=mi(R2S{AcGs}%pWw+0PhXqU*0A%_~96i28vV(rGe^<@d|LA zCqlXngq>k}x}6EkZaiQD%LZPGa)~J_G^zhPS3yD!|5F(^&>7VpX0o-fh1otLQeTtg z&<$>!j&dc2fbnko&aK)+1Ce`CbjazeW=k(7A29wU++qV3Q~&WtAO#&c2+~e9bbS4> zYdUI{32YeS*&(N#MTqGF{6{rLuoCeTFa$y9cQjxE(@+oiy(6-a@I_fPkH?ec$wZrW z?QHZ+MQ*GVYTwIYQ*re|#)C}-Ne%l$A!D@MkN{lT%0A1pMWZP-It7`ErkQ2y6o1`( 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 KTf8>&PWUe&Ej5z> literal 3858 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 UHsf2EO8@`>07*qoM6N<$g0&KfumAu6 diff --git a/maps/antag_spawn/ert/ert_base.dmm b/maps/antag_spawn/ert/ert_base.dmm index 0a6037a5bef..c53e8e7a3c9 100644 --- a/maps/antag_spawn/ert/ert_base.dmm +++ b/maps/antag_spawn/ert/ert_base.dmm @@ -905,8 +905,8 @@ pixel_x = 4; pixel_y = 32 }, -/obj/item/taperoll/police, -/obj/item/taperoll/police, +/obj/item/stack/tape_roll/barricade_tape/police, +/obj/item/stack/tape_roll/barricade_tape/police, /turf/unsimulated/floor{ dir = 1; icon_state = "vault" @@ -1423,8 +1423,8 @@ /obj/item/chems/spray/antiseptic, /obj/item/chems/spray/antiseptic, /obj/item/storage/box/bloodpacks, -/obj/item/tape/medical, -/obj/item/tape/medical, +/obj/item/stack/tape_roll/barricade_tape/medical, +/obj/item/stack/tape_roll/barricade_tape/medical, /obj/item/flashlight/pen, /obj/item/flashlight/pen, /turf/unsimulated/floor{ @@ -2219,16 +2219,16 @@ /area/map_template/rescue_base/base) "eB" = ( /obj/structure/table/reinforced, -/obj/item/taperoll/engineering, -/obj/item/taperoll/engineering, -/obj/item/taperoll/atmos, -/obj/item/taperoll/atmos, +/obj/item/stack/tape_roll/barricade_tape/engineering, +/obj/item/stack/tape_roll/barricade_tape/engineering, +/obj/item/stack/tape_roll/barricade_tape/atmos, +/obj/item/stack/tape_roll/barricade_tape/atmos, /obj/item/multitool, /obj/item/multitool, -/obj/item/ducttape, -/obj/item/ducttape, -/obj/item/ducttape, -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, +/obj/item/stack/tape_roll/duct_tape, +/obj/item/stack/tape_roll/duct_tape, +/obj/item/stack/tape_roll/duct_tape, /obj/item/cell/high, /obj/item/cell/high, /obj/item/cell/high, diff --git a/maps/away/bearcat/bearcat-1.dmm b/maps/away/bearcat/bearcat-1.dmm index 7f94eb58712..c6821fa2cfc 100644 --- a/maps/away/bearcat/bearcat-1.dmm +++ b/maps/away/bearcat/bearcat-1.dmm @@ -1091,7 +1091,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/item/taperoll/engineering/applied, +/obj/structure/tape_barricade/engineering, /obj/structure/cable{ icon_state = "4-8" }, @@ -1543,7 +1543,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/item/taperoll/engineering/applied, +/obj/structure/tape_barricade/engineering, /obj/structure/cable{ icon_state = "4-8" }, @@ -1938,7 +1938,7 @@ pixel_y = 32; req_access = newlist() }, -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, /obj/machinery/light_switch{ pixel_x = -24 }, @@ -2391,7 +2391,7 @@ /obj/effect/floor_decal/corner/yellow{ dir = 9 }, -/obj/item/taperoll/engineering, +/obj/item/stack/tape_roll/barricade_tape/engineering, /turf/simulated/floor/tiled/usedup, /area/ship/scrap/maintenance/storage) "eR" = ( @@ -2406,7 +2406,7 @@ /turf/simulated/floor/tiled/usedup, /area/ship/scrap/maintenance/storage) "eS" = ( -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, /obj/item/stack/material/reinforced/mapped/plasteel/fifty, /obj/item/stack/material/ingot/mapped/copper/fifty, /obj/item/stack/material/rods/fifty, @@ -2423,7 +2423,7 @@ "eT" = ( /obj/item/clothing/head/welding, /obj/item/radio, -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, /obj/structure/table, /obj/item/radio/intercom{ pixel_y = -32 diff --git a/maps/away/bearcat/bearcat-2.dmm b/maps/away/bearcat/bearcat-2.dmm index 7319ec97683..e03ae701868 100644 --- a/maps/away/bearcat/bearcat-2.dmm +++ b/maps/away/bearcat/bearcat-2.dmm @@ -2515,7 +2515,7 @@ /obj/structure/closet/medical_wall/filled{ pixel_y = -32 }, -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, /obj/item/retractor, /obj/item/scalpel, /turf/simulated/floor/tiled/white, diff --git a/maps/away/errant_pisces/errant_pisces.dmm b/maps/away/errant_pisces/errant_pisces.dmm index 4fd6791dc40..a9073c8781a 100644 --- a/maps/away/errant_pisces/errant_pisces.dmm +++ b/maps/away/errant_pisces/errant_pisces.dmm @@ -4196,7 +4196,7 @@ /area/errant_pisces/science_wing) "lx" = ( /obj/structure/table, -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, /turf/simulated/floor/tiled, /area/errant_pisces/science_wing) "ly" = ( diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index 8e54bc4adf4..4da4c09883b 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -1728,7 +1728,7 @@ locked = 1; name = "External Construction Airlock" }, -/obj/item/taperoll/engineering/applied, +/obj/structure/tape_barricade/engineering, /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/maintenance/security_starboard) "adP" = ( @@ -5450,7 +5450,7 @@ locked = 1; name = "External Construction Airlock" }, -/obj/item/taperoll/engineering/applied, +/obj/structure/tape_barricade/engineering, /obj/machinery/shield_diffuser, /turf/simulated/floor/tiled/techfloor/grid, /area/exodus/maintenance/security_starboard) @@ -5899,7 +5899,7 @@ }, /obj/item/clipboard, /obj/item/hand_labeler, -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, /turf/simulated/floor/tiled/dark, /area/exodus/lawoffice) "amt" = ( @@ -8644,7 +8644,7 @@ /obj/structure/table/reinforced, /obj/item/clipboard, /obj/item/hand_labeler, -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, /turf/simulated/floor/tiled/dark, /area/exodus/lawoffice) "arR" = ( @@ -14517,7 +14517,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, /turf/simulated/floor/wood/walnut, /area/exodus/library) "aEG" = ( @@ -23878,7 +23878,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, /obj/structure/table, /turf/simulated/floor/tiled/steel_grid, /area/exodus/crew_quarters/locker) @@ -31905,7 +31905,7 @@ pixel_x = -27; pixel_y = 1 }, -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, /obj/structure/table{ name = "plastic table frame" }, @@ -43635,7 +43635,7 @@ dir = 1; pixel_y = -22 }, -/obj/item/taperoll/medical, +/obj/item/stack/tape_roll/barricade_tape/medical, /turf/simulated/floor/tiled/white, /area/exodus/medical/sleeper) "bMy" = ( @@ -54949,7 +54949,7 @@ }, /obj/item/paper_bin, /obj/item/pen, -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, /turf/simulated/floor/tiled/white, /area/exodus/research/xenobiology/xenoflora) "cjD" = ( @@ -55628,7 +55628,7 @@ "clf" = ( /obj/structure/table/reinforced, /obj/item/clipboard, -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, /turf/simulated/floor/tiled/steel_grid, /area/exodus/engineering/foyer) "clg" = ( @@ -59192,7 +59192,7 @@ }, /obj/item/paper_bin, /obj/item/pen, -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, /turf/simulated/floor/tiled/white, /area/exodus/research/xenobiology) "ctX" = ( diff --git a/maps/ministation/ministation.dmm b/maps/ministation/ministation.dmm index 49737304c07..8fd013a3971 100644 --- a/maps/ministation/ministation.dmm +++ b/maps/ministation/ministation.dmm @@ -16554,7 +16554,7 @@ }, /obj/structure/table/steel, /obj/item/wrench, -/obj/item/taperoll/atmos, +/obj/item/stack/tape_roll/barricade_tape/atmos, /turf/simulated/floor, /area/ministation/atmospherics) "XY" = ( diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index c16fc0ac7d4..38912a5f727 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -2362,8 +2362,8 @@ "fd" = ( /obj/structure/table/steel_reinforced, /obj/item/storage/toolbox/syndicate, -/obj/item/ducttape, -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, +/obj/item/stack/tape_roll/duct_tape, /obj/item/crowbar/brace_jack, /obj/item/clothing/head/hardhat/white, /obj/item/grenade/chem_grenade/metalfoam, diff --git a/maps/tradeship/tradeship-1.dmm b/maps/tradeship/tradeship-1.dmm index 5429efb6c46..8ce61a3db69 100644 --- a/maps/tradeship/tradeship-1.dmm +++ b/maps/tradeship/tradeship-1.dmm @@ -3263,7 +3263,7 @@ /turf/simulated/wall/r_wall/hull, /area/ship/trade/crew/dorms2) "Vm" = ( -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, /obj/item/stack/material/reinforced/mapped/plasteel/fifty, /obj/item/stack/material/ingot/mapped/copper/fifty, /obj/item/stack/material/rods/fifty, @@ -3277,8 +3277,8 @@ /obj/item/stack/material/reinforced/mapped/fiberglass/fifty, /obj/item/clothing/head/welding, /obj/item/stack/material/cardstock/mapped/cardboard/fifty, -/obj/item/ducttape, -/obj/item/taperoll/engineering, +/obj/item/stack/tape_roll/duct_tape, +/obj/item/stack/tape_roll/barricade_tape/engineering, /turf/simulated/floor/tiled/techfloor, /area/ship/trade/maintenance/techstorage) "VX" = ( @@ -3337,7 +3337,7 @@ }, /obj/item/t_scanner, /obj/item/cell/high, -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, /obj/item/stock_parts/circuitboard/air_alarm, /obj/item/stock_parts/circuitboard/airlock_electronics, /obj/item/stock_parts/circuitboard/airlock_electronics, diff --git a/maps/tradeship/tradeship-2.dmm b/maps/tradeship/tradeship-2.dmm index 35a95d65a41..ec064d4c9f1 100644 --- a/maps/tradeship/tradeship-2.dmm +++ b/maps/tradeship/tradeship-2.dmm @@ -5013,7 +5013,7 @@ /obj/item/storage/box/ammo/shotgunshells, /obj/item/handcuffs, /obj/item/boombox, -/obj/item/taperoll/bureaucracy, +/obj/item/stack/tape_roll/barricade_tape/bureaucracy, /obj/machinery/keycard_auth{ pixel_y = 21 }, @@ -5557,7 +5557,7 @@ /obj/item/flash, /obj/item/clothing/glasses/sunglasses, /obj/item/storage/box/evidence, -/obj/item/taperoll/police, +/obj/item/stack/tape_roll/barricade_tape/police, /obj/item/holowarrant, /obj/item/storage/briefcase/crimekit, /obj/item/taperecorder, @@ -6524,7 +6524,7 @@ /obj/structure/closet/medical_wall/filled{ pixel_y = -32 }, -/obj/item/ducttape, +/obj/item/stack/tape_roll/duct_tape, /obj/item/storage/firstaid/surgery, /turf/simulated/floor/tiled/white, /area/ship/trade/crew/medbay) diff --git a/maps/tradeship/tradeship-3.dmm b/maps/tradeship/tradeship-3.dmm index 720b46fbdbb..6b83a27f9b2 100644 --- a/maps/tradeship/tradeship-3.dmm +++ b/maps/tradeship/tradeship-3.dmm @@ -763,7 +763,7 @@ dir = 4 }, /obj/machinery/door/firedoor, -/obj/item/taperoll/engineering/applied, +/obj/structure/tape_barricade/engineering, /turf/simulated/floor/tiled/techfloor/grid, /area/ship/trade/bridge_unused) "DZ" = ( From aaa894dce612bf40afc978202b0f6c5f74683898 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Fri, 26 Aug 2022 15:30:20 -0400 Subject: [PATCH 0300/1518] Update lightswitch.dm --- code/game/machinery/lightswitch.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index b7c5d4f3144..6891d002665 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -80,5 +80,5 @@ . = ..() if(!.) to_chat(user, SPAN_NOTICE("You flick \the [src] with \the [I].")) - interface_interact(user) + interface_interact(user) return TRUE From 76fb8e2d689a8ff87b6f428ef46e8c5d95ce7289 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sat, 27 Aug 2022 00:48:00 +0000 Subject: [PATCH 0301/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 13 +++++++------ html/changelogs/.all_changelog.yml | 5 +++++ html/changelogs/AutoChangeLog-pr-2553.yml | 5 ----- html/changelogs/AutoChangeLog-pr-2646.yml | 4 ---- 4 files changed, 12 insertions(+), 15 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2553.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2646.yml diff --git a/html/changelog.html b/html/changelog.html index c7c1a2cd9a4..a508dca27d1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,13 @@ -->
    +

    27 August 2022

    +

    PsyCommando updated:

    +
      +
    • The list for spawning material stacks is now sorted by type name. So its a bit more useful.
    • +
    • Paper shredder gives better user feedback.
    • +
    +

    23 August 2022

    MistakeNot4892 updated:

      @@ -85,12 +92,6 @@

      MistakeNot4892 updated:

      • Construction skill will now speed up some tool interactions.
      - -

      25 June 2022

      -

      MistakeNot4892 updated:

      -
        -
      • Species previews are no longer naked.
      • -
    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 667ffe949d4..21d3741fe03 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14251,3 +14251,8 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: Fixed top hat not showing up on the mob sprite. - bugfix: Fixed balaclava and other masks turning people bald. - bugfix: Fixed a lot of hats not hiding hair under them. +2022-08-27: + PsyCommando: + - admin: The list for spawning material stacks is now sorted by type name. So its + a bit more useful. + - tweak: Paper shredder gives better user feedback. diff --git a/html/changelogs/AutoChangeLog-pr-2553.yml b/html/changelogs/AutoChangeLog-pr-2553.yml deleted file mode 100644 index 30fe39b4d9f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2553.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: PsyCommando -delete-after: true -changes: - - admin: The list for spawning material stacks is now sorted by type name. So its - a bit more useful. diff --git a/html/changelogs/AutoChangeLog-pr-2646.yml b/html/changelogs/AutoChangeLog-pr-2646.yml deleted file mode 100644 index 477683fe019..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2646.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: PsyCommando -delete-after: true -changes: - - tweak: Paper shredder gives better user feedback. From 9ce39a4486149eb050e0dde7abb31b20447d936b Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Tue, 26 Jul 2022 23:38:02 -0400 Subject: [PATCH 0302/1518] Ports ZASDBG modernization --- code/__defines/ZAS.dm | 15 ++++ code/controllers/subsystems/air.dm | 8 +- code/modules/ZAS/Connection.dm | 111 ++++++++++++++++++++++------ code/modules/ZAS/ConnectionGroup.dm | 45 +++++++---- code/modules/ZAS/Debug.dm | 107 ++++++++++++++++++++++----- code/modules/ZAS/Diagnostic.dm | 27 ++++--- code/modules/ZAS/Turf.dm | 68 ++++++++++++----- code/modules/ZAS/Zone.dm | 10 +-- 8 files changed, 294 insertions(+), 97 deletions(-) diff --git a/code/__defines/ZAS.dm b/code/__defines/ZAS.dm index 94d15e28462..fa25d2f16a5 100644 --- a/code/__defines/ZAS.dm +++ b/code/__defines/ZAS.dm @@ -1,3 +1,18 @@ + +/* + Uncomment this to enable ZAS debugging tools. While ghosted, you will see a visualization of the atmos status of turfs. + Green turfs are zones that are existing happily. + Yellow-orange turfs are a zone that has recently been merged into another zone. + Red turfs are turfs are an invalidated zone. Invalid zones are zones that were destroyed. + White/overlay-less turfs are turfs that are the origin point of a zone. This is completely useless information. + Purple outlines indicate the turf was marked for an update by SSair, and is in its processing list. + In addition, all ZAS-related datums and turfs will have a "verbose" var. Set this to 1 using View Variables to get robust to_chat()s about activity. + Finally, this is a friendly reminder that using Debug Verbs gives access to the Zone Info and Test ZAS Connection verbs when you right click a turf. + + Addendum: + There are additional debug overlays that use ZAS_ZONE_BLOCKER and ZAS_DIRECTIONAL_BLOCKER. + They take priority over standard overlays, displaying directional airflow, and are generally not needed so they are commented out by default. +*/ //#define ZASDBG #define MULTIZAS diff --git a/code/controllers/subsystems/air.dm b/code/controllers/subsystems/air.dm index 6f987688d18..b092cf49869 100644 --- a/code/controllers/subsystems/air.dm +++ b/code/controllers/subsystems/air.dm @@ -198,8 +198,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun T.post_update_air_properties() T.needs_air_update = 0 #ifdef ZASDBG - T.cut_overlay(mark, TRUE) - updated++ + T.vis_contents -= zasdbgovl_mark #endif if (no_mc_tick) @@ -215,8 +214,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun T.post_update_air_properties() T.needs_air_update = 0 #ifdef ZASDBG - T.cut_overlay(mark, TRUE) - updated++ + T.vis_contents -= zasdbgovl_mark #endif if (no_mc_tick) @@ -364,7 +362,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun return tiles_to_update += T #ifdef ZASDBG - T.add_overlay(mark, TRUE) + T.vis_contents += zasdbgovl_mark #endif T.needs_air_update = 1 diff --git a/code/modules/ZAS/Connection.dm b/code/modules/ZAS/Connection.dm index 17c8ea16281..8efd2a6c2f7 100644 --- a/code/modules/ZAS/Connection.dm +++ b/code/modules/ZAS/Connection.dm @@ -49,19 +49,25 @@ Class Procs: */ -/connection/var/turf/simulated/A -/connection/var/turf/simulated/B -/connection/var/zone/zoneA -/connection/var/zone/zoneB +/connection + var/turf/simulated/A + var/turf/simulated/B + var/zone/zoneA + var/zone/zoneB -/connection/var/connection_edge/edge + var/connection_edge/edge -/connection/var/state = 0 + ///Invalid or Valid + var/state = 0 + + #ifdef ZASDBG + ///Set to true during testing to get verbose debug information + var/tmp/verbose = FALSE + #endif /connection/New(turf/simulated/A, turf/simulated/B) #ifdef ZASDBG - ASSERT(SSair.has_valid_zone(A)) - //ASSERT(SSair.has_valid_zone(B)) + ASSERT(TURF_HAS_VALID_ZONE(A)) #endif src.A = A src.B = B @@ -75,17 +81,31 @@ Class Procs: edge = SSair.get_edge(A.zone,B.zone) edge.add_connection(src) +#ifdef ZASDBG +/connection/simulated/New(turf/simulated/A, turf/simulated/B) + . = ..() + ASSERT(TURF_HAS_VALID_ZONE(B)) +#endif + /connection/proc/mark_direct() if(!direct()) state |= CONNECTION_DIRECT edge.direct++ -// log_debug("Marked direct.") + + #ifdef ZASDBG + if(verbose) + zas_log("Marked direct.") + #endif /connection/proc/mark_indirect() if(direct()) state &= ~CONNECTION_DIRECT edge.direct-- -// log_debug("Marked indirect.") + + #ifdef ZASDBG + if(verbose) + zas_log("Marked indirect.") + #endif /connection/proc/mark_space() state |= CONNECTION_SPACE @@ -99,18 +119,34 @@ Class Procs: /connection/proc/erase() edge.remove_connection(src) state |= CONNECTION_INVALID -// log_debug("Connection Erased: [state]") + + #ifdef ZASDBG + if(verbose) + zas_log("Connection Erased: [state]") + #endif /connection/proc/update() -// log_debug("Updated, \...") + #ifdef ZASDBG + if(verbose) + zas_log("Updated, \...") + #endif + if(!istype(A,/turf/simulated)) -// log_debug("Invalid A.") + #ifdef ZASDBG + if(verbose) + zas_log("Invalid A. Erasing...") + #endif + erase() return var/block_status = SSair.air_blocked(A,B) if(block_status & AIR_BLOCKED) -// log_debug("Blocked connection.") + #ifdef ZASDBG + if(verbose) + zas_log("Blocked connection. Erasing...") + #endif + erase() return else if(block_status & ZONE_BLOCKED) @@ -122,14 +158,25 @@ Class Procs: if(state & CONNECTION_SPACE) if(!b_is_space) -// log_debug("Invalid B.") + #ifdef ZASDBG + if(verbose) + zas_log("Invalid B. Erasing...") + #endif + erase() return if(A.zone != zoneA) -// log_debug("Zone changed, \...") + #ifdef ZASDBG + if(verbose) + zas_log("Zone changed, \...") + #endif + if(!A.zone) erase() -// log_debug("erased.") + #ifdef ZASDBG + if(verbose) + zas_log("Turf A's zone has disappeared. Erasing...") + #endif return else edge.remove_connection(src) @@ -137,22 +184,34 @@ Class Procs: edge.add_connection(src) zoneA = A.zone -// log_debug("valid.") + #ifdef ZASDBG + if(verbose) + zas_log("Connection is valid.") + #endif return else if(b_is_space) -// log_debug("Invalid B.") + #ifdef ZASDBG + if(verbose) + zas_log("Turf B is unsimulated, but this is a simulated connection. Erasing...") + #endif erase() return if(A.zone == B.zone) -// log_debug("A == B") + #ifdef ZASDBG + if(verbose) + zas_log("Turf A and Turf B share a zone. Erasing...") + #endif erase() return if(A.zone != zoneA || (zoneB && (B.zone != zoneB))) -// log_debug("Zones changed, \...") + #ifdef ZASDBG + if(verbose) + zas_log("Zones changed, \...") + #endif if(A.zone && B.zone) edge.remove_connection(src) edge = SSair.get_edge(A.zone, B.zone) @@ -160,9 +219,15 @@ Class Procs: zoneA = A.zone zoneB = B.zone else -// log_debug("erased.") + #ifdef ZASDBG + if(verbose) + zas_log("Turf A or B lost it's zone. Erasing...") + #endif erase() return -// log_debug("valid.") \ No newline at end of file + #ifdef ZASDBG + if(verbose) + zas_log("Connection is valid.") + #endif diff --git a/code/modules/ZAS/ConnectionGroup.dm b/code/modules/ZAS/ConnectionGroup.dm index e652d176948..fc98d50f419 100644 --- a/code/modules/ZAS/ConnectionGroup.dm +++ b/code/modules/ZAS/ConnectionGroup.dm @@ -58,13 +58,18 @@ Class Procs: */ -/connection_edge/var/zone/A +/connection_edge + var/zone/A -/connection_edge/var/list/connecting_turfs = list() -/connection_edge/var/direct = 0 -/connection_edge/var/sleeping = 1 + var/list/connecting_turfs = list() + var/direct = 0 + var/sleeping = 1 + var/coefficient = 0 -/connection_edge/var/coefficient = 0 + #ifdef ZASDBG + ///Set this to TRUE during testing to get verbose debug information. + var/tmp/verbose = FALSE + #endif /connection_edge/New() CRASH("Cannot make connection edge without specifications.") @@ -72,23 +77,33 @@ Class Procs: /connection_edge/proc/add_connection(connection/c) coefficient++ if(c.direct()) direct++ -// log_debug("Connection added: [type] Coefficient: [coefficient]") + #ifdef ZASDBG + if(verbose) + zas_log("Connection added: [type] Coefficient: [coefficient]") + #endif -/connection_edge/proc/remove_connection(connection/c) -// log_debug("Connection removed: [type] Coefficient: [coefficient-1]") +/connection_edge/proc/remove_connection(connection/c) coefficient-- if(coefficient <= 0) erase() if(c.direct()) direct-- + #ifdef ZASDBG + if(verbose) + zas_log("Connection removed: [type] Coefficient: [coefficient-1]") + #endif + /connection_edge/proc/contains_zone(zone/Z) /connection_edge/proc/erase() SSair.remove_edge(src) -// log_debug("[type] Erased.") + #ifdef ZASDBG + if(verbose) + zas_log("[type] Erased.") + #endif /connection_edge/proc/tick() @@ -107,9 +122,11 @@ Class Procs: src.B = B A.edges.Add(src) B.edges.Add(src) - //id = edge_id(A,B) -// log_debug("New edge between [A] and [B]") + #ifdef ZASDBG + if(verbose) + zas_log("New edge between [A] and [B]") + #endif /connection_edge/zone/add_connection(connection/c) . = ..() @@ -178,9 +195,11 @@ Class Procs: src.B = B A.edges.Add(src) air = B.return_air() - //id = 52*A.id -// log_debug("New edge from [A] to [B].") + #ifdef ZASDBG + if(verbose) + zas_log("New edge from [A] to [B] ([B.x], [B.y], [B.z]).") + #endif /connection_edge/unsimulated/add_connection(connection/c) . = ..() diff --git a/code/modules/ZAS/Debug.dm b/code/modules/ZAS/Debug.dm index 410f107cd8e..1501e8cddc2 100644 --- a/code/modules/ZAS/Debug.dm +++ b/code/modules/ZAS/Debug.dm @@ -1,20 +1,93 @@ -var/global/image/assigned = image('icons/Testing/Zone.dmi', icon_state = "assigned") -var/global/image/created = image('icons/Testing/Zone.dmi', icon_state = "created") -var/global/image/merged = image('icons/Testing/Zone.dmi', icon_state = "merged") -var/global/image/invalid_zone = image('icons/Testing/Zone.dmi', icon_state = "invalid") -var/global/image/air_blocked = image('icons/Testing/Zone.dmi', icon_state = "block") -var/global/image/zone_blocked = image('icons/Testing/Zone.dmi', icon_state = "zoneblock") -var/global/image/blocked = image('icons/Testing/Zone.dmi', icon_state = "fullblock") -var/global/image/mark = image('icons/Testing/Zone.dmi', icon_state = "mark") - -/connection_edge/var/dbg_out = 0 - -/turf/var/tmp/dbg_img -/turf/proc/dbg(image/img, d = 0) - if(d > 0) img.dir = d - overlays -= dbg_img - overlays += img +#ifdef ZASDBG + +var/global/obj/effect/zasdbg/assigned/zasdbgovl_assigned = new +var/global/obj/effect/zasdbg/created/zasdbgovl_created = new +var/global/obj/effect/zasdbg/merged/zasdbgovl_merged = new +var/global/obj/effect/zasdbg/invalid_zone/zasdbgovl_invalid_zone = new +var/global/obj/effect/zasdbg/blocked/zasdbgovl_blocked = new +var/global/obj/effect/zasdbg/mark/zasdbgovl_mark = new + +var/global/list/zasdbgovl_dirblock = list( + "north" = new /obj/effect/zasdbg/air_blocked/north, + "east" = new /obj/effect/zasdbg/air_blocked/east, + "south" = new /obj/effect/zasdbg/air_blocked/south, + "west" = new /obj/effect/zasdbg/air_blocked/west, +) +///Retrives the directional block indicator overlay for a given direction +#define ZAS_DIRECTIONAL_BLOCKER(d) (zasdbgovl_dirblock[dir2text(d)]) + +var/global/list/zasdbgovl_dirzoneblock = list( + "north" = new /obj/effect/zasdbg/zone_blocked/north, + "east" = new /obj/effect/zasdbg/zone_blocked/east, + "south" = new /obj/effect/zasdbg/zone_blocked/south, + "west" = new /obj/effect/zasdbg/zone_blocked/west, +) +///Retrieves the zone blocked debug overlay for a given direction +#define ZAS_ZONE_BLOCKER(d) (zasdbgovl_dirzoneblock[dir2text(d)]) + +/obj/effect/zasdbg + icon = 'icons/Testing/Zone.dmi' + invisibility = INVISIBILITY_OBSERVER + mouse_opacity = MOUSE_OPACITY_UNCLICKABLE + plane = EFFECTS_ABOVE_LIGHTING_PLANE + layer = FLY_LAYER + +/obj/effect/zasdbg/assigned + icon_state = "assigned" +/obj/effect/zasdbg/created + icon_state = "created" +/obj/effect/zasdbg/merged + icon_state = "merged" +/obj/effect/zasdbg/invalid_zone + icon_state = "invalid" +/obj/effect/zasdbg/blocked + icon_state = "fullblock" +/obj/effect/zasdbg/mark + icon_state = "mark" + +/obj/effect/zasdbg/zone_blocked + icon_state = "zoneblock" + +/obj/effect/zasdbg/zone_blocked/north + dir = NORTH +/obj/effect/zasdbg/zone_blocked/east + dir = EAST +/obj/effect/zasdbg/zone_blocked/south + dir = SOUTH +/obj/effect/zasdbg/zone_blocked/west + dir = WEST + +/obj/effect/zasdbg/air_blocked + icon_state = "block" + +/obj/effect/zasdbg/air_blocked/north + dir = NORTH +/obj/effect/zasdbg/air_blocked/east + dir = EAST +/obj/effect/zasdbg/air_blocked/south + dir = SOUTH +/obj/effect/zasdbg/air_blocked/west + dir = WEST + + +/turf/var/tmp/obj/effect/zasdbg/dbg_img +/turf/proc/dbg(obj/effect/zasdbg/img) + vis_contents -= dbg_img + vis_contents += img dbg_img = img /proc/soft_assert(thing,fail) - if(!thing) message_admins(fail) \ No newline at end of file + if(!thing) message_admins(fail) + +/datum/proc/zas_log(string) + return + +/turf/zas_log(string) + to_chat(world, "[SPAN_DEBUG("ZAS:")] ([src.x], [src.y], [src.z]): [string]") + +/connection/zas_log(string) + to_chat(world, "[SPAN_DEBUG("ZAS:")] connection output: [string]") + +/connection_edge/zas_log(string) + to_chat(world, "[SPAN_DEBUG("ZAS:")] connection edge output: [string]") +#endif diff --git a/code/modules/ZAS/Diagnostic.dm b/code/modules/ZAS/Diagnostic.dm index 2aed37b9eb6..a8aa60dbf76 100644 --- a/code/modules/ZAS/Diagnostic.dm +++ b/code/modules/ZAS/Diagnostic.dm @@ -1,21 +1,18 @@ /client/proc/Zone_Info(turf/T as null|turf) set category = "Debug" - if(T) - if(istype(T,/turf/simulated) && T:zone) - T:zone:dbg_data(src) - else - to_chat(mob, "No zone here.") - var/datum/gas_mixture/mix = T.return_air() - to_chat(mob, "[mix.return_pressure()] kPa [mix.temperature]C") - for(var/g in mix.gas) - to_chat(mob, "[g]: [mix.gas[g]]\n") + if(!T) + return + if(istype(T,/turf/simulated) && T:zone) + T:zone:dbg_data(src) else - if(zone_debug_images) - for(var/zone in zone_debug_images) - images -= zone_debug_images[zone] - zone_debug_images = null + to_chat(mob, "ZONE: No zone here.") + var/datum/gas_mixture/mix = T.return_air() + to_chat(mob, "ZONE: [mix.return_pressure()] kPa [mix.temperature] k") + for(var/g in mix.gas) + to_chat(mob, "ZONE GASES: [g]: [mix.gas[g]]\n") -/client/var/list/zone_debug_images + if((T:zone && (length(T:zone:contents) > ZONE_MIN_SIZE))) + to_chat(mob, SPAN_NOTICE("This turf's zone is below the minimum size, and will merge over zone blockers.")) /client/proc/Test_ZAS_Connection(var/turf/simulated/T) set category = "Debug" @@ -37,6 +34,7 @@ return if(direction == "N/A") + to_chat(mob, "Testing self-blocking...") if(!(T.c_airblock(T) & AIR_BLOCKED)) to_chat(mob, "The turf can pass air! :D") else @@ -50,6 +48,7 @@ var/t_block = T.c_airblock(other_turf) var/o_block = other_turf.c_airblock(T) + to_chat(mob, "Testing connection between ([T.x], [T.y], [T.z]) and ([other_turf.x], [other_turf.y], [other_turf.z])...") if(o_block & AIR_BLOCKED) if(t_block & AIR_BLOCKED) to_chat(mob, "Neither turf can connect. :(") diff --git a/code/modules/ZAS/Turf.dm b/code/modules/ZAS/Turf.dm index f979389d9ca..1e6266e8961 100644 --- a/code/modules/ZAS/Turf.dm +++ b/code/modules/ZAS/Turf.dm @@ -1,8 +1,23 @@ + + +////Turf Vars//// +///The cached air mixture of a turf. Never directly access, use `return_air()`. +//This exists to store air during zone rebuilds, as well as for unsimulated turfs. +//They are never deleted to not overwhelm the garbage collector. +/turf/var/datum/gas_mixture/air +///Is this turf queued in the TURFS cycle of SSair? +/turf/var/needs_air_update = 0 + +////Simulated Turf Vars//// +///The turf's current zone. /turf/simulated/var/zone/zone +///All directions in which a turf that can contain air is present. /turf/simulated/var/open_directions -/turf/var/needs_air_update = 0 -/turf/var/datum/gas_mixture/air +#ifdef ZASDBG +///Set to TRUE during debugging to get descriptive to_chats of the object. Works for all atmos-related datums. +/turf/var/tmp/verbose = FALSE +#endif /turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) if(graphic_add && graphic_add.len) @@ -13,7 +28,11 @@ /turf/proc/update_air_properties() var/block = c_airblock(src) if(block & AIR_BLOCKED) - //dbg(blocked) + #ifdef ZASDBG + if(verbose) + zas_log("Self-blocked.") + dbg(zasdbgovl_blocked) + #endif return 1 #ifdef MULTIZAS @@ -30,7 +49,9 @@ block = unsim.c_airblock(src) if(block & AIR_BLOCKED) - //unsim.dbg(air_blocked, turn(180,d)) + #ifdef ZASDBG + //target.dbg(ZAS_DIRECTIONAL_BLOCKER(turn(d, 180))) + #endif continue var/r_block = c_airblock(unsim) @@ -101,8 +122,9 @@ var/s_block = c_airblock(src) if(s_block & AIR_BLOCKED) #ifdef ZASDBG - if(verbose) log_debug("Self-blocked.") - //dbg(blocked) + if(verbose) + zas_log("Self-blocked.") + dbg(zasdbgovl_blocked) #endif if(zone) var/zone/z = zone @@ -134,8 +156,9 @@ if(block & AIR_BLOCKED) #ifdef ZASDBG - if(verbose) log_debug("[d] is blocked.") - //unsim.dbg(air_blocked, turn(180,d)) + if(verbose) + zas_log("[dir2text(d)] is blocked.") + //dbg(ZAS_DIRECTIONAL_BLOCKER(d)) #endif continue @@ -144,8 +167,9 @@ if(r_block & AIR_BLOCKED) #ifdef ZASDBG - if(verbose) log_debug("[d] is blocked.") - //dbg(air_blocked, d) + if(verbose) + zas_log("[dir2text(d)] is blocked.") + //target.dbg(ZAS_DIRECTIONAL_BLOCKER(turn(d, 180))) #endif //Check that our zone hasn't been cut off recently. @@ -175,9 +199,9 @@ // we are blocking them and not blocking ourselves - this prevents tiny zones from forming on doorways. if(((block & ZONE_BLOCKED) && !(r_block & ZONE_BLOCKED)) || ((r_block & ZONE_BLOCKED) && !(s_block & ZONE_BLOCKED))) #ifdef ZASDBG - if(verbose) log_debug("[d] is zone blocked.") - - //dbg(zone_blocked, d) + if(verbose) + zas_log("[dir2text(d)] is zone blocked.") + //dbg(ZAS_ZONE_BLOCKER(d)) #endif //Postpone this tile rather than exit, since a connection can still be made. @@ -189,23 +213,27 @@ sim.zone.add(src) #ifdef ZASDBG - dbg(assigned) - if(verbose) log_debug("Added to [zone]") + dbg(zasdbgovl_assigned) + if(verbose) + zas_log("Added to [zone]") #endif else if(sim.zone != zone) #ifdef ZASDBG - if(verbose) log_debug("Connecting to [sim.zone]") + if(verbose) + zas_log("Connecting to [sim.zone]") #endif SSair.connect(src, sim) #ifdef ZASDBG - else if(verbose) log_debug("[d] has same zone.") + else if(verbose) + zas_log("[dir2text(d)] has same zone.") - else if(verbose) log_debug("[d] has invalid zone.") + else if(verbose) + zas_log("[dir2text(d)] has an invalid or rebuilding zone.") #endif else @@ -219,7 +247,9 @@ newzone.add(src) #ifdef ZASDBG - dbg(created) + dbg(zasdbgovl_created) + if(verbose) + zas_log("New zone created for src.") ASSERT(zone) #endif diff --git a/code/modules/ZAS/Zone.dm b/code/modules/ZAS/Zone.dm index ecfb2e7d0ab..d8e02922a47 100644 --- a/code/modules/ZAS/Zone.dm +++ b/code/modules/ZAS/Zone.dm @@ -63,7 +63,7 @@ Class Procs: #ifdef ZASDBG ASSERT(!invalid) ASSERT(istype(T)) - ASSERT(!SSair.has_valid_zone(T)) + ASSERT(!TURF_HAS_VALID_ZONE(T)) #endif var/datum/gas_mixture/turf_air = T.return_air() @@ -103,7 +103,7 @@ Class Procs: into.add(T) T.update_graphic(graphic_remove = air.graphic) #ifdef ZASDBG - T.dbg(merged) + T.dbg(zasdbgovl_merged) #endif //rebuild the old zone's edges so that they will be possessed by the new zone @@ -118,7 +118,7 @@ Class Procs: SSair.remove_zone(src) #ifdef ZASDBG for(var/turf/simulated/T in contents) - T.dbg(invalid_zone) + T.dbg(zasdbgovl_invalid_zone) #endif /zone/proc/rebuild() @@ -127,7 +127,6 @@ Class Procs: c_invalidate() for(var/turf/simulated/T in contents) T.update_graphic(graphic_remove = air.graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt - //T.dbg(invalid_zone) T.needs_air_update = 0 //Reset the marker so that it will be added to the list. SSair.mark_for_update(T) CHECK_TICK @@ -204,8 +203,7 @@ Class Procs: to_chat(M, "P: [air.return_pressure()] kPa V: [air.volume]L T: [air.temperature]°K ([air.temperature - T0C]°C)") to_chat(M, "O2 per N2: [(air.gas[/decl/material/gas/nitrogen] ? air.gas[/decl/material/gas/oxygen]/air.gas[/decl/material/gas/nitrogen] : "N/A")] Moles: [air.total_moles]") to_chat(M, "Simulated: [contents.len] ([air.group_multiplier])") -// to_chat(M, "Unsimulated: [unsimulated_contents.len]") -// to_chat(M, "Edges: [edges.len]") + to_chat(M, "Edges: [length(edges)]") if(invalid) to_chat(M, "Invalid!") var/zone_edges = 0 var/space_edges = 0 From 45ef5a44409b319ca13287d35cf7bfae5a79edbc Mon Sep 17 00:00:00 2001 From: NataKilar Date: Sat, 27 Aug 2022 12:01:51 -0400 Subject: [PATCH 0303/1518] Fixes ZAS debug on zoneless turf --- code/modules/admin/verbs/mapping.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 15d7725094b..097db5f34f7 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -211,7 +211,11 @@ var/global/list/debug_verbs = list ( var/turf/simulated/location = get_turf(usr) if(!istype(location, /turf/simulated)) - to_chat(src, "This debug tool can only be used while on a simulated turf.") + to_chat(src, SPAN_WARNING("This debug tool can only be used while on a simulated turf.")) + return + + if(!location.zone) + to_chat(src, SPAN_WARNING("The turf you are standing on does not have a zone.")) return if(!usedZAScolors) From a76fe4eabbd09315ca9381e0fe0955ebe238d3f7 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 28 Aug 2022 13:42:21 +1000 Subject: [PATCH 0304/1518] Automatic changelog generation for PR #2607 [ci skip] --- html/changelogs/AutoChangeLog-pr-2607.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2607.yml diff --git a/html/changelogs/AutoChangeLog-pr-2607.yml b/html/changelogs/AutoChangeLog-pr-2607.yml new file mode 100644 index 00000000000..6be7bcde23e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2607.yml @@ -0,0 +1,10 @@ +author: PsyCommando +delete-after: true +changes: + - tweak: Alarms have a built-in unbreakable tesla-link and don't need a console + screen and keyboard part anymore to be usable. + - tweak: Pipe meters have unbreakable built-in components now. + - tweak: Buttons have unbreakable tesla-link and transmitters/receiver in them now. + - tweak: Light switches have unbreakable tesla-links. + - tweak: Lights have unbreakable tesla-links in them now. + - tweak: Airlock sensors, and airlock access buttons have unbreakable parts now. From ed45f59f90cc77a4a157bf2235e95b97aacb60f4 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 28 Aug 2022 13:42:45 +1000 Subject: [PATCH 0305/1518] Automatic changelog generation for PR #2645 [ci skip] --- html/changelogs/AutoChangeLog-pr-2645.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2645.yml diff --git a/html/changelogs/AutoChangeLog-pr-2645.yml b/html/changelogs/AutoChangeLog-pr-2645.yml new file mode 100644 index 00000000000..a54381fabb3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2645.yml @@ -0,0 +1,5 @@ +author: PsyCommando +delete-after: true +changes: + - tweak: Tweaked police tape. Now called barricade tape, and the tape itself now + handles neighbours better. From 6be162fed543300ca14ec429a63cf0f61c9c4413 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 28 Aug 2022 14:01:54 +1000 Subject: [PATCH 0306/1518] Automatic changelog generation for PR #2482 [ci skip] --- html/changelogs/AutoChangeLog-pr-2482.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2482.yml diff --git a/html/changelogs/AutoChangeLog-pr-2482.yml b/html/changelogs/AutoChangeLog-pr-2482.yml new file mode 100644 index 00000000000..d95cce33829 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2482.yml @@ -0,0 +1,4 @@ +author: MistakeNot4892 +delete-after: true +changes: + - tweak: Overmap position updates ten times faster now. Exciting. From 50fe0d5516df106f766684eecf9c5bfc64f4c53b Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 28 Aug 2022 19:27:43 -0500 Subject: [PATCH 0307/1518] Fix cocktail descriptions, add sprite support --- code/__defines/flags.dm | 6 ++- code/modules/materials/_materials.dm | 13 ++++++ code/modules/reagents/Chemistry-Machinery.dm | 4 +- code/modules/reagents/cocktails.dm | 18 ++++++++ code/modules/reagents/reagent_containers.dm | 42 ++++++++++++------- .../reagents/reagent_containers/beaker.dm | 6 +-- .../drinkingglass/drinkingglass.dm | 15 +++++-- .../reagents/reagent_containers/drinks.dm | 8 ---- .../reagents/reagent_containers/glass.dm | 2 +- .../reagent_containers/glass/bottle.dm | 7 ++-- mods/content/bigpharma/_bigpharma.dm | 4 +- 11 files changed, 87 insertions(+), 38 deletions(-) diff --git a/code/__defines/flags.dm b/code/__defines/flags.dm index e5f89e3caaa..6dd5078baf7 100644 --- a/code/__defines/flags.dm +++ b/code/__defines/flags.dm @@ -91,4 +91,8 @@ The latter will result in a linter warning and will not work correctly. #define OVERMAP_SECTOR_BASE BITFLAG(0) // Whether or not this sector is a starting sector. Z levels contained in this sector are added to station_levels #define OVERMAP_SECTOR_KNOWN BITFLAG(1) // Makes the sector show up on nav computers #define OVERMAP_SECTOR_IN_SPACE BITFLAG(2) // If the sector can be accessed by drifting off the map edge -#define OVERMAP_SECTOR_UNTARGETABLE BITFLAG(3) // If the sector is untargetable by missiles. \ No newline at end of file +#define OVERMAP_SECTOR_UNTARGETABLE BITFLAG(3) // If the sector is untargetable by missiles. + +// Flags for reagent presentation (/obj/item/chems/var/presentation_flags) +#define PRESENTATION_FLAG_NAME BITFLAG(0) // This chems subtype presents the name of its main reagent/cocktail. +#define PRESENTATION_FLAG_DESC BITFLAG(1) // This chems subtype presents the description of its main reagent/cocktail. \ No newline at end of file diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 1e3178743f7..086282b88a5 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -687,6 +687,19 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) if(prop.reagents.has_reagent(/decl/material/solid/ice)) . = "iced [.]" +/decl/material/proc/get_presentation_desc(var/obj/item/prop) + . = glass_desc + if(prop?.reagents?.total_volume) + . = build_presentation_desc_from_reagents(prop, .) + +/decl/material/proc/build_presentation_desc_from_reagents(var/obj/item/prop, var/supplied) + . = supplied + + if(cocktail_ingredient) + for(var/decl/cocktail/cocktail in SSmaterials.get_cocktails_by_primary_ingredient(type)) + if(cocktail.matches(prop)) + return cocktail.get_presentation_desc(prop) + /decl/material/proc/neutron_interact(var/neutron_energy, var/total_interacted_units, var/total_units) . = list() // Returns associative list of interaction -> interacted units if(!length(neutron_interactions)) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 45d6f315b58..f1d3dc5c321 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -68,7 +68,7 @@ to_chat(user, SPAN_NOTICE("You add the pill bottle into the dispenser slot!")) updateUsrDialog() return TRUE - + return ..() /obj/machinery/chem_master/Topic(href, href_list, state) @@ -236,7 +236,7 @@ if(!name) name = reagents.get_primary_reagent_name() P.label_text = name - P.update_name_label() + P.update_container_name() P.lid_color = bottle_lid_color P.label_color = bottle_label_color reagents.trans_to_obj(P,60) diff --git a/code/modules/reagents/cocktails.dm b/code/modules/reagents/cocktails.dm index 8eca62fc051..34c812c68c1 100644 --- a/code/modules/reagents/cocktails.dm +++ b/code/modules/reagents/cocktails.dm @@ -18,6 +18,12 @@ var/order_specific = FALSE /// If TRUE, doesn't generate a codex entry. var/hidden_from_codex + /// The icon to use for the cocktail. May be null, in which case no custom icon is used. + var/icon/glass_icon + /// The icon_state to use for the cocktail. May be null, in which case the first state in the icon is used. + var/glass_icon_state + /// A list of types (incl. subtypes) to display this cocktail's glass sprite on. + var/display_types = list(/obj/item/chems/drinks/glass2) // Impurity tolerance gives a buffer for imprecise mixing, avoiding finnicky measurements // and allowing for things like spiked drinks. The default is 0.3, meaning aside from ice, @@ -44,6 +50,10 @@ if(prop?.reagents?.has_reagent(/decl/material/solid/ice) && !(/decl/material/solid/ice in ratios)) . = "[name], on the rocks" +/decl/cocktail/proc/get_presentation_desc(var/obj/item/prop) + . = description + // placeholder for future functionality (vapor/fizz/etc. descriptions) + /decl/cocktail/proc/mix_priority() . = length(ratios) @@ -66,6 +76,14 @@ return FALSE return TRUE +/decl/cocktail/proc/has_sprite(obj/item/prop) + // assumes we match, checks if we have (compatible) sprites + return !(isnull(glass_icon) || isnull(glass_icon_state)) + +/decl/cocktail/proc/can_use_sprite(obj/item/prop) + // assume we already match; just check types + return is_type_in_list(prop, display_types) + /decl/cocktail/grog name = "grog" description = "Watered-down rum. Pirate approved!" diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 0d883446f3e..8751986e7a0 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -6,11 +6,12 @@ w_class = ITEM_SIZE_SMALL var/base_name + var/base_desc var/amount_per_transfer_from_this = 5 var/possible_transfer_amounts = @"[5,10,15,25,30]" var/volume = 30 var/label_text - var/show_reagent_name = FALSE + var/presentation_flags = 0 /obj/item/chems/proc/cannot_interact(mob/user) if(!CanPhysicallyInteract(user)) @@ -26,14 +27,33 @@ base_name = initial(name) . = base_name -/obj/item/chems/on_reagent_change() - if(show_reagent_name) +/obj/item/chems/proc/update_container_name() + var/newname = get_base_name() + if(presentation_flags & PRESENTATION_FLAG_NAME) + var/decl/material/R = reagents?.get_primary_reagent_decl() + if(R) + newname += " of [R.get_presentation_name(src)]" + if(length(label_text)) + newname += " ([label_text])" + if(newname != name) + SetName(newname) + +/obj/item/chems/proc/get_base_desc() + if(!base_desc) + base_desc = initial(desc) + . = base_desc + +/obj/item/chems/proc/update_container_desc() + var/list/new_desc_list = list(get_base_desc()) + if(presentation_flags & PRESENTATION_FLAG_DESC) var/decl/material/R = reagents?.get_primary_reagent_decl() - var/newname = get_base_name() if(R) - newname = "[newname] of [R.get_presentation_name(src)]" - if(newname != name) - SetName(newname) + new_desc_list += R.get_presentation_desc(src) + desc = new_desc_list.Join("\n") + +/obj/item/chems/on_reagent_change() + update_container_name() + update_container_desc() update_icon() /obj/item/chems/verb/set_amount_per_transfer_from_this() @@ -66,16 +86,10 @@ else to_chat(user, "You set the label to \"[tmp_label]\".") label_text = tmp_label - update_name_label() + update_container_name() else return ..() -/obj/item/chems/proc/update_name_label() - if(!label_text || label_text == "") - SetName(get_base_name()) - else - SetName("[get_base_name()] ([label_text])") - /obj/item/chems/proc/standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target) // This goes into afterattack if(!istype(target)) return 0 diff --git a/code/modules/reagents/reagent_containers/beaker.dm b/code/modules/reagents/reagent_containers/beaker.dm index f1d3a34a8de..38202b397ea 100644 --- a/code/modules/reagents/reagent_containers/beaker.dm +++ b/code/modules/reagents/reagent_containers/beaker.dm @@ -10,7 +10,7 @@ applies_material_colour = TRUE material_force_multiplier = 0.25 atom_flags = ATOM_FLAG_OPEN_CONTAINER - show_reagent_name = TRUE + presentation_flags = PRESENTATION_FLAG_NAME var/lid_color = COLOR_BEASTY_BROWN /obj/item/chems/glass/beaker/Initialize() @@ -99,7 +99,7 @@ volume = 60 amount_per_transfer_from_this = 10 atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_NO_REACT - show_reagent_name = TRUE + presentation_flags = PRESENTATION_FLAG_NAME material = /decl/material/solid/metal/steel applies_material_name = FALSE applies_material_colour = FALSE @@ -149,7 +149,7 @@ matter = list(/decl/material/solid/plastic = MATTER_AMOUNT_REINFORCEMENT) possible_transfer_amounts = @"[5,10,15,30]" atom_flags = ATOM_FLAG_NO_TEMP_CHANGE | ATOM_FLAG_OPEN_CONTAINER - show_reagent_name = TRUE + presentation_flags = PRESENTATION_FLAG_NAME applies_material_colour = FALSE temperature_coefficient = 1 material = /decl/material/solid/metal/steel diff --git a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm index 2e41511b3ca..d5dac4523e0 100644 --- a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm @@ -29,7 +29,7 @@ var/global/const/DRINK_ICON_NOISY = "noise" amount_per_transfer_from_this = 5 possible_transfer_amounts = @"[5,10,15,30]" atom_flags = ATOM_FLAG_OPEN_CONTAINER - show_reagent_name = TRUE + presentation_flags = PRESENTATION_FLAG_NAME | PRESENTATION_FLAG_DESC temperature_coefficient = 4 item_flags = ITEM_FLAG_HOLLOW @@ -99,11 +99,12 @@ var/global/const/DRINK_ICON_NOISY = "noise" /obj/item/chems/drinks/glass2/get_base_name() . = base_name +/obj/item/chems/drinks/glass2/get_base_desc() + . = custom_desc || ..() + /obj/item/chems/drinks/glass2/on_reagent_change() temperature_coefficient = 4 / max(1, reagents.total_volume) ..() - var/decl/material/R = reagents.get_primary_reagent_decl() - desc = R?.glass_desc || custom_desc || initial(desc) /obj/item/chems/drinks/glass2/proc/can_add_extra(obj/item/glass_extra/GE) if(!("[base_icon]_[GE.glass_addition]left" in icon_states(icon))) @@ -127,9 +128,17 @@ var/global/const/DRINK_ICON_NOISY = "noise" /obj/item/chems/drinks/glass2/on_update_icon() . = ..() underlays.Cut() + icon_state = base_icon if (LAZYLEN(reagents?.reagent_volumes) > 0) var/decl/material/R = reagents.get_primary_reagent_decl() + if(R.cocktail_ingredient) + for(var/decl/cocktail/cocktail in SSmaterials.get_cocktails_by_primary_ingredient(R.type)) + if(cocktail.matches(src) && cocktail.has_sprite(src) && cocktail.can_use_sprite(src)) + icon_state = null // hide the main sprite + add_overlay(image(cocktail.glass_icon, cocktail.glass_icon_state)) + return // don't do the rest--todo semiprocedural cocktail sprites with fizz/ice/vapor + var/list/under_liquid = list() var/list/over_liquid = list() diff --git a/code/modules/reagents/reagent_containers/drinks.dm b/code/modules/reagents/reagent_containers/drinks.dm index 9a47a2e7eb0..276ee0e4652 100644 --- a/code/modules/reagents/reagent_containers/drinks.dm +++ b/code/modules/reagents/reagent_containers/drinks.dm @@ -102,19 +102,11 @@ /obj/item/chems/drinks/get_base_name() . = base_name -/obj/item/chems/drinks/on_reagent_change() - . = ..() - var/decl/material/R = reagents.get_primary_reagent_decl() - desc = R?.glass_desc || initial(desc) - /obj/item/chems/drinks/on_update_icon() . = ..() if(LAZYLEN(reagents.reagent_volumes)) if(filling_states) add_overlay(overlay_image(icon, "[base_icon][get_filling_state()]", reagents.get_color())) - else - SetName(initial(name)) - desc = initial(desc) //////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 11a1ea0baaa..a0a4f7b5332 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -117,7 +117,7 @@ possible_transfer_amounts = @"[10,20,30,60,120,150,180]" volume = 180 atom_flags = ATOM_FLAG_OPEN_CONTAINER - show_reagent_name = TRUE + presentation_flags = PRESENTATION_FLAG_NAME unacidable = 0 material = /decl/material/solid/plastic material_force_multiplier = 0.2 diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm index 95d76e2df3f..85284369d0a 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle.dm @@ -38,7 +38,7 @@ /obj/item/chems/glass/bottle/on_update_icon() ..() cut_overlays() - + if(reagents?.total_volume) var/percent = round(reagents.total_volume / volume * 100, 25) add_overlay(mutable_appearance(icon, "[icon_state]_filling_[percent]", reagents.get_color())) @@ -57,7 +57,7 @@ if (!ATOM_IS_OPEN_CONTAINER(src)) add_overlay(mutable_appearance(icon, "[icon_state]_lid", lid_color)) - + compile_overlays() /obj/item/chems/glass/bottle/Initialize() @@ -68,8 +68,7 @@ if(autolabel && !label_text) // don't override preset labels var/decl/material/R = GET_DECL(initial_reagents[1]) label_text = R.name - if(label_text) - update_name_label() + update_container_name() update_icon() /obj/item/chems/glass/bottle/stabilizer diff --git a/mods/content/bigpharma/_bigpharma.dm b/mods/content/bigpharma/_bigpharma.dm index 4da4b1cb0e0..84d4261be22 100644 --- a/mods/content/bigpharma/_bigpharma.dm +++ b/mods/content/bigpharma/_bigpharma.dm @@ -43,9 +43,9 @@ var/global/list/reagent_names_to_icon_state if(istype(thing, /obj/item/chems)) var/obj/item/chems/chems = thing chems.label_text = new_name - chems.update_name_label() + chems.update_container_name() else thing.SetName(new_name) if(meds.container_description) thing.desc = meds.container_description - thing.update_icon() + thing.update_icon() From f43ad40c22c74fae6b0343e1007ebb37adeba938 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Mon, 29 Aug 2022 00:56:54 +0000 Subject: [PATCH 0308/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 16 ++++++++++++++++ html/changelogs/.all_changelog.yml | 13 +++++++++++++ html/changelogs/AutoChangeLog-pr-2482.yml | 4 ---- html/changelogs/AutoChangeLog-pr-2607.yml | 10 ---------- html/changelogs/AutoChangeLog-pr-2645.yml | 5 ----- 5 files changed, 29 insertions(+), 19 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2482.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2607.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2645.yml diff --git a/html/changelog.html b/html/changelog.html index a508dca27d1..9c0a869b72e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,22 @@ -->
    +

    29 August 2022

    +

    MistakeNot4892 updated:

    +
      +
    • Overmap position updates ten times faster now. Exciting.
    • +
    +

    PsyCommando updated:

    +
      +
    • Alarms have a built-in unbreakable tesla-link and don't need a console screen and keyboard part anymore to be usable.
    • +
    • Pipe meters have unbreakable built-in components now.
    • +
    • Buttons have unbreakable tesla-link and transmitters/receiver in them now.
    • +
    • Light switches have unbreakable tesla-links.
    • +
    • Lights have unbreakable tesla-links in them now.
    • +
    • Airlock sensors, and airlock access buttons have unbreakable parts now.
    • +
    • Tweaked police tape. Now called barricade tape, and the tape itself now handles neighbours better.
    • +
    +

    27 August 2022

    PsyCommando updated:

    diff --git a/nano/templates/design_database.tmpl b/nano/templates/design_database.tmpl index 66c27d00c95..f09a5415a94 100644 --- a/nano/templates/design_database.tmpl +++ b/nano/templates/design_database.tmpl @@ -10,7 +10,7 @@ {{:helper.link(data.disk_name, null, {'eject_disk' : 1})}} DataStored {{for data.disk_tech}} - {{:value.field}}{{:value.level}} + {{:value.field}}{{:value.level}} {{/for}} {{else}} {{:data.disk_name}} @@ -23,7 +23,7 @@ {{for data.tech_levels}} - + {{/for}}
    DataStored
    {{:value.field}}{{:value.level}}
    {{:value.field}}{{:value.level}}
    From 6a65d8081af496b576004a119ccb77a5b63d9cb9 Mon Sep 17 00:00:00 2001 From: jade-lavenza Date: Thu, 21 Jul 2022 02:54:42 -0500 Subject: [PATCH 0397/1518] Add null guard for user in AttachLabel --- code/datums/extensions/label.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/datums/extensions/label.dm b/code/datums/extensions/label.dm index e4e20c05717..cac50962cf0 100644 --- a/code/datums/extensions/label.dm +++ b/code/datums/extensions/label.dm @@ -20,8 +20,9 @@ atom_holder.verbs += /atom/proc/RemoveLabel LAZYADD(labels, label) - user.visible_message("\The [user] attaches a label to \the [atom_holder].", \ - "You attach a label, '[label]', to \the [atom_holder].") + if (user) + user.visible_message("\The [user] attaches a label to \the [atom_holder].", \ + "You attach a label, '[label]', to \the [atom_holder].") var/old_name = atom_holder.name atom_holder.name = "[atom_holder.name] ([label])" From 246c7631907634a3ebafa8e86130bb1c66e326cb Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 20 Sep 2022 11:26:15 +1000 Subject: [PATCH 0398/1518] Requested changes. --- code/game/machinery/bodyscanner_display.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/bodyscanner_display.dm b/code/game/machinery/bodyscanner_display.dm index 2d6238ba64e..0643635724e 100644 --- a/code/game/machinery/bodyscanner_display.dm +++ b/code/game/machinery/bodyscanner_display.dm @@ -23,7 +23,7 @@ /obj/machinery/body_scan_display/on_update_icon() . = ..() cut_overlays() - if(powered()) + if(!(stat & (BROKEN|NOPOWER))) add_overlay("operating") /obj/machinery/body_scan_display/OnTopic(mob/user, href_list) From 4674453e76b302897ee9e69ef5ee658da8a7b4e1 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 2 Oct 2022 00:13:04 +1000 Subject: [PATCH 0399/1518] Requested changes for unused var removal PR. --- code/game/objects/item.dm | 3 +++ code/game/objects/items/weapons/cards_ids.dm | 3 +++ .../integrated_electronics/core/assemblies.dm | 2 ++ .../integrated_electronics/core/detailer.dm | 15 ++++++--------- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/code/game/objects/item.dm b/code/game/objects/item.dm index 10af056fcf8..cba82bfb785 100644 --- a/code/game/objects/item.dm +++ b/code/game/objects/item.dm @@ -1002,3 +1002,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. /obj/item/proc/gives_weather_protection() return FALSE + +/obj/item/proc/get_assembly_detail_color() + return diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 8a8d1936dbc..25f62bce15a 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -78,6 +78,9 @@ desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one inexplicibly looks like a floppy disk." icon_state = "data_3" +/obj/item/card/data/get_assembly_detail_color() + return detail_color + /* * ID CARDS */ diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 28fa7e0bfd1..96e12977f35 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -160,6 +160,8 @@ if(listed_components) show_browser(user, jointext(HTML,null), "window=closed-assembly-\ref[src];size=600x350;border=1;can_resize=1;can_close=1;can_minimize=1") +/obj/item/electronic_assembly/get_assembly_detail_color() + return detail_color /obj/item/electronic_assembly/proc/open_interact(mob/user) var/total_part_size = return_total_size() diff --git a/code/modules/integrated_electronics/core/detailer.dm b/code/modules/integrated_electronics/core/detailer.dm index a725705bd1d..a1aba195f84 100644 --- a/code/modules/integrated_electronics/core/detailer.dm +++ b/code/modules/integrated_electronics/core/detailer.dm @@ -66,12 +66,9 @@ to_chat(user, "You set \the [src]'s detailing color to match [target.name] \[Ref\]. The color matcher is \ now off.") scanning_color = FALSE - if(istype(target, /obj/item/electronic_assembly)) - var/obj/item/electronic_assembly/target_assembly = target - detail_color = target_assembly.detail_color - if(istype(target, /obj/item/card/data)) - var/obj/item/card/data/target_card = target - detail_color = target_card.detail_color - if(istype(target, /obj/item/integrated_electronics/detailer)) // why you'd want to copy off of another detailer, i wouldn't know - var/obj/item/integrated_electronics/detailer/target_detailer = target - detail_color = target_detailer.detail_color + if(isitem(target)) + var/obj/item/I = target + detail_color = I.get_assembly_detail_color() + +/obj/item/integrated_electronics/detailer/get_assembly_detail_color() + return detail_color From ba32c214294b2628ad8eae63ed7a4fc7a6992a0b Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 2 Oct 2022 01:05:55 +0000 Subject: [PATCH 0400/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-2706.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2706.yml diff --git a/html/changelog.html b/html/changelog.html index eb753d4faed..ac42847bbe9 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
    +

    02 October 2022

    +

    Penelope Haze updated:

    +
      +
    • Drinking smaller amounts makes you more sensitive to tastes
    • +
    +

    24 September 2022

    PsyCommando updated:

    From 314a90bd5cb7012fd8643af221a3ebcd5fa1468e Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 13 Jan 2023 14:59:52 +1100 Subject: [PATCH 0868/1518] Automatic changelog generation for PR #2866 [ci skip] --- html/changelogs/AutoChangeLog-pr-2866.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2866.yml diff --git a/html/changelogs/AutoChangeLog-pr-2866.yml b/html/changelogs/AutoChangeLog-pr-2866.yml new file mode 100644 index 00000000000..b012b9f806c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2866.yml @@ -0,0 +1,4 @@ +author: MistakeNot4892 +delete-after: true +changes: + - tweak: Randomize Appearance is back. From cbf14a4a7a6058789bb5b68c50e20f67df5fc457 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 13 Jan 2023 15:31:16 +1100 Subject: [PATCH 0869/1518] Improving some aspects of chemsmoke code. --- code/game/objects/effects/chem/chemsmoke.dm | 20 ++++++++++---------- code/game/objects/effects/effect_system.dm | 6 +++++- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index 0a9894fb4b1..793495489c4 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -34,8 +34,7 @@ /obj/effect/effect/smoke/chem/Destroy() walk(src, 0) // Because we might have called walk_to, we must stop the walk loop or BYOND keeps an internal reference to us forever. set_opacity(0) - // TODO - fadeOut() sleeps. Sleeping in /Destroy is Bad, this needs to be fixed. - fadeOut() + set_density(0) return ..() /obj/effect/effect/smoke/chem/Move() @@ -62,14 +61,15 @@ reagents.splash(AM, splash_amount, copy = 1) // Fades out the smoke smoothly using it's alpha variable. -/obj/effect/effect/smoke/chem/proc/fadeOut(var/frames = 16) - if(!alpha) return //already transparent - - frames = max(frames, 1) //We will just assume that by 0 frames, the coder meant "during one frame". - var/alpha_step = round(alpha / frames) - while(alpha > 0) - alpha = max(0, alpha - alpha_step) - sleep(world.tick_lag) +/obj/effect/effect/smoke/chem/end_of_life() + if(QDELETED(src)) + return + walk(src, 0) // Because we might have called walk_to, we must stop the walk loop or BYOND keeps an internal reference to us forever. + set_opacity(0) + set_density(0) + animate(src, alpha = 0, time = 0.5 SECONDS) + sleep(0.5 SECONDS) + ..() ///////////////////////////////////////////// // Chem Smoke Effect System diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index a7f89209c25..631699a672f 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -182,7 +182,11 @@ steam.start() -- spawns the effect . = ..() if(smoke_duration) time_to_live = smoke_duration - QDEL_IN(src, time_to_live) + addtimer(CALLBACK(src, .proc/end_of_life), time_to_live) + +/obj/effect/effect/smoke/proc/end_of_life() + if(!QDELETED(src)) + qdel(src) /obj/effect/effect/smoke/Crossed(mob/living/carbon/M) ..() From 601918c14835bb58aaca6a8e99548bd2deed2657 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 14 Jan 2023 11:02:23 +1100 Subject: [PATCH 0870/1518] Uncomments spawnable type setting on forcefields. --- code/modules/xenoarcheaology/artifacts/effects/forcefield.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/xenoarcheaology/artifacts/effects/forcefield.dm b/code/modules/xenoarcheaology/artifacts/effects/forcefield.dm index 689ef93c4e9..f91243ca98a 100644 --- a/code/modules/xenoarcheaology/artifacts/effects/forcefield.dm +++ b/code/modules/xenoarcheaology/artifacts/effects/forcefield.dm @@ -51,7 +51,7 @@ strength = 1 density = 1 invisibility = 0 - //is_spawnable_type = FALSE + is_spawnable_type = FALSE var/datum/artifact_effect/forcefield/owner /obj/effect/energy_field/artifact/Initialize(var/ml, var/_owner) From 169458556912955b6555d6ed92b773202ff7f099 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sat, 14 Jan 2023 00:41:17 +0000 Subject: [PATCH 0871/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-2866.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2866.yml diff --git a/html/changelog.html b/html/changelog.html index 84562af656a..d521a1e91f8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
    +

    14 January 2023

    +

    MistakeNot4892 updated:

    +
      +
    • Randomize Appearance is back.
    • +
    +

    21 December 2022

    MistakeNot4892 updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 51cca5925d9..ce1207372cc 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14437,3 +14437,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2022-12-21: MistakeNot4892: - tweak: There is now a grace period on losing your brain before your mob will die. +2023-01-14: + MistakeNot4892: + - tweak: Randomize Appearance is back. diff --git a/html/changelogs/AutoChangeLog-pr-2866.yml b/html/changelogs/AutoChangeLog-pr-2866.yml deleted file mode 100644 index b012b9f806c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2866.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: MistakeNot4892 -delete-after: true -changes: - - tweak: Randomize Appearance is back. From 2f5dd559315df609c82b451c4086c1a6ee64056e Mon Sep 17 00:00:00 2001 From: "natakilar@gmail.com" Date: Sun, 15 Jan 2023 13:34:08 -0500 Subject: [PATCH 0872/1518] Fixes items appearing heavily damaged --- code/game/objects/item.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/item.dm b/code/game/objects/item.dm index 7bc1e480e84..85bf7013cd2 100644 --- a/code/game/objects/item.dm +++ b/code/game/objects/item.dm @@ -208,7 +208,7 @@ var/desc_comp = "" //For "description composite" desc_comp += "It is a [w_class_description()] item." - var/desc_damage = get_examined_damage_string() + var/desc_damage = get_examined_damage_string(health / max_health) if(length(desc_damage)) desc_comp += "
      [desc_damage]" From decf43319692299aeaddb896b08b4beb6c2c207d Mon Sep 17 00:00:00 2001 From: NataKilar Date: Fri, 3 Dec 2021 23:11:34 -0500 Subject: [PATCH 0873/1518] Adds projectile weapons for mechs --- code/_onclick/MouseDrag.dm | 18 +- .../industrial/designs_exosuit_components.dm | 13 ++ code/modules/mechs/equipment/_equipment.dm | 6 + .../mechs/equipment/combat_projectile.dm | 167 ++++++++++++++++++ code/modules/mechs/mech_interaction.dm | 34 +++- code/modules/mechs/mech_movement.dm | 4 +- code/modules/mechs/premade/combat.dm | 2 +- code/modules/projectiles/ammunition/boxes.dm | 12 +- code/modules/projectiles/gun.dm | 20 ++- code/modules/projectiles/guns/projectile.dm | 5 +- .../projectiles/guns/projectile/automatic.dm | 110 ++++++++++-- icons/mecha/mech_equipment.dmi | Bin 25272 -> 25397 bytes icons/obj/ammo.dmi | Bin 13635 -> 13910 bytes icons/obj/guns/machine.dmi | Bin 0 -> 806 bytes nebula.dme | 1 + 15 files changed, 362 insertions(+), 30 deletions(-) create mode 100644 code/modules/mechs/equipment/combat_projectile.dm create mode 100644 icons/obj/guns/machine.dmi diff --git a/code/_onclick/MouseDrag.dm b/code/_onclick/MouseDrag.dm index 4d971e86b69..1c683c63f42 100644 --- a/code/_onclick/MouseDrag.dm +++ b/code/_onclick/MouseDrag.dm @@ -1,5 +1,11 @@ //If we intercept it return true else return false -/atom/proc/RelayMouseDrag(atom/src_object, atom/over_object, src_location, over_location, src_control, over_control, params, var/mob/user) +/atom/proc/RelayMouseDrag(atom/src_object, atom/over_object, src_location, over_location, src_control, over_control, params, mob/user) + return FALSE + +/atom/proc/RelayMouseDown(atom/object, location, control, params, mob/user) + return FALSE + +/atom/proc/RelayMouseUp(atom/object, location, control, params, mob/user) return FALSE /mob/proc/OnMouseDrag(atom/src_object, atom/over_object, src_location, over_location, src_control, over_control, params) @@ -13,11 +19,21 @@ gun.set_autofire(over_object, src) /mob/proc/OnMouseDown(atom/object, location, control, params) + if(istype(loc, /atom)) + var/atom/A = loc + if(A.RelayMouseDown(object, location, control, params, src)) + return + var/obj/item/gun/gun = get_active_hand() if(a_intent == I_HURT && istype(object) && (isturf(object) || isturf(object.loc)) && !incapacitated() && istype(gun)) gun.set_autofire(object, src) /mob/proc/OnMouseUp(atom/object, location, control, params) + if(istype(loc, /atom)) + var/atom/A = loc + if(A.RelayMouseUp(object, location, control, params, src)) + return + var/obj/item/gun/gun = get_active_hand() if(istype(gun)) gun.clear_autofire() diff --git a/code/modules/fabrication/designs/industrial/designs_exosuit_components.dm b/code/modules/fabrication/designs/industrial/designs_exosuit_components.dm index 04fac032ffa..99d7e495d6c 100644 --- a/code/modules/fabrication/designs/industrial/designs_exosuit_components.dm +++ b/code/modules/fabrication/designs/industrial/designs_exosuit_components.dm @@ -96,6 +96,12 @@ /datum/fabricator_recipe/industrial/exosuit_gear/laser path = /obj/item/mech_equipment/mounted_system/taser/laser +/datum/fabricator_recipe/industrial/exosuit_gear/smg + path = /obj/item/mech_equipment/mounted_system/projectile + +/datum/fabricator_recipe/industrial/exosuit_gear/rifle + path = /obj/item/mech_equipment/mounted_system/projectile/assault_rifle + /datum/fabricator_recipe/industrial/exosuit_gear/rcd path = /obj/item/mech_equipment/mounted_system/rcd @@ -110,3 +116,10 @@ /datum/fabricator_recipe/industrial/exosuit_gear/mechshields path = /obj/item/mech_equipment/shields + +/datum/fabricator_recipe/industrial/exosuit_ammo + category = "Exosuit Ammunition" + path = /obj/item/ammo_magazine/mech/smg_top + +/datum/fabricator_recipe/industrial/exosuit_ammo + path = /obj/item/ammo_magazine/mech/rifle \ No newline at end of file diff --git a/code/modules/mechs/equipment/_equipment.dm b/code/modules/mechs/equipment/_equipment.dm index a730743041e..0822da56c1c 100644 --- a/code/modules/mechs/equipment/_equipment.dm +++ b/code/modules/mechs/equipment/_equipment.dm @@ -81,6 +81,12 @@ /obj/item/mech_equipment/proc/MouseDragInteraction() return 0 +/obj/item/mech_equipment/proc/MouseDownInteraction() + return 0 + +/obj/item/mech_equipment/proc/MouseUpInteraction() + return 0 + /obj/item/mech_equipment/mob_can_unequip(mob/M, slot, disable_warning) . = ..() if(. && owner) diff --git a/code/modules/mechs/equipment/combat_projectile.dm b/code/modules/mechs/equipment/combat_projectile.dm new file mode 100644 index 00000000000..07af8679c18 --- /dev/null +++ b/code/modules/mechs/equipment/combat_projectile.dm @@ -0,0 +1,167 @@ +/obj/item/mech_equipment/mounted_system/projectile/attackby(var/obj/item/O as obj, mob/user as mob) + var/obj/item/gun/projectile/automatic/A = holding + if(istype(O, /obj/item/crowbar)) + A.unload_ammo(user) + to_chat(user, SPAN_NOTICE("You remove the ammo magazine from the [src].")) + if(istype(O, A.magazine_type)) + A.load_ammo(O, user) + to_chat(user, SPAN_NOTICE("You load the ammo magazine into the [src].")) + +/obj/item/mech_equipment/mounted_system/projectile/attack_self(var/mob/user) + . = ..() + if(. && holding) + var/obj/item/gun/M = holding + return M.switch_firemodes(user) + +/obj/item/gun/projectile/automatic/get_hardpoint_status_value() + if(!isnull(ammo_magazine)) + return ammo_magazine.stored_ammo.len + else + return null + +/obj/item/gun/projectile/automatic/get_hardpoint_maptext() + if(!isnull(ammo_magazine)) + return "[ammo_magazine.stored_ammo.len]/[ammo_magazine.max_ammo]" + else + return 0 + +//Weapons below this. +/obj/item/mech_equipment/mounted_system/projectile + name = "mounted submachine gun" + icon_state = "mech_ballistic" + holding_type = /obj/item/gun/projectile/automatic/smg/mech + restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND) + restricted_software = list(MECH_SOFTWARE_WEAPONS) + +/obj/item/gun/projectile/automatic/smg/mech + magazine_type = /obj/item/ammo_magazine/mech/smg_top + allowed_magazines = /obj/item/ammo_magazine/mech/smg_top + one_hand_penalty = 0 + has_safety = FALSE + manual_unload = FALSE + firemodes = list( + list(mode_name="semi auto", burst=1, fire_delay=null, one_hand_penalty=0, burst_accuracy=null, dispersion=null), + list(mode_name="3-round bursts", burst=3, fire_delay=null, one_hand_penalty=0, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 1.6, 2.4, 2.4), autofire_enabled=0), + list(mode_name="short bursts", burst=5, fire_delay=null, one_hand_penalty=0, burst_accuracy=list(0,-1,-1,-1,-2), dispersion=list(1.6, 1.6, 2.0, 2.0, 2.4), autofire_enabled=0), + list(mode_name="full auto", burst=1, fire_delay=null, burst_delay=1, one_hand_penalty=0, burst_accuracy=list(0,-1,-1,-1,-2), dispersion=list(1.6, 1.6, 2.0, 2.0, 2.4), autofire_enabled=1) + ) + +/obj/item/mech_equipment/mounted_system/projectile/assault_rifle + name = "mounted assault rifle" + icon_state = "mech_ballistic2" + holding_type = /obj/item/gun/projectile/automatic/assault_rifle/mech + restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND) + restricted_software = list(MECH_SOFTWARE_WEAPONS) + +/obj/item/gun/projectile/automatic/assault_rifle/mech + magazine_type = /obj/item/ammo_magazine/mech/rifle + allowed_magazines = /obj/item/ammo_magazine/mech/rifle + one_hand_penalty = 0 + has_safety = FALSE + manual_unload = FALSE + firemodes = list( + list(mode_name="semi auto", burst=1, fire_delay=null, one_hand_penalty=0, burst_accuracy=null, dispersion=null, autofire_enabled=0), + list(mode_name="3-round bursts", burst=3, fire_delay=null, one_hand_penalty=0, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0), autofire_enabled=0), + list(mode_name="full auto", burst=1, fire_delay=null, burst_delay=1, one_hand_penalty=0, burst_accuracy = list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0), autofire_enabled=1) + ) + +/obj/item/mech_equipment/mounted_system/projectile/machine + name = "mounted machine gun" + icon_state = "mech_machine_gun" + holding_type = /obj/item/gun/projectile/automatic/machine/mech + restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND) + restricted_software = list(MECH_SOFTWARE_WEAPONS) + +/obj/item/gun/projectile/automatic/machine/mech + magazine_type = /obj/item/ammo_magazine/mech/rifle/drum + allowed_magazines = /obj/item/ammo_magazine/mech/rifle/drum + one_hand_penalty = 0 + has_safety = FALSE + manual_unload = FALSE + +// Magazines below this. + +/obj/item/ammo_magazine/mech/attack_self(mob/user) + to_chat(user, SPAN_WARNING("It's pretty hard to extract ammo from a magazine that fits on a mech. You'll have to do it one round at a time.")) + return + +/obj/item/ammo_magazine/mech/smg_top + name = "large 7mm magazine" + desc = "A large magazine for a mech's gun. Looks way too big for a normal gun." + icon_state = "smg_top" + mag_type = MAGAZINE + ammo_type = /obj/item/ammo_casing/pistol/small + material = /decl/material/solid/metal/steel + caliber = CALIBER_PISTOL_SMALL + max_ammo = 90 + +/obj/item/ammo_magazine/mech/rifle + name = "large assault rifle magazine" + icon_state = "assault_rifle" + mag_type = MAGAZINE + caliber = CALIBER_RIFLE + material = /decl/material/solid/metal/steel + ammo_type = /obj/item/ammo_casing/rifle + max_ammo = 100 + +/obj/item/ammo_magazine/mech/rifle/drum + name = "large machine gun magazine" + icon_state = "drum" + mag_type = MAGAZINE + caliber = CALIBER_RIFLE + material = /decl/material/solid/metal/steel + ammo_type = /obj/item/ammo_casing/rifle + max_ammo = 300 + +// Handling for auto-fire mechanic +/mob/living/exosuit/can_autofire(obj/item/gun/autofiring, atom/autofiring_at) + if(autofiring.autofiring_by != src) + return FALSE + var/client/C + if(current_user) + C = current_user.client + if(current_user.incapacitated()) + return FALSE + else + C = client + if(incapacitated()) + return FALSE + if(!C || !(autofiring_at in view(C.view, src))) + return FALSE + if(!(get_dir(src, autofiring_at) & dir)) + return FALSE + if(!(autofiring in selected_system)) // Make sure the gun is still selected. + return FALSE + return TRUE + +/obj/item/mech_equipment/mounted_system/projectile/MouseDownInteraction(atom/object, location, control, params, mob/user) + var/obj/item/gun/gun = holding + if(user != src) + if(istype(object) && (isturf(object) || isturf(object.loc)) && !user.incapacitated() && istype(gun)) + gun.set_autofire(object, owner, FALSE) // Passed gun-firer is still the exosuit since all checks need to be done on the suit. + owner.current_user = user + else + if(istype(object) && (isturf(object) || isturf(object.loc)) && !owner.incapacitated() && istype(gun)) + gun.set_autofire(object, owner, FALSE) + owner.current_user = null + +/obj/item/mech_equipment/mounted_system/projectile/MouseUpInteraction(atom/object, location, control, params, mob/user) + var/obj/item/gun/gun = holding + if(istype(gun)) + gun.clear_autofire() + owner.current_user = null + +/obj/item/mech_equipment/mounted_system/projectile/MouseDragInteraction(atom/src_object, atom/over_object, src_location, over_location, src_control, over_control, params, mob/user) + var/obj/item/gun/gun = holding + if(!istype(gun)) + owner.current_user = null + return + if(user != owner) + if(user != owner.current_user) + gun.clear_autofire() + return + if(istype(over_object) && (isturf(over_object) || isturf(over_object.loc)) && !user.incapacitated() && istype(gun)) + gun.set_autofire(over_object, owner, FALSE) + else + if(istype(over_object) && (isturf(over_object) || isturf(over_object.loc)) && !owner.incapacitated() && istype(gun)) + gun.set_autofire(over_object, owner, FALSE) \ No newline at end of file diff --git a/code/modules/mechs/mech_interaction.dm b/code/modules/mechs/mech_interaction.dm index 5734a5088a9..940c791202b 100644 --- a/code/modules/mechs/mech_interaction.dm +++ b/code/modules/mechs/mech_interaction.dm @@ -9,12 +9,12 @@ return TRUE . = ..() -/mob/living/exosuit/RelayMouseDrag(src_object, over_object, src_location, over_location, src_control, over_control, params, var/mob/user) +/mob/living/exosuit/RelayMouseDrag(atom/src_object, atom/over_object, src_location, over_location, src_control, over_control, params, mob/user) if(user && (user in pilots) && user.loc == src) return OnMouseDrag(src_object, over_object, src_location, over_location, src_control, over_control, params, user) return ..() -/mob/living/exosuit/OnMouseDrag(src_object, over_object, src_location, over_location, src_control, over_control, params, var/mob/user) +/mob/living/exosuit/OnMouseDrag(atom/src_object, atom/over_object, src_location, over_location, src_control, over_control, params, mob/user) if(!user || incapacitated() || user.incapacitated()) return FALSE @@ -25,6 +25,36 @@ if(selected_system) return selected_system.MouseDragInteraction(src_object, over_object, src_location, over_location, src_control, over_control, params, user) +/mob/living/exosuit/RelayMouseDown(atom/object, location, control, params, mob/user) + if(user && (user in pilots) && user.loc == src) + return OnMouseDown(object, location, control, params, user) + return ..() + +/mob/living/exosuit/OnMouseDown(atom/object, location, control, params, mob/user) + if(!user || incapacitated() || user.incapacitated()) + return FALSE + + if(!(user in pilots) && user != src) + return FALSE + + if(selected_system) + return selected_system.MouseDownInteraction(object, location, control, params, user) + +/mob/living/exosuit/RelayMouseUp(atom/object, location, control, params, mob/user) + if(user && (user in pilots) && user.loc == src) + return OnMouseUp(object, location, control, params, user) + return ..() + +/mob/living/exosuit/OnMouseUp(atom/object, location, control, params, mob/user) + if(!user || incapacitated() || user.incapacitated()) + return FALSE + + if(!(user in pilots) && user != src) + return FALSE + + if(selected_system) + return selected_system.MouseUpInteraction(object, location, control, params, user) + /datum/click_handler/default/mech/OnClick(var/atom/A, var/params) var/mob/living/exosuit/E = user.loc if(!istype(E)) diff --git a/code/modules/mechs/mech_movement.dm b/code/modules/mechs/mech_movement.dm index 4347de5d8f6..408c5931744 100644 --- a/code/modules/mechs/mech_movement.dm +++ b/code/modules/mechs/mech_movement.dm @@ -155,7 +155,9 @@ anchored = 0 return FALSE -/mob/living/exosuit/check_space_footing()//mechs can't push off things to move around in space, they stick to hull or float away +/mob/living/exosuit/check_space_footing() //mechs can't push off things to move around in space, they stick to hull or float away + if(has_gravity()) + return TRUE for(var/thing in RANGE_TURFS(src, 1)) var/turf/T = thing if(T.density || T.is_wall() || T.is_floor()) diff --git a/code/modules/mechs/premade/combat.dm b/code/modules/mechs/premade/combat.dm index e9dc09437f6..ec7bc6b2688 100644 --- a/code/modules/mechs/premade/combat.dm +++ b/code/modules/mechs/premade/combat.dm @@ -17,7 +17,7 @@ /mob/living/exosuit/premade/combat/spawn_mech_equipment() ..() install_system(new /obj/item/mech_equipment/mounted_system/taser(src), HARDPOINT_LEFT_HAND) - install_system(new /obj/item/mech_equipment/mounted_system/taser/ion(src), HARDPOINT_RIGHT_HAND) + install_system(new /obj/item/mech_equipment/mounted_system/projectile/assault_rifle(src), HARDPOINT_RIGHT_HAND) install_system(new /obj/item/mech_equipment/flash(src), HARDPOINT_LEFT_SHOULDER) install_system(new /obj/item/mech_equipment/light(src), HARDPOINT_RIGHT_SHOULDER) diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index e97ded60a4c..090bd283b74 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -223,6 +223,16 @@ labels = list("practice") ammo_type = /obj/item/ammo_casing/rifle/practice +/obj/item/ammo_magazine/rifle/drum + name = "machine gun drum magazine" + icon_state = "drum" + origin_tech = "{'combat':2}" + mag_type = MAGAZINE + caliber = CALIBER_RIFLE + material = /decl/material/solid/metal/steel + ammo_type = /obj/item/ammo_casing/rifle + max_ammo = 100 + /obj/item/ammo_magazine/caps name = "speed loader" desc = "A cheap plastic speed loader for some kind of revolver." @@ -235,4 +245,4 @@ /obj/item/ammo_magazine/speedloader/laser_revolver caliber = CALIBER_PISTOL_LASBULB - ammo_type = /obj/item/ammo_casing/lasbulb \ No newline at end of file + ammo_type = /obj/item/ammo_casing/lasbulb diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 83d7e9d5383..f80d4ba9e46 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -109,7 +109,7 @@ /obj/item/gun/preserve_in_cryopod(var/obj/machinery/cryopod/pod) return TRUE -/obj/item/gun/proc/set_autofire(var/atom/fire_at, var/mob/fire_by) +/obj/item/gun/proc/set_autofire(var/atom/fire_at, var/mob/fire_by, var/autoturn = TRUE) . = TRUE if(!istype(fire_at) || !istype(fire_by)) . = FALSE @@ -121,7 +121,7 @@ autofiring_at = fire_at autofiring_by = fire_by if(!autofiring_timer) - autofiring_timer = addtimer(CALLBACK(src, .proc/handle_autofire), burst_delay, (TIMER_STOPPABLE | TIMER_LOOP | TIMER_UNIQUE | TIMER_OVERRIDE)) + autofiring_timer = addtimer(CALLBACK(src, .proc/handle_autofire, autoturn), burst_delay, (TIMER_STOPPABLE | TIMER_LOOP | TIMER_UNIQUE | TIMER_OVERRIDE)) else clear_autofire() @@ -132,19 +132,18 @@ deltimer(autofiring_timer) autofiring_timer = null -/obj/item/gun/proc/handle_autofire() +/obj/item/gun/proc/handle_autofire(var/autoturn) set waitfor = FALSE . = TRUE if(QDELETED(autofiring_at) || QDELETED(autofiring_by)) . = FALSE - else if(autofiring_by.get_active_hand() != src || autofiring_by.incapacitated()) - . = FALSE - else if(!autofiring_by.client || !(autofiring_by in view(autofiring_by.client.view, autofiring_by))) + else if(!autofiring_by.can_autofire(src, autofiring_at)) . = FALSE if(!.) clear_autofire() else if(can_autofire()) - autofiring_by.set_dir(get_dir(src, autofiring_at)) + if(autoturn) + autofiring_by.set_dir(get_dir(src, autofiring_at)) Fire(autofiring_at, autofiring_by, null, (get_dist(autofiring_at, autofiring_by) <= 1), FALSE, FALSE) /obj/item/gun/update_twohanding() @@ -690,3 +689,10 @@ Fire(aiming_at, M) if(M.aiming) M.aiming.toggle_active(FALSE, TRUE) + +/mob/proc/can_autofire(var/obj/item/gun/autofiring, var/atom/autofiring_at) + if(!client || !(autofiring_at in view(client.view,src))) + return FALSE + if(get_active_hand() != autofiring || incapacitated()) + return FALSE + return TRUE \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 129075a5519..23a570029b7 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -29,6 +29,7 @@ var/auto_eject_sound = null var/mag_insert_sound = 'sound/weapons/guns/interaction/pistol_magin.ogg' var/mag_remove_sound = 'sound/weapons/guns/interaction/pistol_magout.ogg' + var/manual_unload = TRUE //Whether or not the gun can be unloaded by hand. var/is_jammed = 0 //Whether this gun is jammed var/jam_chance = 0 //Chance it jams on fire @@ -217,11 +218,11 @@ /obj/item/gun/projectile/attack_self(mob/user) if(firemodes.len > 1) ..() - else + else if(manual_unload) unload_ammo(user) /obj/item/gun/projectile/attack_hand(mob/user) - if(user.is_holding_offhand(src)) + if(user.is_holding_offhand(src) && manual_unload) unload_ammo(user, allow_dump=0) else return ..() diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 80fee5c8f59..3333c9dc842 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -44,7 +44,7 @@ w_class = ITEM_SIZE_HUGE force = 10 caliber = CALIBER_RIFLE - origin_tech = "{'combat':8,'materials':3}" + origin_tech = "{'combat':7,'materials':3}" ammo_type = /obj/item/ammo_casing/rifle slot_flags = SLOT_BACK load_method = MAGAZINE @@ -64,6 +64,26 @@ /decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE ) + firemodes = list( + list(mode_name="semi auto", burst=1, fire_delay=null, one_hand_penalty=8, burst_accuracy=null, dispersion=null), + list(mode_name="3-round bursts", burst=3, fire_delay=null, one_hand_penalty=9, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)), + list(mode_name="full auto", burst=1, fire_delay=0, burst_delay=1, one_hand_penalty=7, burst_accuracy = list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0), autofire_enabled=1) + ) + +/obj/item/gun/projectile/automatic/assault_rifle/update_base_icon() + if(ammo_magazine) + if(ammo_magazine.stored_ammo.len) + icon_state = "[get_world_inventory_state()]-loaded" + else + icon_state = "[get_world_inventory_state()]-empty" + else + icon_state = get_world_inventory_state() + +/obj/item/gun/projectile/automatic/assault_rifle/grenade + name = "assault rifle" + desc = "The Z8 Bulldog is an older model bullpup carbine. This one has an underslung grenade launcher. REALLY makes you feel like a space marine when you hold it." + origin_tech = "{'combat':8,'materials':3}" + firemodes = list( list(mode_name="semi auto", burst=1, fire_delay=null, use_launcher=null, one_hand_penalty=8, burst_accuracy=null, dispersion=null), list(mode_name="3-round bursts", burst=3, fire_delay=null, use_launcher=null, one_hand_penalty=9, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)), @@ -74,23 +94,23 @@ var/use_launcher = 0 var/obj/item/gun/launcher/grenade/underslung/launcher -/obj/item/gun/projectile/automatic/assault_rifle/Initialize() +/obj/item/gun/projectile/automatic/assault_rifle/grenade/Initialize() . = ..() launcher = new(src) -/obj/item/gun/projectile/automatic/assault_rifle/attackby(obj/item/I, mob/user) +/obj/item/gun/projectile/automatic/assault_rifle/grenade/attackby(obj/item/I, mob/user) if((istype(I, /obj/item/grenade))) launcher.load(I, user) else ..() -/obj/item/gun/projectile/automatic/assault_rifle/attack_hand(mob/user) +/obj/item/gun/projectile/automatic/assault_rifle/grenade/attack_hand(mob/user) if(user.is_holding_offhand(src) && use_launcher) launcher.unload(user) else ..() -/obj/item/gun/projectile/automatic/assault_rifle/Fire(atom/target, mob/living/user, params, pointblank=0, reflex=0) +/obj/item/gun/projectile/automatic/assault_rifle/grenade/Fire(atom/target, mob/living/user, params, pointblank=0, reflex=0) if(use_launcher) launcher.Fire(target, user, params, pointblank, reflex) if(!launcher.chambered) @@ -98,18 +118,78 @@ else ..() -/obj/item/gun/projectile/automatic/assault_rifle/update_base_icon() - if(ammo_magazine) - if(ammo_magazine.stored_ammo.len) - icon_state = "[get_world_inventory_state()]-loaded" - else - icon_state = "[get_world_inventory_state()]-empty" - else - icon_state = get_world_inventory_state() - -/obj/item/gun/projectile/automatic/assault_rifle/examine(mob/user) +/obj/item/gun/projectile/automatic/assault_rifle/grenade/examine(mob/user) . = ..() if(launcher.chambered) to_chat(user, "\The [launcher] has \a [launcher.chambered] loaded.") else to_chat(user, "\The [launcher] is empty.") + +/obj/item/gun/projectile/automatic/assault_rifle/grenade/toggle_safety(mob/user) + . = ..() + launcher.toggle_safety() // Do not pass user to prevent double messages. + +// Admin-spawn machine gun. Mech subtype is meant to be used, but this can be spawned for hulks. +/obj/item/gun/projectile/automatic/machine + name = "massive machine gun" + desc = "The XC-67 \"Creosote\" is a massive machine gun, and ranks high on most tin-pot dictators' wish lists. Firing this thing without some sort of weapons platform is a hopeless task." + icon = 'icons/obj/guns/machine.dmi' + w_class = ITEM_SIZE_HUGE + force = 10 + caliber = CALIBER_RIFLE + origin_tech = "{'combat':9,'materials':3}" + ammo_type = /obj/item/ammo_casing/rifle + load_method = MAGAZINE + magazine_type = /obj/item/ammo_magazine/rifle/drum + allowed_magazines = /obj/item/ammo_magazine/rifle/drum + accuracy = 1 + accuracy_power = 7 + one_hand_penalty = 3000 + bulk = GUN_BULK_RIFLE + + burst_delay = 1 + burst = 3 + burst_accuracy = list(0,-1,-1) + dispersion = list(0.0, 0.6, 1.0) + + fire_delay = 0 + autofire_enabled = 1 + + mag_insert_sound = 'sound/weapons/guns/interaction/batrifle_magin.ogg' + mag_remove_sound = 'sound/weapons/guns/interaction/batrifle_magout.ogg' + material = /decl/material/solid/metal/steel + + var/spin_up_time = null + var/sound_token + +/obj/item/gun/projectile/automatic/machine/Fire(atom/target, mob/living/user, clickparams, pointblank, reflex, set_click_cooldown) + if(!spin_up_time || world.time < spin_up_time + 1 SECONDS) + return FALSE + . = ..() + +/obj/item/gun/projectile/automatic/machine/special_check(mob/user) + if(!istype(user, /mob/living)) + return FALSE + if(!user.check_dexterity(DEXTERITY_WEAPONS)) + return FALSE + + var/mob/living/M = user + if(!istype(M, /mob/living/exosuit)) + if(!(MUTATION_HULK in M.mutations)) + to_chat(user, SPAN_WARNING("You can barely lift \the [src], let alone fire it!")) + return FALSE + return TRUE + +/obj/item/gun/projectile/automatic/machine/set_autofire(atom/fire_at, mob/fire_by, autoturn) + if(!special_check(fire_by)) + return FALSE + . = ..() + if(. && !spin_up_time) + if(!sound_token) + sound_token = play_looping_sound(src, "machine_gun", 'sound/mecha/hydraulic.ogg', volume = 30) + spin_up_time = world.time + +/obj/item/gun/projectile/automatic/machine/clear_autofire() + . = ..() + spin_up_time = null + QDEL_NULL(sound_token) \ No newline at end of file diff --git a/icons/mecha/mech_equipment.dmi b/icons/mecha/mech_equipment.dmi index 7ab411ffecdd135db73f65afe22e623833276991..6f3198ad53515f105af05256663a4aabcbead903 100644 GIT binary patch delta 5752 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 JRmzwL{|9C=NxA?4 delta 5626 zcmZvgbyQSu-0g>y6cMCDLb^jbq`Nzmp(O-~amYhR2{MCp2?){+(hWn0LkW_S%Fx}s z^Ly{Q_pkfkS?fIKS!bPRfA?pf{i7eF34sA;#Xu&!UY)3Qm)W;Egmj)o|!$CINE&k$Tk|h zDeMOtI1jD0`|(AcVgxDBWJzsOS?OS?NlBMi57@f$h1@ zycd1P7v^x`SJmn+Y#SRNZi3>be8`+MO;xh!(>t;bXsa#`n~@I#%1BPa01q+J%JDK< z&Eu3~j>Y*>qN!aY!kMy=0uJKWwEi}QE*n9vhcJEWAUA_GVc5N@QT|k2sPfaPw7t4U z(Zm&nEL~Q`>@1l9J$)8u-A#+$>=~Z7G0T$|L_?g4HIwEK?|PSdWp@uq_TF3~A3!eO zD|hN}G2vR6%IS$|I&1*qee)Q;64NFL-tN)5V@2YsibBZKX|BBZ#P)UpYLj*$GE>B= zRt*-EIUY&I;R9i_@$0xy-Tvp-S`^R{Fqx>ndS&$8zvX7E?cnsLVo=S;9ORO!?F>|_Te)ec0Pce!ID`65#Bk^1LXp=|i);LHYklTJ(e&FEb3R^VWxyhO# zBENo6xM0)!Ij6J;NwJ)z*WlEBS*c?ov1WFj{63}K>*1z$ny)`68d92_8`pmdKN0@= zNb^>NM2*4gk&QSBo*G25MU*5OPHC2*z5k6g-HoT;KI=~*@OM!9WOs^TVojw+u}^Sf z{YSe1q}o<9q*(Xk@~H}a{jq4{2TZ!Zm!GxFgH&s${N(QhVIw00&RacZf3~FQ91rD% zzr3}cWeUuv^Q~(jYZo+au%*Uxvy^AWobD5}2vA5Cp)ItjT%QmfG3Bez+Mc8)Vp=`0 zIckpPdo_9Qe4K9DoGSxSIl&2yNWXvs0Uzne) zw%H)Pxt@w^jEjAa2B(!g4~hHx^{aiXFHv$Bd+_4<2dkY~+Fq(|O#4tCC3yok`w
    • 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 KQL0q13Hu*GN$m>& diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 4675377c351f4702404491022abf11ea6f3ff61d..aed587179330b09d0876eb81bc74b7958443c799 100644 GIT binary patch literal 13910 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 z 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 diff --git a/icons/obj/guns/machine.dmi b/icons/obj/guns/machine.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cf566eea211cfe48ecb03a58a979b2f7ddd7bce4 GIT binary patch literal 806 zcmV+>1KIqEP)!`nYF8}}l0d!JMQvg8b*k%9#0E>E5 zSad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1D@x2wg|OkOGD>q3^YSxO z6q52&Ds_u<@=M}#;xiKSkaU_5t+NQPPGtpGKNql90AK4rDRP;_c>n+c97#k$R9J=W zmc38HKp4ia)-N`%VSvpZ4!RLB#L>IA z7O`zY2OdCwDZ$btPyqLB9fL?1bsoddDOUIN-GM{`H+&3B#j81Gh9^^6ZKrhO|K|oBFR~0eUPOv{kk1P~ zOXFK?!h?KXEbi=*2l>2+@9YQ6knkX%7jeQKLJ1EvyoeLHA?AUO7edUC@Ic24+2@1@ kI$p%BL`d>L$BX}_FM>(Jo-={p!~g&Q07*qoM6N<$f) Date: Sat, 18 Dec 2021 11:21:55 -0500 Subject: [PATCH 0874/1518] Cleans up mech autofire logic --- .../mechs/equipment/combat_projectile.dm | 39 ++++++++++--------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/code/modules/mechs/equipment/combat_projectile.dm b/code/modules/mechs/equipment/combat_projectile.dm index 07af8679c18..b0af81339fc 100644 --- a/code/modules/mechs/equipment/combat_projectile.dm +++ b/code/modules/mechs/equipment/combat_projectile.dm @@ -16,14 +16,11 @@ /obj/item/gun/projectile/automatic/get_hardpoint_status_value() if(!isnull(ammo_magazine)) return ammo_magazine.stored_ammo.len - else - return null /obj/item/gun/projectile/automatic/get_hardpoint_maptext() if(!isnull(ammo_magazine)) return "[ammo_magazine.stored_ammo.len]/[ammo_magazine.max_ammo]" - else - return 0 + return 0 //Weapons below this. /obj/item/mech_equipment/mounted_system/projectile @@ -136,14 +133,15 @@ /obj/item/mech_equipment/mounted_system/projectile/MouseDownInteraction(atom/object, location, control, params, mob/user) var/obj/item/gun/gun = holding - if(user != src) - if(istype(object) && (isturf(object) || isturf(object.loc)) && !user.incapacitated() && istype(gun)) - gun.set_autofire(object, owner, FALSE) // Passed gun-firer is still the exosuit since all checks need to be done on the suit. - owner.current_user = user - else - if(istype(object) && (isturf(object) || isturf(object.loc)) && !owner.incapacitated() && istype(gun)) - gun.set_autofire(object, owner, FALSE) - owner.current_user = null + if(istype(object) && (isturf(object) || isturf(object.loc)) && istype(gun)) + if(user != src) + if(!user.incapacitated()) + gun.set_autofire(object, owner, FALSE) // Passed gun-firer is still the exosuit since all checks need to be done on the suit. + owner.current_user = user + else + if(!owner.incapacitated()) + gun.set_autofire(object, owner, FALSE) + owner.current_user = null /obj/item/mech_equipment/mounted_system/projectile/MouseUpInteraction(atom/object, location, control, params, mob/user) var/obj/item/gun/gun = holding @@ -156,12 +154,15 @@ if(!istype(gun)) owner.current_user = null return - if(user != owner) - if(user != owner.current_user) + if(istype(over_object) && (isturf(over_object) || isturf(over_object.loc))) + if(user != owner) + if(user != owner.current_user || user.incapacitated()) + gun.clear_autofire() + return + else if(owner.incapacitated()) gun.clear_autofire() return - if(istype(over_object) && (isturf(over_object) || isturf(over_object.loc)) && !user.incapacitated() && istype(gun)) - gun.set_autofire(over_object, owner, FALSE) - else - if(istype(over_object) && (isturf(over_object) || isturf(over_object.loc)) && !owner.incapacitated() && istype(gun)) - gun.set_autofire(over_object, owner, FALSE) \ No newline at end of file + gun.set_autofire(over_object, owner, FALSE) + return + + gun.clear_autofire() \ No newline at end of file From ee3554fd1b0879b0136b0dfd9e76b6866a4335ce Mon Sep 17 00:00:00 2001 From: "natakilar@gmail.com" Date: Sun, 15 Jan 2023 15:11:22 -0500 Subject: [PATCH 0875/1518] Adjusts checks for mounted projectile weapons --- code/_onclick/MouseDrag.dm | 6 +-- .../mechs/equipment/combat_projectile.dm | 40 +++++++++---------- code/modules/projectiles/guns/projectile.dm | 2 + .../projectiles/guns/projectile/automatic.dm | 9 ++--- 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/code/_onclick/MouseDrag.dm b/code/_onclick/MouseDrag.dm index 1c683c63f42..daf6a09accb 100644 --- a/code/_onclick/MouseDrag.dm +++ b/code/_onclick/MouseDrag.dm @@ -9,7 +9,7 @@ return FALSE /mob/proc/OnMouseDrag(atom/src_object, atom/over_object, src_location, over_location, src_control, over_control, params) - if(istype(loc, /atom)) + if(loc) var/atom/A = loc if(A.RelayMouseDrag(src_object, over_object, src_location, over_location, src_control, over_control, params, src)) return @@ -19,7 +19,7 @@ gun.set_autofire(over_object, src) /mob/proc/OnMouseDown(atom/object, location, control, params) - if(istype(loc, /atom)) + if(loc) var/atom/A = loc if(A.RelayMouseDown(object, location, control, params, src)) return @@ -29,7 +29,7 @@ gun.set_autofire(object, src) /mob/proc/OnMouseUp(atom/object, location, control, params) - if(istype(loc, /atom)) + if(loc) var/atom/A = loc if(A.RelayMouseUp(object, location, control, params, src)) return diff --git a/code/modules/mechs/equipment/combat_projectile.dm b/code/modules/mechs/equipment/combat_projectile.dm index b0af81339fc..f3748b03f90 100644 --- a/code/modules/mechs/equipment/combat_projectile.dm +++ b/code/modules/mechs/equipment/combat_projectile.dm @@ -1,9 +1,11 @@ -/obj/item/mech_equipment/mounted_system/projectile/attackby(var/obj/item/O as obj, mob/user as mob) +/obj/item/mech_equipment/mounted_system/projectile/attackby(var/obj/item/O, var/mob/user) var/obj/item/gun/projectile/automatic/A = holding + if(!istype(A)) + return if(istype(O, /obj/item/crowbar)) A.unload_ammo(user) to_chat(user, SPAN_NOTICE("You remove the ammo magazine from the [src].")) - if(istype(O, A.magazine_type)) + else if(istype(O, A.magazine_type)) A.load_ammo(O, user) to_chat(user, SPAN_NOTICE("You load the ammo magazine into the [src].")) @@ -29,6 +31,7 @@ holding_type = /obj/item/gun/projectile/automatic/smg/mech restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND) restricted_software = list(MECH_SOFTWARE_WEAPONS) + origin_tech = "{'programming':4,'combat':6,'engineering':5}" /obj/item/gun/projectile/automatic/smg/mech magazine_type = /obj/item/ammo_magazine/mech/smg_top @@ -49,6 +52,7 @@ holding_type = /obj/item/gun/projectile/automatic/assault_rifle/mech restricted_hardpoints = list(HARDPOINT_LEFT_HAND, HARDPOINT_RIGHT_HAND) restricted_software = list(MECH_SOFTWARE_WEAPONS) + origin_tech = "{'programming':4,'combat':8,'engineering':6}" /obj/item/gun/projectile/automatic/assault_rifle/mech magazine_type = /obj/item/ammo_magazine/mech/rifle @@ -114,16 +118,12 @@ /mob/living/exosuit/can_autofire(obj/item/gun/autofiring, atom/autofiring_at) if(autofiring.autofiring_by != src) return FALSE - var/client/C - if(current_user) - C = current_user.client - if(current_user.incapacitated()) - return FALSE - else - C = client - if(incapacitated()) - return FALSE - if(!C || !(autofiring_at in view(C.view, src))) + var/client/C = current_user ? current_user.client : client + + if(!C || !C.mob || C.mob.incapacitated()) + return FALSE + + if(!(autofiring_at in view(C.view, src))) return FALSE if(!(get_dir(src, autofiring_at) & dir)) return FALSE @@ -147,22 +147,22 @@ var/obj/item/gun/gun = holding if(istype(gun)) gun.clear_autofire() - owner.current_user = null + if(owner) // In case the owning exosuit has been gibbed etc. + owner.current_user = null /obj/item/mech_equipment/mounted_system/projectile/MouseDragInteraction(atom/src_object, atom/over_object, src_location, over_location, src_control, over_control, params, mob/user) var/obj/item/gun/gun = holding + if(!owner) + gun?.clear_autofire() + return if(!istype(gun)) - owner.current_user = null + owner?.current_user = null return if(istype(over_object) && (isturf(over_object) || isturf(over_object.loc))) - if(user != owner) - if(user != owner.current_user || user.incapacitated()) - gun.clear_autofire() - return - else if(owner.incapacitated()) + if(user.incapacitated() || (user != owner && user != owner.current_user)) gun.clear_autofire() return gun.set_autofire(over_object, owner, FALSE) return - + gun.clear_autofire() \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 23a570029b7..46bd66a2d08 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -220,6 +220,8 @@ ..() else if(manual_unload) unload_ammo(user) + else + to_chat(user, SPAN_WARNING("You can't unload \the [src] manually. Maybe try a crowbar?")) /obj/item/gun/projectile/attack_hand(mob/user) if(user.is_holding_offhand(src) && manual_unload) diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 3333c9dc842..227811e79da 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -83,7 +83,7 @@ name = "assault rifle" desc = "The Z8 Bulldog is an older model bullpup carbine. This one has an underslung grenade launcher. REALLY makes you feel like a space marine when you hold it." origin_tech = "{'combat':8,'materials':3}" - + firemodes = list( list(mode_name="semi auto", burst=1, fire_delay=null, use_launcher=null, one_hand_penalty=8, burst_accuracy=null, dispersion=null), list(mode_name="3-round bursts", burst=3, fire_delay=null, use_launcher=null, one_hand_penalty=9, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)), @@ -174,10 +174,9 @@ return FALSE var/mob/living/M = user - if(!istype(M, /mob/living/exosuit)) - if(!(MUTATION_HULK in M.mutations)) - to_chat(user, SPAN_WARNING("You can barely lift \the [src], let alone fire it!")) - return FALSE + if(M.mob_size < MOB_SIZE_LARGE) + to_chat(user, SPAN_WARNING("You can barely lift \the [src], let alone fire it!")) + return FALSE return TRUE /obj/item/gun/projectile/automatic/machine/set_autofire(atom/fire_at, mob/fire_by, autoturn) From 779ee4d6c4c1a12876bf8d034387b65e084b3bab Mon Sep 17 00:00:00 2001 From: "natakilar@gmail.com" Date: Sun, 15 Jan 2023 15:11:48 -0500 Subject: [PATCH 0876/1518] Adjusts costs for mounted exosuit equipment --- .../industrial/designs_exosuit_components.dm | 36 +++++++++++++------ code/modules/projectiles/guns/energy/laser.dm | 4 +++ .../projectiles/guns/energy/special.dm | 5 +++ code/modules/projectiles/guns/energy/stun.dm | 6 +++- 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/code/modules/fabrication/designs/industrial/designs_exosuit_components.dm b/code/modules/fabrication/designs/industrial/designs_exosuit_components.dm index 99d7e495d6c..1c4f1849691 100644 --- a/code/modules/fabrication/designs/industrial/designs_exosuit_components.dm +++ b/code/modules/fabrication/designs/industrial/designs_exosuit_components.dm @@ -84,37 +84,51 @@ /datum/fabricator_recipe/industrial/exosuit_gear/drill path = /obj/item/mech_equipment/drill -/datum/fabricator_recipe/industrial/exosuit_gear/taser +/datum/fabricator_recipe/industrial/exosuit_gear/mounted path = /obj/item/mech_equipment/mounted_system/taser -/datum/fabricator_recipe/industrial/exosuit_gear/plasma +// Add the resources from whatever is mounted on the system +/datum/fabricator_recipe/industrial/exosuit_gear/mounted/get_resources() + . = ..() + if(!ispath(path, /obj/item/mech_equipment/mounted_system)) + return + var/obj/item/mech_equipment/mounted_system/system = path + + var/mounted_type = initial(system.holding_type) + if(!mounted_type) + return + var/list/mounted_cost = atom_info_repository.get_matter_for(mounted_type) + for(var/mat in mounted_cost) + resources[mat] += mounted_cost[mat] * FABRICATOR_EXTRA_COST_FACTOR + +/datum/fabricator_recipe/industrial/exosuit_gear/mounted/plasma path = /obj/item/mech_equipment/mounted_system/taser/plasma -/datum/fabricator_recipe/industrial/exosuit_gear/ion +/datum/fabricator_recipe/industrial/exosuit_gear/mounted/ion path = /obj/item/mech_equipment/mounted_system/taser/ion -/datum/fabricator_recipe/industrial/exosuit_gear/laser +/datum/fabricator_recipe/industrial/exosuit_gear/mounted/laser path = /obj/item/mech_equipment/mounted_system/taser/laser -/datum/fabricator_recipe/industrial/exosuit_gear/smg +/datum/fabricator_recipe/industrial/exosuit_gear/mounted/smg path = /obj/item/mech_equipment/mounted_system/projectile -/datum/fabricator_recipe/industrial/exosuit_gear/rifle +/datum/fabricator_recipe/industrial/exosuit_gear/mounted/rifle path = /obj/item/mech_equipment/mounted_system/projectile/assault_rifle -/datum/fabricator_recipe/industrial/exosuit_gear/rcd +/datum/fabricator_recipe/industrial/exosuit_gear/mounted/rcd path = /obj/item/mech_equipment/mounted_system/rcd -/datum/fabricator_recipe/industrial/exosuit_gear/floodlight +/datum/fabricator_recipe/industrial/exosuit_gear/mounted/floodlight path = /obj/item/mech_equipment/light -/datum/fabricator_recipe/industrial/exosuit_gear/sleeper +/datum/fabricator_recipe/industrial/exosuit_gear/mounted/sleeper path = /obj/item/mech_equipment/sleeper -/datum/fabricator_recipe/industrial/exosuit_gear/extinguisher +/datum/fabricator_recipe/industrial/exosuit_gear/mounted/extinguisher path = /obj/item/mech_equipment/mounted_system/extinguisher -/datum/fabricator_recipe/industrial/exosuit_gear/mechshields +/datum/fabricator_recipe/industrial/exosuit_gear/mounted/mechshields path = /obj/item/mech_equipment/shields /datum/fabricator_recipe/industrial/exosuit_ammo diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 5e21a1d69a3..0d804ea7cee 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -11,6 +11,10 @@ origin_tech = "{'combat':3,'magnets':2}" material = /decl/material/solid/metal/steel projectile_type = /obj/item/projectile/beam/midlaser + matter = list( + /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT + ) /obj/item/gun/energy/laser/mounted self_recharge = 1 diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index df275721b29..cb4878d05f1 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -14,6 +14,11 @@ fire_delay = 30 projectile_type = /obj/item/projectile/ion combustion = 0 + material = /decl/material/solid/metal/steel + matter = list( + /decl/material/solid/metal/uranium = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/metal/gold = MATTER_AMOUNT_REINFORCEMENT + ) /obj/item/gun/energy/ionrifle/emp_act(severity) ..(max(severity, 2)) //so it doesn't EMP itself, I guess diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 54e02c8b3a6..ca42527292f 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -8,11 +8,15 @@ max_shots = 5 projectile_type = /obj/item/projectile/beam/stun combustion = 0 - firemodes = list( list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun), list(mode_name="shock", projectile_type=/obj/item/projectile/beam/stun/shock), ) + material = /decl/material/solid/metal/steel + matter = list( + /decl/material/solid/metal/aluminium = MATTER_AMOUNT_SECONDARY, + /decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT, + ) /obj/item/gun/energy/taser/mounted name = "mounted electrolaser" From 3052428332bc29450d7d15781353dfe0a5282552 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 16 Jan 2023 15:58:43 +1100 Subject: [PATCH 0877/1518] Allows forcing of a specific exoplanet type, mostly for debug. --- maps/~mapsystem/maps.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/maps/~mapsystem/maps.dm b/maps/~mapsystem/maps.dm index 5b79e29f1d6..c1f0f546f32 100644 --- a/maps/~mapsystem/maps.dm +++ b/maps/~mapsystem/maps.dm @@ -119,6 +119,7 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable var/id_hud_icons = 'icons/mob/hud.dmi' // Used by the ID HUD (primarily sechud) overlay. var/num_exoplanets = 0 + var/force_exoplanet_type // Used to override exoplanet weighting and always pick the same exoplanet. //dimensions of planet zlevels, defaults to world size if smaller, INCREASES world size if larger. //Due to how maps are generated, must be (2^n+1) e.g. 17,33,65,129 etc. Map will just round up to those if set to anything other. var/list/planet_size = list() @@ -278,6 +279,8 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable new_planet.build_level(planet_size[1], planet_size[2]) /datum/map/proc/pick_exoplanet() + if(force_exoplanet_type) + return force_exoplanet_type var/planets = list() for(var/T in subtypesof(/obj/effect/overmap/visitable/sector/exoplanet)) var/obj/effect/overmap/visitable/sector/exoplanet/planet_type = T From c84433ec3b248209ed1ee23d8c1fb58fbcfb76d3 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Tue, 17 Jan 2023 00:43:03 +0000 Subject: [PATCH 0878/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index d521a1e91f8..27d988da6bd 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -137,12 +137,6 @@

      MistakeNot4892 updated:

      • Liver and brain regeneration has been tweaked, and all internal organs will now regenerate slowly to a point.
      - -

      15 November 2022

      -

      PsyCommando updated:

      -
        -
      • Fix limb reattachment surgery not properly installing any contained internal organs once the last step was completed.
      • -
    From a6801ae313dfee69286f65c7bb2e5aa18280f2cc Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Tue, 17 Jan 2023 16:45:18 +1100 Subject: [PATCH 0879/1518] Automatic changelog generation for PR #2882 [ci skip] --- html/changelogs/AutoChangeLog-pr-2882.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2882.yml diff --git a/html/changelogs/AutoChangeLog-pr-2882.yml b/html/changelogs/AutoChangeLog-pr-2882.yml new file mode 100644 index 00000000000..db0d93dca10 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2882.yml @@ -0,0 +1,4 @@ +author: NataKilar +delete-after: true +changes: + - bugfix: Items no longer appear heavily damaged regardless of their health From d145b9c3e4aa1a1946c8bbb9b9083210d3818b7b Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 17 Jan 2023 18:20:13 +1100 Subject: [PATCH 0880/1518] Fixes and refactors for radio message_mode code. --- code/__defines/radio.dm | 7 + .../objects/items/devices/radio/headset.dm | 11 +- .../game/objects/items/devices/radio/radio.dm | 10 +- code/modules/mob/living/carbon/human/say.dm | 2 +- code/modules/mob/living/say.dm | 185 +++++++++--------- code/modules/mob/living/silicon/say.dm | 31 ++- .../simple_animal/hostile/retaliate/parrot.dm | 4 +- code/modules/mob/say.dm | 16 +- nebula.dme | 1 + 9 files changed, 139 insertions(+), 128 deletions(-) create mode 100644 code/__defines/radio.dm diff --git a/code/__defines/radio.dm b/code/__defines/radio.dm new file mode 100644 index 00000000000..1fec306b409 --- /dev/null +++ b/code/__defines/radio.dm @@ -0,0 +1,7 @@ +#define MESSAGE_MODE_LEFT "left" +#define MESSAGE_MODE_RIGHT "right" +#define MESSAGE_MODE_INTERCOM "intercom" +#define MESSAGE_MODE_DEFAULT "default" +#define MESSAGE_MODE_WHISPER "whisper" +#define MESSAGE_MODE_DEPARTMENT "department" +#define MESSAGE_MODE_SPECIAL "special" \ No newline at end of file diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index f6116a8eb48..2814ffd302a 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -49,12 +49,11 @@ to_chat(user, radio_desc) /obj/item/radio/headset/get_connection_from_message_mode(mob/living/M, message, message_mode) - if (message_mode == "special") - if (translate_binary) - var/decl/language/binary = GET_DECL(/decl/language/binary) - binary.broadcast(M, message) - return null - return ..() + if(message_mode == MESSAGE_MODE_SPECIAL && translate_binary) + var/decl/language/binary = GET_DECL(/decl/language/binary) + binary.broadcast(M, message) + else + return ..() /obj/item/radio/headset/receive_range(freq, level, aiOverride = 0) if (aiOverride) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index fb825fe0147..d9995736bb7 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -238,7 +238,7 @@ /obj/item/radio/proc/autosay(var/message, var/from, var/channel, var/sayverb = "states") //BS12 EDIT var/datum/radio_frequency/connection = null if(channel && channels && channels.len > 0) - if (channel == "department") + if (channel == MESSAGE_MODE_DEPARTMENT) channel = channels[1] connection = secure_radio_connections[channel] else @@ -254,12 +254,12 @@ // Interprets the message mode when talking into a radio, possibly returning a connection datum /obj/item/radio/proc/get_connection_from_message_mode(mob/living/M, message, message_mode) // If a channel isn't specified, send to common. - if(!message_mode || message_mode == "headset") + if(!message_mode || global.nondepartmental_message_modes[message_mode]) return radio_connection // Otherwise, if a channel is specified, look for it. if(channels && channels.len > 0) - if (message_mode == "department") // Department radio shortcut + if (message_mode == MESSAGE_MODE_DEPARTMENT) // Department radio shortcut message_mode = channels[1] if (channels[message_mode]) // only broadcast if the channel is set on @@ -287,7 +287,8 @@ to_chat(M, SPAN_WARNING("You're disrupted as you reach for \the [src].")) return 0 - if(istype(M)) M.trigger_aiming(TARGET_CAN_RADIO) + if(istype(M)) + M.trigger_aiming(TARGET_CAN_RADIO) // Uncommenting this. To the above comment: // The permacell radios aren't suppose to be able to transmit, this isn't a bug and this "fix" is just making radio wires useless. -Giacom @@ -297,7 +298,6 @@ if(!radio_connection) set_frequency(frequency) - if(power_usage) var/obj/item/cell/has_cell = get_cell() if(!has_cell) diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index d5339dae2ff..4f9051c39f3 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -114,7 +114,7 @@ return ..(message_data) /mob/living/carbon/human/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) - if(message_mode == "whisper") //It's going to get sanitized again immediately, so decode. + if(message_mode == MESSAGE_MODE_WHISPER) //It's going to get sanitized again immediately, so decode. whisper_say(html_decode(message), speaking, alt_name) return TRUE return ..() diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 427c30b7e22..23a45f9f914 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -1,79 +1,87 @@ var/global/list/department_radio_keys = list( - ":r" = "right ear", ".r" = "right ear", - ":l" = "left ear", ".l" = "left ear", - ":i" = "intercom", ".i" = "intercom", - ":h" = "department", ".h" = "department", - ":+" = "special", ".+" = "special", //activate radio-specific special functions - ":c" = "Command", ".c" = "Command", - ":n" = "Science", ".n" = "Science", - ":m" = "Medical", ".m" = "Medical", - ":e" = "Engineering", ".e" = "Engineering", - ":s" = "Security", ".s" = "Security", - ":w" = "whisper", ".w" = "whisper", - ":t" = "Mercenary", ".t" = "Mercenary", - ":x" = "Raider", ".x" = "Raider", - ":u" = "Supply", ".u" = "Supply", - ":v" = "Service", ".v" = "Service", - ":p" = "AI Private", ".p" = "AI Private", - ":z" = "Entertainment",".z" = "Entertainment", - ":y" = "Exploration", ".y" = "Exploration", - - ":R" = "right ear", ".R" = "right ear", - ":L" = "left ear", ".L" = "left ear", - ":I" = "intercom", ".I" = "intercom", - ":H" = "department", ".H" = "department", - ":C" = "Command", ".C" = "Command", - ":N" = "Science", ".N" = "Science", - ":M" = "Medical", ".M" = "Medical", - ":E" = "Engineering", ".E" = "Engineering", - ":S" = "Security", ".S" = "Security", - ":W" = "whisper", ".W" = "whisper", - ":T" = "Mercenary", ".T" = "Mercenary", - ":X" = "Raider", ".X" = "Raider", - ":U" = "Supply", ".U" = "Supply", - ":V" = "Service", ".V" = "Service", - ":P" = "AI Private", ".P" = "AI Private", - ":Z" = "Entertainment",".Z" = "Entertainment", - ":Y" = "Exploration", ".Y" = "Exploration", + ":r" = MESSAGE_MODE_RIGHT, ".r" = MESSAGE_MODE_RIGHT, + ":l" = MESSAGE_MODE_LEFT, ".l" = MESSAGE_MODE_LEFT, + ":i" = MESSAGE_MODE_INTERCOM, ".i" = MESSAGE_MODE_INTERCOM, + ":h" = MESSAGE_MODE_DEPARTMENT, ".h" = MESSAGE_MODE_DEPARTMENT, + ":+" = MESSAGE_MODE_SPECIAL, ".+" = MESSAGE_MODE_SPECIAL, //activate radio-specific special functions + ":w" = MESSAGE_MODE_WHISPER, ".w" = MESSAGE_MODE_WHISPER, + ":c" = "Command", ".c" = "Command", + ":n" = "Science", ".n" = "Science", + ":m" = "Medical", ".m" = "Medical", + ":e" = "Engineering", ".e" = "Engineering", + ":s" = "Security", ".s" = "Security", + ":t" = "Mercenary", ".t" = "Mercenary", + ":x" = "Raider", ".x" = "Raider", + ":u" = "Supply", ".u" = "Supply", + ":v" = "Service", ".v" = "Service", + ":p" = "AI Private", ".p" = "AI Private", + ":z" = "Entertainment", ".z" = "Entertainment", + ":y" = "Exploration", ".y" = "Exploration", + + ":R" = MESSAGE_MODE_RIGHT, ".R" = MESSAGE_MODE_RIGHT, + ":L" = MESSAGE_MODE_LEFT, ".L" = MESSAGE_MODE_LEFT, + ":I" = MESSAGE_MODE_INTERCOM, ".I" = MESSAGE_MODE_INTERCOM, + ":H" = MESSAGE_MODE_DEPARTMENT, ".H" = MESSAGE_MODE_DEPARTMENT, + ":W" = MESSAGE_MODE_WHISPER, ".W" = MESSAGE_MODE_WHISPER, + ":C" = "Command", ".C" = "Command", + ":N" = "Science", ".N" = "Science", + ":M" = "Medical", ".M" = "Medical", + ":E" = "Engineering", ".E" = "Engineering", + ":S" = "Security", ".S" = "Security", + ":T" = "Mercenary", ".T" = "Mercenary", + ":X" = "Raider", ".X" = "Raider", + ":U" = "Supply", ".U" = "Supply", + ":V" = "Service", ".V" = "Service", + ":P" = "AI Private", ".P" = "AI Private", + ":Z" = "Entertainment", ".Z" = "Entertainment", + ":Y" = "Exploration", ".Y" = "Exploration", //russian version below - ":к" = "right ear", ".к" = "right ear", - ":д" = "left ear", ".д" = "left ear", - ":ш" = "intercom", ".ш" = "intercom", - ":р" = "department", ".р" = "department", - ":с" = "Command", ".с" = "Command", - ":т" = "Science", ".т" = "Science", - ":ь" = "Medical", ".ь" = "Medical", - ":у" = "Engineering", ".у" = "Engineering", - ":ы" = "Security", ".ы" = "Security", - ":ц" = "whisper", ".ц" = "whisper", - ":е" = "Mercenary", ".е" = "Mercenary", - ":г" = "Supply", ".г" = "Supply", - ":ч" = "Raider", ".ч" = "Raider", - ":м" = "Service", ".м" = "Service", - ":з" = "AI Private", ".з" = "AI Private", - ":я" = "Entertainment",".я" = "Entertainment", - ":н" = "Exploration", ".н" = "Exploration", - - ":К" = "right ear", ".К" = "right ear", - ":Д" = "left ear", ".Д" = "left ear", - ":Ш" = "intercom", ".Ш" = "intercom", - ":Р" = "department", ".Р" = "department", - ":С" = "Command", ".С" = "Command", - ":Т" = "Science", ".Т" = "Science", - ":Ь" = "Medical", ".Ь" = "Medical", - ":У" = "Engineering", ".У" = "Engineering", - ":Ы" = "Security", ".Ы" = "Security", - ":Ц" = "whisper", ".Ц" = "whisper", - ":Е" = "Mercenary", ".Е" = "Mercenary", - ":Г" = "Supply", ".Г" = "Supply", - ":Ч" = "Raider", ".Ч" = "Raider", - ":М" = "Service", ".М" = "Service", - ":З" = "AI Private", ".З" = "AI Private", - ":Я" = "Entertainment",".Я" = "Entertainment", - ":Н" = "Exploration", ".Н" = "Exploration", + ":к" = MESSAGE_MODE_RIGHT, ".к" = MESSAGE_MODE_RIGHT, + ":д" = MESSAGE_MODE_LEFT, ".д" = MESSAGE_MODE_LEFT, + ":ш" = MESSAGE_MODE_INTERCOM, ".ш" = MESSAGE_MODE_INTERCOM, + ":р" = MESSAGE_MODE_DEPARTMENT, ".р" = MESSAGE_MODE_DEPARTMENT, + ":ц" = MESSAGE_MODE_WHISPER, ".ц" = MESSAGE_MODE_WHISPER, + ":с" = "Command", ".с" = "Command", + ":т" = "Science", ".т" = "Science", + ":ь" = "Medical", ".ь" = "Medical", + ":у" = "Engineering", ".у" = "Engineering", + ":ы" = "Security", ".ы" = "Security", + ":е" = "Mercenary", ".е" = "Mercenary", + ":г" = "Supply", ".г" = "Supply", + ":ч" = "Raider", ".ч" = "Raider", + ":м" = "Service", ".м" = "Service", + ":з" = "AI Private", ".з" = "AI Private", + ":я" = "Entertainment", ".я" = "Entertainment", + ":н" = "Exploration", ".н" = "Exploration", + + ":К" = MESSAGE_MODE_RIGHT, ".К" = MESSAGE_MODE_RIGHT, + ":Д" = MESSAGE_MODE_LEFT, ".Д" = MESSAGE_MODE_LEFT, + ":Ш" = MESSAGE_MODE_INTERCOM, ".Ш" = MESSAGE_MODE_INTERCOM, + ":Р" = MESSAGE_MODE_DEPARTMENT, ".Р" = MESSAGE_MODE_DEPARTMENT, + ":Ц" = MESSAGE_MODE_WHISPER, ".Ц" = MESSAGE_MODE_WHISPER, + ":С" = "Command", ".С" = "Command", + ":Т" = "Science", ".Т" = "Science", + ":Ь" = "Medical", ".Ь" = "Medical", + ":У" = "Engineering", ".У" = "Engineering", + ":Ы" = "Security", ".Ы" = "Security", + ":Е" = "Mercenary", ".Е" = "Mercenary", + ":Г" = "Supply", ".Г" = "Supply", + ":Ч" = "Raider", ".Ч" = "Raider", + ":М" = "Service", ".М" = "Service", + ":З" = "AI Private", ".З" = "AI Private", + ":Я" = "Entertainment", ".Я" = "Entertainment", + ":Н" = "Exploration", ".Н" = "Exploration", ) +// Assoc for lookup speed since this is in potentially semihot code +var/global/list/nondepartmental_message_modes = list( + MESSAGE_MODE_LEFT = TRUE, + MESSAGE_MODE_RIGHT = TRUE, + MESSAGE_MODE_INTERCOM = TRUE, + MESSAGE_MODE_DEFAULT = TRUE, + MESSAGE_MODE_WHISPER = TRUE +) var/global/list/channel_to_radio_key = new /proc/get_radio_key_from_channel(var/channel) @@ -143,12 +151,9 @@ var/global/list/channel_to_radio_key = new // determine relevancy. See handle_message_mode below. /mob/living/proc/get_radios(var/message_mode) - if(!message_mode) - return - var/list/possible_radios - if(message_mode == "right ear" || message_mode == "left ear") - var/use_right = message_mode == "right ear" + if(message_mode == MESSAGE_MODE_RIGHT || message_mode == MESSAGE_MODE_LEFT) + var/use_right = (message_mode == MESSAGE_MODE_RIGHT) var/obj/item/thing = get_equipped_item(use_right ? slot_r_ear_str : slot_l_ear_str) if(thing) LAZYDISTINCTADD(possible_radios, thing) @@ -156,13 +161,18 @@ var/global/list/channel_to_radio_key = new thing = get_equipped_item(use_right ? BP_R_HAND : BP_L_HAND) if(thing) LAZYDISTINCTADD(possible_radios, thing) - else + else if(message_mode == MESSAGE_MODE_INTERCOM) + if(!restrained()) + for(var/obj/item/radio/I in view(1)) + if(I.intercom_handling) + LAZYDISTINCTADD(possible_radios, I) + else if(message_mode != MESSAGE_MODE_WHISPER) for(var/slot in global.ear_slots) var/thing = get_equipped_item(slot) if(thing) LAZYDISTINCTADD(possible_radios, thing) - if(length(possible_radios)) + if(LAZYLEN(possible_radios)) for(var/atom/movable/thing as anything in possible_radios) var/obj/item/radio/radio = thing.get_radio(message_mode) if(istype(radio)) @@ -172,16 +182,15 @@ var/global/list/channel_to_radio_key = new // It then processes the message_mode to implement an additional behavior needed for the message, such // as retrieving radios or looking for an intercom nearby. /mob/living/proc/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) + if(!message_mode) + return var/list/assess_items_as_radios = get_radios(message_mode) - if(message_mode == "intercom" && !restrained()) - for(var/obj/item/radio/I in view(1)) - if(I.intercom_handling) - LAZYDISTINCTADD(assess_items_as_radios, I) - for(var/obj/item/radio/radio as anything in assess_items_as_radios) - used_radios += radio + if(!LAZYLEN(assess_items_as_radios)) + return + used_radios |= assess_items_as_radios + for(var/obj/item/radio/radio as anything in used_radios) radio.add_fingerprint(src) radio.talk_into(src, message, message_mode, verb, speaking) - . = TRUE /mob/living/proc/handle_speech_sound() var/list/returns[2] @@ -227,9 +236,9 @@ var/global/list/channel_to_radio_key = new return custom_emote(1, copytext(message,2)) //parse the radio code and consume it - var/message_mode = parse_message_mode(message, "headset") + var/message_mode = parse_message_mode(message) if (message_mode) - if (message_mode == "headset") + if (message_mode == MESSAGE_MODE_DEFAULT) message = copytext_char(message,2) //it would be really nice if the parse procs could do this for us. else message = copytext_char(message,3) @@ -281,7 +290,7 @@ var/global/list/channel_to_radio_key = new if(!message || message == "") return 0 - var/list/obj/item/used_radios = new + var/list/obj/item/used_radios = list() if(handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)) return 1 diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index e8c5bc12b5c..55521ad2cbf 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -8,30 +8,27 @@ if(message_mode) if(!is_component_functioning("radio")) to_chat(src, SPAN_WARNING("Your radio isn't functional at this time.")) - return FALSE - if(message_mode == "general") - message_mode = null - return silicon_radio.talk_into(src, message, message_mode, verb, speaking) + else + used_radios += silicon_radio + . = TRUE return ..() /mob/living/silicon/ai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) if(message_mode) - if(message_mode == "department") - return holopad_talk(message, verb, speaking) - if (ai_radio.disabledAi || !has_power() || stat) - to_chat(src, "System Error - Transceiver Disabled.") - return FALSE - if(message_mode == "general") - message_mode = null - return ai_radio.talk_into(src,message,message_mode,verb,speaking) - return ..() + if(message_mode == MESSAGE_MODE_DEPARTMENT) + holopad_talk(message, verb, speaking) + else if (ai_radio.disabledAi || !has_power() || stat) + to_chat(src, SPAN_DANGER("System Error - Transceiver Disabled.")) + else + used_radios += ai_radio + . = TRUE + ..() /mob/living/silicon/pai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) if(message_mode) - if(message_mode == "general") - message_mode = null - return silicon_radio.talk_into(src,message,message_mode,verb,speaking) - return ..() + used_radios += silicon_radio + . = TRUE + ..() /mob/living/silicon/say_quote(var/text) var/ending = copytext(text, length(text)) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm index ad5b6a71b6f..e4c0afb4db6 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm @@ -668,9 +668,9 @@ verb = pick(speak_emote) - var/message_mode="" + var/message_mode if(copytext(message,1,2) == get_prefix_key(/decl/prefix/radio_main_channel)) - message_mode = "headset" + message_mode = MESSAGE_MODE_DEFAULT message = copytext(message,2) if(length(message) >= 2) diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 10e7f46608a..b429a8169d7 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -67,15 +67,13 @@ //parses the message mode code (e.g. :h, :w) from text, such as that supplied to say. //returns the message mode string or null for no message mode. //standard mode is the mode returned for the special ';' radio code. -/mob/proc/parse_message_mode(var/message, var/standard_mode="headset") - if(length(message) >= 1 && copytext_char(message,1,2) == get_prefix_key(/decl/prefix/radio_main_channel)) - return standard_mode - - if(length(message) >= 2) - var/channel_prefix = copytext_char(message, 1 ,3) - return department_radio_keys[channel_prefix] - - return null +/mob/proc/parse_message_mode(var/message) + if(length(message) >= 1) + if(copytext_char(message,1,2) == get_prefix_key(/decl/prefix/radio_main_channel)) + return MESSAGE_MODE_DEFAULT + if(length(message) >= 2) + var/channel_prefix = copytext_char(message, 1, 3) + return department_radio_keys[channel_prefix] //parses the language code (e.g. :j) from text, such as that supplied to say. //returns the language object only if the code corresponds to a language that src can speak, otherwise null. diff --git a/nebula.dme b/nebula.dme index 511c4740be7..31e8f1a69a0 100644 --- a/nebula.dme +++ b/nebula.dme @@ -71,6 +71,7 @@ #include "code\__defines\power.dm" #include "code\__defines\proc_presets.dm" #include "code\__defines\qdel.dm" +#include "code\__defines\radio.dm" #include "code\__defines\research.dm" #include "code\__defines\ruin_tags.dm" #include "code\__defines\shields.dm" From c27de5b587b1e3344e55e985803bdcf3c72ef9fe Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 17 Jan 2023 19:43:12 +1100 Subject: [PATCH 0881/1518] Shuttle clearing landmarks now use shuttle size properly. --- code/game/turfs/exterior/exterior_barren.dm | 4 ---- code/modules/overmap/exoplanets/_exoplanet.dm | 7 ++++--- code/modules/shuttles/landmarks.dm | 4 +++- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/code/game/turfs/exterior/exterior_barren.dm b/code/game/turfs/exterior/exterior_barren.dm index 5e645d85950..5418b5331c6 100644 --- a/code/game/turfs/exterior/exterior_barren.dm +++ b/code/game/turfs/exterior/exterior_barren.dm @@ -7,7 +7,3 @@ . = ..() if(prob(20)) add_overlay(image('icons/turf/flooring/decals.dmi', "asteroid[rand(0,9)]")) - -/turf/exterior/barren/Initialize() - . = ..() - update_icon() \ No newline at end of file diff --git a/code/modules/overmap/exoplanets/_exoplanet.dm b/code/modules/overmap/exoplanets/_exoplanet.dm index 5e1fe842c73..4bd89d390a2 100644 --- a/code/modules/overmap/exoplanets/_exoplanet.dm +++ b/code/modules/overmap/exoplanets/_exoplanet.dm @@ -230,7 +230,8 @@ /obj/effect/overmap/visitable/sector/exoplanet/proc/generate_landing() var/places = list() var/attempts = 10*landing_points_to_place - var/border_padding = shuttle_size / 2 + 3 + var/landing_radius = CEILING(shuttle_size / 2) + var/border_padding = landing_radius + 3 while(landing_points_to_place) attempts-- @@ -241,7 +242,7 @@ if(attempts >= 0) // While we have the patience, try to find better spawn points. If out of patience, put them down wherever, so long as there are no repeats. var/valid = 1 - var/list/block_to_check = block(locate(T.x - shuttle_size / 2, T.y - shuttle_size / 2, T.z), locate(T.x + shuttle_size / 2, T.y + shuttle_size / 2, T.z)) + var/list/block_to_check = block(locate(T.x - landing_radius, T.y - landing_radius, T.z), locate(T.x + landing_radius, T.y + landing_radius, T.z)) for(var/turf/check in block_to_check) if(!istype(get_area(check), /area/exoplanet) || check.turf_flags & TURF_FLAG_NORUINS) valid = 0 @@ -255,7 +256,7 @@ landing_points_to_place-- places += T - new /obj/effect/shuttle_landmark/automatic/clearing(T) + new /obj/effect/shuttle_landmark/automatic/clearing(T, landing_radius) /obj/effect/overmap/visitable/sector/exoplanet/get_scan_data(mob/user) . = ..() diff --git a/code/modules/shuttles/landmarks.dm b/code/modules/shuttles/landmarks.dm index 95172c4e323..4758c863575 100644 --- a/code/modules/shuttles/landmarks.dm +++ b/code/modules/shuttles/landmarks.dm @@ -133,8 +133,10 @@ var/global/list/shuttle_landmarks = list() /obj/effect/shuttle_landmark/automatic/clearing var/radius = 10 -/obj/effect/shuttle_landmark/automatic/clearing/Initialize() +/obj/effect/shuttle_landmark/automatic/clearing/Initialize(var/ml, var/supplied_radius) ..() + if(!isnull(supplied_radius)) + radius = supplied_radius return INITIALIZE_HINT_LATELOAD /obj/effect/shuttle_landmark/automatic/clearing/LateInitialize() From da725d50e934e7e4b9ed03f44e73b390ce59d034 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Wed, 18 Jan 2023 00:44:29 +0000 Subject: [PATCH 0882/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-2882.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2882.yml diff --git a/html/changelog.html b/html/changelog.html index 27d988da6bd..dd76457d089 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
    +

    18 January 2023

    +

    NataKilar updated:

    +
      +
    • Items no longer appear heavily damaged regardless of their health
    • +
    +

    14 January 2023

    MistakeNot4892 updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index ce1207372cc..f9f60d933b1 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14440,3 +14440,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2023-01-14: MistakeNot4892: - tweak: Randomize Appearance is back. +2023-01-18: + NataKilar: + - bugfix: Items no longer appear heavily damaged regardless of their health diff --git a/html/changelogs/AutoChangeLog-pr-2882.yml b/html/changelogs/AutoChangeLog-pr-2882.yml deleted file mode 100644 index db0d93dca10..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2882.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: NataKilar -delete-after: true -changes: - - bugfix: Items no longer appear heavily damaged regardless of their health From 3c525fef7807cef896016e01eb2f01c264a69fde Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Thu, 19 Jan 2023 00:43:39 +0000 Subject: [PATCH 0883/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index dd76457d089..4fcb19c5b66 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -137,12 +137,6 @@

      PsyCommando updated:

      • Fix disconnected pipes + blastdoors button on desperado/mercenary base.
      - -

      17 November 2022

      -

      MistakeNot4892 updated:

      -
        -
      • Liver and brain regeneration has been tweaked, and all internal organs will now regenerate slowly to a point.
      • -
    From 919590f8f53d032dc3074dd818a519903bff1436 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 19 Jan 2023 15:36:13 -0600 Subject: [PATCH 0884/1518] Fix runtime from invalid explosion_act severity --- code/game/atoms.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 7f64bee5ef9..c261e829bd4 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -289,7 +289,7 @@ its easier to just keep the beam vertical. . = (severity <= 3) if(.) for(var/atom/movable/AM in get_contained_external_atoms()) - AM.explosion_act(severity++) + AM.explosion_act(severity + 1) try_detonate_reagents(severity) currently_exploding = FALSE From ca58e0a06c099b4570ec4e92e4bcefce9caf52ce Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 19 Jan 2023 18:42:50 -0600 Subject: [PATCH 0885/1518] Add probabilistic variable setter mapping helper --- code/modules/maps/helper_landmarks.dm | 36 ++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/code/modules/maps/helper_landmarks.dm b/code/modules/maps/helper_landmarks.dm index a42fddfb775..0063d359791 100644 --- a/code/modules/maps/helper_landmarks.dm +++ b/code/modules/maps/helper_landmarks.dm @@ -98,4 +98,38 @@ events_repository.unregister_global(/decl/observ/shuttle_added, src, .proc/check_shuttle) if(shuttle_datum) events_repository.unregister(/decl/observ/shuttle_moved, shuttle_datum, src, .proc/delete_everything) - . = ..() \ No newline at end of file + . = ..() + +// Has a percent chance on spawn to set the specified variable on the specified type to the specified value. + +/obj/abstract/landmark/variable_setter + var/type_to_find + var/variable_to_set + var/value_to_set + var/probability = 100 + +/obj/abstract/landmark/variable_setter/Initialize() + . = ..() + if(!prob(probability)) + return // Do nothing. + for(var/atom/candidate_atom in get_turf(src)) + if(!istype(candidate_atom, type_to_find)) + continue + if(try_set_variable(candidate_atom)) + break + return INITIALIZE_HINT_QDEL + +/obj/abstract/landmark/variable_setter/proc/try_set_variable(atom/atom_to_modify) + // We don't have that variable! Give our own runtime to be more informative than the default one. + if(!(variable_to_set in atom_to_modify.vars)) + CRASH("Unable to find variable [variable_to_set] to modify on type [atom_to_modify.type].") + // Already modified, if we're stacked we shouldn't modify the same one twice. + if(atom_to_modify.vars[variable_to_set] == value_to_set) + return FALSE + atom_to_modify.vars[variable_to_set] = value_to_set + return TRUE + +/obj/abstract/landmark/variable_setter/closet_opener + type_to_find = /obj/structure/closet + variable_to_set = "opened" + value_to_set = TRUE From e30603adc5f9829c05b953b449567f8cece10ae8 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 11 Jan 2023 01:07:38 +1100 Subject: [PATCH 0886/1518] Reworking how markings are handled. Tweaks Taj eye icon. Adding organ icon state checking to species validation. --- .../preference_setup/general/01_basic.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 29 +++++++++++------- code/modules/organs/external/_external.dm | 1 - .../organs/external/_external_icons.dm | 16 +++++----- code/modules/organs/external/head.dm | 14 ++++----- code/modules/organs/external/standard.dm | 10 ------ .../prosthetics/prosthetics_manufacturer.dm | 8 +++++ code/modules/species/outsider/random.dm | 2 +- code/modules/species/species.dm | 13 +++++++- code/modules/species/species_bodytype.dm | 15 ++++++++- code/modules/sprite_accessories/_accessory.dm | 1 + .../sprite_accessories/_accessory_facial.dm | 1 + .../sprite_accessories/_accessory_hair.dm | 1 + .../sprite_accessories/_accessory_markings.dm | 20 +++++++++++- icons/mob/bandage.dmi | Bin 1810 -> 1812 bytes .../cyberlimbs/morgan/morgan_main.dmi | Bin 1085 -> 1085 bytes icons/mob/human_races/cyberlimbs/robotic.dmi | Bin 1530 -> 1530 bytes .../human_races/species/default_markings.dmi | Bin 25241 -> 11202 bytes icons/mob/human_races/species/golem/body.dmi | Bin 6175 -> 6177 bytes .../human_races/species/human/body_female.dmi | Bin 1613 -> 1614 bytes .../human_races/species/human/body_male.dmi | Bin 1598 -> 1599 bytes .../species/human/deformed_body_female.dmi | Bin 4203 -> 4204 bytes .../species/human/deformed_body_male.dmi | Bin 1612 -> 1613 bytes .../mob/human_races/species/humanoid/body.dmi | Bin 1460 -> 1461 bytes .../species/monkey/monkey_body.dmi | Bin 1062 -> 1063 bytes icons/mob/surgery.dmi | Bin 1470 -> 1474 bytes .../icons/cyberlimbs/bishop/bishop_main.dmi | Bin 4190 -> 4191 bytes .../icons/cyberlimbs/bishop/bishop_rook.dmi | Bin 2984 -> 2983 bytes .../cyberlimbs/hephaestus/hephaestus_main.dmi | Bin 3872 -> 3873 bytes .../hephaestus/hephaestus_titan.dmi | Bin 1850 -> 1850 bytes .../cyberlimbs/morpheus/morpheus_main.dmi | Bin 1819 -> 1820 bytes .../cyberlimbs/morpheus/morpheus_mantis.dmi | Bin 1737 -> 1738 bytes .../cyberlimbs/nanotrasen/nanotrasen_main.dmi | Bin 3123 -> 3125 bytes .../cyberlimbs/shellguard/shellguard_main.dmi | Bin 1458 -> 1459 bytes .../icons/cyberlimbs/veymed/veymed_female.dmi | Bin 1609 -> 1610 bytes .../icons/cyberlimbs/veymed/veymed_male.dmi | Bin 1608 -> 1609 bytes .../wardtakahashi/wardtakahashi_economy.dmi | Bin 1434 -> 1435 bytes .../wardtakahashi/wardtakahashi_main.dmi | Bin 1589 -> 1589 bytes .../icons/cyberlimbs/xion/xion_econo.dmi | Bin 1682 -> 1683 bytes .../icons/cyberlimbs/xion/xion_main.dmi | Bin 3617 -> 3618 bytes .../icons/cyberlimbs/zenghu/zenghu_spirit.dmi | Bin 1602 -> 1603 bytes .../ascent/icons/species/body/alate/body.dmi | Bin 1850 -> 1850 bytes .../ascent/icons/species/body/gyne/body.dmi | Bin 3233 -> 3235 bytes .../ascent/mobs/bodyparts_insectoid.dm | 5 +-- .../bayliens/adherent/icons/body_amethyst.dmi | Bin 2988 -> 2988 bytes .../bayliens/adherent/icons/body_emerald.dmi | Bin 2988 -> 2988 bytes .../bayliens/adherent/icons/body_jet.dmi | Bin 2840 -> 2840 bytes .../bayliens/adherent/icons/body_quartz.dmi | Bin 2988 -> 2988 bytes .../bayliens/adherent/icons/body_ruby.dmi | Bin 2988 -> 2988 bytes .../bayliens/adherent/icons/body_sapphire.dmi | Bin 2988 -> 2988 bytes .../bayliens/adherent/icons/body_topaz.dmi | Bin 2988 -> 2988 bytes .../adherent/icons/body_turquoise.dmi | Bin 2988 -> 2988 bytes .../bayliens/adherent/icons/damage_mask.dmi | Bin 593 -> 0 bytes .../adherent/organs/organs_external.dm | 4 --- .../bayliens/skrell/icons/body/body.dmi | Bin 1335 -> 1335 bytes .../bayliens/tajaran/datum/accessory.dm | 23 +++++++------- .../species/bayliens/tajaran/datum/species.dm | 2 +- mods/species/bayliens/tajaran/icons/body.dmi | Bin 1331 -> 1331 bytes .../bayliens/tajaran/icons/deformed_body.dmi | Bin 1201 -> 1202 bytes mods/species/bayliens/tajaran/icons/eyes.dmi | Bin 390 -> 400 bytes .../bayliens/tajaran/icons/markings.dmi | Bin 8206 -> 6502 bytes .../bayliens/tritonian/icons/body_female.dmi | Bin 1194 -> 1194 bytes .../bayliens/tritonian/icons/body_male.dmi | Bin 1191 -> 1191 bytes .../bayliens/unathi/icons/body_female.dmi | Bin 1478 -> 1479 bytes .../bayliens/unathi/icons/body_male.dmi | Bin 1471 -> 1472 bytes .../unathi/icons/deformed_body_female.dmi | Bin 1504 -> 1505 bytes .../unathi/icons/deformed_body_male.dmi | Bin 1483 -> 1484 bytes mods/species/neoavians/icons/body.dmi | Bin 1200 -> 1201 bytes mods/species/neoavians/icons/body_add.dmi | Bin 1210 -> 1211 bytes mods/species/neoavians/icons/body_raptor.dmi | Bin 1183 -> 1184 bytes .../neoavians/icons/body_raptor_add.dmi | Bin 1193 -> 1194 bytes mods/species/neoavians/icons/markings.dmi | Bin 1140 -> 1002 bytes mods/species/serpentid/icons/body_green.dmi | Bin 2268 -> 2267 bytes mods/species/serpentid/icons/body_grey.dmi | Bin 2317 -> 2316 bytes mods/species/utility_frames/icons/body.dmi | Bin 1289 -> 1289 bytes .../species/utility_frames/icons/markings.dmi | Bin 1029 -> 857 bytes mods/species/vox/icons/body/deformed_body.dmi | Bin 2096 -> 2096 bytes .../vox/icons/body/improvised_cyberlimbs.dmi | Bin 1824 -> 1824 bytes .../vox/icons/body/primalis_cyberlimbs.dmi | Bin 1855 -> 1855 bytes mods/species/vox/icons/body/servitor/body.dmi | Bin 2205 -> 2206 bytes .../vox/icons/body/servitor/markings.dmi | Bin 3423 -> 2691 bytes mods/species/vox/icons/body/soldier/body.dmi | Bin 2153 -> 2341 bytes .../vox/icons/body/soldier/markings.dmi | Bin 3244 -> 2471 bytes 83 files changed, 105 insertions(+), 62 deletions(-) delete mode 100644 mods/species/bayliens/adherent/icons/damage_mask.dmi diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm index 548a88fa022..04fb9537e40 100644 --- a/code/modules/client/preference_setup/general/01_basic.dm +++ b/code/modules/client/preference_setup/general/01_basic.dm @@ -33,7 +33,7 @@ W.write("spawnpoint", spawnpoint.name) /datum/category_item/player_setup_item/physical/basic/sanitize_character() - + var/valid_spawn = FALSE for(var/decl/spawnpoint/spawnpoint as anything in global.using_map.allowed_spawns) if(pref.spawnpoint == spawnpoint.type) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index db3ad1fbc50..ed9bdc7f0e1 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -1,3 +1,12 @@ +var/global/list/_limb_mask_cache = list() +/proc/get_limb_mask_for(var/decl/bodytype/bodytype, var/bodypart) + LAZYINITLIST(_limb_mask_cache[bodytype]) + if(!_limb_mask_cache[bodytype][bodypart]) + var/icon/limb_mask = icon(bodytype.icon_base, bodypart) + limb_mask.MapColors(0,0,0, 0,0,0, 0,0,0, 1,1,1) + _limb_mask_cache[bodytype][bodypart] = limb_mask + return _limb_mask_cache[bodytype][bodypart] + /* Global associative list for caching humanoid icons. Index format m or f, followed by a string of 0 and 1 to represent bodyparts followed by husk 1 or 0. @@ -301,10 +310,10 @@ var/global/list/damage_icon_parts = list() continue var/icon/DI var/use_colour = (BP_IS_PROSTHETIC(O) ? SYNTH_BLOOD_COLOR : O.species.get_blood_color(src)) - var/cache_index = "[O.damage_state]/[O.icon_name]/[use_colour]/[species.name]" + var/cache_index = "[O.damage_state]/[O.bodytype.type]/[O.icon_state]/[use_colour]/[species.name]" if(damage_icon_parts[cache_index] == null) DI = new /icon(bodytype.get_damage_overlays(src), O.damage_state) // the damage icon for whole human - DI.Blend(new /icon(O.icon, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels + DI.Blend(get_limb_mask_for(O.bodytype, O.icon_state), ICON_MULTIPLY) // mask with this organ's pixels DI.Blend(use_colour, ICON_MULTIPLY) damage_icon_parts[cache_index] = DI else @@ -326,7 +335,7 @@ var/global/list/damage_icon_parts = list() for(var/obj/item/organ/external/O in get_external_organs()) var/bandage_level = O.bandage_level() if(bandage_level) - standing_image.overlays += image(bandage_icon, "[O.icon_name][bandage_level]") + standing_image.overlays += image(bandage_icon, "[O.icon_state][bandage_level]") overlays_standing[HO_DAMAGE_LAYER] = standing_image if(update_icons) @@ -358,8 +367,8 @@ var/global/list/damage_icon_parts = list() var/obj/item/organ/internal/eyes/eyes = get_organ((species.vision_organ || BP_EYES), /obj/item/organ/internal/eyes) icon_key += istype(eyes) ? eyes.eye_colour : COLOR_BLACK - for(var/organ_tag in global.all_limb_tags) - var/obj/item/organ/external/part = GET_EXTERNAL_ORGAN(src, organ_tag) + for(var/limb_tag in global.all_limb_tags) + var/obj/item/organ/external/part = GET_EXTERNAL_ORGAN(src, limb_tag) if(isnull(part) || part.skip_body_icon_draw) icon_key += "0" continue @@ -846,7 +855,6 @@ var/global/list/damage_icon_parts = list() if(update_icons) queue_icon_update() - /mob/living/carbon/human/update_fire(var/update_icons=1) overlays_standing[HO_FIRE_LAYER] = null if(on_fire) @@ -867,21 +875,20 @@ var/global/list/damage_icon_parts = list() var/surgery_icon = E.species.get_surgery_overlay_icon(src) if(!surgery_icon) continue - var/list/surgery_states = icon_states(surgery_icon) - var/base_state = "[E.icon_name][how_open]" + var/base_state = "[E.icon_state][how_open]" var/overlay_state = "[base_state]-flesh" var/list/overlays_to_add - if(overlay_state in surgery_states) + if(check_state_in_icon(overlay_state, surgery_icon)) var/image/flesh = image(icon = surgery_icon, icon_state = overlay_state, layer = -HO_SURGERY_LAYER) flesh.color = E.species.get_flesh_colour(src) LAZYADD(overlays_to_add, flesh) overlay_state = "[base_state]-blood" - if(overlay_state in surgery_states) + if(check_state_in_icon(overlay_state, surgery_icon)) var/image/blood = image(icon = surgery_icon, icon_state = overlay_state, layer = -HO_SURGERY_LAYER) blood.color = E.species.get_blood_color(src) LAZYADD(overlays_to_add, blood) overlay_state = "[base_state]-bones" - if(overlay_state in surgery_states) + if(check_state_in_icon(overlay_state, surgery_icon)) LAZYADD(overlays_to_add, image(icon = surgery_icon, icon_state = overlay_state, layer = -HO_SURGERY_LAYER)) total.overlays |= overlays_to_add diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index d1967950625..66765d34dd2 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -29,7 +29,6 @@ var/limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_CAN_BREAK | ORGAN_FLAG_CAN_DISLOCATE // Appearance vars. - var/icon_name = null // Icon state base. var/body_part = null // Part flag var/icon_position = 0 // Used in mob overlay layering calculations. var/model // Used when caching robolimb icons. diff --git a/code/modules/organs/external/_external_icons.dm b/code/modules/organs/external/_external_icons.dm index 8f0ea8a9d7c..d2535dff85d 100644 --- a/code/modules/organs/external/_external_icons.dm +++ b/code/modules/organs/external/_external_icons.dm @@ -58,12 +58,12 @@ var/global/list/limb_icon_cache = list() for(var/M in markings) var/decl/sprite_accessory/marking/mark_style = GET_DECL(M) if (mark_style.draw_target == MARKING_TARGET_SKIN) - var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") - mark_s.Blend(markings[M], mark_style.blend) + var/mark_color = markings[M] + var/icon/mark_s = mark_style.get_cached_marking_icon(bodytype, icon_state, mark_color) //#TODO: This probably should be added to a list that's applied on update icon, otherwise its gonna act really wonky! add_overlay(mark_s) //So when it's not on your body, it has icons mob_icon.Blend(mark_s, mark_style.layer_blend) //So when it's on your body, it has icons - icon_cache_key += "[M][markings[M]]" + icon_cache_key += "[M][mark_color]" /obj/item/organ/external/proc/update_limb_icon_file() if (BP_IS_PROSTHETIC(src)) @@ -81,7 +81,7 @@ var/global/list/limb_icon_cache = list() /obj/item/organ/external/on_update_icon(var/regenerate = 0) . = ..() - icon_state = "[icon_name]" + icon_state = organ_tag icon_cache_key = "[icon_state]_[species ? species.name : "unknown"][render_alpha]" if(model) icon_cache_key += "_model_[model]" @@ -93,12 +93,12 @@ var/global/list/limb_icon_cache = list() for(var/M in markings) var/decl/sprite_accessory/marking/mark_style = GET_DECL(M) if (mark_style.draw_target == MARKING_TARGET_SKIN) - var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") - mark_s.Blend(markings[M], mark_style.blend) + var/mark_color = markings[M] + var/icon/mark_s = mark_style.get_cached_marking_icon(bodytype, icon_state, mark_color) //#TODO: This probably should be added to a list that's applied on update icon, otherwise its gonna act really wonky! add_overlay(mark_s) //So when it's not on your body, it has icons mob_icon.Blend(mark_s, mark_style.layer_blend) //So when it's on your body, it has icons - icon_cache_key += "[M][markings[M]]" + icon_cache_key += "[M][mark_color]" if(render_alpha < 255) mob_icon += rgb(,,,render_alpha) @@ -170,7 +170,7 @@ var/global/list/robot_hud_colours = list("#ffffff","#cccccc","#aaaaaa","#888888" return applying /obj/item/organ/external/proc/bandage_level() - if(damage_state_text() == "00") + if(damage_state_text() == "00") return 0 if(!is_bandaged()) return 0 diff --git a/code/modules/organs/external/head.dm b/code/modules/organs/external/head.dm index e6ff11e4c19..e9ab3fe9eeb 100644 --- a/code/modules/organs/external/head.dm +++ b/code/modules/organs/external/head.dm @@ -1,6 +1,5 @@ /obj/item/organ/external/head organ_tag = BP_HEAD - icon_name = "head" name = "head" slot_flags = SLOT_LOWER_BODY max_damage = 75 @@ -148,17 +147,18 @@ for (var/M in markings) var/decl/sprite_accessory/marking/mark_style = GET_DECL(M) if (mark_style.draw_target == MARKING_TARGET_HAIR) - var/icon/mark_icon = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]") + + var/mark_color if (!mark_style.do_colouration && owner.h_style) var/decl/sprite_accessory/hair/hair_style = GET_DECL(owner.h_style) if ((~hair_style.flags & HAIR_BALD) && hair_colour) - mark_icon.Blend(hair_colour, ICON_ADD) + mark_color = hair_colour else //only baseline human skin tones; others will need species vars for coloration - mark_icon.Blend(rgb(200 + skin_tone, 150 + skin_tone, 123 + skin_tone), ICON_ADD) + mark_color = rgb(200 + skin_tone, 150 + skin_tone, 123 + skin_tone) else - mark_icon.Blend(markings[M], ICON_ADD) - res.overlays |= mark_icon - icon_cache_key += "[M][markings[M]]" + mark_color = markings[M] + res.overlays |= mark_style.get_cached_marking_icon(bodytype, icon_state, mark_color) + icon_cache_key += "[M][mark_color]" return res diff --git a/code/modules/organs/external/standard.dm b/code/modules/organs/external/standard.dm index f9cd1b326c7..2903fe3c932 100644 --- a/code/modules/organs/external/standard.dm +++ b/code/modules/organs/external/standard.dm @@ -7,7 +7,6 @@ /obj/item/organ/external/chest name = "upper body" organ_tag = BP_CHEST - icon_name = "torso" max_damage = 100 min_broken_damage = 35 w_class = ITEM_SIZE_HUGE //Used for dismembering thresholds, in addition to storage. Humans are w_class 6, so it makes sense that chest is w_class 5. @@ -39,7 +38,6 @@ /obj/item/organ/external/groin name = "lower body" organ_tag = BP_GROIN - icon_name = "groin" max_damage = 100 min_broken_damage = 35 w_class = ITEM_SIZE_LARGE @@ -61,7 +59,6 @@ /obj/item/organ/external/arm organ_tag = BP_L_ARM name = "left arm" - icon_name = "l_arm" max_damage = 50 min_broken_damage = 30 w_class = ITEM_SIZE_NORMAL @@ -77,7 +74,6 @@ /obj/item/organ/external/arm/right organ_tag = BP_R_ARM name = "right arm" - icon_name = "r_arm" body_part = SLOT_ARM_RIGHT joint = "right elbow" amputation_point = "right shoulder" @@ -85,7 +81,6 @@ /obj/item/organ/external/leg organ_tag = BP_L_LEG name = "left leg" - icon_name = "l_leg" max_damage = 50 min_broken_damage = 30 w_class = ITEM_SIZE_NORMAL @@ -102,7 +97,6 @@ /obj/item/organ/external/leg/right organ_tag = BP_R_LEG name = "right leg" - icon_name = "r_leg" body_part = SLOT_LEG_RIGHT icon_position = RIGHT joint = "right knee" @@ -111,7 +105,6 @@ /obj/item/organ/external/foot organ_tag = BP_L_FOOT name = "left foot" - icon_name = "l_foot" max_damage = 30 min_broken_damage = 15 w_class = ITEM_SIZE_SMALL @@ -127,7 +120,6 @@ /obj/item/organ/external/foot/right organ_tag = BP_R_FOOT name = "right foot" - icon_name = "r_foot" body_part = SLOT_FOOT_RIGHT icon_position = RIGHT parent_organ = BP_R_LEG @@ -137,7 +129,6 @@ /obj/item/organ/external/hand organ_tag = BP_L_HAND name = "left hand" - icon_name = "l_hand" icon_position = LEFT max_damage = 30 min_broken_damage = 15 @@ -165,7 +156,6 @@ /obj/item/organ/external/hand/right organ_tag = BP_R_HAND name = "right hand" - icon_name = "r_hand" icon_position = RIGHT body_part = SLOT_HAND_RIGHT parent_organ = BP_R_ARM diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm b/code/modules/organs/prosthetics/prosthetics_manufacturer.dm index 44180d4c4f9..8c13ba5fd82 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm +++ b/code/modules/organs/prosthetics/prosthetics_manufacturer.dm @@ -20,6 +20,14 @@ var/modular_prosthetic_tier = MODULAR_BODYPART_INVALID // Determines how the limb behaves as a prosthetic with regards to manual attachment/detachment. var/limb_tech = "{'engineering':1,'materials':1,'magnets':1}" // What tech levels should limbs of this type use/need? +/decl/prosthetics_manufacturer/validate() + . = ..() + if(icon && (!applies_to_part || (BP_CHEST in applies_to_part))) + if(check_state_in_icon("torso", icon)) + . += "deprecated \"torso\" state present in [icon]" + if(!check_state_in_icon(BP_CHEST, icon)) + . += "[BP_CHEST] state not present in [icon]" + /decl/prosthetics_manufacturer/proc/check_can_install(var/target_slot, var/target_bodytype, var/target_species) . = istext(target_slot) if(.) diff --git a/code/modules/species/outsider/random.dm b/code/modules/species/outsider/random.dm index e9287471e5c..7bb6b782ea6 100644 --- a/code/modules/species/outsider/random.dm +++ b/code/modules/species/outsider/random.dm @@ -32,7 +32,7 @@ /decl/emote/exertion/biological/pant ) var/blood_color - + /decl/species/alium/Initialize() //Coloring diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index 6629d67f1a8..5e0633dbc25 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -440,9 +440,20 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 /decl/species/validate() . = ..() + for(var/decl/bodytype/bodytype in available_bodytypes) + var/bodytype_base_icon = bodytype.get_base_icon() + var/deformed_base_icon = bodytype.get_base_icon(get_deform = TRUE) + for(var/organ_tag in has_limbs) + if(organ_tag == BP_TAIL) // Tails are handled specially due to overlays and animations, will not be present in the base bodytype icon(s). + continue + if(bodytype_base_icon && !check_state_in_icon(organ_tag, bodytype_base_icon)) + . += "missing state \"[organ_tag]\" from base icon [bodytype_base_icon] on bodytype [bodytype.type]" + if(deformed_base_icon && bodytype_base_icon != deformed_base_icon && !check_state_in_icon(organ_tag, deformed_base_icon)) + . += "missing state \"[organ_tag]\" from deformed icon [deformed_base_icon] on bodytype [bodytype.type]" + for(var/organ_tag in vital_organs) if(!(organ_tag in has_organ) && !(organ_tag in has_limbs)) - . += "vital organ '[organ_tag]' not present in organ/limb lists" + . += "vital organ \"[organ_tag]\" not present in organ/limb lists" for(var/trait_type in traits) var/trait_level = traits[trait_type] diff --git a/code/modules/species/species_bodytype.dm b/code/modules/species/species_bodytype.dm index f34a2d25fcb..708566c1e7b 100644 --- a/code/modules/species/species_bodytype.dm +++ b/code/modules/species/species_bodytype.dm @@ -74,4 +74,17 @@ var/global/list/bodytypes_by_category = list() return disintegrate /decl/bodytype/proc/get_hug_zone_messages(var/zone) - return LAZYACCESS(hug_messages, zone) \ No newline at end of file + return LAZYACCESS(hug_messages, zone) + +/decl/bodytype/validate() + . = ..() + if(icon_base) + if(check_state_in_icon("torso", icon_base)) + . += "torso state present in icon_base" + if(!check_state_in_icon(BP_CHEST, icon_base)) + . += "chest state not present in icon_base" + if(icon_deformed && icon_deformed != icon_base) + if(check_state_in_icon("torso", icon_deformed)) + . += "torso state present in icon_deformed" + if(!check_state_in_icon(BP_CHEST, icon_deformed)) + . += "chest state not present in icon_deformed" diff --git a/code/modules/sprite_accessories/_accessory.dm b/code/modules/sprite_accessories/_accessory.dm index 8dcf3295dc3..46a0a1e9447 100644 --- a/code/modules/sprite_accessories/_accessory.dm +++ b/code/modules/sprite_accessories/_accessory.dm @@ -17,6 +17,7 @@ */ /decl/sprite_accessory + abstract_type = /decl/sprite_accessory var/name // The preview name of the accessory var/icon // the icon file the accessory is located in var/icon_state // the icon_state of the accessory diff --git a/code/modules/sprite_accessories/_accessory_facial.dm b/code/modules/sprite_accessories/_accessory_facial.dm index cdc08e4873d..b1c70136c4d 100644 --- a/code/modules/sprite_accessories/_accessory_facial.dm +++ b/code/modules/sprite_accessories/_accessory_facial.dm @@ -7,6 +7,7 @@ */ /decl/sprite_accessory/facial_hair + abstract_type = /decl/sprite_accessory/facial_hair icon = 'icons/mob/human_races/species/human/facial.dmi' gender = MALE diff --git a/code/modules/sprite_accessories/_accessory_hair.dm b/code/modules/sprite_accessories/_accessory_hair.dm index ae3cf5bba39..26738c69487 100644 --- a/code/modules/sprite_accessories/_accessory_hair.dm +++ b/code/modules/sprite_accessories/_accessory_hair.dm @@ -7,6 +7,7 @@ */ /decl/sprite_accessory/hair + abstract_type = /decl/sprite_accessory/hair icon = 'icons/mob/human_races/species/human/hair.dmi' /decl/sprite_accessory/hair/bald diff --git a/code/modules/sprite_accessories/_accessory_markings.dm b/code/modules/sprite_accessories/_accessory_markings.dm index bf2ab7a2f40..d9d41d8c798 100644 --- a/code/modules/sprite_accessories/_accessory_markings.dm +++ b/code/modules/sprite_accessories/_accessory_markings.dm @@ -1,8 +1,8 @@ //body markings - /decl/sprite_accessory/marking icon = 'icons/mob/human_races/species/default_markings.dmi' do_colouration = 1 //Almost all of them have it, COLOR_ADD + abstract_type = /decl/sprite_accessory/marking //Empty list is unrestricted. Should only restrict the ones that make NO SENSE on other species, //like IPC optics overlay stuff. var/layer_blend = ICON_OVERLAY @@ -10,6 +10,24 @@ //Reminder: BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_CHEST,BP_GROIN,BP_HEAD var/draw_target = MARKING_TARGET_SKIN var/list/disallows = list() //A list of other marking types to ban from adding when this marking is already added + var/list/icons = list() + var/mask_to_bodypart = TRUE + +/decl/sprite_accessory/marking/proc/get_cached_marking_icon(var/decl/bodytype/bodytype, var/bodypart, var/color = COLOR_WHITE) + LAZYINITLIST(icons[bodytype]) + LAZYINITLIST(icons[bodytype][bodypart]) + if(!icons[bodytype][bodypart][color]) + var/icon/marking_icon = icon(icon, icon_state) // make a new one to avoid mutating the base + if(mask_to_bodypart) + marking_icon.Blend(get_limb_mask_for(bodytype, bodypart), ICON_MULTIPLY) + marking_icon.Blend(color, blend) + icons[bodytype][bodypart][color] = marking_icon + return icons[bodytype][bodypart][color] + +/decl/sprite_accessory/marking/validate() + . = ..() + if(!check_state_in_icon(icon_state, icon)) + . += "missing icon state \"[icon_state]\" in [icon]" /decl/sprite_accessory/marking/tat_hive name = "Tattoo (Hive, Back)" diff --git a/icons/mob/bandage.dmi b/icons/mob/bandage.dmi index bab279f6c1d1b3db92911cfdba4509c986985966..807318555fd6684b1a016bab54b1ba60b8320e27 100644 GIT binary patch delta 267 zcmV+m0rdWo4wMd%Qh(ukR9JLGWpiV4X>fFDZ*Bkpc$|%tu?oW=6h&wK3Q6|TBwf3d zl#-$Og&>WILK5LA?eEu^sY~D86pkFu6D`&4{^)wuK0Em~6rA7GRb5VJDL!tDHf@?( z3TxbK1hV zFA@k|o#VZP#S#`vSS*3D1jZ5=y9|q&kr^ip8F9i8 z>Eu1|at;pB?i?~?D3-8T!eR-GB`}u$$Cm2exA_D80+#c789#f5XaE2Oz)3_wRCt{2 R-A#9zOccQJnX^s-#08q@dfWg2 delta 245 zcmVfFDZ*Bkpc$|%tu?oU46h-IeD}voct*eVD z(!u^h2{bl=+Q3cF-#3Yqi|=kPaKhodKw5pi-ugjb?!9_hL?2dt(#P#iHE%y9mk-@R zHO~6krSBmolWZP0&YEezQO)EL%O%x3V4k+j`(NrnQJqMofN2;8$5% zFdZ6c@)g_FJDV!_3Niv<}AG8Sa)GA?#zcAPP0#TjFy vj}Q`LEgYjQ9J6F97F;a2Sdg(GWAQ(>)z{%tKhO_D>Uw!*baThEJOS7RTcvX& diff --git a/icons/mob/human_races/cyberlimbs/morgan/morgan_main.dmi b/icons/mob/human_races/cyberlimbs/morgan/morgan_main.dmi index 546259706dd7ed18db65d2e4d31304afb5af3870..dfa94b94d13a4c7b1547166f19958543bdabd768 100644 GIT binary patch delta 142 zcmV;90CE4l2)zi9i+?B?k}DWfE0!R!K{oC6le9yp5^Z|$=?zkC?(L%+Ow)Jz1)M2G zb2Hb&QL8ukf@`>(wL+kPv*oT^2B*t(rRQk!#1COY7!~7=%N>ti5S}n wf}l*I*p4X`L79j>5%RtYoG9)p1o!t8wP}au^VJ0-l7=SkumT(+vkU<-0}E+F@c;k- delta 142 zcmV;90CE4l2)zi9i+>0inkyKC72A+lAdBYuN!p=Pi8ej>^aiOm&$jCa)4Y291}X`& zd6@g@tkse{$1U8hT17}9@;4NA4BJ?dbu?F6`9x)3(rP3(!#-brY7!~3(Pb|v6EU(A w1VNcZksT3PP$puGRPay*!junH1o!t8wP}au^VJnG#fC;zM*>WcvkU<-12lF$?*IS* diff --git a/icons/mob/human_races/cyberlimbs/robotic.dmi b/icons/mob/human_races/cyberlimbs/robotic.dmi index d16ee148203dcb30c85e3cc76e2232a9eee14008..2c149716cd2f1d8804f491e90f96102ace053a80 100644 GIT binary patch delta 160 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 literal 25241 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 diff --git a/icons/mob/human_races/species/golem/body.dmi b/icons/mob/human_races/species/golem/body.dmi index b3775425bbde751bb10c409d15506b336ba59177..4a7e14a05b82b9949176b553c8c354b719916409 100644 GIT binary patch delta 181 zcmV;m080O#FrhGzB!8fKR9JLGWpiV4X>fFDZ*Bkpc$|&Ty$Zu16o%nhui_)wOMkMu zl!W4t+(M9gqJoKVl=k*Jbm&$c4?Mhlr^kJI=mq1f<%>9nbUfFDZ*Bkpc$|&Ty$Zu17=__kui}vGr9W9+ ziXk{8w-5x43P#~m+S~8Yp<8u4@bJPJ@tha6L9U9wER~QG1g6WCvv)AnL*Q}e%-i66 z{f<&~wGbF;rjiHFOrQdRiL-nJ+Zk#lXb*cFR?G1@hq h9m?y}z8Sk>@o#Lzyh+Ga@eeBzhDOT{Sj@4_R2L)JSLOf! diff --git a/icons/mob/human_races/species/human/body_female.dmi b/icons/mob/human_races/species/human/body_female.dmi index bc073eeaf5a767eff14bd4b4f53532630fd75b0f..e0dc8a7a036d1d19069fbf81541306747b819e59 100644 GIT binary patch delta 166 zcmV;X09pUd49*OYpaGwep%Z^oR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6# za*U0*I5Sc+(=$pSoZ^zil2jm5sVF|NC|8M#GbOXA7^I1dGp#5wHxx#O zMq*wH5rz?^EWIc{Gmi*6b5hfZu#y;6Me%9*`6WacMwGJTjMQSnsxlQ)6LAKGvVyCh U3piE*BN~P#?%R(Zvqu321$oRzI{*Lx delta 165 zcmV;W09yaf49yIXpaGtdp%Z_Nk-ZATFbsre>nTjKm;S9?Nj@vS?qw zNjr2Z)piG;?m*YtYkwO?+ua9vAlFRAUhH|d2lLE9(rQjeFbQ)^@-bDs;3^w-o|gtp z$XvH0FcbR)H+}e0vx;JudfFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5; z&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBSC_b?$SBZ-=C9|j)q=}0& zttc@!6~s0~sLCNqRZ)CKVqOXnh7qMKy(m93j|e++QqzgBk|`KfMe%9*`6WacMwGJT ijMQSnsxnd&aR!C5f~%hkI93588ipqB+m9ZjJ^=+FRZR5& delta 179 zcmV;k08IbC489DImw%pmR9JLGWpiV4X>fFDZ*Bkpc$|%qy$ZuH41{OvDNM4L{;gd~ zLdnp)f-zXJ4T%M^XkWicJ9H}5b_bvCK-b!9e;Y>I-3NFe*G$D;?0L5b^UOigYEDNm z33E*HF;%?aDjRm5mj+D8T(=`I6Z-`>efUzdiei_135qZk7ATo=QFP826_px_-9#jc hFcl`mmHtu*{m)mlwjaCqsxK^!hDM|xFZ-iE0R>M0PoMw* diff --git a/icons/mob/human_races/species/human/deformed_body_female.dmi b/icons/mob/human_races/species/human/deformed_body_female.dmi index da386c18ad19b1ffc844466a63ac034a410ba289..a1fa8ba191f577ac67bdf720e7fcc20d39e493a0 100644 GIT binary patch delta 181 zcmV;m080PsAnYKJB!8fKR9JLGWpiV4X>fFDZ*Bkpc$|&UI|{=v5CqU#I>li3As@GD zf{amNU%`lYEeUK3RwB86iWI3rwj6lOz_hscgPUMSr=P?n8#Z&Ej7a6cGW6U z3bB4dslE~n8lFAxjaEzI0)tMgmHkcy2A8keM2hF=k3~=>Vk&`iIs}^=1;M05@x10- j1!W@kh*bWoNdD&)E&9pAj!wS;BN~P#4IW29vCN+joa0fK delta 180 zcmV;l089VuAnPEIB!8cJR9JLGWpiV4X>fFDZ*Bkpc$|&UzY4=37zFTHpW;aN(mz>U zilI0puONa(g+$>~+Sl*Up;PHM9{jk28*!f>W`$midEYxg#_vT)t{&DYD5G&nRQDNGUZJ#^xR(W0IrDZnbts i8H@Ewt^QRhxSv;ym{$$G82JV)jfO^L<0r_m&7TjfFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5; z&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBSC_b?$SBZ-=C9|j)q=}0& zttc@!6~s0~sLCNqRZ)CKVqOXnh7qMKy(m93j|e++QqzgBk|`KfMe%9*`6WacMwGJT jjMQSnsxnd&aR!C5f~%hkI93588ipqB+m9ZzWdY{|o_fFDZ*Bkpc$|%qy$ZuH41{OvDNM4L{;gd~ zLdnp)f-zXJ4T%M^XkWicJ9H}5b_bvCK-b!9e;Y>I-3NFe*G$D;?0L5b^UOigYEDNm z33E*HF;%?aDjRm5mj+D8T(=`I6Z-`>efUzdiei_135qZk7ATo=QFP826_px_-9#jc iFcl`mmHtu*{m)mlwjaCqsxK^!hDM|xFZ;7*0p|qIkx>8u diff --git a/icons/mob/human_races/species/humanoid/body.dmi b/icons/mob/human_races/species/humanoid/body.dmi index 989dcb243af8cf9ac82d487e1f6c8016ad515d3c..65f0f5676da1133654dfff94b47d0cecc25128ae 100644 GIT binary patch delta 181 zcmV;m080O~3$+W7h<~4YR9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5; z&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBSC_b?$SBZ-=C9|j)q=}0& zttc@!6~s0~sLCNqRZ)CKVqOXnh7qMKy(m93j|e++QqzgBk|`KfMe%9*`6WacMwGJT jjMQSnsxnd&aR!C5f~%hkI93588ipqB+m9ZzF9C%FRGdv! delta 180 zcmV;l089V13$zQ6h<~1XR9JLGWpiV4X>fFDZ*Bkpc$|%qy$ZuH41{OvDNM4L{;gd~ zLdnp)f-zXJ4T%M^XkWicJ9H}5b_bvCK-b!9e;Y>I-3NFe*G$D;?0L5b^UOigYEDNm z33E*HF;%?aDjRm5mj+D8T(=`I6Z-`>efUzdiei_135qZk7ATo=QFP826_px_-9#jc iFcl`mmHtu*{m)mlwjaCqsxK^!hDM|xFZ;7F0fhvH7f=8I diff --git a/icons/mob/human_races/species/monkey/monkey_body.dmi b/icons/mob/human_races/species/monkey/monkey_body.dmi index 778798ae48dcdd09634ce1956914fdd90ebe2115..11779ee5b995b329002c489e60dd9081e3ce97a1 100644 GIT binary patch delta 182 zcmV;n07?I*2&V{;UVor^R9JLGWpiV4X>fFDZ*Bkpc$|%qy9&cF3`J-AD@?MNzSb@! zp=3yY!I)aH1c?o@X@5USJ9H}1b}t+qgjAb*`{)MK^qqbIXG+oB%=K{8>P^1jS}td; z5GY{zmRwwcHCAlVMPF&4vjzbm1BDw>+W-In delta 181 zcmV;m080O-2&M>-UVoo@R9JLGWpiV4X>fFDZ*Bkpc$|&VJqp7x3wP}au^VJo4`G!U-2Xl$D2LT`hv@}#N diff --git a/icons/mob/surgery.dmi b/icons/mob/surgery.dmi index 8457a59526b37eb0658a70222795e890276a9e98..eb38e6236eb72578c64a3dd1cfd3b583fcf3368c 100644 GIT binary patch delta 291 zcmV+;0o?w+3&IPKXMYTOR9JLGWpiV4X>fFDZ*Bkpc$}4$!HUBm5Qfk3DWpAj*(SaA zvb2;QnpX&RGl{|^g39*wH)>&z`_E0`^J5(6Pxkujdb{`f^0=!X3eovhpY`eEQ#CI) zCcACARyCH~Y*XFDWD;%5-5k7I+rz{Z?M^kL3o)Nn%@oW+d4GNUgTr9Lg2F6;zb(Zi zf;$=f^eaW6W^2|FZ-}9l>qMGn)C4EH>^=XJ1ubsp?gaft}Zb|?{#9RZ87hMC6 p79w%8$elxuniuPb250}7)4jg-m-0va1z@ldgVD&TX|s3%Mg*ZslV|_{ delta 287 zcmV+)0pR|^3%(1GXMYHKR9JLGWpiV4X>fFDZ*Bkpc$}4$K@P$o5JlJJ6hzk=ZQZ&t z8skE*U@)bH1Utz<^!gSsap|8OB#)P2nBOk-;dH*-^znL8FU!%>r1yHa-l*p7`{d?L z*Q&-@Ke|*mF_~oN!) diff --git a/mods/content/corporate/icons/cyberlimbs/bishop/bishop_main.dmi b/mods/content/corporate/icons/cyberlimbs/bishop/bishop_main.dmi index 7416142c7fc26a1eb1c15a87750bbfe26daa4b6a..97cee647880be3e65492c6faab15b749597c78f6 100644 GIT binary patch delta 181 zcmV;m080PfAm1R6B!8fKR9JLGWpiV4X>fFDZ*Bkpc$|&SI|{=v5Jk~iTE)ZeLq2ZR z1exH%-hvSESQ6M4j6|~i6e&^#PdRY7Z(7{@$1uT;gMJa0ly?|(r?Xb?G}j1&+f}Pb zDa86cO7)ds(6IBoHCoMy3k*7~7WNwz7+ij86)ASn@3SB#Vk+!b3WAtKv0HMkf|!U! j^2hH7&S^hX&q(F(V2ggTu;ZXV5sro?467;bvCNVWybe{v delta 180 zcmV;l089VhAl@L5B!8cJR9JLGWpiV4X>fFDZ*Bkpc$|&Sy$Zu17=__kui}vGr9W9+ ziXk{8w;+N>g(SkKw71`(L#L8&Jn-;xdOXL;EYP!&uRt}I0}8|CD#bhdmZ0#sOOZm3 zseMOnt_3J`WF76D6h2dh!XU*;ZVwd-x1ZWrifnR+XT(^H>?sx^BgRo=*HRiI#$qYB i^ZSuXK2B9DRLeirV_Y=!Y~%+PVTMM*VUC-z&5{qn{8R)0 diff --git a/mods/content/corporate/icons/cyberlimbs/bishop/bishop_rook.dmi b/mods/content/corporate/icons/cyberlimbs/bishop/bishop_rook.dmi index 38aba177e92efdd1856ca033ece8749b59961099..e32cd73d76bcb025a68de611fb3e2d8346168362 100644 GIT binary patch delta 170 zcmV;b09F5}7pE7HY5}~FYb<}4t%a@~Y1!D@+bW`$u{v@|!uP>XNXjn7wX9fvE9n4e zrP1unj@un2qpY3q!(mT}0ND!n9<1XIe4F51a9t;q)Dms5C~1&)5c=#FXNX|~xxo%i_sp$ad zlr`+g_UjELqY_?*VYj73g6gDy4$gBAq0R6rxe*y9LZOQmB`xwEVqbh>9Qy=HLzh6c z*7{jYrzO)#$#haOotDg7boM)S2wTv6itAPJs<+yqRc4tgf&aM1oCz8exMk)IVNfvs ZCFiVa%EvF>0gg1YjWR5lgR?IIcna5FQ|tf$ diff --git a/mods/content/corporate/icons/cyberlimbs/hephaestus/hephaestus_main.dmi b/mods/content/corporate/icons/cyberlimbs/hephaestus/hephaestus_main.dmi index 55a22e7455500c2bbde531c90ade1984b5d0355d..c5459759caf2887fb40911daecfcca0505ee5d15 100644 GIT binary patch delta 181 zcmV;m080O$9-$tPB!8fKR9JLGWpiV4X>fFDZ*Bkpc$|&SI|{=v5Jk~iTE)ZeLq2ZR z1exH%-hvSESQ6M4j6|~i6e&^#PdRY7Z(7{@$1uT;gMJa0ly?|(r?Xb?G}j1&+f}Pb zDa86cO7)ds(6IBoHCoMy3k*7~7WNwz7+ij86)ASn@3SB#Vk+!b3WAtKv0HMkf|!U! j^2hH7&S^hX&q(F(V2ggTu;ZXV5sro?467;bvCLEsVU<+` delta 180 zcmV;l089U&9-tnOB!8cJR9JLGWpiV4X>fFDZ*Bkpc$|&Sy$Zu17=__kui}vGr9W9+ ziXk{8w;+N>g(SkKw71`(L#L8&Jn-;xdOXL;EYP!&uRt}I0}8|CD#bhdmZ0#sOOZm3 zseMOnt_3J`WF76D6h2dh!XU*;ZVwd-x1ZWrifnR+XT(^H>?sx^BgRo=*HRiI#$qYB i^ZSuXK2B9DRLeirV_Y=!Y~%+PVTMM*VUC-z%~TF(15-r+ diff --git a/mods/content/corporate/icons/cyberlimbs/hephaestus/hephaestus_titan.dmi b/mods/content/corporate/icons/cyberlimbs/hephaestus/hephaestus_titan.dmi index b22ce8aff62044f7f5986509a0b9b47630d7a45f..537c9ce687904df9a4fe912ee5e4cf1e17ea107c 100644 GIT binary patch delta 177 zcmV;i08an94!RDIe}BR-5QXRDSA=#I(dz0VEz-gM1v$($38aZ!LW}?2v<|wIhFji) z@7=xON^xy&Z71q`%SWVOyb~93-XA!djEp*&Q^lD^qjdb55Fuic1wDX fP3lEB8l2X+QZ!w?yu$~vMU}T6Ga<*bBLNo%!emx} delta 177 zcmV;i08an94!RDIe}9885QXRDR|H*4X>HdoMJW#TFO)#eBoIBh1f~DJ(GKk*3Aell z-@ALmmEzt!+D_EZmd`-m;wWz7dOUHqSQSh(mx?n3R-5oOKF9!37W9%d6r3qbehqQf zlN?~x=YPt`QDtBbbOzNUh9u^)nz_7YE~}Z#Yi2<1T#QfFDZ*Bkpc$|&VI|{=v3L{h-zFDRU@IF($;UnZO;Qp{u)*z40zJrQ!LD$<6QswxUBMH)@Cj4&1>9l$Zd kIEwU~QvDc##}Lfl^;^|X-RG+-Ao_+TFrn{rvuOdc1u0lnE&u=k delta 181 zcmV;m080Oy4x0{;!GE86R9JLGWpiV4X>fFDZ*Bkpc$|&VJqp7x3gP@6^y<2Y?MQp~Iu-16av z@P(;}SZQ90%2z2?q(ga^uVZ(@l#9x8bfIFIM_VzhMzNY>ED!U4Sql#R)O}w62Hh)= NeH7+M!?Q^NfCU5KO+o+w delta 158 zcmV;P0Ac^i4ap6VodKhfo*#cn_R_z#OGzjhnkxi@72DugAd8mXzDYZDtF`IDC-Fe7 zx%RhVG~IpB51TGI`W-RJdh`Tmfd MsS+Hbvq}Mg1@`4j{Qv*} diff --git a/mods/content/corporate/icons/cyberlimbs/nanotrasen/nanotrasen_main.dmi b/mods/content/corporate/icons/cyberlimbs/nanotrasen/nanotrasen_main.dmi index 817df63e3ee0d89cc51a507302e950bb2429d52f..66d0bbdb87046b30a68c7533371fb3583d6ff37f 100644 GIT binary patch delta 182 zcmV;n07?I|7_}IXB!8iLR9JLGWpiV4X>fFDZ*Bkpc$|&UI|{=v5CqU#dy2vCLq2ZR z1exH%zJd_(+7ieXtVDAC6e&^#s~mU?!?d{fk70rt2YRvOkalQvr!%Q{n2U$T?MljX zSbh11TwGyjG^?brH>Bnu85$j_Mcl?28ke7Xdd}rgiFL9asw-Hf#Co^S6=hXSY~;0~ ktVW4lQaU~()-liS@B9}1WMIaDJ|OyrCY698!?Da~3-47{#Q*>R delta 180 zcmV;l089V17_%6VB!8cJR9JLGWpiV4X>fFDZ*Bkpc$|&Sy$Zu17=__kui}vGr9W9+ ziXk{8w;+N>g(SkKw71`(L#L8&Jn-;xdOXL;EYP!&uRt}I0}8|CD#bhdmZ0#sOOZm3 zseMOnt_3J`kxD)~DSW01g+Ypy+#V_vZa>uu)pDxHI@(Xw#wk){lRG>k#$sf*5E(I! iBD)0!Tr78V_Y=!Y~%+}?S@9~R}RRr&Swj1dQ;^9 diff --git a/mods/content/corporate/icons/cyberlimbs/shellguard/shellguard_main.dmi b/mods/content/corporate/icons/cyberlimbs/shellguard/shellguard_main.dmi index a91367c6b2a119c38f15faab67cbda8737aed2e5..f0f2ad5f42ea437519e1193afb0bfab6c6f75594 100644 GIT binary patch delta 163 zcmV;U09^mF3$qK5Z~>l?aTR|-3c@fDMc2tGLc15OZrw;r>B3$?1~bhB+5{#+uisWT zZX~n&AKo7xOl@vmKa8fm5Bi0id<^DlE{CI5Z*Mbg<=kjR=pE&6Nf|P3v6>&iOQn_d zoc57c6T^agKK)Wtj9GvY1S`O1bVZ6qW-K#fnHh`B2%&t+arB``JqZ%iU;Em0WBd8) R3Nwv{CVL(u>$4UCoCM-mNUi_? delta 162 zcmV;T0A2sH3$hE4Z~>i>aTR~N3d1lAMQ7_POtP20)-ENXWN3b&7_8Wa!~$8gzu%-? zx)f`>7tR$2)Y@x*8%EpR2Y4cvMA=^KdAA4iN?zhxPDd~iQ;6~{MV#OooB82*X~6iz zWgCH+*e$r_!!I=vi2{o*dj&RQs8XylW1Si6%vfa>(bZ1{rj)Cc5El{pN42&eyU$nO QIADfGoA#3PvljuJ1o}`+2><{9 diff --git a/mods/content/corporate/icons/cyberlimbs/veymed/veymed_female.dmi b/mods/content/corporate/icons/cyberlimbs/veymed/veymed_female.dmi index 41d1d1e6f51ef5f9ba26a647b2dcb6e0827daa64..26b92416d23c14731bda6fb71cca14e224a7d402 100644 GIT binary patch delta 181 zcmV;m080PK49X0Usehk(R9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5; z&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBSC_b?$SBZ-=C9|j)q=}0& zttc@!6~s0~sLCNqRZ)CKVqOXnh7qMKy(m93j|e++QqzgBk|`KfMe%9*`6WacMwGJT jjMQSnsxnd&aR!C5f~%hkI93588ipqB+m9ZzPyzV_i>6LD delta 180 zcmV;l089VM49N_Tsehh&R9JLGWpiV4X>fFDZ*Bkpc$|%qy$ZuH41{OvDNM4L{;gd~ zLdnp)f-zXJ4T%M^XkWicJ9H}5b_bvCK-b!9e;Y>I-3NFe*G$D;?0L5b^UOigYEDNm z33E*HF;%?aDjRm5mj+D8T(=`I6Z-`>efUzdiei_135qZk7ATo=QFP826_px_-9#jc iFcl`mmHtu*{m)mlwjaCqsxK^!hDM|xFZ;7m0r>>H)KKC8 diff --git a/mods/content/corporate/icons/cyberlimbs/veymed/veymed_male.dmi b/mods/content/corporate/icons/cyberlimbs/veymed/veymed_male.dmi index 783725c8459a045602a788259535d552bfe6b8d2..b4fd5806bb0bd59971af13b4e91d4fa366f16a50 100644 GIT binary patch delta 166 zcmV;X09pUY49N_TpaGwep%Z^oR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6# za*U0*I5Sc+(=$pSoZ^zil2jm5sVF|NC|8M#GbOXA7^I1dGp#5wHxx#O zMq*wH5rz?^EWIc{Gmi*6b5hfZu#y;6Me%9*`6WacMwGJTjMQSnsxlQ)6LAKGvVyCh U3piE*BN~P#?%R(Zvqu2|1#?hGEC2ui delta 165 zcmV;W09yaa49EnTjKm;S9?Nj@vS?qw zNjr2Z)piG;?m*YtYkwO?+ua9vAlFRAUhH|d2lLE9(rQjeFbQ)^@-bDs;3^w-o|gtp z$XvH0FcbR)H+}e0vx;JudfFDZ*Bkpc$|&VI|{=v3H_1b)v})c^nh delta 181 zcmV;m080Ox3z`d%g@2!VR9JLGWpiV4X>fFDZ*Bkpc$|&VJqp7x3_uTj2%a=@e>>V7&)u?EY254Won z9)k1y4VewYJ~keVZKSY)^06buOlE;&zWfj)Wh^R37*bJ@jw#@ZDpo1dGa^@%RWZ_r jmWr|(McSKGK5YEUTGdb8=c^kALxx7!yItY4E&*)>+PhLH diff --git a/mods/content/corporate/icons/cyberlimbs/wardtakahashi/wardtakahashi_main.dmi b/mods/content/corporate/icons/cyberlimbs/wardtakahashi/wardtakahashi_main.dmi index 7122cafb81875e7eb79fbe2aae97178960faaf20..1fb14207c9b42d720b4ca99888b4f5a92b9f0bac 100644 GIT binary patch delta 160 zcmV;R0AK&L47Ci9j(?H63d1lAMQ8gfOtP20)-ENXWJrF&m|C#}i4C%8e?Lh(bSlwy zFB}~SRGWMI=myjDoqhplO3~cR^>EbcO}^k-E@!O}C}8=PTwH-QR%{*5l~$fOZ$ny* z>}J^V=|@c>iY>b61u_xFc7h;~Nhr2sN<|o5}g-Q0(zqLzA2pO6y7=sntkXRs#=K4w6p;L)A zJ^1txs5Z~G>j%@kdi@3}3A1^a`{}IJl03&P+^$+hNFnk!6m|^TSdn!!S6cZ*Wna>2 zBsar8UwDYDUJFDMf+vJ(VBnM9Et5m`_sViDZ&`GGLyLlnhG1^=nqv_tdx>IxQN OhDP1nAUd-l0Tcy!I7pcQ diff --git a/mods/content/corporate/icons/cyberlimbs/xion/xion_econo.dmi b/mods/content/corporate/icons/cyberlimbs/xion/xion_econo.dmi index ecdfcc197c71c21bfac6ae82b6b8edcf63227de1..7bb9044f86be5feaa09b6d76aa8a0c0e99e36ef9 100644 GIT binary patch delta 149 zcmV;G0BZk|4U-L!VF9I)Vk&=_TCoI9Tx65{ev@|TQmpM>IN}~qZLaOD>rHd-^bDLR zPUd3HyS-Kmxr}Q$9koIrkNI0twi(t~@x$_1Y2}F1cBIw7c7!b-ekrt*6JP)M(4grJ( DU<^or delta 148 zcmV;F0Biq~4U!FzVF9F(Vk&qHuv_?^`?1tdI3&I zlewAe;i%P$E{CmL&RPXPAM&@PY%^@J;+N&I(#j#HeWcaEc7#2jeyLz5C%__j0W}ci zA{IqvQDzoJW>IDqz?Lt1CY*{?CQekOW`+e}{m0d&?VHc{-%KZw=^+CkHyg7L0fYrc CT|^}S diff --git a/mods/content/corporate/icons/cyberlimbs/xion/xion_main.dmi b/mods/content/corporate/icons/cyberlimbs/xion/xion_main.dmi index 3fd2d896fdebe25b76baa668099d9c62ca178606..b404f18738861c48af6b89e1a78ca846bd0d17db 100644 GIT binary patch delta 181 zcmV;m080O%9HJbMB!8fKR9JLGWpiV4X>fFDZ*Bkpc$|&SI|{=v5Jk~iTE)ZeLq2ZR z1exH%-hvSESQ6M4j6|~i6e&^#PdRY7Z(7{@$1uT;gMJa0ly?|(r?Xb?G}j1&+f}Pb zDa86cO7)ds(6IBoHCoMy3k*7~7WNwz7+ij86)ASn@3SB#Vk+!b3WAtKv0HMkf|!U! j^2hH7&S^hX&q(F(V2ggTu;ZXV5sro?467;bvCLHsU@}z# delta 180 zcmV;l089U(9HAVLB!8cJR9JLGWpiV4X>fFDZ*Bkpc$|&Sy$Zu17=__kui}vGr9W9+ ziXk{8w;+N>g(SkKw71`(L#L8&Jn-;xdOXL;EYP!&uRt}I0}8|CD#bhdmZ0#sOOZm3 zseMOnt_3J`WF76D6h2dh!XU*;ZVwd-x1ZWrifnR+XT(^H>?sx^BgRo=*HRiI#$qYB i^ZSuXK2B9DRLeirV_Y=!Y~%+PVTMM*VUC-z%~cI%qEkZv diff --git a/mods/content/corporate/icons/cyberlimbs/zenghu/zenghu_spirit.dmi b/mods/content/corporate/icons/cyberlimbs/zenghu/zenghu_spirit.dmi index 000d3837d69f66449953b3b2c1e019829982d047..ab9adde10b2112fda0e540bcbc4cecc23e785aa1 100644 GIT binary patch delta 149 zcmV;G0BZlj48shNRRN`uRw{p(TCoI9Tx65{ev@|TQmpM>IFb&iHrMvn^`^OZdInAu zCv!39-CnDOT*kGWj#?p*$NViR+YD>0_+fdhv~t908`5fEJHnO^zZBZZ39tZOKn*eG zA{InuL1q?2WqHuv_?^`?1tdI3&I zlewAe;i%P$E{CmL&RPXPAM&@PY%^@J;+N&I(#j#HeWcaEc7#2jeyLz5C%__j0W}ci zA{IqvQDzoJW>IDqz?Ls&;zUKtGvQREW`+e}{m0d&?VHc{-%q!Z>8=BF9_zCM0YC+& C3P)xD diff --git a/mods/species/ascent/icons/species/body/alate/body.dmi b/mods/species/ascent/icons/species/body/alate/body.dmi index 68efba56efd66a1bf0d6d8bc9732c0d04c7ccc54..d7093628bcf3e0a2351f074fdaf47ddad52c929e 100644 GIT binary patch delta 165 zcmV;W09yaL4!RDIbbmVv!!Qs;Yv~li?n8cUnqXsG#8(hXw3Zh1ft5(EA3G^h1#dS4 zZ--&0Ro8wPC)M3X`2;GMle(z$ZZE|PZS{*e9i{Mq&eyLg)l^tyL)uVmq_9Y3J(6N3 z6Jgbd9~D>>X>XEcgt4%QHekGOa*i@4Mz;WtQH?{9o^!5@Fc}v1@KClX59aU7TGdb8 TXZ<&F5s{^O?0uHA3;`|%yemp! delta 165 zcmV;W09yaL4!RDIbbq}H!!QhlXZtBkvX}m?T}nd9(7b|iv11GD2xQT|ev@|SRHE$; zJ{^ayHP`+&jHbH}`WdJK&gNpyyS-K~@SGNNI%<^y#Kd1y*>PB8L)KAgwDLf8J<@6- zSHh|fKPrnTvdPU}5GKM3_zdN-$wfk#1>JIpf@%_q?1adIFc}fXNEJ7!6x`pJwWc4t T&-!nBgptL?70f5I3;`|%Z@*9f diff --git a/mods/species/ascent/icons/species/body/gyne/body.dmi b/mods/species/ascent/icons/species/body/gyne/body.dmi index a147a64c1af324b50b41f98047c3a9620275cf8a..1f2dd77750715e8ec0d4f7f9fd265dbf955c766a 100644 GIT binary patch delta 189 zcmV;u07Czv8KW7HTYsl|R9JLGWpiV4X>fFDZ*Bkpc$|%qu@1s83`FPTE24HsAThA8 zpjN0u`wLMZZfq%OBqxI3r(t0u+3w`0JIn6XZM;v58sJz;2Juc!uVfUuf}Ege*Xg;W|6D4^80nO2?3Z3260)H delta 187 zcmV;s07UfFDZ*Bkpc$|%qu?oX53`A%9D@?MN7CLn4 zQW8pr<`;sC6?WC0YxV4%UC31 wscecd3r-VZJkIC@G70q}O#2%hM<4!CwQh&z`_&cdorWu-3j!@(vlRiC3J=;r&;S4c delta 142 zcmV;90CE4U7pxbMlz)T_%`XIl72A+RAdB|*8+YkcqU~Pp;UG|LA8pqUwt4pOLe7a+ zd$-ra5zISziCejx!9+|UN?C4@#R+b)is*a=#wX5Y0W+~%u;kMZnn%Zrf{Je4m$6F5 wTG>P-iqljWk23~^OhXBArd=v9rS%_G+jeNaU;O~|FosLw$^zy;vlRiC3SnbI;s5{u diff --git a/mods/species/bayliens/adherent/icons/body_emerald.dmi b/mods/species/bayliens/adherent/icons/body_emerald.dmi index b13887f944eafd14dd7d7ee940feaf42eadae43c..49f7e9ecf08737b598ff72fe6fd835eadb962adf 100644 GIT binary patch delta 142 zcmV;90CE4U7pxbMlz)^A$u9&`E0!U#K{oC0C+^azMB5eja3oNzAMLXnbkle6MovBk zeb?8+5!A=qOxtidgCg{fa%pamvdOr`iqO~!l=YlS18QQkV9BQ+G>?WC0YxV4%UC31 wscecd3r-VZJkIC@G70q}O#2%hM<4!CwQh&z`_&cdorWu-3j!@(vlRiC3J=;r&;S4c delta 142 zcmV;90CE4U7pxbMlz)T_%`XIl72A+RAdB|*8+YkcqU~Pp;UG|LA8pqUwt4pOLe7a+ zd$-ra5zISziCejx!9+|UN?C4@#R+b)is*a=#wX5Y0W+~%u;kMZnn%Zrf{Je4m$6F5 wTG>P-iqljWk23~^OhXBArd=v9rS%_G+jeNaU;O~|FosLw$^zy;vlRiC3SnbI;s5{u diff --git a/mods/species/bayliens/adherent/icons/body_jet.dmi b/mods/species/bayliens/adherent/icons/body_jet.dmi index 84031cc419521b07d20a1b6880dbd29f49d09434..e32bcd6b93249c54aafb450470f64a4787900441 100644 GIT binary patch delta 142 zcmV;90CE4A7MK>0k$;p7$u9&`E0!U#K{oC0C+^azMB5eja3oNzAMLXnbkle6MovBk zeb?8+5!A=qOxtidgCg{fa%pamvdOr`iqO~!l=YlS18QQkV9BQ+G>?WC0YxV4%UC31 wscecd3r-VZJkIC@G70q}O#2%hM<4!CwQh&z`_&cdorWu-3j!@(vl0OY3iaYa4*&oF delta 142 zcmV;90CE4A7MK>0k$;2?%`XIl72A+RAdB|*8+YkcqU~Pp;UG|LA8pqUwt4pOLe7a+ zd$-ra5zISziCejx!9+|UN?C4@#R+b)is*a=#wX5Y0W+~%u;kMZnn%Zrf{Je4m$6F5 wTG>P-iqljWk23~^OhXBArd=v9rS%_G+jeNaU;O~|FosLw$^zy;vl0OY3P*ZFApigX diff --git a/mods/species/bayliens/adherent/icons/body_quartz.dmi b/mods/species/bayliens/adherent/icons/body_quartz.dmi index 1746f84f8c4a6b1a97215349f498cd71e8699553..5dfc428bf662edd275de09ace96f6a2c70d0815f 100644 GIT binary patch delta 142 zcmV;90CE4U7pxbMlz)^A$u9&`E0!U#K{oC0C+^azMB5eja3oNzAMLXnbkle6MovBk zeb?8+5!A=qOxtidgCg{fa%pamvdOr`iqO~!l=YlS18QQkV9BQ+G>?WC0YxV4%UC31 wscecd3r-VZJkIC@G70q}O#2%hM<4!CwQh&z`_&cdorWu-3j!@(vlRiC3J=;r&;S4c delta 142 zcmV;90CE4U7pxbMlz)T_%`XIl72A+RAdB|*8+YkcqU~Pp;UG|LA8pqUwt4pOLe7a+ zd$-ra5zISziCejx!9+|UN?C4@#R+b)is*a=#wX5Y0W+~%u;kMZnn%Zrf{Je4m$6F5 wTG>P-iqljWk23~^OhXBArd=v9rS%_G+jeNaU;O~|FosLw$^zy;vlRiC3SnbI;s5{u diff --git a/mods/species/bayliens/adherent/icons/body_ruby.dmi b/mods/species/bayliens/adherent/icons/body_ruby.dmi index 9cc2983e73fcd5b6d11d88df6c7b03ffcac98c5e..8aa2c99e62c34f13af6ffe25994a23931e69274e 100644 GIT binary patch delta 142 zcmV;90CE4U7pxbMlz)^A$u9&`E0!U#K{oC0C+^azMB5eja3oNzAMLXnbkle6MovBk zeb?8+5!A=qOxtidgCg{fa%pamvdOr`iqO~!l=YlS18QQkV9BQ+G>?WC0YxV4%UC31 wscecd3r-VZJkIC@G70q}O#2%hM<4!CwQh&z`_&cdorWu-3j!@(vlRiC3J=;r&;S4c delta 142 zcmV;90CE4U7pxbMlz)T_%`XIl72A+RAdB|*8+YkcqU~Pp;UG|LA8pqUwt4pOLe7a+ zd$-ra5zISziCejx!9+|UN?C4@#R+b)is*a=#wX5Y0W+~%u;kMZnn%Zrf{Je4m$6F5 wTG>P-iqljWk23~^OhXBArd=v9rS%_G+jeNaU;O~|FosLw$^zy;vlRiC3SnbI;s5{u diff --git a/mods/species/bayliens/adherent/icons/body_sapphire.dmi b/mods/species/bayliens/adherent/icons/body_sapphire.dmi index 850b34f12e38623b052dee8faed751dc05f54051..0e8e864628905689e762b40e41e45936abd0eda2 100644 GIT binary patch delta 142 zcmV;90CE4U7pxbMlz)^A$u9&`E0!U#K{oC0C+^azMB5eja3oNzAMLXnbkle6MovBk zeb?8+5!A=qOxtidgCg{fa%pamvdOr`iqO~!l=YlS18QQkV9BQ+G>?WC0YxV4%UC31 wscecd3r-VZJkIC@G70q}O#2%hM<4!CwQh&z`_&cdorWu-3j!@(vlRiC3J=;r&;S4c delta 142 zcmV;90CE4U7pxbMlz)T_%`XIl72A+RAdB|*8+YkcqU~Pp;UG|LA8pqUwt4pOLe7a+ zd$-ra5zISziCejx!9+|UN?C4@#R+b)is*a=#wX5Y0W+~%u;kMZnn%Zrf{Je4m$6F5 wTG>P-iqljWk23~^OhXBArd=v9rS%_G+jeNaU;O~|FosLw$^zy;vlRiC3SnbI;s5{u diff --git a/mods/species/bayliens/adherent/icons/body_topaz.dmi b/mods/species/bayliens/adherent/icons/body_topaz.dmi index 9da15d6212639de19905248b1e633891183464f9..761483240338d8342ffdc71d2670dd17aa7585ec 100644 GIT binary patch delta 142 zcmV;90CE4U7pxbMlz)^A$u9&`E0!U#K{oC0C+^azMB5eja3oNzAMLXnbkle6MovBk zeb?8+5!A=qOxtidgCg{fa%pamvdOr`iqO~!l=YlS18QQkV9BQ+G>?WC0YxV4%UC31 wscecd3r-VZJkIC@G70q}O#2%hM<4!CwQh&z`_&cdorWu-3j!@(vlRiC3J=;r&;S4c delta 142 zcmV;90CE4U7pxbMlz)T_%`XIl72A+RAdB|*8+YkcqU~Pp;UG|LA8pqUwt4pOLe7a+ zd$-ra5zISziCejx!9+|UN?C4@#R+b)is*a=#wX5Y0W+~%u;kMZnn%Zrf{Je4m$6F5 wTG>P-iqljWk23~^OhXBArd=v9rS%_G+jeNaU;O~|FosLw$^zy;vlRiC3SnbI;s5{u diff --git a/mods/species/bayliens/adherent/icons/body_turquoise.dmi b/mods/species/bayliens/adherent/icons/body_turquoise.dmi index 78952bfb04ad87b725569479961b513e5b618c4d..4570f52fb88609010445b0e1bdf11f864388aa1f 100644 GIT binary patch delta 142 zcmV;90CE4U7pxbMlz)^A$u9&`E0!U#K{oC0C+^azMB5eja3oNzAMLXnbkle6MovBk zeb?8+5!A=qOxtidgCg{fa%pamvdOr`iqO~!l=YlS18QQkV9BQ+G>?WC0YxV4%UC31 wscecd3r-VZJkIC@G70q}O#2%hM<4!CwQh&z`_&cdorWu-3j!@(vlRiC3J=;r&;S4c delta 142 zcmV;90CE4U7pxbMlz)T_%`XIl72A+RAdB|*8+YkcqU~Pp;UG|LA8pqUwt4pOLe7a+ zd$-ra5zISziCejx!9+|UN?C4@#R+b)is*a=#wX5Y0W+~%u;kMZnn%Zrf{Je4m$6F5 wTG>P-iqljWk23~^OhXBArd=v9rS%_G+jeNaU;O~|FosLw$^zy;vlRiC3SnbI;s5{u diff --git a/mods/species/bayliens/adherent/icons/damage_mask.dmi b/mods/species/bayliens/adherent/icons/damage_mask.dmi deleted file mode 100644 index f42eb2760e64e9792e84ddd1024a3ea3be1c7591..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 593 zcmV-X0s0{{R3SZmPk00006P)t-sz`(%& z|Nkp#hqM3y00DGTPE!Ct=GbNc005zSR9JLGWpiV4X>fFDZ*Bkpc$|%qy9&cF3`J+_ zD@?MNzUbDaB!mpjF9d@X+mP5Gi}v^Hw$QCu+r8*;xS&?w`eB@OcOT(_ltYU8s?WPU zsAsV3OF11uc?{0;`*MNIhOxxPqp=Mr8z`500JV_W@SA_oIvd&qlsB<1Baw`xvLz)J zOcP-=ujm9a3B`$Ws#1GT zPx9?}{O?h!b*hve0T>Tpm`;Js{y%^;YZ0v3O4py+%HVcvW%xS>9=GnuL%Z;_>A%BA zESn4r0WV-6FwJ|Mk;yR@E&8>#2=KTxp9nqxv=w+qF#fz_-%}TgoA@K$aWNtA0P=}? z48{G?4HoCbD&rD}!FoQMDxF4isFXmgt0{JTB`^vYVz73SDjTY}m!MB(z@Yb^Qil fjjLy?dzADA5=3Ac2d|s>00000NkvXXu0mjf`r!rq diff --git a/mods/species/bayliens/adherent/organs/organs_external.dm b/mods/species/bayliens/adherent/organs/organs_external.dm index 2e47331bd0b..e7f3c3426b8 100644 --- a/mods/species/bayliens/adherent/organs/organs_external.dm +++ b/mods/species/bayliens/adherent/organs/organs_external.dm @@ -71,7 +71,6 @@ name = "first tendril" amputation_point = "midpoint" joint = "base" - icon_name = "l_leg" organ_tag = BP_L_LEG parent_organ = BP_CHEST max_damage =20 @@ -81,15 +80,12 @@ /obj/item/organ/external/tendril/two name = "second tendril" - icon_name = "r_leg" organ_tag = BP_R_LEG /obj/item/organ/external/tendril/three name = "third tendril" - icon_name = "l_foot" organ_tag = BP_L_FOOT /obj/item/organ/external/tendril/four name = "fourth tendril" - icon_name = "r_foot" organ_tag = BP_R_FOOT diff --git a/mods/species/bayliens/skrell/icons/body/body.dmi b/mods/species/bayliens/skrell/icons/body/body.dmi index 5d71019d7b144fb6a77bc1090cb1db1b91da787a..91b0e86f3b1b954d23c3b4ad3f136b9c06232393 100644 GIT binary patch delta 160 zcmV;R0AK&N3bzW7c7Kt(3d1lAMQ8gfOtP20)-ENXWJrF&m|C#}i4C%8e?Lh(bSlwy zFPwV@sW$ia(G8~QJN*LAl%lzr>*1)?n|#5wT+Uh{P{8snxwryrtk^o9E3G_n-bPxD z>}J^V=|@c>iY>b61u_xFc7h;~Nhr2sN<|o5}g-Q0(zqLzA2pO6y7=sntkXRs#=K4w6p;L)A zJ^1tnsW#8H>j%@kdi@3}3A1^a`{}IJl03&P+^$+hNFnk!6m|^TSdn!!S6cZ*Wna>2 zBsar8UwDYDUJFDMf+vJ(VBnM9Et5m`_sVu3K_L&Zo14-{1d_xBXFX@}pI7!_~k;Ps}mf~%hkI937W PYlbXY$T5Yp0|77uIAce6 delta 161 zcmV;S0AByI3bP83Z-0%Ey9&cF3`J+_D@?MNzJ@McNy|vT1+6ahGnj zwtL~|!a=>hjrVER!()OMat@UARiAfzQ14)i-^%F-%42Z8)N+AbOu;R79*yll*}%Ep zfLhqBSo7frIi`@BR3XmPr1%-p38;mr2r$E|fbu4_Eu&~GN)^W>n(?n@ug7`#e)R(o P&4x@0Rezs)R9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5; z&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBSC_b?$SBZ-=C9|j)q=}0& zttc@!6~s0~sLCNqRZ)CKVqOXnh7qMKy(m93j|e++QqzgBk|`KfMe%9*`6WacMwGJT ijMQSnsxnd&aR!C5f~%hkI93588ipqB+m9Zx{Ivt%rcMz6 delta 179 zcmV;k08Ia~39$)~Rezp(R9JLGWpiV4X>fFDZ*Bkpc$|%qy$ZuH41{OvDNM4L{;gd~ zLdnp)f-zXJ4T%M^XkWicJ9H}5b_bvCK-b!9e;Y>I-3NFe*G$D;?0L5b^UOigYEDNm z33E*HF;%?aDjRm5mj+D8T(=`I6Z-`>efUzdiei_135qZk7ATo=QFP826_px_-9#jc hFcl`mmHtu*{m)mlwjaCqsxK^!hDM|xFZ;3mwF3{rP`m&D diff --git a/mods/species/bayliens/tajaran/icons/eyes.dmi b/mods/species/bayliens/tajaran/icons/eyes.dmi index 1b29ac5de32a1969bd5e0afa5d32abcc089b8ddc..e7b1f1241a27ef98bdefffd42c9e4ab05716dac3 100644 GIT binary patch delta 158 zcmV;P0Ac@z1CRrdomJjRL_t(|obB4N4Z|Q50MR(3WD!J(d9r-hAPU5B z6~*7?oR2&6)B>6UXaP+Dw1B1nT0m2Pvj@i*ug~?WoCO!iPyrs3 zAOR7RU;z%3AOQpwW=Q}sB(>_!p96eNjQx`((`ikKX_5gj7~DR<8;yq%!oHZi)Bpeg M07*qoM6N<$f;WLdr~m)} delta 138 zcmV;50CoS61BL^Tol(?DL_t(|obB475yLpEI-HtMwdPU*W}({Wgc{r5s+xI=P%$H)OvP6@uEG?GEHkQ&v_DGU!CCM(vG9zP&Oxem7F$j~Lgvip^ z>zkb{VN45VkR}F$!8~`*d%VZ{{`37k&+$8c|J?W7*If5?p4WAL&hz}7=l%GKx#0m` zQC zH8b>yK~O>aSO2(35pE2Z)ysDInP+c}AA|}Yk_~th&Zg*@eYe_Ih%*A2$pRr?s|w=zH@drx|H|;1Kdpu@|8qcfQ36Jj<0(rjqdE zRH;n%iQ4)Qgrtc|0&Rz5lJ+Ctq?wVkNs2I>S5mCz8+*XP?z3!Gi|*}buIOz`9QH-; z(wpQ{10h`{XMLs2-af%%AEyC;$Sot(1?!OPW%7Oe(eW^z-;}B2;inW*?>FKY!$Fkw)1V$T^sM4Fnm!*l zX8fcuG$8UN=k8VdlDN9Bj`~c?R3-saQ^wqlxG_-q3+Kz6 z52N;F)i-&$xI6?}&10Iy0AT9^0NCz_0M5#sKtvY|0E907!@!}(0ef#?-@Rs*Gtf{V z<8lsF=LE4?F8azV&wzd>H3x=-(NyQ}yAl~FeJC+?JCcgAm?NhfZLEM|o<^r8&ygR6 zLd+q+>2x_jgZg3E2ip3&JtZ7t#+f*x-74p8q|Na)TYQ9lVi%E;7=SZ{u1HTg?(5%L z*?n6hWV%NY)Hd)9bDqzoD${&x{ z9$>xudopa&KOT=)etT~_@FO2}N5kc3!f(wGB}rxj6?46&+@ZueNAWOkxCx3{m@52m zQUEq&*>Yf|^B4q`6!c9=sg2Q0$toA_(hQew*cHzw_gmcA3#7#cyiXpb^E>&(nYS9r zA8|1yDP$&atEsD#q=|R7SH-D24XLZ@R-fY98Y6lY|Kbj$46$%YB2M0z#DEur7Ky+1}(ZI0(m*=@zRyv07YTv#V6Pj}kw#u{q2TKZlpmrQ#|%!%Y`B!n-Ms`5E>~J_xLbkTtb4XRbg_NWNq_((J;MaE8R9ty;n~A5S;PV zxyJHghnAr~vc<;Qv)-w1 zk7{th^tBP_JvF$)2y+QxArN`4dqUudOO|^AM>MR`swGhjRJuCUdGHwxs)T0?m7+; z&S)(NqNAL+I|hQ&tkNtEA^Onk##;lZwaV0CYIgW`go%$+niVcdd92^#uoC|7cM+E> z)Zm1IL7JR*N6yI7NQ8!70BnGf^W@kl+VC@#ja7xYo5(z;b>I5#`}DIcWc}%NibpoX z1$2~lbHieLo1?FnO*=FQY|l(H4udBlsI_3! z+NJ)jI8ejFR0~c5UHmaV8rH~QD;YiHFJ{wGYx|_OzvqQ_XtEE&pQWx^3|9_lvXdQo zU|!U>qGu0>@WUNewCS1Up1hK&IkcsboH7}O4laZv-E;eJ>x7iVNZGL;B5U?+AbS( z5Oa52jW>bbC*Us|ZxuhrrWwy|ot9yJ=XF{XD>Cs}>tET`c0lHbaGv(Un0U8KbVhDFsar3X*M`=Z5#)?`Lb3VR@ce>3Wnh0{W8#7I(mt zl1WT#G}t^!VKlQC8fTL_qQ4e<)l)~KM(X{DCgKWa)ZUKKUnW7=}2ab)1((Vooq{Ud7ggY zt-ZYKlvVyggjMAnnJl=rdNcotiX>Z zAw-7|YiHxl;vz-8`TJ|)v8Ol+blHWuJiom^t$h5TNqS0!N`PTM&s!SEPpaJRfI6Q& zAqtTr>cYtjF|ad|ofq}-vBU0@&hgbZhx!$xH#1@RQqjeC9P~^{{Q7uGX6fIWY#r)O zR0;OhOZARBZx-niLtKWhlJ+i$VFTb8+{r7nGsAZc0m}$m*Z#)dx3+ z2Yj(Uvzs1&BV5IrB9wU=9rZ2Vgeogqac1*242b&{3Z}b90PtFb18BVs1%Nn7;D0+{ z`+Z=a-0Sb|le;!Ag03$&r#hwpt*Iz!fI`;*2jFFo2c|lr^QYs%%_hc3#^`e zA|Cm`L{^l0ZsCfqDfDR=&+S!M`w8F?0GEySZm)`kR=jdiyTk2x%>ivj;i2BYY-KeL zBEgl^Y*dQpGDNvLb-GMgsY>*1=9}Zv5hEy6R*nUzNPP>-yLMr#QzYPCu$8JOzsu>J zMz>E)WKnL|hG#Wy{)-#Qz@2b#&ViK6aY_r-@_Qi7=b_J4`|5ppL(?AY+YB>MDz!c4 z`lR45Ez-n;5qH)4Nh491VTB!qX>@EYL`eHfq2Wn^loEcUS}_e!AsGubv(x}Jop9P? zNAQ%ga&qsAY%B^em;-rx$1WHKc#JmIR98RS(hYx_kdP4cyHUePUm^&Yo}LN9;}z^d ze1h8-R%jmPr{og1V%}}!A%>X9{+)Jvh480NUcYdbt9{GMy`BrAjd#-@kZNoc`e^;C zKPlrc$&YV=XXxoZrbnZTY3JDO%8`fUW|nU0SDD=xh%z#VfP1idr~1RXVT#}9aS%yK zH9)<-UN0HVWrH^59Fzc+e`OF5H!nPIuw6QTt5>nN8hqT}rwN)`^~KG^CG!JyV;zA- zj=VB4Bedg~arWiVvpeJhT8sJN8i(qAUkBIFp(Bhb!C!CHb#kMoHeN2cyBJao0z4_+ zBT)s_e-9Z>bwVSeVjS;xoZDn>-_!nkotfd35h^bdsVQqg@behm&M{H0^Uz_GogWgd z^Kc+&2ewN}QRg?*`V@P+>{5l1K-6&`Uo0*QFW2BLkTqDKrK&>?BA4h8`T~pMxv$t> zU#@izmOTf8VwB&*txprP$ayJv<3bc7S*}YnB74b@Ad|mQ_S`WzU;6#UkrDHB$tz`J zH)CHFF}16@kKgxn_f?ru{Dul1o?iMDkY{AAzHB1_x^vBZfO~1(zfKbO&B;^14s!SrR{fn>IqgWuq zmb*e#rEWiK=Tl?N!d8o*Z=DDE%i04f_`CuWiB(4=OmcGqo$Jq-Tr>f^vgJ-d?yf1i zD{BPwwp`XvxA>rL#;K+L1kdpV96u_R9&Ao&2ns9weGxcs&ktV@YWzBO8Q}C}5&Yd{ znm<+56E-H<7ybZsXZnWQ*1H;1Q&r3g4CLs;MU zFR$>R$t5aBKKrJbs1%Op494|0`bN5Wqv-j9U`|ULx0K z)(h56$NS0-%=zDl@%^EzyRgn0m4BTtB{f_x6XTh*I_+Y{F;*HFcn|v`D(Tp59&+y6 z=B3yrhX*TMTC4=$XYbEhs?*gD+gb*W_P2`i==}Er81^o6G>l1p-s83}+EX^{*Tp0N zEsG5PbqakCiyd(J#;Va0opaEePE08>A6#5?m6BS`@*S#}3Vw6?%Q$%Z===T>3I#@M z`Th@gPXrF~rw3Adns6j7OyJ(V<-!4-mEe8bI72vm3ulSEr2^{|J*Wmz@*ieL0S;4JMW@V-0 z%vC4xgqm`3*G2RX2?k$4?<`Mpd&`Njqvv0*mW*$;KOhzO*f-@YxDn?Zoa(=U2=28- z@4dFGtMnniR|(3!#`ELADG2Btf&ZdB{GSWR|J005o3gP{+!PbL>({64QS{}H|5<@U zUBXTiHH?^gv(I{%#m=1VZ{AnE8#cf5p>eJ)!JegWg(`JEEhPb$i(8+ZeBgOiY-j!^ z%g3$n3}PmDDtdIZ2X$xfUF^bS;~Aq)-iU`mwc5ys?%1NGQbhW7F|_wp#CdUV^6;(3 zKo&n7PHqf~ogTh*_Wt3qb(ZouUi{maWkD0etNANo&hD6JG0c|20X-W4Ow;?2m`K5E z$BeRLIZl-t6g<26A<08kwAXsGk=Rk&h|OFxC)GB8w7IS*#wY0zj=Plzhl3IKNJSO7 zA&9U_+q4AH|FgSp>2bKO4WKG|K#dj?WD@J1t#v7VReMq3cD`A?59KAO{%qsbP!G`d zHyv80#RR9z)&s>HTh_L1(Kv5VqZaJKI%*)-+smtvA_ZhXGdMZ_9ai#h5Sf2|rHePh z|6O@|{r_=1Lr+0lOE`StW=eaVnQnMP{cA8u+v;6$zBGCb={3O`Ne|w=SHYx&JCTDa zVFrr^F`iiu_WbDhFkYp5vMO~9(CO?>RrQNkB=q~*+Z|{lM*Kg=tIwa`cZIDznJ6HMunyGrL@4Xl)&$z<3Vj9E@EP0 zn0g4{e|8P(Jorp~ffVOSDhO`~8Z&IWuQQzJ+2q`OixZ5PrW_o9`aX}-dR(*pQFkz+ z>0R`0d9Vkh#PM(O)qghgKXTrQ4-6k*cIo3YX^c9=KN|i|4XCV5;Pgfi9%H(&v`cDiV>cT2#nnGo{Hui)x(9;x&EagfbGgm^;g68=}d3c*kz7+y$=l@gkKNd14G_j z2D$0R=W&nci@to4*mJAR+~SpIq8n~DS%)L5-nQO((NG2!8eU+EEr;dTEo_;`GQS9QxtE5!ppgT6vrnaDGe(Na>_3asl_%ZAn`i*<`>pOfAX!DD{S zT7CLbIeBXveSCT=26l2u^Dpu@4Qk6qW(M@Y_+TBwkq?rx)C%~KOK!-Yke1qBY!}x3 z0_IZNXvR0izY@4gV6FIcB{&fzZ^t^k^BuIKCpn;wu^ic zs^8COR`~`~B2t=s}_oz9Y{%u3-*EX)`Tya3GBF}uCzVGnY!>vB7 zM8H1SLv3=)a}-NYl_+U z7!9j|r}dT&&2ysCgEK2ALuv^auxu<}PxNoI8mG;jCvP#ER5M@s@ti6qZ$)sNdTZ(! zRR#*Ha1tgzx;F(pQojEjQWte{X88?)Y-D&6H%KHTWfmj*dlFM>4@d(|U3R?9l-27k z$IlV&BJ7=laZ*xO3AuQ=$u>~2P_DD#dk%TudHU{BTYiWA5H(eLf1B$($>_qF9;15P z`ond4s0@c$i@0QnVyh_JvP5;gL}B^C>9}*Shs`!E{`DqE@l$E9bT8G0mPYr4KSkwV zjlhX_e`6s6145g;zaPSM$1IG--l&BX0YP!QKCO0j??F;j<51TDvP5QLBj}>5v>nWQ z0mtBG?a4gPdBl08FETy{fA4(4mf_Z~8CIG1Ui|$f+8}+8zXL4WKo)zb58@0$`7?*a zz?T&ewP_^Mgrl8f=a7;NX9PJpn`3Pk>XSmy(}GO=pWU2QU(;zHH)t;ErPX*_XxEeYzQ<6cRKLA7Md;vD}pmp`NX-d znK{yF(ko;3FRH literal 8206 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 delta 142 zcmV;90CE4S391Q@f`14ZnkyKC72A+lAdBYuN!p=Pi8ej>^gyUK&$jCa)4Y291}X`& zd6@g@tkse{$1U8hT17}9@;4NA4BJ?dbu?F6`9x)3(rP3(!#-brY7!~3(Pb|v6EU(A w1VNcZksT3PP$puGRPazmaK}dm!j%81+O$LS`RWQMmxe}OQv!k}vjYLA15ma48vf?(L%+Ow)Jz1)M2G zb2Hb&QL8ukf@`>(wL+kPv*oT^2B*t(rRQk!#1COY7!~7=%N>ti5S}n wf}l*I*p4X`L79j>5%Ru5aQjCFP89#C+O$LS`RW20WQHcR^8$CJvjYL711^gyUK&$jCa)4Y291}X`& zd6@g@tkse{$1U8hT17}9@;4NA4BJ?dbu?F6`9x)3(rP3(!#-brY7!~3(Pb|v6EU(A w1VNcZksT3PP$puGRPazmaK}dm!j%81+O$LS`RWQMmxe}OQv!k}vjYL715IK-Qvd(} diff --git a/mods/species/bayliens/unathi/icons/body_female.dmi b/mods/species/bayliens/unathi/icons/body_female.dmi index fad7c93f17ad70a52f0b1d63c018787c2cc229c1..77620a6b94266267342889fbafdf4044fbb03a84 100644 GIT binary patch delta 182 zcmV;n07?JG3&#tPYJZ@5R9JLGWpiV4X>fFDZ*Bkpc$|&VI|{=v3`#Q$T kqpcWLqgc%`mQUvYvR3v}_xb7yyxoQ-CZv+Ivl0Qc1lQGA$^ZZW delta 181 zcmV;m080PI3&snOYJZ=4R9JLGWpiV4X>fFDZ*Bkpc$|&VJqp7x3_uTj2%a=@e>>V7&)u?EY254Won z9)k1y4VewYJ~keVZKSY)^06buOlE;&zWfj)Wh^R37*bJ@HYv0eRjg8^y-DTsV;v(M j!Bv#iDAF?`SCsu@t?H-l^VJRP@P69KdY&gfHQ diff --git a/mods/species/bayliens/unathi/icons/body_male.dmi b/mods/species/bayliens/unathi/icons/body_male.dmi index 582c1ccd5844b3a0f9a6d41db4358d5bea635489..75d2a831377954ade5c8e0cf2c11a539ead48d55 100644 GIT binary patch delta 182 zcmV;n07?J93&0DIYJZ@5R9JLGWpiV4X>fFDZ*Bkpc$|&VI|{=v3`#Q$T kqpcWLqgc%`mQUvYvR3v}_xb7yyxoQ-CZv+Ivl0QV1kK@CwEzGB delta 181 zcmV;m080PB3%?7HYJZ=4R9JLGWpiV4X>fFDZ*Bkpc$|&VJqp7x3_uTj2%a=@e>>V7&)u?EY254Won z9)k1y4VewYJ~keVZKSY)^06buOlE;&zWfj)Wh^R37*bJ@HYv0eRjg8^y-DTsV;v(M j!Bv#iDAF?`SCsu@t?H-l^VJRP@P69KIR#R5}L diff --git a/mods/species/bayliens/unathi/icons/deformed_body_female.dmi b/mods/species/bayliens/unathi/icons/deformed_body_female.dmi index 63f99147848397188cb88335ea5ece48fd9589af..ba4e40e8142479c00e29de7bddbef0990a9313e3 100644 GIT binary patch delta 182 zcmV;n07?Jg3*ifpbAOfFDZ*Bkpc$|&VI|{=v3fFDZ*Bkpc$|&VJqp7x3_uTj2%a=@e>>V7&)u?EY254Won z9)k1y4VewYJ~oapq(%xGC?88w%w!fg=F3kpQpTe4U~CbQHYv0eRjg8^y-DShv5t|B j;3~>$6zLg}E6V<{R`pZ&`RWD%Lxx84u%73$90A1y$yig2 diff --git a/mods/species/bayliens/unathi/icons/deformed_body_male.dmi b/mods/species/bayliens/unathi/icons/deformed_body_male.dmi index 687db5ff7a61976f29a566c97aa17099a1bd6862..a03dce76634bcbd2fe42890a5f61901d495a3ff8 100644 GIT binary patch delta 181 zcmV;m080PM3(O0UbAO+DR9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5; z&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBSC_b?$SBZ-=C9|j)q=}0& zttc@!6~s0~sLCNqRZ)CKVqOXnh7qMKy(m93j|e++QqzgBk|`KfMe%9*`6WacMwGJT jjMQSnsxnd&aR!C5f~%hkI93588ipqB+m9Zz8Ue8cW{6FN delta 180 zcmV;l089VO3(E_TbAO(CR9JLGWpiV4X>fFDZ*Bkpc$|%qy$ZuH41{OvDNM4L{;gd~ zLdnp)f-zXJ4T%M^XkWicJ9H}5b_bvCK-b!9e;Y>I-3NFe*G$D;?0L5b^UOigYEDNm z33E*HF;%?aDjRm5mj+D8T(=`I6Z-`>efUzdiei_135qZk7ATo=QFP826_px_-9#jc iFcl`mmHtu*{m)mlwjaCqsxK^!hDM|xFZ;6_0kH&^>QFEM diff --git a/mods/species/neoavians/icons/body.dmi b/mods/species/neoavians/icons/body.dmi index b83c9c64f8391b009fa92707009a73e020946e34..5e9915ed184a72b44d4515d6f9d9d519588337f9 100644 GIT binary patch delta 165 zcmV;W09yaB39$)~UICzyUlo5l3d1lA2H@E~g-Q0(*V?5dlnlugjHwmNpx7Xr_WDWM zpKk3rqk^>CEp?QO;_T+UJ;c!&8LQZ^a3vOzGmk-~aT zdyf<|n+5jz^g~aCl#9x7^r5Io8(xZvs}yN8p}aoVG13ICVpxqLJ;xMSJ{kXIt?H-l T^VJo(L53!^98r_A1_7!AQzTHX delta 164 zcmV;V09*gD39t!}UICwxUlo5n3d1lA1>o5}g-Q0(zqLzA2pO6y7=snt;8-Aw=K4w6 zp1XelbHQc-)8%I8xZi#mdg SS2yWYhDPbg^hUD>0jdLVd`d_F diff --git a/mods/species/neoavians/icons/body_add.dmi b/mods/species/neoavians/icons/body_add.dmi index 56c31a46a9af380cb31d670c31a4c7acea2fa3cb..bd52c9a0b8d7cff5da3ec8c88c252e23d562213b 100644 GIT binary patch delta 165 zcmV;W09yaL3A+i9UICzyUlo5l3d1lA2H@E~g-Q0(*V?5dlnlugjHwmNpx7Xr_WDWM zpKk3rqk^>CEp?QO;_T+UJ;c!&8LQZ^a3vOzGmk-~aT zdyf<|n+5jz^g~aCl#9x7^r5Io8(xZvs}yN8p}aoVG13ICVpxqLJ;xMSJ{kXIt?H-l T^VJo(L53!^98r_A1_87KUo5}g-Q0(zqLzA2pO6y7=snt;8-Aw=K4w6 zp1XelbHQc-)8%I8xZi#mdg SS2yWYhDPbg^hUD>0ki{sOiE?| diff --git a/mods/species/neoavians/icons/body_raptor.dmi b/mods/species/neoavians/icons/body_raptor.dmi index 5ec0239386c858488166e82c7c49ccf4f775a2bf..fd339fb8f3ba0b24f79c5f7d4c668dd308f6ceb7 100644 GIT binary patch delta 165 zcmV;W09yZ_37`p(UICzyUlo5l3d1lA2H@E~g-Q0(*V?5dlnlugjHwmNpx7Xr_WDWM zpKk3rqk^>CEp?QO;_T+UJ;c!&8LQZ^a3vOzGmk-~aT zdyf<|n+5jz^g~aCl#9x7^r5Io8(xZvs}yN8p}aoVG13ICVpxqLJ;xMSJ{kXIt?H-l T^VJo(L53!^98r_A1_7A^JvvZ( delta 164 zcmV;V09*f{37-j&UICwxUlo5n3d1lA1>o5}g-Q0(zqLzA2pO6y7=snt;8-Aw=K4w6 zp1XelbHQc-)8%I8xZi#mdg SS2yWYhDPbg^hUD>0ht3@v`Q5K diff --git a/mods/species/neoavians/icons/body_raptor_add.dmi b/mods/species/neoavians/icons/body_raptor_add.dmi index e1f3697bdb7d736fbbe203eadea5db0985c1fcde..5294c1e3e1c6423b785afb05c28bf410622e2e0c 100644 GIT binary patch delta 165 zcmV;W09ya4391Q@UICzyUlo5l3d1lA2H@E~g-Q0(*V?5dlnlugjHwmNpx7Xr_WDWM zpKk3rqk^>CEp?QO;_T+UJ;c!&8LQZ^a3vOzGmk-~aT zdyf<|n+5jz^g~aCl#9x7^r5Io8(xZvs}yN8p}aoVG13ICVpxqLJ;xMSJ{kXIt?H-l T^VJo(L53!^98r_A1_7f3N*+*| delta 164 zcmV;V09*g638@K?UICwxUlo5n3d1lA1>o5}g-Q0(zqLzA2pO6y7=snt;8-Aw=K4w6 zp1XelbHQc-)8%I8xZi#mdg SS2yWYhDPbg^hUD>0iy$Fgi132 diff --git a/mods/species/neoavians/icons/markings.dmi b/mods/species/neoavians/icons/markings.dmi index 9febe1a0ad7a8fc63804fa604fec84cd778ebf80..68489bb750f3dc8d8639ae170bf32e3c2aa62885 100644 GIT binary patch delta 903 zcmV;219<%O20001>1Oos70D0kh9+4p_9ymBS zCMG7pz`(4jz5@UN00DGTPE!Ct=GbNc004@SXia~Ki!&v&s2HS&i!-e#F*g;&HbhmV zo0yV9P+@syUV405YGO$S&>5tuCd&NOL?Vm@DZ*!(vVyCh3plUPOWMt`Nba6imoyD00A4EK12}5OE-rVn?mWWC+gSNe)JM z%+P;7z+fUl{)$ZfyJ}_8yOVQ@V}*qBKHQ-1-Mz2wwCLVD0D>U?Cu-$Wto%_b4A%L{ zX2W7M6aT~~BY(D!xxs#?-Df%!`=D%rHEh`6237Bj>lylGhT<(x#$1O|>L*6sF`gg@ zf*=UujX~!#`8C0Pu1j(9XU~7tl3424uw8$F;ciFG6y& zRwY(3TO|mBAPC~)QunbcDakI^SwVZrbbaBfy1xB0%9VC$FqWe}ldI?>2juTpc*cL& z`^~)Ib9`%txr}><;ax7};0RPFcvb^^P47EXW`%ZWV?!gxr#-o|8eb<4(kZA&ukofH zW2m@$v6V|HylDAoIB~|44%$+({$MwFi)wI`vbkN0t=$jV1FkoC{Oh5BtWK{o1_Qo! zFS&R{ptLM3yh_DWaSjVQpIWFv82+yLqjT#syNSn8Fted@%yB)2?=1j0eX+0hP zRHV!hzwuzkhct%*KhTZ=aMeUR$=X{QHVYpt7VQ`ydTIh)h}JZbAMp{W`ig&Dzj3Oy zOh@O_$4U*I)G42}1@iQIz@MIWW8#QUYg?lZN=|EAGpX2*Ac%M2LD!c;y&**8r(Y*4 zoImScvO355v=IJqy5zeMNziqEEwP?XuueM;=lI}_*pdLdz@S|R=L+f0eS&p&H05qb z>uF~tSfae1j(;k0W{BT-w&FWOx)XsP=sp0hn&?+qdrQM^;e(~39Rn<%nm`w#bzS5~ d5ClO~&Oh6smPxQQ@ihPd002ovPDHLkV1koxsQUl_ delta 1042 zcmV+t1nv9k2lNObiBL{Q4GJ0x0000DNk~Le0002M0002M1Oos70HE@5G?5`G9wsIx zI5;@Kz`($o zoevT6ZxQoVCeLe1K2RH59b0^F#6Vox8(SE5_vK#e?nxp>Ah>fldfd?9GAVkkIa7s! zJ(YZ8IejNCL=uVtMgy8%HYFjYd~-np*}4NW=zTDtYoe)Igp6CWA&)9S(SrNc^f!Ob zk01zwAPDkblB%lAHMVSOG4}w}#&qBj0W$^S&SNY(4Iy0naKg3shA;Q}@JQ072m}u< zqGymyQZE?%^!GL^dae6&g@HGR->5m0P%uci3SsQ0g~%k^ZYJD2jBa}{B(Vhpauu`s zdjJy1_6?aqAAQfnLTDNR9QT%I4yt8{V>O@Y^-5`AP9mW z2!iBP!wnm>QbxX4oFWU|&p=t6+d!Q5=^wA5ya~PnMFqFF(|ZRb8x@2Zd6%<54se#emgGsfJeVuvY2;Zg9Zg>Qf>SB14J&S+H83es& z!ow6Kq{p5`6b-a4lapJlR~8S;2)2F@Be+eCkd=z!fe1yB>gXeaAc%wq%Zf|2qzM!Y zO4BlJT_%$e)NV34gnD0ac-RL$ptso!tXB~lWU~txopkH=rx@x{AL^-Na}Ez~2lOZ# zw!JSY)X^Aft6QrO`vhp`K7oI_-WhS{5Gqq=^3nr3Y*mR@Oakc8f66>KDbSY9;S!s+ zG632-m=KP7AAF(SA_V?L>nj5oZ54GDoArq`=$6N5VZ3FJ(R5n985 z#Q9aC8I^llP^J0xYmFcXf*=Tj{A97#qt`>vgmjCubc+Ua-{Tw>!5~JG$G!&I9z@(Z zgzDU%rCW43pYe~{<1Oa@0|sqjz~|c>q2**=$VTZl^CJj?AjppS0p#wSBoTrU^#A|> M07*qoM6N<$f``k~JOBUy diff --git a/mods/species/serpentid/icons/body_green.dmi b/mods/species/serpentid/icons/body_green.dmi index d939879615d2edcae035a3baa0fe366c085be8de..97c96f522fc02ed2a3f340b8106597ee4a9d7a74 100644 GIT binary patch delta 153 zcmV;K0A~N(5!(@vSOKMxStfro@MwsZ`sE`?v#ft-cJ`ank*5 zgeP(iDeAL6?K)7e;0kTW@c@c2cq-NDAQxM3lMNfoYXiy!&eZ}nvt6<3{g+xq6dSV9 z3Bp7en};+{2zpK-3VIjxf>H^^W=^RH!bI4eF#o3r?ax=VdYJmpPTmLt^_}6-u6Uud H2LaUwja^DU delta 154 zcmV;L0A>H%5!?}wSOKPyStfr%hUOKF!HR82Y>?IV^&5BTRI2U7ecXY#R^NtknstAl z;E7aXPWq}ZhYr*$Iu84BK7k4tecYe2b3rCOjCvKv-?{8FokA`@(K zf-n(A<{`}!f}V0rg5DLqpj1MUS#oAUmo@MwsZ`sE`?v#ft-cJ`ank*5 zgeP(iDeAL6?K)7e;0kTW@c@c2cq-NDAQxM3lMNfoYXiy!&eZ}nvt6<3{g+xq6dSV9 z3Bp7en};+{2zpK-3VIjxf>H^^W=^RH!bI4eF#o3r?ax=VdYJmpPTmLt^_}6-u6Uud H3IPKMGLT5x delta 154 zcmV;L0A>G-5{(j&TLGq#Tqb`)hUOKF!HR82Y>?IV^&5BTRI2U7ecXY#R^NtknstAl z;E7aXPWq}ZhYr*$Iu84BK7k4tecYe2b3rCOjCvKv-?{8FokA`@(K zf-n(A<{`}!f}V0rg5DLqpj1MUS#oAUm@;>0tMID@Ev$*w6dP_Hl)?eu;7*tzZ5~VRV;{PK`IOA u1k{{T5gZ_qu}nq?_4OZwxvp}YeEdhXrk}dcSKk@Dh9;6A?iXRQK6ANX4eTZSz*^t7}zTDeGNAJS?jyTG1Lzf`c@I3l5OTNG1zl>+3U8!7AkmWBy0Ark}dcS63rXhDHgeYym2<{tE=9Mn10q diff --git a/mods/species/utility_frames/icons/markings.dmi b/mods/species/utility_frames/icons/markings.dmi index b824b5efc47414639d65a1b5f4cd225a1a6e5378..9867444ff91f1eb0134cca28008e61c936972c74 100644 GIT binary patch literal 857 zcmV-f1E&0mP)005u_0{{R3dEt5<0000RP)t-sz`(%& z|Np6}snOBVgM))xTU#+PF&-Wsz`(#wQ;9SH0004WQchCV=-0C=2@&@m3eFboCIIXOkt?g$Di3u=Wr&?}%6o5oUTD#xYQCxw9tk?nu! zeGe|psX4cusV}X5B1a0NIhw;}tJOjvE|qM#;RzMurnO1kU z4_x!^>taG4uThvL{I6Y@Js{_L2y>r*-JykC+grW`_~}a1boKjjFPzO@zjaJUnE(I+ zM@d9MRA_X9{-{R7xo$!uA6XVsQ72dR*m2yAD~5Tt*y~lrh67&nWN0(b_0=6VND56fNkbUfWsRQ@8=!@;lZjHY-=sq*LjypIf)rbyefMX^%LK)cn}GazcjLYC2oH4J=#yf~&m6 z8m)yYYebDf454nTj8%8#V|A78#`ioZ(1mRFg9`JlX!d{PhuLHH j^Ur=8EeL`jd^Udo$>cX(=V=-0C=30lFbf+Fc5^#?Nc;x*7$ezVjzZtyaFk7Z8xcuY!`ifLF35-dqWtQjVm4PG<$cHIhnQ;uwSI(gnDQq6AqBr5M3C(0a}+bVQkkn&GY;c zNmI3&x?mR0=c=rW&r7@k=O&_qdJ%>%5sDNj^P<5KK1i)(zk65!{OY`raq#ev7){SE_HNAR9smsvmCe zk;tbC%8)~z6k@o99#)?J@kk$Nd{>3#ANlV5Ex+(Rn?~bnH!_8kpkwfSMNd5`n6jg~ ztlUUjpCHfoQ_wI8%m)DY`8K8T#F9|&O46aX*paJwW6YY~&P++;BpcF%JS&0(wWYT+ zef+qj&s^}S3KC2#y`?7nT6VRh@#uGu-tpd1kT5-dsNitzhW$KL&u}a<4 z#PJ2UH@EJzHuG#KSDq2kKfjFKS!K!{JFg;>Y!)+jsjBa@pUfLeNITnIvFKEJ62xmZ3zZVSkdmTXiUI#Sx zdjJ3cE{_xDEvlbe^M-N$l{U=dx}7O+$PUcDO%Ag55kQYOT%~OMtcv=Spf6hLA2A0b zpJ}TV4IiWGvByd;0{qF+N^}W9ESb_>NtWJvv8$pg3c)3xG^2I}ePq18SnVz8V0bZ% zZf=U66-!!QtRCv?gJF6~Z>vXIU##}^^}$fVJC)`&adgs3sY6W+00000@Cvp;-`>&h zm2SiOga!0L5={A8w-@?~8KNn(fHHq!c?(GxG~Z!@$nQ%(BTQ=Bg#AnJz;-S8=_@4w z00000UU*@G)eZRjsO|4SbYvyuvvH#I!svQs&-RG>JKOfspZhz$18?zrjp(s?%y-}| zey!CzJHOs3d1lAMQ8gfOtP20)-ENXWJrF&m|C#}i4C%8e?Lh(bSlwy zFB}~SRGWMI=myjDoqhplO3~cR^>EbcO}^k-E@!O}C}8=PTwH-QR%{*5l~$fOZ$ny* z>}J^V=|@c>iY>b61u_xFc7h;~Nhr2sN<|!CzJJj@3d1lA1>o5}g-Q0(zqLzA2pO6y7=sntkXRs#=K4w6p;L)A zJ^1txs5Z~G>j%@kdi@3}3A1^a`{}IJl03&P+^$+hNFnk!6m|^TSdn!!S6cZ*Wna>2 zBsar8UwDYDUJFDMf+vJ(VBnM9Et5m`_sViDZ&`GGLyLlnhG1^=nqv_tdx>IxQN OhDP1nAUd;A0pA9fSxLhH diff --git a/mods/species/vox/icons/body/improvised_cyberlimbs.dmi b/mods/species/vox/icons/body/improvised_cyberlimbs.dmi index 5fde28f9b19bd40aee8af4e9fb0b998300f77902..697b248d4ee443f9ca0d53cbf8fc2433ce9d05aa 100644 GIT binary patch delta 159 zcmV;Q0AT;14xkQ@c7Kt*3d1lAglGFHOtP2$tzAk&$&kE)F|}d|5*uXGzJ8K+=v1QZ z4nExpt~U4f(G8~QJN*LAl%lzr>*1)?n|#65T+Uh{P{8svxwrzWtk^o9E3G_n-j1{y z+0C%&(~p`&6kBxB3&KPg+X;doOh%0<6+xv4LvZ`=2Tl}ssS_tc{##g^c4$7UE)b-K NCZDhD|FZ}I7zP`iO+I6h-f2U)NoRA|B=|ltN=$&<4^lUtir0I}LM7 z;Fo^_sm-(P`oT1>UcZ4#!fYPqemZNlB+qecZda`$q!9Vr6m|?-S&?-#S6cZ*WgpUN zBsareUwDYDUJF9;JcvJ(VBm`sg`ELbUG5!~_lfiUGm#S=&c|Eb!vL-YCS3Ke&T NM)&%^)w2iz7zSlyNAUmv diff --git a/mods/species/vox/icons/body/primalis_cyberlimbs.dmi b/mods/species/vox/icons/body/primalis_cyberlimbs.dmi index 4dd51b30efb51e494710466341a83e96b3b8dddb..9472d8aba8dbeaddbdef93ee93076ee054cae6b7 100644 GIT binary patch delta 159 zcmV;Q0AT;W4!;hNYJZWt3d1lAMQ8gfOtP20)-ENXWJrF&m|C#}i4C%8e?Lh(bSlwy zFB}~SRGWMI=myjDoqhplO3~cR^>EbcO}^k-E@!O}C}8=PTwH-QR%{*5l~$fOZ$ny* z>}J^V=|@c>iY>b61u_xFc7h;~Nhr2sN<|o5}g-Q0(zqLzA2pO6y7=sntkXRs#=K4w6p;L)A zJ^1txs5Z~G>j%@kdi@3}3A1^a`{}IJl03&P+^$+hNFnk!6m|^TSdn!!S6cZ*Wna>2 zBsar8UwDYDUJFDMf+vJ(VBnM9Et5m`_sViDZ&`GGLyLlnhG1^=nqv_tdx>IxQN NhDP1nAUd)ALIy0uNtFNq diff --git a/mods/species/vox/icons/body/servitor/body.dmi b/mods/species/vox/icons/body/servitor/body.dmi index 5f3c67d504e266ee088a485ad97e2cfda555b4db..8c4d0df41785f58ea98714d024220486d4be28c4 100644 GIT binary patch delta 188 zcmV;t07L(s5uOo{SbwH^R9JLGWpiV4X>fFDZ*Bkpc$|&V%?iRW3)0*Y*FV&%e(XN4e*+56kaY{O-U_n@0hb4^R#wXZ delta 187 zcmV;s07UfFDZ*Bkpc$|&VJqp7x3GL2YD6|pa| zQ&eJUt7-{VTVwB~K{0k>Fu%F?+pCNNOyfJw#M*kfUyL3aba1F+uy7!W8VE3vOtxI$te zmp_?k;Oro1(K#>`Wyl^s$t9*=*SIz_;}LMRo3z=Ww;P?2W1{SmGH!5Eym=BC-^cKb z=~z7b1|H$ig9@mQ$r(5uIC~N;tgk*{s&&w7#max_DI1p?u;-Kc`FPB8&e|4HlN*6+ zbb`KHbzrIZ4&M3}e{n--Ey8x~&Q(2a5QwkX3}$E(lC?5vXe!Hq@cc4OI6gBoNQ-Qb zEa&BJk8bo3u8iYR5ck&9=Phubsy05ti?@G>K1=Ls_%#$_@s7gvwS>S!eq0Up+ewX9 z6n~B36<^Yt=?mr2_AbRdo%Gmk%nUP-66#(xf9mfQ>_u|8kHx}3ca$b19?iyrIMldA z>`y&v;|Fuu@hVmsfqsXo=QRbzQBPm~1n)TgIPh`dWUR_KIZfyPNm^yhZ z0>QM*bjf2L7GClQKE59ElHZlG{Ltv5U+B?S|9VB!EQrf@q;9Ih8eSyNNv`f{v^o%6 zjSN?45puhb5%$I7nEC|l_VVI4_`l~D-TaQU_9Q9kioSjd#q}4&@+pK$;_B{w-C1QL z0p4CCsHo8F)z~ZJRxScQap*+`Zq!@jP39&2V@aRyTB} zu?ne;?HSBS#z@M;_S*Qe;yLZoW5NHf*#FMx&&g6b?>XSk6xfK0dODrfQp$tFOU{?| zH(M#c934VzY>wwCDLJx74Hn_f?B?_KFqkdo_z{sPslA!&_*5{0-Pd;`)fTb1C1-Z7 z`+LEknFdw~8T%2V6%`XlV0Etr4kATyYFh2-k(Q&LiU5zbFMctlZeI5)@gn8&M-Y!2i&Fg8Hmih7#oj= z!(jDG+@hjTC&wIyNmoM`i+ZEIv)ryV$KKB$g;*Z+uOhj{U~iXG=gsW9opq$Hvm z&TM_}bocAJ3-4970+!gc-KG;450dCiOaka~UBl0!YMQ#k%t(4+Wl@n$S$GjSEfbiP zc|WpNsD?W?x8A+5GIG2Yr7?D9a$Y!Slz9R`s^hHmp8@;-%JnZS|G2AOCFL`plduv+L7nm^5-0Iz>{jvEPBUjt zC_kpLp-O?-H z@0b(yNdt@c+Tg9=*6i*XReD;(T)==hC6+q#)o!j{_Tb9%lH@KU>I%ClQ+!=xLc~)lc}Pdd$Pc#RL>QZ+G@(J)Y-Kvo-0@~0RfZ@QO5HrXrPz8aoeGl z#>~sdJIdcz4!7ac(n%bPsHMQ6|Z6|J#77FquJ!SIGNFkWR28`;E7so0#p0>c#_SHAM>qEK_mwKq9&(qKePv~G zU8E^tbEWRhVJefAg)Otl_x_D*F-1LSg}YL{NbILC9Yga2I64fiF^t<<6bOexadP@- zw6ZdgV=2ITNZ1G4`3b@;UxF3T=z+GuSAavSYwL?9Xgbl3Qo8tO#C}wQ>Q674Bbbx@ zrKp<%H0M`?fWlZXuxVD7u;tIH^0cbwM~f;@==MGK<)*HPSeLR>Uoj}MaFoJ4?mAE841*vYdrGiVi;++KKq>E8 z{_sXjn_AfW@&^bZe<%ox5MUvss%X_=sQqQxl`jkI5-Yu5J@G)FY@xZ#vGN@wVq6Is zp|d*#u&#;oFJlVyMl`tVXm7Gs^gawmzOA1Ni0p$Y`bHq>r;RvGDjyjrnsdgeJyc9V8T`6i9%TriqOhTvOJ cywS&;W1u<3l)YP7z+WZE%-9k}HFAym4OxB*H~;_u literal 3423 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 LT!doJc*On-UB~we diff --git a/mods/species/vox/icons/body/soldier/body.dmi b/mods/species/vox/icons/body/soldier/body.dmi index 500789d05fa4cfcb824871b5d6545ae59621f95e..c77e6ab97ac7fb9042ceb94f5967eeb8c235d11d 100644 GIT binary patch delta 2291 zcmV5Tz237Yg760{{R3=mU4sks&vKrg~IZbVOxyV{&P5bZKvH004NLjnT~t z!Y~X6@N@eVWxI=CS1+<5JGfUU)n-j0YauO)Z||lDPtxAGFJARoZV z$DmH?xYlkUnbH%V4MH)>gAA{@IE!x*V)T(~$KCgcRHWrX|lfwj~000OE zNklW z+sPSc#tTUf5sW$9a5U|w;3|75D10e@THVWW9<+>B7%>%myF-NXkyCT{4X{Z&DRjy;C)xYvh&vF4BW zNpucrxLMZfA$0obwZ?S|!;V3LF+yn?=uQRA0 z{aiu;U(NURgbISb`{{abrqKzEC)w+a)-_+_x?6|uDskKh&QmABJVIT6q>cka$BF9j zX}*1P0eGceKibH`|{@wFt@XPvZ^7;UdK1qIH`*y2oD#-QR`J-CBh0mGy|U zMqu`l)=1@BxZEAjGI<<-Cw1jp$LOGo@(+88zlSNIGt3ExPHn=chd~76>2fiFG1H5Q zpMRuoSXVD<`ojZ?+qWi)nO>xuyodXU>BU-vbiYUO;{INoHq!h}REz7_25yAR19>@x zUm4r-B8@_?H`-SQ-CajtO89I!&*i16fJ87_@w<1%y5?ZW!|XtR_UVM%{W5d?MhOWb zO!XqS--t(@TKBSe=-vRzHSw;_-XC@NZME=*2z_zrPwa}fc1l2@K3py&zcp^uDB%;F zbdf|-f=ag4fQN3S$!^RwOo-;qnyiNn;{^@QUocWP{DCPbC@3f>C@3g=0OGu|T7K~Z zK=)&b(dG9~@nm{`&F`-Y>cSongIoKd5tJX)NcH3rH*t-Tdh-UnW+o^q6V?r%LvhyxH6%5S)mPouVQ`lnF-=d*br5di1pPT z{Z?M4QEWHS7c(j-C@3f>C@3f>DEtD5ge|-RB|?ddO_WuC)A$0MqNE;*w|FnBfc0XB zs~+Mbpkju5ftGRo-Zx+i60t|nCTcD2VBF*G^E}*XJoE>6$gi&<3^x)zi`vi=w2DiA z{p!Um3JMB;3ZDR}ww|d{MkYZpFfnA2ko)v7bBqnu_x!)cYKxWMWAXo zFYwNmWa(s9{-x~9plhD4H*D2-C2*mse9`w4$<@&Coxqg!`H<;&X9^<#l|-sDLD zw!Fok^BEbNz_zP`SRly-h2=RDPktt5JS6RiXT9lwVC{Trs~I_&sEP zHN3wm?^n~Pzv<%sUi3Ewel<1yP45o=rgtD_{-!uTDEOO-3raqWw!!>OVSbVMn{xTV zCjCvV5%V{N`9P4yo0 zCx!V%=5Kn)54JK!di{udc=WsJ77}8AQEbb=BH{{p?p{7DabubUAve^T%n>ABxc zmrrw^u(n_qu~;RY#4ybc(2EK4Cq3wYy*cYc=1&Ur;y(AgX%(-(i+=zX)WKBm5uN+NBzE?5(z`%d_)XL`^7Q&GE?=ORgF z3$~~GNy671UO)L}=W{}0-kYOdKJDQ3s5JDVbolE{KRJZcZ{KgxBc2_zpT~hY?a!%& z*Q56OMno3o^s_#8@7w+M9dz;GE|{OzlLo;&TTcovnruBP;hp0d{sjRS$3*|aMZEw3 N002ovPDHLkV1gI?lj8sY delta 2102 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 VFT+QuYVh|1IBMf)UGz5$^%tbQyPp66 From 4c763e39f1a31925b9e07a0d0f7affe0e0fd8653 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 19 Jan 2023 09:26:06 -0600 Subject: [PATCH 0887/1518] Add airlock tags for cycling to external airmix --- .../machinery/embedded_controller/airlock_controllers.dm | 4 ++++ code/game/machinery/embedded_controller/airlock_program.dm | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/embedded_controller/airlock_controllers.dm b/code/game/machinery/embedded_controller/airlock_controllers.dm index c13901f9d71..346dfab73c3 100644 --- a/code/game/machinery/embedded_controller/airlock_controllers.dm +++ b/code/game/machinery/embedded_controller/airlock_controllers.dm @@ -13,6 +13,8 @@ var/tag_air_alarm var/list/dummy_terminals = list() // Internal use only; set id_tag on the dummy terminal to be added. var/cycle_to_external_air = 0 + var/tag_pump_out_external + var/tag_pump_out_internal /obj/machinery/embedded_controller/radio/airlock/modify_mapped_vars(map_hash) ..() @@ -23,6 +25,8 @@ ADJUST_TAG_VAR(tag_exterior_sensor, map_hash) ADJUST_TAG_VAR(tag_interior_sensor, map_hash) ADJUST_TAG_VAR(tag_air_alarm, map_hash) + ADJUST_TAG_VAR(tag_pump_out_external, map_hash) + ADJUST_TAG_VAR(tag_pump_out_internal, map_hash) /obj/machinery/embedded_controller/radio/airlock/Destroy() for(var/obj/machinery/dummy_airlock_controller/terminal in dummy_terminals) diff --git a/code/game/machinery/embedded_controller/airlock_program.dm b/code/game/machinery/embedded_controller/airlock_program.dm index 5ebc5f34104..12d1a7aa7e4 100644 --- a/code/game/machinery/embedded_controller/airlock_program.dm +++ b/code/game/machinery/embedded_controller/airlock_program.dm @@ -48,11 +48,11 @@ /datum/computer/file/embedded_program/airlock/reset_id_tags(base_tag) . = ..() - if(cycle_to_external_air) - tag_pump_out_external = "[id_tag]_pump_out_external" - tag_pump_out_internal = "[id_tag]_pump_out_internal" if(istype(master, /obj/machinery/embedded_controller/radio/airlock)) //if our controller is an airlock controller than we can auto-init our tags var/obj/machinery/embedded_controller/radio/airlock/controller = master + if(cycle_to_external_air) + tag_pump_out_external = SET_AIRLOCK_TAG(controller.tag_pump_out_external, "[id_tag]_pump_out_external") + tag_pump_out_internal = SET_AIRLOCK_TAG(controller.tag_pump_out_internal, "[id_tag]_pump_out_internal") tag_exterior_door = SET_AIRLOCK_TAG(controller.tag_exterior_door, "[id_tag]_outer") tag_interior_door = SET_AIRLOCK_TAG(controller.tag_interior_door, "[id_tag]_inner") tag_airpump = SET_AIRLOCK_TAG(controller.tag_airpump, "[id_tag]_pump") From 88ced833042509626c541180c742693b20b07683 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 17 Jan 2023 04:07:01 -0600 Subject: [PATCH 0888/1518] Fix trailing space on ore chunk --- code/modules/materials/materials_ore.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/materials/materials_ore.dm b/code/modules/materials/materials_ore.dm index 6ed92e443d3..0e2aa74ae19 100644 --- a/code/modules/materials/materials_ore.dm +++ b/code/modules/materials/materials_ore.dm @@ -87,7 +87,7 @@ /obj/item/stack/material/ore/update_strings() . = ..() - SetName("[(material.ore_name ? material.ore_name : "[material.name] chunk")] [(amount > 1? "pile" : "")]") + SetName("[(material.ore_name ? material.ore_name : "[material.name] chunk")][(amount > 1? " pile" : "")]") desc = material.ore_desc ? material.ore_desc : "A lump of ore." /obj/item/stack/material/ore/get_recipes() From 43147b10c047f64d1ee1ace4f4cce77befb56920 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 20 Jan 2023 23:12:58 -0600 Subject: [PATCH 0889/1518] Fix bald (not short) hair with BLOCK_HEAD_HAIR --- code/modules/mob/living/carbon/human/update_icons.dm | 8 -------- 1 file changed, 8 deletions(-) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 156402c1e87..ea4d975479b 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -448,14 +448,6 @@ var/global/list/damage_icon_parts = list() queue_icon_update() return - //masks and helmets can obscure our hair. - for(var/slot in global.airtight_slots) - var/obj/item/gear = get_equipped_item(slot) - if(gear && (gear.flags_inv & BLOCK_ALL_HAIR)) - if(update_icons) - queue_icon_update() - return - overlays_standing[HO_HAIR_LAYER] = head_organ.get_hair_icon() if(update_icons) queue_icon_update() From c91865684b4e3d372ba283246a011d1957efea5a Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 22 Jan 2023 00:45:22 +0000 Subject: [PATCH 0890/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 4fcb19c5b66..906b3c891eb 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -131,12 +131,6 @@

    PsyCommando updated:

    • Added some fairly bad wrapped package icons, and wrapped gifts icons.
    - -

    20 November 2022

    -

    PsyCommando updated:

    -
      -
    • Fix disconnected pipes + blastdoors button on desperado/mercenary base.
    • -
    From b6cb0a52b35048f91068ee5d83fb071ccdc4a365 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 16 Jan 2023 14:07:38 +1100 Subject: [PATCH 0891/1518] Wall icons are now generated/cached at runtime instead of entirely using overlays. Moved shine onto wall icon caching. Wall icon gen now caches much more aggressively and replicates a similar layering flow to the old code. Optimizing wall icon caching. --- code/game/turfs/exterior/exterior_wall.dm | 21 ++----- code/game/turfs/simulated/_wall_icon_cache.dm | 56 ++++++++++++++++++ code/game/turfs/simulated/wall_icon.dm | 38 +++--------- code/modules/mob/mob.dm | 1 + icons/turf/wall_texture.dmi | Bin 1635 -> 1727 bytes nebula.dme | 1 + 6 files changed, 71 insertions(+), 46 deletions(-) create mode 100644 code/game/turfs/simulated/_wall_icon_cache.dm diff --git a/code/game/turfs/exterior/exterior_wall.dm b/code/game/turfs/exterior/exterior_wall.dm index 2f03714a9cb..3e4e11d01d3 100644 --- a/code/game/turfs/exterior/exterior_wall.dm +++ b/code/game/turfs/exterior/exterior_wall.dm @@ -177,24 +177,11 @@ var/global/list/natural_walls = list() var/material_icon_base = material.icon_base_natural || 'icons/turf/walls/natural.dmi' var/base_color = paint_color ? paint_color : material.color + var/shine = (material?.reflectiveness > 0) ? clamp((material.reflectiveness * 0.01) * 255, 10, (0.6 * ReadHSV(RGBtoHSV(material.color))[3])) : 0 // patened formula based on color's Value (in HSV) - var/max_shine - var/shine - if(material?.reflectiveness > 0) - max_shine = 0.6 * ReadHSV(RGBtoHSV(material.color))[3] // patened formula based on color's Value (in HSV) - shine = clamp((material.reflectiveness * 0.01) * 255, 10, max_shine) - - var/image/I - for(var/i = 1 to 4) - var/apply_state = "[wall_connections[i]]" - I = image(material_icon_base, apply_state, dir = BITFLAG(i-1)) - I.color = base_color - add_overlay(I) - if(shine) - I = image(material_icon_base, "shine[wall_connections[i]]", dir = BITFLAG(i-1)) - I.appearance_flags |= RESET_ALPHA - I.alpha = shine - add_overlay(I) + icon = get_combined_wall_icon(wall_connections, null, material_icon_base, base_color, shine_value = shine) + icon_state = "" + color = null if(ore_overlay) add_overlay(ore_overlay) diff --git a/code/game/turfs/simulated/_wall_icon_cache.dm b/code/game/turfs/simulated/_wall_icon_cache.dm new file mode 100644 index 00000000000..909b44ddf82 --- /dev/null +++ b/code/game/turfs/simulated/_wall_icon_cache.dm @@ -0,0 +1,56 @@ +#define CACHE_BASE_MARKER 1 +#define CACHE_PAINT_MARKER 2 +#define CACHE_STRIPE_MARKER 3 +#define CACHE_EDGE_MARKER 4 +#define CACHE_SHINE_MARKER 5 + +var/global/list/cached_wall_icons = list() +/proc/_get_wall_subicon(var/material_icon_base, var/connections, var/color, var/state, var/alpha, var/cache_marker) + var/cache_key = jointext(list(cache_marker, material_icon_base, json_encode(connections), color), "-") + if(!global.cached_wall_icons[cache_key]) + var/icon/subicon = icon('icons/turf/wall_texture.dmi', "blank") + for(var/i = 1 to 4) + var/check_state = "[state][length(connections) >= i ? connections[i] : null]" + if(check_state_in_icon(check_state, material_icon_base)) + subicon.Blend(icon(material_icon_base, check_state, dir = BITFLAG(i-1)), ICON_OVERLAY) + if(color && color != COLOR_WHITE) + subicon.Blend(color, ICON_MULTIPLY) + if(!isnull(alpha)) + subicon += rgb(null, null, null, alpha) + global.cached_wall_icons[cache_key] = subicon + return global.cached_wall_icons[cache_key] + +/proc/get_combined_wall_icon(var/list/wall_connections, var/list/other_connections, var/material_icon_base, var/base_color, var/paint_color, var/stripe_color, var/edge_color, var/shine_value) + + var/cache_key = list(material_icon_base, json_encode(wall_connections), json_encode(other_connections)) + if(base_color) + cache_key += CACHE_BASE_MARKER + cache_key += base_color + if(paint_color) + cache_key += CACHE_PAINT_MARKER + cache_key += paint_color + if(stripe_color) + cache_key += CACHE_STRIPE_MARKER + cache_key += stripe_color + if(edge_color) + cache_key += CACHE_EDGE_MARKER + cache_key += edge_color + if(shine_value) + cache_key += CACHE_SHINE_MARKER + cache_key += shine_value + cache_key = jointext(cache_key, "-") + + if(!global.cached_wall_icons[cache_key]) + var/icon/wall_icon = icon(_get_wall_subicon(material_icon_base, wall_connections, base_color, cache_marker = CACHE_BASE_MARKER)) + if(paint_color) wall_icon.Blend(_get_wall_subicon(material_icon_base, wall_connections, paint_color, "paint", cache_marker = CACHE_PAINT_MARKER), ICON_OVERLAY) + if(stripe_color) wall_icon.Blend(_get_wall_subicon(material_icon_base, wall_connections, stripe_color, "stripes", cache_marker = CACHE_STRIPE_MARKER), ICON_OVERLAY) + if(edge_color) wall_icon.Blend(_get_wall_subicon(material_icon_base, other_connections, edge_color, "other", cache_marker = CACHE_EDGE_MARKER), ICON_OVERLAY) + if(shine_value) wall_icon.Blend(_get_wall_subicon(material_icon_base, other_connections, null, "shine", cache_marker = CACHE_SHINE_MARKER, alpha = shine_value), ICON_OVERLAY) + global.cached_wall_icons[cache_key] = wall_icon + return global.cached_wall_icons[cache_key] + +#undef CACHE_BASE_MARKER +#undef CACHE_PAINT_MARKER +#undef CACHE_STRIPE_MARKER +#undef CACHE_EDGE_MARKER +#undef CACHE_SHINE_MARKER \ No newline at end of file diff --git a/code/game/turfs/simulated/wall_icon.dm b/code/game/turfs/simulated/wall_icon.dm index 1a686e26afe..e16a4efca9f 100644 --- a/code/game/turfs/simulated/wall_icon.dm +++ b/code/game/turfs/simulated/wall_icon.dm @@ -123,28 +123,18 @@ other_connections = dirs_to_corner_states(other_dirs) var/material_icon_base = get_wall_icon() - var/image/I var/base_color = material.color if(!density) - I = image(material_icon_base, "fwall_open") - I.color = base_color - add_overlay(I) - return - - for(var/i = 1 to 4) - I = image(material_icon_base, "[wall_connections[i]]", dir = BITFLAG(i-1)) - I.color = base_color - add_overlay(I) - if(paint_color) - I = image(icon, "paint[wall_connections[i]]", dir = BITFLAG(i-1)) - I.color = paint_color - add_overlay(I) - if(stripe_color) - I = image(icon, "stripe[wall_connections[i]]", dir = BITFLAG(i-1)) - I.color = stripe_color - add_overlay(I) + icon = material_icon_base + icon_state = "fwall_open" + color = base_color + else + icon = get_combined_wall_icon(wall_connections, other_connections, material_icon_base, base_color, paint_color, stripe_color, (material.wall_flags & WALL_HAS_EDGES) && (stripe_color || base_color)) + icon_state = "" + color = null if(apply_reinf_overlay()) + var/image/I var/reinf_color = paint_color ? paint_color : reinf_material.color if(construction_stage != null && construction_stage < 6) I = image('icons/turf/walls/_construction_overlays.dmi', "[construction_stage]") @@ -154,18 +144,8 @@ if(reinf_material.use_reinf_state) I = image(reinf_material.icon_reinf, reinf_material.use_reinf_state) I.color = reinf_color - add_overlay(I) else - // Directional icon - for(var/i = 1 to 4) - I = image(reinf_material.icon_reinf, "[wall_connections[i]]", dir = BITFLAG(i-1)) - I.color = reinf_color - add_overlay(I) - - if(material.wall_flags & WALL_HAS_EDGES) - for(var/i = 1 to 4) - I = image(material_icon_base, "other[other_connections[i]]", dir = BITFLAG(i-1)) - I.color = stripe_color ? stripe_color : base_color + I = image(_get_wall_subicon(reinf_material.icon_reinf, wall_connections, reinf_color)) add_overlay(I) var/image/texture = material.get_wall_texture() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index c30496b0ebc..59135f826b3 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -57,6 +57,7 @@ QDEL_NULL_SCREEN(zone_sel) /mob/Initialize() + default_pixel_z = round(world.icon_size * 0.35) . = ..() if(ispath(skillset)) skillset = new skillset(src) diff --git a/icons/turf/wall_texture.dmi b/icons/turf/wall_texture.dmi index 265e997b93263d63a661abe5aace5d73f50a451c..8a8de81c25a9ffca28c5920929c15f07fd8d2048 100644 GIT binary patch delta 896 zcmV-`1AqME48IL5iBL{Q4GJ0x0000DNk~Le0000$0000W2m=5B0F^_Iwg3PE`cO<% zMZmzokt`$v|NpU1(E=6r2}tJv0004WQchC}3lS&4r1m2`J5NXm%mrh#x z43LpjKHw{}Or`{xvnY7hY-G=&<;+EH$decH8Kn8K6)+``W2?1(_!lfBUnlsexudY^ zi{vst0tCn*yo>r4gW@F=swAZ-ZID2jvgQQkC?5zFbOmu%f2>61DnV2=yrLS_YnT$~ zUNvjsG~l&e+tyJbs9TTv28p=`4IH{Ff(;urc8TD!CeoT(AZQjG0?E-rU9jdY2y5wM zcNm$_sR$|rpt7O_%m}BA_8kU#r?#sI?6#1Js($X-n}+{vvm<&~ zz)BwMlZE>a91L-n(-Mcet1{V;!$;t#6@p{xtPS8eoPd+3w9{wUaF(R!<@2is*`q$(Z(3UTeaJ@SUUOEw@Tif%9!nv3!qWgRd5`3EY5~ulbNhweN}>$Sj;CD`X?RFZhX-og6upJ6CS<i}P6+e#=|GQX06@`z6`s*GiRRg(XD^BB4Snd_kNyHhF~E#( z?L0S7G8hy#c!)Y3GL&IPkM!XqB(n^bzsZdhc4HKd(V~nov9XNP#v59|f9MG?Q6)GD zqAfTi+sVo?C44H=m>$RsW{NpW?wdV_Q0BS@KaVhv7?{rjF%~*vrSwJaqApg>B`g)W zjOD6$S1vZt@P0XCK4~bT&1RLVKuBVB4V7~UAu0*u}kyVVA$~+MQmcT zT($*$>o(~(xNqOF)9~)ne|DFIJ*drtz56oqA8oO@RJBm-7d~+CP^fcVgAVspYuc0} zN8y-4j;pttzzH}Br%r2U&a&|w-sc6rpmXt(+R8r0Vf`{(xhl#v*sAK)WQaTD8>f~d zP$AcESmSQWe|3x73I1?LAWK>9szsUx_nck2&jVMM58+WWfgj5vT|D7wpj}mEr!72t zPQnYTEAXZM>NRgf$tV04-o+AvYfuF7-mI9rAO5xDBcF6*l|H-s^M$Y9zW>k(=ckXC hV9}BizxW-g{Q-Pro%zl~kWv5u002ovPDHLkV1g?meQW># diff --git a/nebula.dme b/nebula.dme index 1e4ec8b35d5..200b0681c60 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1363,6 +1363,7 @@ #include "code\game\turfs\flooring\flooring_shuttle.dm" #include "code\game\turfs\initialization\init.dm" #include "code\game\turfs\initialization\maintenance.dm" +#include "code\game\turfs\simulated\_wall_icon_cache.dm" #include "code\game\turfs\simulated\floor.dm" #include "code\game\turfs\simulated\floor_acts.dm" #include "code\game\turfs\simulated\floor_attackby.dm" From a7f2480637c128d4e95a19603c499ffa3c4ee244 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 17 Jan 2023 19:45:46 +1100 Subject: [PATCH 0892/1518] Removed redundant icon update from barren turfs. --- code/game/turfs/exterior/exterior_barren.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/turfs/exterior/exterior_barren.dm b/code/game/turfs/exterior/exterior_barren.dm index 5418b5331c6..56e21812f12 100644 --- a/code/game/turfs/exterior/exterior_barren.dm +++ b/code/game/turfs/exterior/exterior_barren.dm @@ -2,8 +2,9 @@ name = "ground" icon = 'icons/turf/exterior/barren.dmi' icon_edge_layer = EXT_EDGE_BARREN + var/decal_state -/turf/exterior/barren/on_update_icon() +/turf/exterior/barren/Initialize() . = ..() if(prob(20)) - add_overlay(image('icons/turf/flooring/decals.dmi', "asteroid[rand(0,9)]")) + decal_state = "asteroid[rand(0,9)]" From a2e0777d701bfaa17829f6e45e215718d9b3338b Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 17 Jan 2023 20:01:04 +1100 Subject: [PATCH 0893/1518] Cleaned up exterior turf icon update. --- code/game/turfs/exterior/exterior_barren.dm | 5 ++--- code/game/turfs/exterior/exterior_concrete.dm | 7 ++++--- code/game/turfs/exterior/exterior_seafloor.dm | 11 ++--------- code/game/turfs/exterior/exterior_wall.dm | 11 ++++++++++- code/modules/mob/mob.dm | 1 - 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/code/game/turfs/exterior/exterior_barren.dm b/code/game/turfs/exterior/exterior_barren.dm index 56e21812f12..795fa140df5 100644 --- a/code/game/turfs/exterior/exterior_barren.dm +++ b/code/game/turfs/exterior/exterior_barren.dm @@ -2,9 +2,8 @@ name = "ground" icon = 'icons/turf/exterior/barren.dmi' icon_edge_layer = EXT_EDGE_BARREN - var/decal_state /turf/exterior/barren/Initialize() - . = ..() if(prob(20)) - decal_state = "asteroid[rand(0,9)]" + LAZYADD(decals, image('icons/turf/flooring/decals.dmi', "asteroid[rand(0,9)]")) + . = ..() diff --git a/code/game/turfs/exterior/exterior_concrete.dm b/code/game/turfs/exterior/exterior_concrete.dm index 8f4eb268a5a..bd4879951e7 100644 --- a/code/game/turfs/exterior/exterior_concrete.dm +++ b/code/game/turfs/exterior/exterior_concrete.dm @@ -15,7 +15,7 @@ var/global/exterior_broken_states = icon_states('icons/turf/exterior/broken.dmi' desc = "A flat expanse of artificial stone-like artificial material." icon = 'icons/turf/exterior/concrete.dmi' diggable = FALSE - var/broken + var/broken var/burned /turf/exterior/concrete/flooded @@ -40,9 +40,9 @@ var/global/exterior_broken_states = icon_states('icons/turf/exterior/broken.dmi' name = "reinforced concrete" desc = "Stone-like artificial material. It has been reinforced with an unknown compound" -/turf/exterior/concrete/reinforced/on_update_icon() +/turf/exterior/concrete/reinforced/Initialize(ml) + LAZYDISTINCTADD(decals, "hexacrete") . = ..() - add_overlay("hexacrete") /turf/exterior/concrete/reinforced/damaged broken = TRUE @@ -50,3 +50,4 @@ var/global/exterior_broken_states = icon_states('icons/turf/exterior/broken.dmi' /turf/exterior/concrete/reinforced/road name = "asphalt" color = COLOR_GRAY40 + base_color = COLOR_GRAY40 diff --git a/code/game/turfs/exterior/exterior_seafloor.dm b/code/game/turfs/exterior/exterior_seafloor.dm index 07f84bb27aa..4ab69066acd 100644 --- a/code/game/turfs/exterior/exterior_seafloor.dm +++ b/code/game/turfs/exterior/exterior_seafloor.dm @@ -10,13 +10,6 @@ color = COLOR_LIQUID_WATER /turf/exterior/seafloor/Initialize() + if(prob(20)) + LAZYADD(decals, image("asteroid[rand(0,9)]", 'icons/turf/mining_decals.dmi')) . = ..() - color = null - if(isnull(detail_decal) && prob(20)) - detail_decal = "asteroid[rand(0,9)]" - update_icon() - -/turf/exterior/seafloor/on_update_icon() - . = ..() - if(detail_decal) - add_overlay(image(icon = 'icons/turf/mining_decals.dmi', icon_state = detail_decal)) diff --git a/code/game/turfs/exterior/exterior_wall.dm b/code/game/turfs/exterior/exterior_wall.dm index 3e4e11d01d3..59eb58b0b4e 100644 --- a/code/game/turfs/exterior/exterior_wall.dm +++ b/code/game/turfs/exterior/exterior_wall.dm @@ -19,6 +19,7 @@ var/global/list/natural_walls = list() var/decl/material/material var/decl/material/reinf_material var/floor_type = /turf/exterior/barren + var/static/list/exterior_wall_shine_cache = list() /turf/exterior/wall/examine(mob/user, distance, infix, suffix) . = ..() @@ -177,7 +178,15 @@ var/global/list/natural_walls = list() var/material_icon_base = material.icon_base_natural || 'icons/turf/walls/natural.dmi' var/base_color = paint_color ? paint_color : material.color - var/shine = (material?.reflectiveness > 0) ? clamp((material.reflectiveness * 0.01) * 255, 10, (0.6 * ReadHSV(RGBtoHSV(material.color))[3])) : 0 // patened formula based on color's Value (in HSV) + + var/shine = 0 + if(material?.reflectiveness > 0) + var/shine_cache_key = "[material.reflectiveness]-[material.color]" + shine = exterior_wall_shine_cache[shine_cache_key] + if(isnull(shine)) + // patented formula based on color's value (in HSV) + shine = clamp((material.reflectiveness * 0.01) * 255, 10, (0.6 * ReadHSV(RGBtoHSV(material.color))[3])) + exterior_wall_shine_cache[shine_cache_key] = shine icon = get_combined_wall_icon(wall_connections, null, material_icon_base, base_color, shine_value = shine) icon_state = "" diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 59135f826b3..c30496b0ebc 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -57,7 +57,6 @@ QDEL_NULL_SCREEN(zone_sel) /mob/Initialize() - default_pixel_z = round(world.icon_size * 0.35) . = ..() if(ispath(skillset)) skillset = new skillset(src) From c1c6fcd4d1ab2b2c5e75d94b9aa25561b9d805d7 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 22 Jan 2023 12:56:09 -0600 Subject: [PATCH 0894/1518] Make close_uis faster during init --- code/controllers/subsystems/processing/nano.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/controllers/subsystems/processing/nano.dm b/code/controllers/subsystems/processing/nano.dm index 44b05e8326b..a7d531e8679 100644 --- a/code/controllers/subsystems/processing/nano.dm +++ b/code/controllers/subsystems/processing/nano.dm @@ -75,6 +75,9 @@ PROCESSING_SUBSYSTEM_DEF(nano) */ /datum/controller/subsystem/processing/nano/proc/close_uis(src_object) . = 0 + if (!length(open_uis)) + return + var/src_object_key = "\ref[src_object]" if (!open_uis[src_object_key]) return From ff04162ce1a39f14ee80092c8af1d9302a1b5fb9 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 23 Jan 2023 00:14:51 -0600 Subject: [PATCH 0895/1518] Make ambience a lazylist --- code/game/area/areas.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 133593f641e..25b4f160fad 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -360,7 +360,7 @@ var/global/list/mob/living/forced_ambiance_list = new if(LAZYLEN(forced_ambience) && !(L in forced_ambiance_list)) forced_ambiance_list += L L.playsound_local(T,sound(pick(forced_ambience), repeat = 1, wait = 0, volume = 25, channel = sound_channels.lobby_channel)) - if(ambience.len && prob(5) && (world.time >= L.client.played + 3 MINUTES)) + if(LAZYLEN(ambience) && prob(5) && (world.time >= L.client.played + 3 MINUTES)) L.playsound_local(T, sound(pick(ambience), repeat = 0, wait = 0, volume = 15, channel = sound_channels.ambience_channel)) L.client.played = world.time From 240671fd5d9dbe029e01655e9fcb53d50093368f Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 23 Jan 2023 01:32:31 -0600 Subject: [PATCH 0896/1518] Use SECONDS macro for play_ambience cooldown --- code/modules/mob/living/carbon/human/life.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 96333185cba..3734cb28eeb 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -828,7 +828,7 @@ playsound_local(src,pick(global.scarySounds),50, 1, -1) var/area/A = get_area(src) - if(client && world.time >= client.played + 600) + if(client && world.time >= client.played + 60 SECONDS) A.play_ambience(src) if(stat == UNCONSCIOUS && world.time - l_move_time < 5 && prob(10)) to_chat(src,"You feel like you're [pick("moving","flying","floating","falling","hovering")].") From 9e10d6223010a6dd5f9adc1671a8f785363437f4 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 23 Jan 2023 00:16:01 -0600 Subject: [PATCH 0897/1518] Allow gas heaters to connect to fuel pipes Fixes a catastrophic overpressure leak on the Errant Pisces. --- code/modules/atmospherics/components/unary/heat_source.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/atmospherics/components/unary/heat_source.dm b/code/modules/atmospherics/components/unary/heat_source.dm index 4ccf0c95cce..20b6e32cf45 100644 --- a/code/modules/atmospherics/components/unary/heat_source.dm +++ b/code/modules/atmospherics/components/unary/heat_source.dm @@ -15,6 +15,7 @@ construct_state = /decl/machine_construction/default/panel_closed uncreated_component_parts = null stat_immune = 0 + connect_types = CONNECT_TYPE_REGULAR | CONNECT_TYPE_FUEL var/max_temperature = T20C + 680 var/internal_volume = 600 //L From ac0fd8ffc9c209194f9dcd8e267c31de354e512f Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 23 Jan 2023 00:16:51 -0600 Subject: [PATCH 0898/1518] Fix missing pipes and wires on the Errant Pisces --- maps/away/errant_pisces/errant_pisces.dmm | 84 +++++++++++++++++++---- 1 file changed, 72 insertions(+), 12 deletions(-) diff --git a/maps/away/errant_pisces/errant_pisces.dmm b/maps/away/errant_pisces/errant_pisces.dmm index c4fd39ce10a..6dc8faa97be 100644 --- a/maps/away/errant_pisces/errant_pisces.dmm +++ b/maps/away/errant_pisces/errant_pisces.dmm @@ -2062,6 +2062,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, /turf/simulated/floor/plating, /area/errant_pisces/solar_starboard) "fp" = ( @@ -2080,6 +2083,9 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plating, /area/errant_pisces/solar_starboard) "fq" = ( @@ -2091,6 +2097,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plating, /area/errant_pisces/solar_starboard) "fr" = ( @@ -2169,6 +2178,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/plating, /area/errant_pisces/solar_port) "fC" = ( @@ -2576,7 +2588,9 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, /turf/simulated/floor/tiled, /area/errant_pisces/hallway) "gA" = ( @@ -2768,6 +2782,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, /turf/simulated/floor/wood, /area/errant_pisces/rooms) "hg" = ( @@ -2779,17 +2796,19 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/tiled, /area/errant_pisces/rooms) "hh" = ( +/obj/effect/wallframe_spawn/reinforced, +/obj/machinery/door/firedoor, /obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + icon_state = "1-2" }, -/turf/simulated/floor/tiled, -/area/errant_pisces/hallway) +/turf/simulated/floor/plating, +/area/errant_pisces/bridge) "hi" = ( /obj/structure/cable/green{ icon_state = "1-2" @@ -2813,6 +2832,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/tiled, /area/errant_pisces/dorms) "hk" = ( @@ -2822,6 +2844,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 10 + }, /turf/simulated/floor/tiled, /area/errant_pisces/dorms) "hl" = ( @@ -2872,6 +2897,7 @@ /obj/structure/cable/green{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/wood, /area/errant_pisces/rooms) "hu" = ( @@ -4777,6 +4803,7 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating, /area/errant_pisces/general_storage) "nb" = ( @@ -4787,6 +4814,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/door/airlock/freezer, /obj/effect/decal/cleanable/blood, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled/freezer, /area/errant_pisces/prod_storage) "nc" = ( @@ -5198,6 +5226,12 @@ /obj/structure/cable/green{ icon_state = "2-4" }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, /turf/simulated/floor/plating, /area/errant_pisces/aux_power) "nN" = ( @@ -5206,6 +5240,12 @@ }, /obj/machinery/door/airlock, /obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, /turf/simulated/floor/plating, /area/errant_pisces/aux_power) "nO" = ( @@ -5215,8 +5255,12 @@ /obj/structure/cable/green{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/tiled, /area/errant_pisces/aft_hallway) "nP" = ( @@ -5564,6 +5608,9 @@ }, /obj/structure/cable/green, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable/green{ + icon_state = "0-2" + }, /turf/simulated/floor/tiled, /area/errant_pisces/bridge) "oM" = ( @@ -5692,6 +5739,9 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, +/obj/structure/cable/green{ + icon_state = "1-2" + }, /turf/simulated/floor/tiled, /area/errant_pisces/bridge) "ph" = ( @@ -5789,6 +5839,9 @@ pixel_x = -25; rcon_setting = 3 }, +/obj/structure/cable/green{ + icon_state = "1-6" + }, /turf/simulated/floor/tiled, /area/errant_pisces/bridge) "py" = ( @@ -5847,6 +5900,9 @@ }, /obj/structure/table/steel, /obj/random/snack, +/obj/structure/cable/green{ + icon_state = "6-9" + }, /turf/simulated/floor/tiled, /area/errant_pisces/bridge) "pK" = ( @@ -5981,6 +6037,9 @@ /obj/machinery/computer/ship/sensors{ dir = 4 }, +/obj/structure/cable/green{ + icon_state = "2-9" + }, /turf/simulated/floor/tiled, /area/errant_pisces/bridge) "qb" = ( @@ -6118,6 +6177,7 @@ /area/errant_pisces/fishing_wing) "qx" = ( /obj/machinery/shipsensors, +/obj/structure/cable/green, /turf/simulated/floor/reinforced/airless, /area/errant_pisces/bridge) "qy" = ( @@ -26267,7 +26327,7 @@ gd gk gy fZ -hh +gd fZ fZ fZ @@ -26671,7 +26731,7 @@ gd gm gA fZ -hh +gd fZ fZ hM @@ -28920,7 +28980,7 @@ oS oS pK qa -po +hh qx pp qH From da6dd52b56c23d77ef3cbb31da5d193b44af1e14 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 23 Jan 2023 01:31:13 -0600 Subject: [PATCH 0899/1518] Add testing for away site pipe leaks --- code/modules/maps/_map_template.dm | 13 +-- code/modules/maps/helper_landmarks.dm | 8 +- code/unit_tests/map_tests.dm | 12 +- maps/away/bearcat/bearcat-2.dmm | 13 ++- maps/away/casino/casino.dmm | 14 ++- maps/away/derelict/derelict-station.dmm | 20 +++- maps/away/errant_pisces/errant_pisces.dmm | 10 +- .../lost_supply_base/lost_supply_base.dmm | 19 ++- maps/away/magshield/magshield.dmm | 110 +++++++++++++----- maps/away/mining/mining-signal.dmm | 3 + maps/away/slavers/slavers_base.dmm | 39 +++++-- maps/away/smugglers/smugglers.dmm | 1 + maps/away/unishi/unishi-3.dmm | 16 ++- .../away_sites_testing_define.dm | 4 +- .../away_sites/lar_maria/lar_maria-2.dmm | 40 ++++++- .../government/away_sites/icarus/icarus-1.dmm | 31 ++++- .../government/away_sites/icarus/icarus-2.dmm | 24 ++-- 17 files changed, 287 insertions(+), 90 deletions(-) diff --git a/code/modules/maps/_map_template.dm b/code/modules/maps/_map_template.dm index 9dc4446a614..ea93af62a0d 100644 --- a/code/modules/maps/_map_template.dm +++ b/code/modules/maps/_map_template.dm @@ -104,15 +104,14 @@ SSshuttle.block_queue = pre_init_state SSshuttle.clear_init_queue() // We will flush the queue unless there were other blockers, in which case they will do it. -/datum/map_template/proc/load_new_z(no_changeturf = TRUE) - - var/x = round((world.maxx - width)/2) - var/y = round((world.maxy - height)/2) +/datum/map_template/proc/load_new_z(no_changeturf = TRUE, centered=TRUE) + var/x = max(round((world.maxx - width)/2), 1) + var/y = max(round((world.maxy - height)/2), 1) + if(!centered) + x = 1 + y = 1 var/initial_z = world.maxz + 1 - if (x < 1) x = 1 - if (y < 1) y = 1 - var/list/bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF) var/list/atoms_to_initialise = list() var/shuttle_state = pre_init_shuttles() diff --git a/code/modules/maps/helper_landmarks.dm b/code/modules/maps/helper_landmarks.dm index a42fddfb775..fd4ddb0f195 100644 --- a/code/modules/maps/helper_landmarks.dm +++ b/code/modules/maps/helper_landmarks.dm @@ -98,4 +98,10 @@ events_repository.unregister_global(/decl/observ/shuttle_added, src, .proc/check_shuttle) if(shuttle_datum) events_repository.unregister(/decl/observ/shuttle_moved, shuttle_datum, src, .proc/delete_everything) - . = ..() \ No newline at end of file + . = ..() + +/// Used to tell pipe leak unit tests that a leak is intentional. Placed over the pipe that leaks, not the tile missing a pipe. +/obj/abstract/landmark/allowed_leak +#ifndef UNIT_TEST + delete_me = TRUE +#endif diff --git a/code/unit_tests/map_tests.dm b/code/unit_tests/map_tests.dm index a55d03c79f1..c1477660858 100644 --- a/code/unit_tests/map_tests.dm +++ b/code/unit_tests/map_tests.dm @@ -538,20 +538,20 @@ //======================================================================================= -/datum/unit_test/station_pipes_shall_not_leak - name = "MAP: Station pipes shall not leak" +/datum/unit_test/pipes_shall_not_leak + name = "MAP: Pipes shall not leak unless allowed" -/datum/unit_test/station_pipes_shall_not_leak/start_test() +/datum/unit_test/pipes_shall_not_leak/start_test() var/failures = 0 for(var/obj/machinery/atmospherics/pipe/P in SSmachines.machinery) - if(P.leaking && isStationLevel(P.z)) + if(P.leaking && isPlayerLevel(P.z) && !(locate(/obj/abstract/landmark/allowed_leak) in get_turf(P))) failures++ log_bad("Following pipe is leaking: [log_info_line(P)]") if(failures) - fail("[failures] station pipe\s leak.") + fail("[failures] pipe\s leaking without allowed leak landmark!") else - pass("No station pipes are leaking") + pass("No pipes are leaking.") return 1 //======================================================================================= diff --git a/maps/away/bearcat/bearcat-2.dmm b/maps/away/bearcat/bearcat-2.dmm index 40637183149..739657c85f4 100644 --- a/maps/away/bearcat/bearcat-2.dmm +++ b/maps/away/bearcat/bearcat-2.dmm @@ -3735,6 +3735,7 @@ }, /obj/effect/floor_decal/corner/blue, /obj/machinery/portable_atmospherics/canister/oxygen, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/airless, /area/ship/scrap/maintenance/atmos) "hi" = ( @@ -3749,6 +3750,7 @@ /obj/effect/floor_decal/corner/blue{ dir = 10 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/airless, /area/ship/scrap/maintenance/atmos) "hj" = ( @@ -3771,6 +3773,7 @@ dir = 1 }, /mob/living/simple_animal/hostile/carp, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/airless, /area/ship/scrap/maintenance/atmos) "hl" = ( @@ -4445,6 +4448,7 @@ dir = 4 }, /obj/machinery/portable_atmospherics/powered/pump/filled, +/obj/machinery/atmospherics/pipe/simple/visible/universal, /turf/simulated/floor/tiled/airless, /area/ship/scrap/maintenance/atmos) "iu" = ( @@ -4526,14 +4530,14 @@ /turf/simulated/floor/tiled/airless, /area/ship/scrap/maintenance/atmos) "iE" = ( -/obj/machinery/atmospherics/pipe/manifold/visible/blue{ - dir = 4 - }, /obj/effect/floor_decal/corner/blue, /obj/effect/floor_decal/corner/yellow{ dir = 4 }, /obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/visible/blue{ + dir = 4 + }, /turf/simulated/floor/tiled/airless, /area/ship/scrap/maintenance/atmos) "iF" = ( @@ -4857,6 +4861,7 @@ "js" = ( /obj/machinery/atmospherics/valve/open, /obj/item/shard/borosilicate, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/ship/scrap/maintenance/engine/aft) "jt" = ( @@ -4969,6 +4974,7 @@ /area/ship/scrap/maintenance/engine/aft) "jH" = ( /obj/machinery/atmospherics/pipe/manifold/visible/fuel, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/ship/scrap/maintenance/engine/aft) "jI" = ( @@ -5020,6 +5026,7 @@ }, /obj/effect/floor_decal/industrial/warning, /mob/living/simple_animal/hostile/carp, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/ship/scrap/maintenance/engine/aft) "jQ" = ( diff --git a/maps/away/casino/casino.dmm b/maps/away/casino/casino.dmm index cf98413623f..3347559d787 100644 --- a/maps/away/casino/casino.dmm +++ b/maps/away/casino/casino.dmm @@ -1860,6 +1860,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, /turf/simulated/floor/tiled, /area/casino/casino_maintenance) "fq" = ( @@ -2814,6 +2817,7 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating, /area/casino/casino_crew_atmos) "ij" = ( @@ -3106,6 +3110,7 @@ /obj/machinery/atmospherics/omni/filter{ dir = 8 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/plating, /area/casino/casino_crew_atmos) "iY" = ( @@ -3116,6 +3121,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/universal{ dir = 4 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/plating, /area/casino/casino_crew_atmos) "iZ" = ( @@ -3173,6 +3179,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/cyan{ dir = 9 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/plating, /area/casino/casino_crew_atmos) "ji" = ( @@ -5338,6 +5345,11 @@ }, /turf/simulated/floor/airless, /area/casino/casino_bow) +"TO" = ( +/obj/machinery/atmospherics/pipe/manifold/visible/red, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/plating, +/area/casino/casino_crew_atmos) "Ub" = ( /obj/structure/window/basic{ dir = 4 @@ -9506,7 +9518,7 @@ gM gg ix iI -iW +TO iV jy jN diff --git a/maps/away/derelict/derelict-station.dmm b/maps/away/derelict/derelict-station.dmm index 9668178555d..4d0f32bf0c5 100644 --- a/maps/away/derelict/derelict-station.dmm +++ b/maps/away/derelict/derelict-station.dmm @@ -2382,6 +2382,7 @@ /obj/machinery/atmospherics/pipe/simple/visible{ dir = 4 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/constructionsite/atmospherics) "iv" = ( @@ -2717,6 +2718,7 @@ /obj/machinery/atmospherics/pipe/simple/visible{ dir = 5 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/constructionsite/atmospherics) "jr" = ( @@ -3420,6 +3422,11 @@ }, /turf/simulated/floor/tiled/dark, /area/constructionsite/teleporter) +"nn" = ( +/obj/machinery/atmospherics/pipe/simple/visible, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/tiled/dark/airless, +/area/constructionsite/atmospherics) "ob" = ( /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ id_tag = "constructionsite_vent" @@ -3454,6 +3461,11 @@ /obj/structure/wall_frame, /turf/simulated/floor/airless, /area/constructionsite/hallway/fore) +"Yw" = ( +/obj/machinery/atmospherics/pipe/simple/visible, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/airless, +/area/constructionsite/atmospherics) (1,1,1) = {" aa @@ -24565,9 +24577,9 @@ hr hr hr hr -hV -ie +nn ie +Yw hr hs hr @@ -25974,10 +25986,10 @@ hr hr hs hr +nn hV -hV -ie ie +Yw hs hr hs diff --git a/maps/away/errant_pisces/errant_pisces.dmm b/maps/away/errant_pisces/errant_pisces.dmm index 6dc8faa97be..e1ecd33f77a 100644 --- a/maps/away/errant_pisces/errant_pisces.dmm +++ b/maps/away/errant_pisces/errant_pisces.dmm @@ -800,12 +800,14 @@ /obj/machinery/atmospherics/pipe/simple/visible/red{ dir = 4 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/plating, /area/errant_pisces/atmos) "cw" = ( /obj/machinery/atmospherics/omni/mixer{ dir = 1 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/plating, /area/errant_pisces/atmos) "cx" = ( @@ -903,6 +905,7 @@ /obj/effect/floor_decal/industrial/warning{ dir = 6 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/plating, /area/errant_pisces/atmos) "cN" = ( @@ -6432,6 +6435,11 @@ }, /turf/simulated/floor/tiled/white, /area/errant_pisces/head_m) +"QS" = ( +/obj/machinery/atmospherics/pipe/simple/visible/blue, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/plating, +/area/errant_pisces/atmos) "Ti" = ( /obj/machinery/computer/modular{ dir = 4 @@ -25299,7 +25307,7 @@ aY bh bA bV -bV +QS cw cM cZ diff --git a/maps/away/lost_supply_base/lost_supply_base.dmm b/maps/away/lost_supply_base/lost_supply_base.dmm index 793ec245d7a..ef689993464 100644 --- a/maps/away/lost_supply_base/lost_supply_base.dmm +++ b/maps/away/lost_supply_base/lost_supply_base.dmm @@ -761,6 +761,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/lost_supply_base) "cf" = ( @@ -941,6 +942,7 @@ /area/lost_supply_base) "cG" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/lost_supply_base) "cH" = ( @@ -1002,6 +1004,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/lost_supply_base) "cT" = ( @@ -1026,12 +1029,14 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/lost_supply_base) "cY" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/lost_supply_base) "cZ" = ( @@ -1041,6 +1046,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/wall, /area/lost_supply_base) "da" = ( @@ -1849,6 +1855,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/airless{ icon_state = "steel_burned1" }, @@ -1897,6 +1904,7 @@ pixel_x = 5; pixel_y = -3 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/airless, /area/lost_supply_base) "fT" = ( @@ -2008,6 +2016,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/airless, /area/lost_supply_base) "gh" = ( @@ -2109,6 +2118,14 @@ icon_state = "steel_broken0" }, /area/lost_supply_base/supply) +"nL" = ( +/obj/machinery/atmospherics/pipe/simple/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/airless, +/area/lost_supply_base) "Jd" = ( /obj/machinery/computer/modular{ dir = 1 @@ -8474,7 +8491,7 @@ bg bB bN bU -bU +nL cr aG cS diff --git a/maps/away/magshield/magshield.dmm b/maps/away/magshield/magshield.dmm index d90190d2602..203c739a187 100644 --- a/maps/away/magshield/magshield.dmm +++ b/maps/away/magshield/magshield.dmm @@ -400,6 +400,7 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/magshield/smes_storage) "bj" = ( @@ -1046,6 +1047,7 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/magshield/smes_storage) "cV" = ( @@ -1428,6 +1430,7 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/magshield/north) "ej" = ( @@ -1483,6 +1486,7 @@ icon_state = "1-4" }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/magshield/north) "eo" = ( @@ -2054,12 +2058,6 @@ }, /turf/simulated/floor/airless, /area/magshield/east) -"fV" = ( -/obj/machinery/atmospherics/pipe/manifold/visible/red{ - dir = 1 - }, -/turf/simulated/floor/airless, -/area/magshield/east) "fW" = ( /obj/machinery/atmospherics/pipe/simple/visible/red{ dir = 4 @@ -2149,12 +2147,6 @@ }, /turf/simulated/floor/airless, /area/magshield/east) -"gl" = ( -/obj/machinery/atmospherics/pipe/simple/visible/red{ - dir = 9 - }, -/turf/simulated/floor/airless, -/area/magshield/east) "gm" = ( /obj/structure/cable{ icon_state = "1-2" @@ -2444,6 +2436,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/magshield/east) "hh" = ( @@ -2730,6 +2723,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled, /area/magshield/west) "hZ" = ( @@ -2765,6 +2759,7 @@ /area/magshield/west) "ie" = ( /obj/machinery/seed_storage, +/obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled, /area/magshield/east) "if" = ( @@ -3394,6 +3389,7 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/magshield/south) "kb" = ( @@ -3755,13 +3751,13 @@ /turf/simulated/floor/tiled, /area/magshield/south) "le" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable/yellow{ + icon_state = "1-2" }, -/turf/simulated/floor/tiled, -/area/magshield/south) +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/airless, +/area/magshield/smes_storage) "lf" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 @@ -3897,6 +3893,11 @@ /obj/effect/shuttle_landmark/nav_magshield/nav3, /turf/space, /area/space) +"qp" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging, +/obj/abstract/landmark/allowed_leak, +/turf/space, +/area/space) "uL" = ( /obj/effect/wallframe_spawn/reinforced, /turf/simulated/floor/tiled, @@ -3909,6 +3910,51 @@ }, /turf/simulated/floor/airless, /area/magshield/east) +"JW" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/tiled, +/area/magshield/south) +"KZ" = ( +/obj/machinery/atmospherics/pipe/simple/heat_exchanging{ + dir = 4 + }, +/obj/abstract/landmark/allowed_leak, +/turf/space, +/area/space) +"Oa" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/tiled/dark, +/area/magshield/west) +"TY" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/airless, +/area/magshield/north) +"Uw" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/tiled, +/area/magshield/south) (1,1,1) = {" aa @@ -19371,7 +19417,7 @@ hM hM hM hM -it +Oa it it iK @@ -20144,7 +20190,7 @@ bc bc bO bc -bc +qp aa ao aa @@ -20346,10 +20392,10 @@ bc bc bc bc -bc +qp aa aa -bN +KZ ab de de @@ -20547,7 +20593,7 @@ bc bc bc bc -bc +qp aa aa aa @@ -21165,7 +21211,7 @@ dl dj dH dg -ej +TY dg dj de @@ -23574,7 +23620,7 @@ aD aU bi bg -aU +le aU aU bZ @@ -27058,7 +27104,7 @@ iq iq iq iq -le +kz iq ip ip @@ -27865,7 +27911,7 @@ iq iq iq iq -kx +JW ip jl jl @@ -28066,7 +28112,7 @@ jg ix jZ kt -ix +Uw ku kc jD @@ -28446,7 +28492,7 @@ fi fi fU fi -fU +fi fi fi gF @@ -28646,9 +28692,9 @@ fh fi fi fi -fV -ge -gl +fU +fi +fi fi fi fi diff --git a/maps/away/mining/mining-signal.dmm b/maps/away/mining/mining-signal.dmm index ec101d0ae48..de1ec66f91e 100644 --- a/maps/away/mining/mining-signal.dmm +++ b/maps/away/mining/mining-signal.dmm @@ -1426,6 +1426,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/white/airless, /area/outpost/abandoned) "eR" = ( @@ -1516,6 +1517,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/red, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/plating{ icon_state = "dmg1" }, @@ -2439,6 +2441,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/item/ammo_casing/pistol/magnum, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/dark, /area/outpost/abandoned) "rb" = ( diff --git a/maps/away/slavers/slavers_base.dmm b/maps/away/slavers/slavers_base.dmm index 25da7e728a3..61083e29ea9 100644 --- a/maps/away/slavers/slavers_base.dmm +++ b/maps/away/slavers/slavers_base.dmm @@ -371,6 +371,9 @@ /obj/structure/cable/cyan{ icon_state = "2-8" }, +/obj/structure/cable/cyan{ + icon_state = "4-8" + }, /turf/simulated/floor/tiled/airless, /area/slavers_base/cells) "bp" = ( @@ -457,9 +460,10 @@ /turf/simulated/floor/tiled/airless, /area/slavers_base/cells) "by" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/simulated/floor/tiled/airless, -/area/slavers_base/cells) +/obj/machinery/atmospherics/pipe/manifold/visible/black, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/airless/ceiling, +/area/slavers_base/powatm) "bz" = ( /obj/structure/closet/crate/freezer/rations, /obj/effect/decal/cleanable/dirt, @@ -727,11 +731,11 @@ "cc" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood, -/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ - icon_state = "0-2" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/airless, /area/slavers_base/cells) "cd" = ( @@ -2102,12 +2106,14 @@ /obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 4 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless/ceiling, /area/slavers_base/powatm) "fN" = ( /obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 10 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless/ceiling, /area/slavers_base/powatm) "fO" = ( @@ -2218,6 +2224,7 @@ /obj/machinery/atmospherics/omni/filter{ dir = 8 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless/ceiling, /area/slavers_base/powatm) "gf" = ( @@ -3884,6 +3891,18 @@ }, /turf/simulated/floor/tiled/white, /area/slavers_base/dorms) +"nm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/tiled/airless, +/area/slavers_base/demo) +"EJ" = ( +/obj/machinery/atmospherics/pipe/simple/visible/black{ + dir = 4 + }, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/airless/ceiling, +/area/slavers_base/powatm) (1,1,1) = {" aa @@ -14907,7 +14926,7 @@ eF da da fL -gc +by da da da @@ -15513,7 +15532,7 @@ eH da da da -gd +EJ da da da @@ -20138,7 +20157,7 @@ aM aM aM bo -by +cx aM aM aM @@ -20975,7 +20994,7 @@ hr hH ie hd -iI +nm iZ jm jx diff --git a/maps/away/smugglers/smugglers.dmm b/maps/away/smugglers/smugglers.dmm index f5539d4c17e..e2c7e60eb45 100644 --- a/maps/away/smugglers/smugglers.dmm +++ b/maps/away/smugglers/smugglers.dmm @@ -83,6 +83,7 @@ icon_state = "door_closed"; name = "Internal Airlock" }, +/obj/machinery/atmospherics/pipe/simple/visible/black, /turf/simulated/floor, /area/smugglers/base) "ar" = ( diff --git a/maps/away/unishi/unishi-3.dmm b/maps/away/unishi/unishi-3.dmm index 5d2e981c0aa..5f6a5cf3a3d 100644 --- a/maps/away/unishi/unishi-3.dmm +++ b/maps/away/unishi/unishi-3.dmm @@ -872,9 +872,7 @@ /area/unishi/living) "cD" = ( /obj/structure/bed/chair/padded/black, -/obj/machinery/computer/modular/telescreen/preset/generic{ - dir = 2 - }, +/obj/machinery/computer/modular/telescreen/preset/generic, /turf/simulated/floor/tiled, /area/unishi/living) "cE" = ( @@ -1977,6 +1975,16 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply, /turf/simulated/floor/tiled, /area/unishi/living) +"RG" = ( +/obj/structure/closet/crate/bin, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/unishi/living) "Um" = ( /obj/machinery/light/small{ dir = 4 @@ -7549,7 +7557,7 @@ bf dW ea bf -bq +RG bf es be diff --git a/maps/away_sites_testing/away_sites_testing_define.dm b/maps/away_sites_testing/away_sites_testing_define.dm index 18f0b37ffc0..72163ba24c7 100644 --- a/maps/away_sites_testing/away_sites_testing_define.dm +++ b/maps/away_sites_testing/away_sites_testing_define.dm @@ -12,10 +12,10 @@ var/list/unsorted_sites = list_values(SSmapping.get_templates_by_category(MAP_TEMPLATE_CATEGORY_AWAYSITE)) var/list/sorted_sites = sortTim(unsorted_sites, /proc/cmp_sort_templates_tallest_to_shortest) for (var/datum/map_template/A in sorted_sites) - A.load_new_z() + A.load_new_z(centered = FALSE) testing("Spawning [A] in [english_list(GetConnectedZlevels(world.maxz))]") if(A.template_flags & TEMPLATE_FLAG_TEST_DUPLICATES) - A.load_new_z() + A.load_new_z(centered = FALSE) testing("Spawning [A] in [english_list(GetConnectedZlevels(world.maxz))]") /proc/cmp_sort_templates_tallest_to_shortest(var/datum/map_template/a, var/datum/map_template/b) diff --git a/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm b/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm index f13e010dddb..7e97ebf1f82 100644 --- a/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm +++ b/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm @@ -1108,10 +1108,12 @@ /obj/machinery/atmospherics/omni/filter{ dir = 4 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/plating, /area/lar_maria/atmos) "dr" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/cyan, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/plating, /area/lar_maria/atmos) "ds" = ( @@ -1177,10 +1179,12 @@ /area/lar_maria/atmos) "dD" = ( /obj/machinery/atmospherics/binary/oxyregenerator, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/plating, /area/lar_maria/atmos) "dE" = ( /obj/machinery/atmospherics/pipe/simple/visible/blue, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/plating, /area/lar_maria/atmos) "dF" = ( @@ -3090,6 +3094,13 @@ }, /turf/simulated/floor/plating, /area/lar_maria/solar_control) +"ok" = ( +/obj/machinery/atmospherics/binary/pump{ + dir = 4 + }, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/plating, +/area/lar_maria/atmos) "pb" = ( /obj/machinery/atmospherics/binary/pump{ dir = 8 @@ -3183,12 +3194,31 @@ }, /turf/simulated/floor/tiled/white, /area/lar_maria/head_f) +"Ag" = ( +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 8 + }, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/plating, +/area/lar_maria/atmos) "DG" = ( /obj/machinery/computer/modular{ dir = 1 }, /turf/simulated/floor/tiled, /area/lar_maria/office) +"FZ" = ( +/obj/machinery/atmospherics/pipe/simple/visible/red, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/plating, +/area/lar_maria/atmos) +"YS" = ( +/obj/machinery/atmospherics/pipe/simple/visible/red{ + dir = 10 + }, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/plating, +/area/lar_maria/atmos) (1,1,1) = {" aa @@ -22470,7 +22500,7 @@ pb ci cA cR -cR +ok dB tb bx @@ -22671,7 +22701,7 @@ bx bM ci cn -cl +YS dn dB bM @@ -22874,7 +22904,7 @@ bN ci cn cn -cR +ok dC dO bx @@ -23480,7 +23510,7 @@ bQ ck bQ cU -cU +Ag bQ dR bG @@ -24085,7 +24115,7 @@ bx qb cl cB -cB +FZ dp dF ub diff --git a/mods/content/government/away_sites/icarus/icarus-1.dmm b/mods/content/government/away_sites/icarus/icarus-1.dmm index 7f26d3567d8..11bd7e8d30b 100644 --- a/mods/content/government/away_sites/icarus/icarus-1.dmm +++ b/mods/content/government/away_sites/icarus/icarus-1.dmm @@ -1149,6 +1149,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled, /area/icarus/open) "dX" = ( @@ -1996,6 +1997,7 @@ "gy" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/plating, /area/icarus/vessel) "gz" = ( @@ -2096,6 +2098,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/plating, /area/icarus/open) "gR" = ( @@ -2383,6 +2386,9 @@ dir = 4; id_tag = "d1starboardnacelle" }, +/obj/machinery/atmospherics/pipe/simple/visible/fuel{ + dir = 4 + }, /turf/simulated/floor/reinforced, /area/icarus/vessel) "hH" = ( @@ -2525,7 +2531,9 @@ /turf/unsimulated/beach/sand, /area/icarus/open) "id" = ( -/obj/machinery/atmospherics/unary/engine, +/obj/machinery/atmospherics/unary/engine{ + dir = 1 + }, /turf/simulated/wall/r_wall, /area/icarus/open) "ie" = ( @@ -2661,6 +2669,19 @@ /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/tiled/white, /area/icarus/vessel) +"rK" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/tiled, +/area/icarus/open) +"sK" = ( +/obj/machinery/atmospherics/pipe/simple/visible/fuel{ + dir = 4 + }, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/plating, +/area/icarus/open) (1,1,1) = {" aa @@ -22008,7 +22029,7 @@ en en ei et -hD +sK eA hX et @@ -22124,7 +22145,7 @@ dD dK dD dD -dD +rK ee ei ei @@ -22207,7 +22228,7 @@ aq gR hd eA -hD +sK et aq hD @@ -25760,7 +25781,7 @@ cf dL dY dD -dD +rK eA ei ei diff --git a/mods/content/government/away_sites/icarus/icarus-2.dmm b/mods/content/government/away_sites/icarus/icarus-2.dmm index c5f7ce09cff..30b7c9c2ba8 100644 --- a/mods/content/government/away_sites/icarus/icarus-2.dmm +++ b/mods/content/government/away_sites/icarus/icarus-2.dmm @@ -962,12 +962,12 @@ /turf/simulated/floor/tiled, /area/icarus/vessel) "df" = ( -/obj/machinery/door/airlock, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled, -/area/icarus/vessel) +/area/icarus/open) "dg" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1 @@ -1271,6 +1271,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless{ icon_state = "dmg2" }, @@ -1343,6 +1344,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled, /area/icarus/vessel) "el" = ( @@ -1813,6 +1815,12 @@ /obj/structure/wall_frame, /turf/simulated/floor/plating, /area/icarus/vessel) +"MC" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/tiled, +/area/icarus/open) "RQ" = ( /obj/machinery/computer/modular{ dir = 4 @@ -21288,7 +21296,7 @@ dw dU dw dw -dw +MC ac cR ac @@ -24921,7 +24929,7 @@ bY bY dN dw -dU +df dR cR cR @@ -26126,7 +26134,7 @@ ap cu cJ ap -df +bw ap ap ap From 260af1e0145b30206faa94da0468720b55e94bd4 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 23 Jan 2023 01:35:09 -0600 Subject: [PATCH 0900/1518] Remove redundant sector name from navpoint names --- code/modules/shuttles/landmarks.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/shuttles/landmarks.dm b/code/modules/shuttles/landmarks.dm index 4758c863575..294527638e9 100644 --- a/code/modules/shuttles/landmarks.dm +++ b/code/modules/shuttles/landmarks.dm @@ -127,10 +127,11 @@ var/global/list/shuttle_landmarks = list() /obj/effect/shuttle_landmark/automatic/sector_set(var/obj/effect/overmap/visitable/O) ..() - SetName("[O.name] - [initial(name)] ([x],[y])") + SetName("[initial(name)] ([x],[y])") //Subtype that calls explosion on init to clear space for shuttles /obj/effect/shuttle_landmark/automatic/clearing + name = "clearing" var/radius = 10 /obj/effect/shuttle_landmark/automatic/clearing/Initialize(var/ml, var/supplied_radius) From 0c09cec1c0521d7084a71aff86603ab21f10c7df Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 20 Jan 2023 23:13:37 -0600 Subject: [PATCH 0901/1518] Make replaced job items go in storage --- .../preference_setup/loadout/loadout.dm | 31 ++++++++++++------- code/modules/mob/inventory.dm | 6 ++-- .../mob/living/carbon/human/inventory.dm | 24 ++++++++------ 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index de20fb7916e..c7a5b4e968d 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -417,28 +417,35 @@ var/global/list/gear_datums = list() if(metadata && !islist(metadata)) PRINT_STACK_TRACE("Loadout spawn_item() proc received non-null non-list metadata: '[json_encode(metadata)]'") -/decl/loadout_option/proc/spawn_on_mob(var/mob/living/carbon/human/H, var/metadata) - var/obj/item/item = spawn_and_validate_item(H, metadata) +/decl/loadout_option/proc/spawn_on_mob(mob/living/carbon/human/wearer, metadata) + var/obj/item/item = spawn_and_validate_item(wearer, metadata) if(!item) return - if(H.equip_to_slot_if_possible(item, slot, del_on_fail = 1, force = 1)) + var/obj/item/old_item = wearer.get_equipped_item(slot) + if(wearer.equip_to_slot_if_possible(item, slot, del_on_fail = TRUE, force = TRUE, delete_old_item = FALSE)) . = item + if(old_item && old_item.type != item.type) + wearer.u_equip(old_item) + place_in_storage_or_drop(wearer, old_item) -/decl/loadout_option/proc/spawn_in_storage_or_drop(var/mob/living/carbon/human/H, var/metadata) - var/obj/item/item = spawn_and_validate_item(H, metadata) +/decl/loadout_option/proc/spawn_in_storage_or_drop(mob/living/carbon/human/wearer, metadata) + var/obj/item/item = spawn_and_validate_item(wearer, metadata) if(!item) return - var/atom/placed_in = H.equip_to_storage(item) + place_in_storage_or_drop(wearer, item) + +/decl/loadout_option/proc/place_in_storage_or_drop(mob/living/carbon/human/wearer, obj/item/item) + var/atom/placed_in = wearer.equip_to_storage(item) if(placed_in) - to_chat(H, "Placing \the [item] in your [placed_in.name]!") - else if(H.equip_to_appropriate_slot(item)) - to_chat(H, "Placing \the [item] in your inventory!") - else if(H.put_in_hands(item)) - to_chat(H, "Placing \the [item] in your hands!") + to_chat(wearer, SPAN_NOTICE("Placing \the [item] in your [placed_in.name]!")) + else if(wearer.equip_to_appropriate_slot(item)) + to_chat(wearer, SPAN_NOTICE("Placing \the [item] in your inventory!")) + else if(wearer.put_in_hands(item)) + to_chat(wearer, SPAN_NOTICE("Placing \the [item] in your hands!")) else - to_chat(H, "Dropping \the [item] on the ground!") + to_chat(wearer, SPAN_DANGER("Dropping \the [item] on the ground!")) /decl/loadout_option/proc/spawn_and_validate_item(mob/living/carbon/human/H, metadata) PRIVATE_PROC(TRUE) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 36969dd90eb..0dbefff67cc 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -15,7 +15,7 @@ //set disable_warning to disable the 'you are unable to equip that' warning. //unset redraw_mob to prevent the mob from being redrawn at the end. //set force to replace items in the slot and ignore blocking overwear -/mob/proc/equip_to_slot_if_possible(obj/item/W, slot, del_on_fail = 0, disable_warning = 0, redraw_mob = 1, force = 0) +/mob/proc/equip_to_slot_if_possible(obj/item/W, slot, del_on_fail = 0, disable_warning = 0, redraw_mob = 1, force = FALSE, delete_old_item = TRUE) if(!istype(W) || !slot) return FALSE @@ -27,12 +27,12 @@ return FALSE if(canUnEquip(W)) - equip_to_slot(W, slot, redraw_mob) //This proc should not ever fail. + equip_to_slot(W, slot, redraw_mob, delete_old_item = delete_old_item) //This proc should not ever fail. return TRUE //This is an UNSAFE proc. It merely handles the actual job of equipping. All the checks on whether you can or can't eqip need to be done before! Use mob_can_equip() for that task. //In most cases you will want to use equip_to_slot_if_possible() -/mob/proc/equip_to_slot(obj/item/W, slot) +/mob/proc/equip_to_slot(obj/item/W, slot, delete_old_item = TRUE) SHOULD_CALL_PARENT(TRUE) return istype(W) && !isnull(slot) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 1096f2b6eb8..ddf99bc48df 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -162,7 +162,7 @@ This saves us from having to call add_fingerprint() any time something is put in // Post hands rewrite I plan to conver the rest of the inventory system to a string-based inventory slot system // so at that point the numerical flags will be removed and this proc (and the rest of the chain) can be rewritten. -/mob/living/carbon/human/equip_to_slot(obj/item/W, slot, redraw_mob = 1) +/mob/living/carbon/human/equip_to_slot(obj/item/W, slot, redraw_mob = TRUE, delete_old_item = TRUE) . = ..() if(!. || !has_organ_for_slot(slot)) @@ -185,7 +185,9 @@ This saves us from having to call add_fingerprint() any time something is put in if(W.action_button_name) update_action_buttons() if(old_item) - qdel(old_item) + u_equip(old_item) + if(delete_old_item) + qdel(old_item) return TRUE // End boilerplate. @@ -200,9 +202,8 @@ This saves us from having to call add_fingerprint() any time something is put in update_inv_back(redraw_mob) if(slot_wear_mask_str) _wear_mask = W - if(_wear_mask.flags_inv & BLOCK_ALL_HAIR) - update_hair(redraw_mob) //rebuild hair - update_inv_ears(0) + update_hair(redraw_mob) //rebuild hair + update_inv_ears(0) W.equipped(src, slot) update_inv_wear_mask(redraw_mob) if(slot_handcuffed_str) @@ -235,9 +236,9 @@ This saves us from having to call add_fingerprint() any time something is put in update_inv_gloves(redraw_mob) if(slot_head_str) _head = W - if(_head.flags_inv & (BLOCK_ALL_HAIR|HIDEMASK)) - update_hair(redraw_mob) //rebuild hair - update_inv_ears(0) + update_hair(redraw_mob) //rebuild hair + update_inv_ears(0) + if(_head.flags_inv & HIDEMASK) update_inv_wear_mask(0) if(istype(W,/obj/item/clothing/head/kitty)) W.update_icon(src) @@ -296,9 +297,12 @@ This saves us from having to call add_fingerprint() any time something is put in if(W.action_button_name) update_action_buttons() - // if we replaced an item, delete the old item. do this at the end to make the replacement seamless + // seamless replacement deletes the old item by default, but can be disabled for special handling + // like job items going into storage when replaced by loadout items if(old_item) - qdel(old_item) + u_equip(old_item) + if(delete_old_item) + qdel(old_item) return 1 From 08895ed1fbfadfeb4610096281c07bdc3d8cde82 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 21 Jan 2023 14:42:47 -0600 Subject: [PATCH 0902/1518] Delete job items if duplicated in loadout --- code/modules/client/preference_setup/loadout/loadout.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index c7a5b4e968d..3a8dc7625e3 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -425,9 +425,13 @@ var/global/list/gear_datums = list() var/obj/item/old_item = wearer.get_equipped_item(slot) if(wearer.equip_to_slot_if_possible(item, slot, del_on_fail = TRUE, force = TRUE, delete_old_item = FALSE)) . = item - if(old_item && old_item.type != item.type) - wearer.u_equip(old_item) + if(!old_item) + return + wearer.u_equip(old_item) + if(old_item.type != item.type) place_in_storage_or_drop(wearer, old_item) + else + qdel(old_item) /decl/loadout_option/proc/spawn_in_storage_or_drop(mob/living/carbon/human/wearer, metadata) var/obj/item/item = spawn_and_validate_item(wearer, metadata) From 8fb6088d0eda6cb8bbfc2024df8d0a8e4d7316e9 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 21 Jan 2023 08:56:03 -0500 Subject: [PATCH 0903/1518] Update Matrices, Fix Runtimes Update color matrix procs and in the process fixes a runtime when supermatter damage gets high. Also move animations to animations.dm --- code/_helpers/animations.dm | 33 +- code/_helpers/matrices.dm | 297 +++++++++++------- code/game/objects/items/cryobag.dm | 6 +- .../client/client_color_definitions.dm | 52 +-- .../under/accessories/accessory_toggleable.dm | 2 +- code/modules/events/ion_storm.dm | 2 +- .../simple_animal/hostile/retaliate/jelly.dm | 4 +- .../reagents/chems/random/random_effects.dm | 2 +- code/modules/supermatter/supermatter.dm | 2 +- 9 files changed, 259 insertions(+), 141 deletions(-) diff --git a/code/_helpers/animations.dm b/code/_helpers/animations.dm index c3ba7d48996..65932553d9a 100644 --- a/code/_helpers/animations.dm +++ b/code/_helpers/animations.dm @@ -67,4 +67,35 @@ // And animate the attack! animate(I, alpha = 175, transform = matrix() * 0.75, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3) animate(time = 1) - animate(alpha = 0, time = 3, easing = CIRCULAR_EASING|EASE_OUT) \ No newline at end of file + animate(alpha = 0, time = 3, easing = CIRCULAR_EASING|EASE_OUT) + +/atom/proc/shake_animation(var/intensity = 8) + var/init_px = pixel_x + var/shake_dir = pick(-1, 1) + animate(src, transform=turn(matrix(), intensity*shake_dir), pixel_x=init_px + 2*shake_dir, time=1) + animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING) + +/atom/proc/SpinAnimation(speed = 10, loops = -1, clockwise = 1, segments = 3, parallel = TRUE) + if(!segments) + return + var/segment = 360/segments + if(!clockwise) + segment = -segment + var/list/matrices = list() + for(var/i in 1 to segments-1) + var/matrix/M = matrix(transform) + M.Turn(segment*i) + matrices += M + var/matrix/last = matrix(transform) + matrices += last + + speed /= segments + + if(parallel) + animate(src, transform = matrices[1], time = speed, loops , flags = ANIMATION_PARALLEL) + else + animate(src, transform = matrices[1], time = speed, loops) + for(var/i in 2 to segments) //2 because 1 is covered above + animate(transform = matrices[i], time = speed) + //doesn't have an object argument because this is "Stacking" with the animate call above + //3 billion% intentional \ No newline at end of file diff --git a/code/_helpers/matrices.dm b/code/_helpers/matrices.dm index c211ec41a1c..7eaf04da437 100644 --- a/code/_helpers/matrices.dm +++ b/code/_helpers/matrices.dm @@ -1,121 +1,208 @@ +// Luma coefficients suggested for HDTVs. If you change these, make sure they add up to 1. +#define LUMA_R 0.213 +#define LUMA_G 0.715 +#define LUMA_B 0.072 + +/// Datum which stores information about a matrix decomposed with decompose(). +/datum/decompose_matrix + var/scale_x = 1 + var/scale_y = 1 + var/rotation = 0 + var/shift_x = 0 + var/shift_y = 0 + + +/// Decomposes a matrix into scale, shift and rotation. +/// * If other operations were applied on the matrix, such as shearing, the result will not be precise. +/matrix/proc/decompose() + var/datum/decompose_matrix/decompose_matrix = new + . = decompose_matrix + var/flip_sign = (a*e - b*d < 0)? -1 : 1 // Det < 0 => only 1 axis is flipped - start doing some sign flipping + // If both axis are flipped, nothing bad happens and Det >= 0, it just treats it like a 180° rotation + // If only 1 axis is flipped, we need to flip one direction - in this case X, so we flip a, b and the x scaling + decompose_matrix.scale_x = sqrt(a * a + d * d) * flip_sign + decompose_matrix.scale_y = sqrt(b * b + e * e) + decompose_matrix.shift_x = c + decompose_matrix.shift_y = f + if(!decompose_matrix.scale_x || !decompose_matrix.scale_y) + return + // If only translated, scaled and rotated, a/xs == e/ys and -d/xs == b/xy + var/cossine = (a/decompose_matrix.scale_x + e/decompose_matrix.scale_y) / 2 + var/sine = (b/decompose_matrix.scale_y - d/decompose_matrix.scale_x) / 2 * flip_sign + decompose_matrix.rotation = arctan(cossine, sine) * flip_sign + + /matrix/proc/TurnTo(old_angle, new_angle) . = new_angle - old_angle Turn(.) //BYOND handles cases such as -270, 360, 540 etc. DOES NOT HANDLE 180 TURNS WELL, THEY TWEEN AND LOOK LIKE SHIT -/atom/proc/SpinAnimation(speed = 10, loops = -1) - var/matrix/m120 = matrix(transform) - m120.Turn(120) - var/matrix/m240 = matrix(transform) - m240.Turn(240) - var/matrix/m360 = matrix(transform) - speed /= 3 //Gives us 3 equal time segments for our three turns. - //Why not one turn? Because byond will see that the start and finish are the same place and do nothing - //Why not two turns? Because byond will do a flip instead of a turn - animate(src, transform = m120, time = speed, loops) - animate(transform = m240, time = speed) - animate(transform = m360, time = speed) - -/atom/proc/shake_animation(var/intensity = 8) - var/init_px = pixel_x - var/shake_dir = pick(-1, 1) - animate(src, transform=turn(matrix(), intensity*shake_dir), pixel_x=init_px + 2*shake_dir, time=1) - animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING) - -//The X pixel offset of this matrix +/// Shear the transform on either or both axes. +/// * x - X axis shearing +/// * y - Y axis shearing +/matrix/proc/Shear(x, y) + return Multiply(matrix(1, x, 0, y, 1, 0)) + + +/// Dumps the matrix data in format a-f +/matrix/proc/tolist() + . = list() + . += a + . += b + . += c + . += d + . += e + . += f + +/// Dumps the matrix data in a matrix-grid format +/// * a d 0 +/// * b e 0 +/// * c f 1 +/matrix/proc/togrid() + . = list() + . += a + . += d + . += 0 + . += b + . += e + . += 0 + . += c + . += f + . += 1 + +/// The X pixel offset of this matrix /matrix/proc/get_x_shift() . = c -//The Y pixel offset of this matrix +/// The Y pixel offset of this matrix /matrix/proc/get_y_shift() . = f -// Color matrices: - -//Luma coefficients suggested for HDTVs. If you change these, make sure they add up to 1. -#define LUMR 0.2126 -#define LUMG 0.7152 -#define LUMB 0.0722 - -//Still need color matrix addition, negation, and multiplication. - -//Returns an identity color matrix which does nothing -/proc/color_identity() - return list(1,0,0, 0,1,0, 0,0,1) -//Moves all colors angle degrees around the color wheel while maintaining intensity of the color and not affecting whites -//TODO: Need a version that only affects one color (ie shift red to blue but leave greens and blues alone) -/proc/color_rotation(angle) - if(angle == 0) - return color_identity() - angle = clamp(angle, -180, 180) - var/cos = cos(angle) +/// Returns the matrix identity +/// * 1 0 0 0 +/// * 0 1 0 0 +/// * 0 0 1 0 +/// * 0 0 0 0 +/proc/color_matrix_identity() + return list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,0) + +/// Adds/subtracts overall lightness +/// * 0 is identity, 1 makes everything white, -1 makes everything black +/proc/color_matrix_lightness(power) + return list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1, power,power,power,0) + +/// Changes distance hues have from grey while maintaining the overall lightness. Greys are unaffected. +/// * 1 is identity, 0 is greyscale, >1 oversaturates colors +/proc/color_matrix_saturation(value) + var/inv = 1 - value + var/R = round(LUMA_R * inv, 0.001) + var/G = round(LUMA_G * inv, 0.001) + var/B = round(LUMA_B * inv, 0.001) + + return list(R + value,R,R,0, G,G + value,G,0, B,B,B + value,0, 0,0,0,1, 0,0,0,0) + +/// Changes distance colors have from rgb(127,127,127) grey +/// * 1 is identity. 0 makes everything grey >1 blows out colors and greys +/proc/color_matrix_contrast(value) + var/add = (1 - value) / 2 + return list(value,0,0,0, 0,value,0,0, 0,0,value,0, 0,0,0,1, add,add,add,0) + +/// Moves all colors angle degrees around the color wheel while maintaining intensity of the color and not affecting greys +/// * 0 is identity, 120 moves reds to greens, 240 moves reds to blues +/proc/color_matrix_rotate_hue(angle) var/sin = sin(angle) - - var/constA = 0.143 - var/constB = 0.140 - var/constC = -0.283 + var/cos = cos(angle) + var/cos_inv_third = 0.333*(1-cos) + var/sqrt3_sin = sqrt(3)*sin return list( - LUMR + cos * (1-LUMR) + sin * -LUMR, LUMR + cos * -LUMR + sin * constA, LUMR + cos * -LUMR + sin * -(1-LUMR), - LUMG + cos * -LUMG + sin * -LUMG, LUMG + cos * (1-LUMG) + sin * constB, LUMG + cos * -LUMG + sin * LUMG, - LUMB + cos * -LUMB + sin * (1-LUMB), LUMB + cos * -LUMB + sin * constC, LUMB + cos * (1-LUMB) + sin * LUMB + round(cos+cos_inv_third, 0.001), round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), 0, + round(cos_inv_third-sqrt3_sin, 0.001), round(cos+cos_inv_third, 0.001), round(cos_inv_third+sqrt3_sin, 0.001), 0, + round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), round(cos+cos_inv_third, 0.001), 0, + 0,0,0,1, + 0,0,0,0 ) -//Makes everything brighter or darker without regard to existing color or brightness -/proc/color_brightness(power) - power = clamp(power, -255, 255) - power = power/255 - - return list(1,0,0, 0,1,0, 0,0,1, power,power,power) - -var/global/list/delta_index = list( - 0, 0.01, 0.02, 0.04, 0.05, 0.06, 0.07, 0.08, 0.1, 0.11, - 0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.20, 0.21, 0.22, 0.24, - 0.25, 0.27, 0.28, 0.30, 0.32, 0.34, 0.36, 0.38, 0.40, 0.42, - 0.44, 0.46, 0.48, 0.5, 0.53, 0.56, 0.59, 0.62, 0.65, 0.68, - 0.71, 0.74, 0.77, 0.80, 0.83, 0.86, 0.89, 0.92, 0.95, 0.98, - 1.0, 1.06, 1.12, 1.18, 1.24, 1.30, 1.36, 1.42, 1.48, 1.54, - 1.60, 1.66, 1.72, 1.78, 1.84, 1.90, 1.96, 2.0, 2.12, 2.25, - 2.37, 2.50, 2.62, 2.75, 2.87, 3.0, 3.2, 3.4, 3.6, 3.8, - 4.0, 4.3, 4.7, 4.9, 5.0, 5.5, 6.0, 6.5, 6.8, 7.0, - 7.3, 7.5, 7.8, 8.0, 8.4, 8.7, 9.0, 9.4, 9.6, 9.8, - 10.0) - -//Exxagerates or removes brightness -/proc/color_contrast(value) - value = clamp(value, -100, 100) - if(value == 0) - return color_identity() - - var/x = 0 - if (value < 0) - x = 127 + value / 100 * 127; - else - x = value % 1 - if(x == 0) - x = delta_index[value] +/// Rotates around the red axis +/proc/color_matrix_rotate_x(angle) + var/sinval = round(sin(angle), 0.001); var/cosval = round(cos(angle), 0.001) + return list(1,0,0,0, 0,cosval,sinval,0, 0,-sinval,cosval,0, 0,0,0,1, 0,0,0,0) + +/// Rotates around the green axis +/proc/color_matrix_rotate_y(angle) + var/sinval = round(sin(angle), 0.001); var/cosval = round(cos(angle), 0.001) + return list(cosval,0,-sinval,0, 0,1,0,0, sinval,0,cosval,0, 0,0,0,1, 0,0,0,0) + +/// Rotates around the blue axis +/proc/color_matrix_rotate_z(angle) + var/sinval = round(sin(angle), 0.001); var/cosval = round(cos(angle), 0.001) + return list(cosval,sinval,0,0, -sinval,cosval,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,0) + + +/// Returns a matrix addition of A with B +/proc/color_matrix_add(list/A, list/B) + if(!istype(A) || !istype(B)) + return color_matrix_identity() + if(A.len != 20 || B.len != 20) + return color_matrix_identity() + var/list/output = list() + output.len = 20 + for(var/value in 1 to 20) + output[value] = A[value] + B[value] + return output + +/// Returns a matrix multiplication of A with B +/proc/color_matrix_multiply(list/A, list/B) + if(!istype(A) || !istype(B)) + return color_matrix_identity() + if(A.len != 20 || B.len != 20) + return color_matrix_identity() + var/list/output = list() + output.len = 20 + var/x = 1 + var/y = 1 + var/offset = 0 + for(y in 1 to 5) + offset = (y-1)*4 + for(x in 1 to 4) + output[offset+x] = round(A[offset+1]*B[x] + A[offset+2]*B[x+4] + A[offset+3]*B[x+8] + A[offset+4]*B[x+12]+(y == 5?B[x+16]:0), 0.001) + return output + +/// Converts RGB shorthands into RGBA matrices complete of constants rows (ergo a 20 keys list in byond). +/proc/color_to_full_rgba_matrix(color) + if(istext(color)) + var/list/L = ReadRGB(color) + if(!L) + CRASH("Invalid/unsupported color format argument in color_to_full_rgba_matrix()") + return list(L[1]/255,0,0,0, 0,L[2]/255,0,0, 0,0,L[3]/255,0, 0,0,0,L.len>3?L[4]/255:1, 0,0,0,0) + else if(!islist(color)) //invalid format + return color_matrix_identity() + var/list/L = color + switch(L.len) + if(3 to 5) // row-by-row hexadecimals + . = list() + for(var/a in 1 to L.len) + var/list/rgb = ReadRGB(L[a]) + for(var/b in rgb) + . += b/255 + if(length(rgb) % 4) // RGB has no alpha instruction + . += a != 4 ? 0 : 1 + if(L.len < 4) //missing both alphas and constants rows + . += list(0,0,0,1, 0,0,0,0) + else if(L.len < 5) //missing constants row + . += list(0,0,0,0) + if(9 to 12) //RGB + . = list(L[1],L[2],L[3],0, L[4],L[5],L[6],0, L[7],L[8],L[9],0, 0,0,0,1) + for(var/b in 1 to 3) //missing constants row + . += L.len < 9+b ? 0 : L[9+b] + . += 0 + if(16 to 20) // RGBA + . = L.Copy() + if(L.len < 20) //missing constants row + for(var/b in 1 to 20-L.len) + . += 0 else - x = delta_index[value] * (1-x) + delta_index[value+1] * x//use linear interpolation for more granularity. - x = x * 127 + 127 - - var/mult = x / 127 - var/add = 0.5 * (127-x) / 255 - return list(mult,0,0, 0,mult,0, 0,0,mult, add,add,add) - -//Exxagerates or removes colors -/proc/color_saturation(value as num) - if(value == 0) - return color_identity() - value = clamp(value, -100, 100) - if(value > 0) - value *= 3 - var/x = 1 + value / 100 - var/inv = 1 - x - var/R = LUMR * inv - var/G = LUMG * inv - var/B = LUMB * inv - - return list(R + x,R,R, G,G + x,G, B,B,B + x) - -#undef LUMR -#undef LUMG -#undef LUMB \ No newline at end of file + CRASH("Invalid/unsupported color format argument in color_to_full_rgba_matrix()") + +#undef LUMA_R +#undef LUMA_G +#undef LUMA_B \ No newline at end of file diff --git a/code/game/objects/items/cryobag.dm b/code/game/objects/items/cryobag.dm index 9d7ed58d5aa..fd0650c3fd6 100644 --- a/code/game/objects/items/cryobag.dm +++ b/code/game/objects/items/cryobag.dm @@ -72,13 +72,13 @@ add_overlay(I) /obj/structure/closet/body_bag/cryobag/proc/get_saturation() - return -155 * (1 - stasis_power/initial(stasis_power)) + return stasis_power / initial(stasis_power) /obj/structure/closet/body_bag/cryobag/fold(var/user) var/obj/item/bodybag/cryobag/folded = ..() if(istype(folded)) folded.stasis_power = stasis_power - folded.color = color_saturation(get_saturation()) + folded.color = color_matrix_saturation(get_saturation()) /obj/structure/closet/body_bag/cryobag/Process() if(stasis_power < 2) @@ -90,7 +90,7 @@ if(degradation_time < 0) degradation_time = initial(degradation_time) stasis_power = round(0.75 * stasis_power) - animate(src, color = color_saturation(get_saturation()), time = 10) + animate(src, color = color_matrix_saturation(get_saturation()), time = 10) update_icon() if(H.stasis_sources[STASIS_CRYOBAG] != stasis_power) diff --git a/code/modules/client/client_color_definitions.dm b/code/modules/client/client_color_definitions.dm index 86648ee16fa..bb90e887dd7 100644 --- a/code/modules/client/client_color_definitions.dm +++ b/code/modules/client/client_color_definitions.dm @@ -4,8 +4,8 @@ /datum/client_color/deuteranopia priority = 100 client_color = list( - 0.47,0.38,0.15, - 0.54,0.31,0.15, + 0.47,0.38,0.15, + 0.54,0.31,0.15, 0,0.3,0.7 ) wire_colour_substitutions = list( @@ -13,15 +13,15 @@ "darkred" = "black", "purple" = "blue", "orange" = "yellow", - "brown" = "yellow", + "brown" = "yellow", "green" = "yellow" ) /datum/client_color/protanopia priority = 100 client_color = list( - 0.51,0.4,0.12, - 0.49,0.41,0.12, + 0.51,0.4,0.12, + 0.49,0.41,0.12, 0,0.2,0.76 ) wire_colour_substitutions = list( @@ -29,22 +29,22 @@ "darkred" = "black", "purple" = "blue", "orange" = "yellow", - "brown" = "yellow", + "brown" = "yellow", "green" = "yellow" ) /datum/client_color/tritanopia priority = 100 client_color = list( - 0.95,0.07,0, - 0,0.44,0.52, + 0.95,0.07,0, + 0,0.44,0.52, 0.05,0.49,0.48 ) wire_colour_substitutions = list( - "blue" = "green", + "blue" = "green", "orange" = "pink", - "brown" = "pink", - "gold" = "pink", + "brown" = "pink", + "gold" = "pink", "yellow" = "pink", "cyan" = "green", "navy" = "green", @@ -54,18 +54,18 @@ /datum/client_color/achromatopsia priority = 100 client_color = list( - 0.33,0.33,0.33, - 0.33,0.33,0.33, + 0.33,0.33,0.33, + 0.33,0.33,0.33, 0.33,0.33,0.33 ) wire_colour_substitutions = list( - "red" = "gray", - "blue" = "black", - "green" = "gray", - "darkred" = "black", + "red" = "gray", + "blue" = "black", + "green" = "gray", + "darkred" = "black", "orange" = "gray", - "brown" = "gray", - "gold" = "gray", + "brown" = "gray", + "gold" = "gray", "cyan" = "gray", "navy" = "gray", "purple" = "black", @@ -87,13 +87,13 @@ priority = INFINITY //This effect sort of exists on its own you /have/ to be seeing RED override = TRUE //Because multiplying this will inevitably fail wire_colour_substitutions = list( - "red" = "red", - "blue" = "red", - "green" = "red", - "darkred" = "red", + "red" = "red", + "blue" = "red", + "green" = "red", + "darkred" = "red", "orange" = "red", - "brown" = "red", - "gold" = "red", + "brown" = "red", + "gold" = "red", "cyan" = "red", "navy" = "red", "purple" = "red", @@ -103,4 +103,4 @@ ) /datum/client_color/oversaturated/New() - client_color = color_saturation(40) + client_color = color_matrix_saturation(1.4) diff --git a/code/modules/clothing/under/accessories/accessory_toggleable.dm b/code/modules/clothing/under/accessories/accessory_toggleable.dm index 1c7712c3b0a..0720696be1d 100644 --- a/code/modules/clothing/under/accessories/accessory_toggleable.dm +++ b/code/modules/clothing/under/accessories/accessory_toggleable.dm @@ -91,7 +91,7 @@ /obj/item/clothing/accessory/toggleable/hawaii/random/Initialize() . = ..() icon = pick('icons/clothing/accessories/clothing/hawaiian.dmi', 'icons/clothing/accessories/clothing/hawaiian_alt.dmi') - color = color_rotation(rand(-11,12)*15) + color = color_matrix_rotate_hue(rand(-11,12)*15) /obj/item/clothing/accessory/toggleable/zhongshan name = "zhongshan suit jacket" diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index c76ac682af5..e414cd6f8a8 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -8,7 +8,7 @@ /datum/event/ionstorm/get_skybox_image() if(!cloud_hueshift) - cloud_hueshift = color_rotation(rand(-3,3)*15) + cloud_hueshift = color_matrix_rotate_hue(rand(-3,3)*15) var/image/res = overlay_image('icons/skybox/ionbox.dmi', "ions", cloud_hueshift, RESET_COLOR) res.blend_mode = BLEND_ADD return res diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm index 6a4fd3d4302..02e12536523 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/jelly.dm @@ -21,7 +21,7 @@ /mob/living/simple_animal/hostile/retaliate/jelly/Initialize() . = ..() if(gets_random_color) - color = color_rotation(round(rand(0,360),20)) + color = color_matrix_rotate_hue(round(rand(0,360),20)) /mob/living/simple_animal/hostile/retaliate/jelly/alt icon = 'icons/mob/simple_animal/jelly_alt.dmi' @@ -46,7 +46,7 @@ if(W) W.force *= jelly_scale if(!megajelly_color) - megajelly_color = color_rotation(round(rand(0,360),20)) + megajelly_color = color_matrix_rotate_hue(round(rand(0,360),20)) color = megajelly_color /mob/living/simple_animal/hostile/retaliate/jelly/mega/death() diff --git a/code/modules/reagents/chems/random/random_effects.dm b/code/modules/reagents/chems/random/random_effects.dm index cec658a1c78..cb99074ef70 100644 --- a/code/modules/reagents/chems/random/random_effects.dm +++ b/code/modules/reagents/chems/random/random_effects.dm @@ -48,7 +48,7 @@ reagent.name = "[initial(reagent.name)]-[value]" /decl/random_chem_effect/general_properties/color/get_random_value() - return color_rotation(round(rand(0,360),20)) + return color_matrix_rotate_hue(round(rand(0,360),20)) /decl/random_chem_effect/general_properties/color/on_property_recompute(var/decl/material/liquid/random/reagent, var/value) reagent.color = value diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index ba129fa4dc4..e3211095dc4 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -539,7 +539,7 @@ var/global/list/supermatter_delam_accent_sounds = list( if(!power) animate_filter("outline", list(size = 0)) - color = color_contrast(Interpolate(0, 50, clamp( (damage - emergency_point) / (explosion_point - emergency_point),0,1))) + color = color_matrix_contrast(Interpolate(1, 5, clamp( (damage - emergency_point) / (explosion_point - emergency_point), 0, 1))) if (damage >= emergency_point && !damage_animation) start_damage_animation() From 904d86323b625757985adbea1e42aab36bdbbccc Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 22 Jan 2023 15:04:39 -0600 Subject: [PATCH 0904/1518] Fix codex nexus header --- code/modules/codex/entries/codex.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/codex/entries/codex.dm b/code/modules/codex/entries/codex.dm index 4028038ddb1..e7f621bf40f 100644 --- a/code/modules/codex/entries/codex.dm +++ b/code/modules/codex/entries/codex.dm @@ -21,7 +21,7 @@ mechanics_text = "The place to start with The Codex
    " /datum/codex_entry/nexus/get_codex_body(mob/presenting_to, include_header, include_footer) - . = list(get_codex_header(presenting_to)) + . = get_codex_header(presenting_to) . += "[mechanics_text]" . += "

    Categories

    " var/list/category_strings From b86d091632b21316c3f00b344c379c439825a20c Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Tue, 24 Jan 2023 00:45:02 +0000 Subject: [PATCH 0905/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 906b3c891eb..e4fc71bb31b 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -125,12 +125,6 @@

    PsyCommando updated:

    • Fixed /obj/item/chems being shattered in nullspace causing a runtime.
    - -

    22 November 2022

    -

    PsyCommando updated:

    -
      -
    • Added some fairly bad wrapped package icons, and wrapped gifts icons.
    • -
    From 816806c095069164f8bc4c5bad9a864d06bf8b8e Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 23 Jan 2023 23:59:06 -0600 Subject: [PATCH 0906/1518] Apply suggestions from code review --- code/game/atoms.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index c261e829bd4..558f27d0136 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -284,10 +284,10 @@ its easier to just keep the beam vertical. /atom/proc/explosion_act(var/severity) SHOULD_CALL_PARENT(TRUE) - if(!currently_exploding) + . = !currently_exploding && severity > 0 && severity <= 3 + if(.) currently_exploding = TRUE - . = (severity <= 3) - if(.) + if(severity < 3) for(var/atom/movable/AM in get_contained_external_atoms()) AM.explosion_act(severity + 1) try_detonate_reagents(severity) From 724300087589d67391d168664f07315cd8b985f0 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 24 Jan 2023 00:06:54 -0600 Subject: [PATCH 0907/1518] Mark or fix leaking pipes in exoplanet ruins --- .../exoplanet_ruins/crashed_pod/crashed_pod.dmm | 9 ++++++++- maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm | 4 ++++ .../exoplanet_ruins/playablecolony/colony.dmm | 2 ++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm index b61dad4848b..f038b5a6abb 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm +++ b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm @@ -33,6 +33,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/red{ dir = 6 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/wall/r_wall, /area/map_template/crashed_pod) "ag" = ( @@ -98,11 +99,13 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "an" = ( /obj/machinery/atmospherics/omni/filter, /obj/effect/decal/cleanable/dirt, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "ao" = ( @@ -112,6 +115,7 @@ /obj/effect/decal/cleanable/dirt, /obj/item/trash/tastybread, /obj/item/chems/drinks/cans/speer, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "ap" = ( @@ -180,11 +184,13 @@ }, /obj/structure/reagent_dispensers/fueltank, /obj/effect/decal/cleanable/dirt, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/techfloor, /area/map_template/crashed_pod) "av" = ( /obj/machinery/atmospherics/omni/filter, /obj/effect/decal/cleanable/dirt, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/techfloor, /area/map_template/crashed_pod) "aw" = ( @@ -192,6 +198,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "ax" = ( @@ -234,6 +241,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/red{ dir = 5 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/wall, /area/map_template/crashed_pod) "aE" = ( @@ -452,7 +460,6 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ dir = 1 }, diff --git a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm b/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm index e2c5d115b68..44c9a9bfe0f 100644 --- a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm +++ b/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm @@ -46,6 +46,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/plating, /area/map_template/oldpod) "ai" = ( @@ -62,6 +63,7 @@ /obj/machinery/atmospherics/portables_connector{ dir = 8 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/plating, /area/map_template/oldpod) "ak" = ( @@ -147,6 +149,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/monotile, /area/map_template/oldpod) "av" = ( @@ -155,6 +158,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/monotile, /area/map_template/oldpod) "aw" = ( diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index 32cb98e13df..6e500158073 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -2405,6 +2405,7 @@ /area/map_template/colony/atmospherics) "fi" = ( /obj/machinery/atmospherics/pipe/simple/visible/black, +/obj/abstract/landmark/allowed_leak, /turf/exterior/concrete, /area/template_noop) "fj" = ( @@ -3662,6 +3663,7 @@ /obj/structure/railing/mapped{ dir = 8 }, +/obj/abstract/landmark/allowed_leak, /turf/exterior/concrete, /area/template_noop) "hr" = ( From a0ed7f209bd0a9e9cce5fe8802b7703e2f69448c Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 23 Jan 2023 23:46:07 -0600 Subject: [PATCH 0908/1518] Fix BUCKET_POS for ticklags with non-integer reciprocals --- code/controllers/subsystems/timer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystems/timer.dm b/code/controllers/subsystems/timer.dm index 03d0ccd3ca1..298d4e28dd6 100644 --- a/code/controllers/subsystems/timer.dm +++ b/code/controllers/subsystems/timer.dm @@ -1,7 +1,7 @@ /// Controls how many buckets should be kept, each representing a tick. (1 minutes worth) #define BUCKET_LEN (world.fps*1*60) /// Helper for getting the correct bucket for a given timer -#define BUCKET_POS(timer) (((round((timer.timeToRun - timer.timer_subsystem.head_offset) / world.tick_lag)+1) % BUCKET_LEN)||BUCKET_LEN) +#define BUCKET_POS(timer) (((CEILING((timer.timeToRun - timer.timer_subsystem.head_offset) / world.tick_lag)+1) % BUCKET_LEN)||BUCKET_LEN) /// Gets the maximum time at which timers will be invoked from buckets, used for deferring to secondary queue #define TIMER_MAX(timer_ss) (timer_ss.head_offset + TICKS2DS(BUCKET_LEN + timer_ss.practical_offset - 1)) /// Max float with integer precision From 12fedcacd8ffe965987a0505911e235683dea88a Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 21 Jan 2023 22:03:52 -0600 Subject: [PATCH 0909/1518] Fix grab interaction showing up for anchored atoms --- code/game/atoms_movable.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 5a2c6375587..a220144a3b0 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -521,6 +521,9 @@ expected_target_type = /atom/movable interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEEDS_TURF +/decl/interaction_handler/grab/is_possible(atom/movable/target, mob/user, obj/item/prop) + return ..() && !target.anchored + /decl/interaction_handler/grab/invoked(atom/target, mob/user, obj/item/prop) var/atom/movable/AM = target AM.try_make_grab(user, defer_hand = TRUE) From 9c061a9f634ad0b1754b30ebb12baad47cfbceea Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Mon, 23 Jan 2023 01:33:10 -0600 Subject: [PATCH 0910/1518] Pause subsystems during random_map auto-apply --- code/modules/random_map/random_map.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/random_map/random_map.dm b/code/modules/random_map/random_map.dm index d861b1eef6d..c0b3ce9fa9a 100644 --- a/code/modules/random_map/random_map.dm +++ b/code/modules/random_map/random_map.dm @@ -136,7 +136,9 @@ var/global/list/map_count = list() if(check_map_sanity()) cleanup() if(auto_apply) + Master.StartLoadingMap() apply_to_map() + Master.StopLoadingMap() return 1 return 0 From 79be31323c6cb5620f73c69edb225d60756fb48a Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 24 Jan 2023 13:01:07 -0600 Subject: [PATCH 0911/1518] Fix stacked pipes on the Unishi --- maps/away/unishi/unishi-3.dmm | 36 ++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/maps/away/unishi/unishi-3.dmm b/maps/away/unishi/unishi-3.dmm index 5f6a5cf3a3d..5a1a0d149d2 100644 --- a/maps/away/unishi/unishi-3.dmm +++ b/maps/away/unishi/unishi-3.dmm @@ -1272,11 +1272,11 @@ /area/unishi/living) "dE" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/item/caution, /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled, /area/unishi/living) "dF" = ( @@ -1959,6 +1959,12 @@ /obj/random/clothing, /turf/simulated/floor/tiled, /area/unishi/living) +"yC" = ( +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 8 + }, +/turf/simulated/floor/tiled, +/area/unishi/living) "zD" = ( /obj/structure/closet/secure_closet/personal/cabinet, /obj/random/cash, @@ -1968,6 +1974,14 @@ /obj/random/hat, /turf/simulated/floor/wood, /area/unishi/living) +"AF" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/tiled, +/area/unishi/living) "AK" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 @@ -1980,8 +1994,8 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, /turf/simulated/floor/tiled, /area/unishi/living) @@ -6230,9 +6244,9 @@ aO aO aO aO -aO -aO -aO +aP +aP +aP aO aO aO @@ -6940,7 +6954,7 @@ bn ds bn dE -bn +AF dR dU dY @@ -7659,7 +7673,7 @@ aP aP aP aP -aP +yC aP aP aP @@ -7862,9 +7876,9 @@ aO aO aO aO -aO -aO -aO +aP +aP +aP aO aO aO From d967e4eb939a2ac67cc0b2386d3cc4b3afec07b3 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sat, 21 Jan 2023 03:26:20 -0600 Subject: [PATCH 0912/1518] Fix data and arguments for on_leaving_metabolism Pass holder instead of my_atom and metabolism_class --- code/modules/materials/_materials.dm | 2 +- .../definitions/liquids/materials_liquid_toxins.dm | 4 ++-- code/modules/reagents/Chemistry-Metabolism.dm | 7 ++++--- code/modules/reagents/chems/chems_compounds.dm | 6 +++--- code/modules/reagents/chems/chems_drugs.dm | 4 ++-- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index b1fb4c92d92..d1b9a430f31 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -523,7 +523,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) /decl/material/proc/get_wall_texture() return -/decl/material/proc/on_leaving_metabolism(var/atom/parent, var/metabolism_class) +/decl/material/proc/on_leaving_metabolism(datum/reagents/metabolism/holder) return #define ACID_MELT_DOSE 10 diff --git a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm index 06399f18778..53db49eba28 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm @@ -149,8 +149,8 @@ M.timeofdeath = world.time M.add_chemical_effect(CE_NOPULSE, 1) -/decl/material/liquid/zombiepowder/on_leaving_metabolism(atom/parent, metabolism_class) - var/mob/M = parent +/decl/material/liquid/zombiepowder/on_leaving_metabolism(datum/reagents/metabolism/holder) + var/mob/M = holder?.my_atom if(istype(M)) M.status_flags &= ~FAKEDEATH . = ..() diff --git a/code/modules/reagents/Chemistry-Metabolism.dm b/code/modules/reagents/Chemistry-Metabolism.dm index 92a31f000a0..e1002809b1f 100644 --- a/code/modules/reagents/Chemistry-Metabolism.dm +++ b/code/modules/reagents/Chemistry-Metabolism.dm @@ -3,10 +3,11 @@ var/mob/living/parent /datum/reagents/metabolism/clear_reagent(var/reagent_type, var/defer_update = FALSE, var/force = FALSE) - . = ..() - if(.) + // Duplicated check so that reagent data is accessible in on_leaving_metabolism. + if(force || !!(REAGENT_VOLUME(src, reagent_type) || REAGENT_DATA(src, reagent_type))) var/decl/material/current = GET_DECL(reagent_type) - current.on_leaving_metabolism(parent, metabolism_class) + current.on_leaving_metabolism(src) + . = ..() /datum/reagents/metabolism/New(var/max = 100, mob/living/parent_mob, var/met_class) ..(max, parent_mob) diff --git a/code/modules/reagents/chems/chems_compounds.dm b/code/modules/reagents/chems/chems_compounds.dm index f744085c318..9b5d65415c0 100644 --- a/code/modules/reagents/chems/chems_compounds.dm +++ b/code/modules/reagents/chems/chems_compounds.dm @@ -28,9 +28,9 @@ var/mob/living/carbon/human/H = M H.update_eyes() -/decl/material/liquid/glowsap/on_leaving_metabolism(atom/parent, metabolism_class) - if(ishuman(parent)) - var/mob/living/carbon/human/H = parent +/decl/material/liquid/glowsap/on_leaving_metabolism(datum/reagents/metabolism/holder) + if(ishuman(holder?.my_atom)) + var/mob/living/carbon/human/H = holder.my_atom addtimer(CALLBACK(H, /mob/living/carbon/human/proc/update_eyes), 5 SECONDS) . = ..() diff --git a/code/modules/reagents/chems/chems_drugs.dm b/code/modules/reagents/chems/chems_drugs.dm index 68e9b46dee8..cd4cf0c8f3a 100644 --- a/code/modules/reagents/chems/chems_drugs.dm +++ b/code/modules/reagents/chems/chems_drugs.dm @@ -215,9 +215,9 @@ if(prob(5)) to_chat(M, SPAN_WARNING("[pick(dose_messages)]")) -/decl/material/liquid/glowsap/gleam/on_leaving_metabolism(var/atom/parent, var/metabolism_class) +/decl/material/liquid/glowsap/gleam/on_leaving_metabolism(datum/reagents/metabolism/holder) . = ..() - var/mob/M = parent + var/mob/M = holder?.my_atom if(istype(M)) M.remove_client_color(/datum/client_color/noir/thirdeye) From f03e83e39381a5e5f5564f164dcec393839cfe9a Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Wed, 25 Jan 2023 00:41:35 +0000 Subject: [PATCH 0913/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index e4fc71bb31b..4b294dbbe08 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -119,12 +119,6 @@

    PsyCommando updated:

  • Fix mapped network machinery fields.
  • Fixed bad switch case in robot_component/take_damage() causing BURN and ELECTROCUTE damage to get ignored.
  • - -

    23 November 2022

    -

    PsyCommando updated:

    -
      -
    • Fixed /obj/item/chems being shattered in nullspace causing a runtime.
    • -
    From 41d920bbb03ec2c4010095d1b9629addb7df3796 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 25 Jan 2023 13:21:39 -0600 Subject: [PATCH 0914/1518] Mark variable_setter as non-spawnable --- code/modules/maps/helper_landmarks.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/maps/helper_landmarks.dm b/code/modules/maps/helper_landmarks.dm index 0063d359791..1c1cb5131c5 100644 --- a/code/modules/maps/helper_landmarks.dm +++ b/code/modules/maps/helper_landmarks.dm @@ -103,6 +103,7 @@ // Has a percent chance on spawn to set the specified variable on the specified type to the specified value. /obj/abstract/landmark/variable_setter + is_spawnable_type = FALSE var/type_to_find var/variable_to_set var/value_to_set From 39ddd22360c200c6d98ecda87b0020f5305e4fd2 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 25 Jan 2023 01:16:14 -0600 Subject: [PATCH 0915/1518] Move submap spawnpoints with shuttles --- code/__defines/flags.dm | 2 +- code/_helpers/turfs.dm | 10 +++------- code/modules/submaps/submap_landmark.dm | 1 + maps/away/liberia/liberia_jobs.dm | 1 - 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/code/__defines/flags.dm b/code/__defines/flags.dm index 2e2a738150d..950e4dc9af1 100644 --- a/code/__defines/flags.dm +++ b/code/__defines/flags.dm @@ -53,7 +53,7 @@ The latter will result in a linter warning and will not work correctly. // Movable-level flags (/atom/movable/movable_flags) #define MOVABLE_FLAG_PROXMOVE BITFLAG(0) // Does this object require proximity checking in Enter()? #define MOVABLE_FLAG_Z_INTERACT BITFLAG(1) // Should attackby and attack_hand be relayed through ladders and open spaces? -#define MOVABLE_FLAG_EFFECTMOVE BITFLAG(2) // Is this an effect that should move? +#define MOVABLE_FLAG_ALWAYS_SHUTTLEMOVE BITFLAG(2) // Is this an effect that should move? #define MOVABLE_FLAG_DEL_SHUTTLE BITFLAG(3) // Shuttle transistion will delete this. #define MOVABLE_FLAG_WHEELED BITFLAG(4) // Movable has reduced stamina cost/speed reduction when pulled. diff --git a/code/_helpers/turfs.dm b/code/_helpers/turfs.dm index e8f466e6179..385edc0c61f 100644 --- a/code/_helpers/turfs.dm +++ b/code/_helpers/turfs.dm @@ -133,7 +133,7 @@ var/supported = FALSE // Whether or not there's an object in the turf which can support other objects. if(is_background) new_turf = target - else + else new_turf = target.ChangeTurf(source.type, 1, 1) new_turf.transport_properties_from(source) new_turf.prev_type = target_type @@ -144,12 +144,8 @@ break for(var/obj/O in source) - if(O.simulated && (!is_background || supported || O.obj_flags & OBJ_FLAG_MOVES_UNSUPPORTED)) + if((O.movable_flags & MOVABLE_FLAG_ALWAYS_SHUTTLEMOVE) || (O.simulated && (!is_background || supported || (O.obj_flags & OBJ_FLAG_MOVES_UNSUPPORTED)))) O.forceMove(new_turf) - else if(istype(O,/obj/effect)) // This is used for non-game objects like spawnpoints, so ignore the background check. - var/obj/effect/E = O - if(E.movable_flags & MOVABLE_FLAG_EFFECTMOVE) - E.forceMove(new_turf) for(var/mob/M in source) if(is_background && !supported) @@ -160,5 +156,5 @@ if(is_background) return list(new_turf, source) - + return new_turf diff --git a/code/modules/submaps/submap_landmark.dm b/code/modules/submaps/submap_landmark.dm index cf33c19bd49..5c548e584c4 100644 --- a/code/modules/submaps/submap_landmark.dm +++ b/code/modules/submaps/submap_landmark.dm @@ -27,6 +27,7 @@ var/global/list/submap_spawnpoints_by_z = list() INITIALIZE_IMMEDIATE(/obj/abstract/submap_landmark/spawnpoint) /obj/abstract/submap_landmark/spawnpoint + movable_flags = MOVABLE_FLAG_ALWAYS_SHUTTLEMOVE icon_state = "x3" /obj/abstract/submap_landmark/spawnpoint/Initialize() diff --git a/maps/away/liberia/liberia_jobs.dm b/maps/away/liberia/liberia_jobs.dm index 7b0844ca79d..296b2fb57a3 100644 --- a/maps/away/liberia/liberia_jobs.dm +++ b/maps/away/liberia/liberia_jobs.dm @@ -36,7 +36,6 @@ // Spawn points. /obj/abstract/submap_landmark/spawnpoint/liberia name = "Merchant" - movable_flags = MOVABLE_FLAG_EFFECTMOVE /decl/hierarchy/outfit/job/merchant name = "Job - Merchant - Liberia" From 011e4f490e66c752cd785d6aaea6d8cdaea36068 Mon Sep 17 00:00:00 2001 From: PsyCommando Date: Wed, 25 Jan 2023 03:53:03 -0500 Subject: [PATCH 0916/1518] VV handler for direction_offset Automatically updates directional_offset when the var's json is modified in VV --- .../admin/view_variables/vv_set_handlers.dm | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/code/modules/admin/view_variables/vv_set_handlers.dm b/code/modules/admin/view_variables/vv_set_handlers.dm index 8aeff484bae..7c81beb725b 100644 --- a/code/modules/admin/view_variables/vv_set_handlers.dm +++ b/code/modules/admin/view_variables/vv_set_handlers.dm @@ -181,3 +181,17 @@ var/new_scale_y = variable == "icon_scale_y" ? var_value : A.icon_scale_y A.set_scale(new_scale_x, new_scale_y) + + +/decl/vv_set_handler/directional_offset_hander + handled_type = /obj + handled_vars = list("directional_offset") + +/decl/vv_set_handler/directional_offset_hander/handle_set_var(var/obj/O, variable, var_value, client) + if(!istext(var_value) && !isnull(var_value)) + to_chat(client, SPAN_WARNING("You can only enter a JSON string, or nothing in this field!")) + return + + //Set the offset and force update + O.directional_offset = var_value + O.update_directional_offset(TRUE) From d014eb9ae0b5b146df0f3152692232c1e5cad896 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 24 Jan 2023 17:41:27 -0600 Subject: [PATCH 0917/1518] Mark leaks in expeditionary ship ruin as allowed --- .../ruins/ec_old_crash/ec_old_crash.dmm | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/mods/content/government/ruins/ec_old_crash/ec_old_crash.dmm b/mods/content/government/ruins/ec_old_crash/ec_old_crash.dmm index e9f433ed1b5..32eb5ee9437 100644 --- a/mods/content/government/ruins/ec_old_crash/ec_old_crash.dmm +++ b/mods/content/government/ruins/ec_old_crash/ec_old_crash.dmm @@ -79,6 +79,7 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/map_template/ecship/cockpit) "ao" = ( @@ -310,6 +311,7 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/map_template/ecship/cryo) "aT" = ( @@ -405,6 +407,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/airless, /area/map_template/ecship/cryo) "bf" = ( @@ -479,6 +482,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/white/lowpressure, /area/map_template/ecship/cryo) "bm" = ( @@ -509,6 +513,7 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/airless, /area/map_template/ecship/crew) "bp" = ( @@ -788,6 +793,7 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor, /area/map_template/ecship/crew) "bQ" = ( @@ -970,6 +976,7 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor, /area/map_template/ecship/science) "ci" = ( @@ -1222,6 +1229,7 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/abstract/landmark/allowed_leak, /turf/simulated/floor/tiled/lowpressure, /area/map_template/ecship/engineering) "cJ" = ( @@ -1352,14 +1360,14 @@ dir = 8; icon_state = "tube1" }, -/obj/machinery/atmospherics/pipe/manifold/visible/cyan{ - dir = 4 - }, /obj/effect/floor_decal/corner/yellow{ dir = 9 }, /obj/structure/emergency_dispenser/west, /obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/visible/cyan{ + dir = 8 + }, /turf/simulated/floor, /area/map_template/ecship/engineering) "cZ" = ( @@ -1914,6 +1922,7 @@ /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/visible/cyan, /obj/abstract/landmark/clear, +/obj/abstract/landmark/allowed_leak, /turf/template_noop, /area/template_noop) "mD" = ( @@ -1962,6 +1971,15 @@ /obj/abstract/landmark/clear, /turf/template_noop, /area/template_noop) +"XP" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/abstract/landmark/allowed_leak, +/turf/simulated/floor/tiled/airless, +/area/map_template/ecship/crew) "YW" = ( /obj/structure/catwalk, /obj/abstract/landmark/scorcher, @@ -2742,7 +2760,7 @@ aO bf by bB -bf +XP cu cC cI From 077eb4179137ed95c2a39e63ae32d9fd8c0fbd01 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 24 Jan 2023 17:43:21 -0600 Subject: [PATCH 0918/1518] Remove isPlayerLevel check from pipe leak test --- code/unit_tests/map_tests.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/unit_tests/map_tests.dm b/code/unit_tests/map_tests.dm index c1477660858..a55ad69593f 100644 --- a/code/unit_tests/map_tests.dm +++ b/code/unit_tests/map_tests.dm @@ -544,7 +544,7 @@ /datum/unit_test/pipes_shall_not_leak/start_test() var/failures = 0 for(var/obj/machinery/atmospherics/pipe/P in SSmachines.machinery) - if(P.leaking && isPlayerLevel(P.z) && !(locate(/obj/abstract/landmark/allowed_leak) in get_turf(P))) + if(P.leaking && !(locate(/obj/abstract/landmark/allowed_leak) in get_turf(P))) failures++ log_bad("Following pipe is leaking: [log_info_line(P)]") From 278107edebbcb3d53c1ae0a3056a996bcb0200b0 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 24 Jan 2023 22:14:52 -0600 Subject: [PATCH 0919/1518] Fix pipe leak in ninja base --- maps/antag_spawn/ninja/ninja_base.dmm | 29 +++------------------------ 1 file changed, 3 insertions(+), 26 deletions(-) diff --git a/maps/antag_spawn/ninja/ninja_base.dmm b/maps/antag_spawn/ninja/ninja_base.dmm index 5cfebb4754c..5ad112b8ff8 100644 --- a/maps/antag_spawn/ninja/ninja_base.dmm +++ b/maps/antag_spawn/ninja/ninja_base.dmm @@ -92,13 +92,6 @@ icon_state = "white" }, /area/map_template/ninja_dojo/dojo) -"ap" = ( -/obj/machinery/atmospherics/portables_connector, -/obj/machinery/portable_atmospherics/canister/oxygen/prechilled, -/turf/unsimulated/floor{ - icon_state = "white" - }, -/area/map_template/ninja_dojo/dojo) "aq" = ( /obj/structure/table/glass, /turf/unsimulated/floor{ @@ -129,22 +122,6 @@ icon_state = "white" }, /area/map_template/ninja_dojo/dojo) -"au" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 5 - }, -/turf/unsimulated/floor{ - icon_state = "white" - }, -/area/map_template/ninja_dojo/dojo) -"av" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 9 - }, -/turf/unsimulated/floor{ - icon_state = "white" - }, -/area/map_template/ninja_dojo/dojo) "aw" = ( /obj/structure/table/glass, /obj/item/storage/box/beakers, @@ -1922,7 +1899,7 @@ ad ad aj ao -au +ao ao aK aT @@ -1964,8 +1941,8 @@ ad ad ad aj -ap -av +ao +ao ao aL aG From f7cc424c42065f023d28789e4fb05c8601514262 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 24 Jan 2023 22:53:05 -0600 Subject: [PATCH 0920/1518] Fix leaking pipe in ERT base --- maps/antag_spawn/ert/ert_base.dmm | 34 +++++++------------------------ 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/maps/antag_spawn/ert/ert_base.dmm b/maps/antag_spawn/ert/ert_base.dmm index 610deb5bc54..75d2ed24e47 100644 --- a/maps/antag_spawn/ert/ert_base.dmm +++ b/maps/antag_spawn/ert/ert_base.dmm @@ -2968,11 +2968,9 @@ /obj/machinery/light{ dir = 8 }, -/turf/simulated/floor/tiled/white, -/area/map_template/rescue_base/start) -"gn" = ( -/obj/machinery/atmospherics/portables_connector, -/obj/machinery/portable_atmospherics/canister/oxygen/prechilled, +/obj/machinery/sleeper/standard{ + dir = 8 + }, /turf/simulated/floor/tiled/white, /area/map_template/rescue_base/start) "go" = ( @@ -3011,18 +3009,6 @@ "gw" = ( /turf/simulated/floor/tiled/white, /area/map_template/rescue_base/start) -"gx" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 5 - }, -/turf/simulated/floor/tiled/white, -/area/map_template/rescue_base/start) -"gy" = ( -/obj/machinery/atmospherics/pipe/simple/hidden{ - dir = 9 - }, -/turf/simulated/floor/tiled/white, -/area/map_template/rescue_base/start) "gz" = ( /obj/machinery/door/airlock/centcom{ name = "Cell" @@ -3070,12 +3056,6 @@ }, /turf/simulated/floor/tiled/white, /area/map_template/rescue_base/start) -"gF" = ( -/obj/machinery/sleeper/standard{ - dir = 8 - }, -/turf/simulated/floor/tiled/white, -/area/map_template/rescue_base/start) "gG" = ( /obj/machinery/recharger/wallcharger{ pixel_x = -25 @@ -5452,7 +5432,7 @@ eQ eQ eU gm -gx +gw gw gw gR @@ -5516,8 +5496,8 @@ eQ eQ eQ eU -gn -gy +gw +gw gw gw gw @@ -5583,7 +5563,7 @@ eQ eU go gw -gF +gw gO gS ha From dd2bb935e5ec7c288daf144f768e62543b16f344 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 25 Jan 2023 11:49:16 -0600 Subject: [PATCH 0921/1518] Fix missing scrubber in established colony map --- .../exoplanet_ruins/playablecolony/colony.dmm | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index 6e500158073..d6b27e9f581 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -394,15 +394,15 @@ /turf/exterior/concrete, /area/template_noop) "bf" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, /obj/structure/cable{ icon_state = "2-4" }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/command) "bg" = ( @@ -441,15 +441,13 @@ /turf/simulated/floor/tiled/techfloor, /area/map_template/colony) "bk" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /turf/simulated/floor/tiled/techfloor, /area/map_template/colony/command) "bl" = ( @@ -7855,6 +7853,19 @@ /obj/structure/reagent_dispensers/watertank, /turf/simulated/floor/tiled/techfloor/grid, /area/map_template/colony/hydroponics) +"CM" = ( +/obj/effect/floor_decal/techfloor{ + dir = 1 + }, +/obj/effect/floor_decal/corner/blue{ + dir = 10 + }, +/obj/effect/floor_decal/techfloor/hole/right{ + dir = 1 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/tiled/techfloor, +/area/map_template/colony/command) "Dj" = ( /obj/machinery/portable_atmospherics/hydroponics, /obj/machinery/light{ @@ -9139,7 +9150,7 @@ os (28,1,1) = {" ad aD -aV +CM bk bC ac From fc66f42e63a962e660a85393e156636136a3f8da Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 27 Jan 2023 00:44:26 +0000 Subject: [PATCH 0922/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 7 ------- 1 file changed, 7 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 4b294dbbe08..5599b47eccd 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -112,13 +112,6 @@

    PsyCommando updated:

  • Added simple directional icons for airlock controller buttons and sensors.
  • Allowed connecting fuel pipes to TEG circulators.
  • - -

    25 November 2022

    -

    PsyCommando updated:

    -
      -
    • Fix mapped network machinery fields.
    • -
    • Fixed bad switch case in robot_component/take_damage() causing BURN and ELECTROCUTE damage to get ignored.
    • -
    From 8fa075a009a2f98b83b37d639ed42f515550cdd0 Mon Sep 17 00:00:00 2001 From: comma Date: Sat, 28 Jan 2023 21:27:14 +0300 Subject: [PATCH 0923/1518] Makes casings use drop_sound instead of their own system Casings used to have fall_sounds, merged them into drop_sound handling Also drop_sounds now handle lists (picking non list items is fine I tried) --- code/game/objects/item.dm | 2 +- code/modules/projectiles/ammunition.dm | 5 +++-- code/modules/projectiles/ammunition/bullets.dm | 2 +- code/modules/projectiles/guns/projectile.dm | 8 ++++---- code/modules/projectiles/guns/projectile/shotgun.dm | 4 ++-- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/code/game/objects/item.dm b/code/game/objects/item.dm index 7bc1e480e84..8550c6ad4b4 100644 --- a/code/game/objects/item.dm +++ b/code/game/objects/item.dm @@ -102,7 +102,7 @@ /obj/item/proc/dropped_sound_callback() if(!ismob(loc) && drop_sound) - playsound(src, drop_sound, 25, 0) + playsound(src, pick(drop_sound), 25, 0) /obj/item/proc/get_origin_tech() return origin_tech diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 10d89670349..a31570d3922 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -18,7 +18,7 @@ var/spent_icon = "pistolcasing-spent" var/bullet_color = COLOR_COPPER var/marking_color - var/fall_sounds = list('sound/weapons/guns/casingfall1.ogg','sound/weapons/guns/casingfall2.ogg','sound/weapons/guns/casingfall3.ogg') + drop_sound = list('sound/weapons/guns/casingfall1.ogg','sound/weapons/guns/casingfall2.ogg','sound/weapons/guns/casingfall3.ogg') /obj/item/ammo_casing/Initialize() if(ispath(projectile_type)) @@ -53,7 +53,7 @@ return if(!MOVING_DELIBERATELY(L) && prob(10)) - playsound(src, pick(fall_sounds), 50, 1) + playsound(src, pick(drop_sound), 50, 1) var/turf/turf_current = get_turf(src) var/turf/turf_destiinaton = get_step(turf_current, AM.dir) if(turf_destiinaton.Adjacent(turf_current)) @@ -182,6 +182,7 @@ if(!user.unEquip(C, src)) return stored_ammo.Add(C) + playsound(user, 'sound/weapons/guns/interaction/bullet_insert.ogg', 50, 1) update_icon() else ..() diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm index 2bab8ab38ee..8f727a8132a 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/bullets.dm @@ -71,7 +71,7 @@ caliber = CALIBER_SHOTGUN projectile_type = /obj/item/projectile/bullet/shotgun material = /decl/material/solid/metal/steel - fall_sounds = list('sound/weapons/guns/shotgun_fall.ogg') + drop_sound = 'sound/weapons/guns/shotgun_fall.ogg' /obj/item/ammo_casing/shotgun/pellet name = "shotgun shell" diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 129075a5519..3850191eb03 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -105,8 +105,8 @@ if(EJECT_CASINGS) //eject casing onto ground. chambered.dropInto(loc) chambered.throw_at(get_ranged_target_turf(get_turf(src),turn(loc.dir,270),1), rand(0,1), 5) - if(LAZYLEN(chambered.fall_sounds)) - playsound(loc, pick(chambered.fall_sounds), 50, 1) + if(chambered.drop_sound) + playsound(loc, pick(chambered.drop_sound), 50, 1) if(CYCLE_CASINGS) //cycle the casing back to the end. if(ammo_magazine) ammo_magazine.stored_ammo += chambered @@ -194,8 +194,8 @@ var/turf/T = get_turf(user) if(T) for(var/obj/item/ammo_casing/C in loaded) - if(LAZYLEN(C.fall_sounds)) - playsound(loc, pick(C.fall_sounds), 50, 1) + if(LAZYLEN(C.drop_sound)) + playsound(loc, pick(C.drop_sound), 50, 1) C.forceMove(T) count++ loaded.Cut() diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index cb7c0fe1ac1..06af682f326 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -39,8 +39,8 @@ if(chambered)//We have a shell in the chamber chambered.dropInto(loc)//Eject casing - if(LAZYLEN(chambered.fall_sounds)) - playsound(loc, pick(chambered.fall_sounds), 50, 1) + if(chambered.drop_sound) + playsound(loc, pick(chambered.drop_sound), 50, 1) chambered = null if(loaded.len) From e3581a493b04a42c2f2874752f10d31169d8d247 Mon Sep 17 00:00:00 2001 From: comma Date: Sun, 29 Jan 2023 02:37:50 +0300 Subject: [PATCH 0924/1518] Fixes drinks and flavorpods name generation Tea cups and flavor pods just needed a presentation flag. Drinks in general needed their base name set before reagents are added, because reagent update find it unset and name them null --- code/modules/reagents/reagent_containers/drinks.dm | 3 ++- code/modules/reagents/reagent_containers/pill.dm | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/reagent_containers/drinks.dm b/code/modules/reagents/reagent_containers/drinks.dm index 55c99433e90..a1b24257e0a 100644 --- a/code/modules/reagents/reagent_containers/drinks.dm +++ b/code/modules/reagents/reagent_containers/drinks.dm @@ -17,9 +17,9 @@ var/base_icon = null // Base icon name for fill states /obj/item/chems/drinks/Initialize() - . = ..() if(!base_name) base_name = name + . = ..() /obj/item/chems/drinks/dragged_onto(var/mob/user) attack_self(user) @@ -296,6 +296,7 @@ base_name = "cup" base_icon = "cup" volume = 30 + presentation_flags = PRESENTATION_FLAG_NAME /obj/item/chems/drinks/tea/black name = "cup of black tea" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 0069b7fca41..c40956de50f 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -267,6 +267,7 @@ name = "master flavorpod item" desc = "A cellulose pod containing some kind of flavoring." icon_state = "pill4" + presentation_flags = PRESENTATION_FLAG_NAME /obj/item/chems/pill/pod/cream name = "creamer pod" From dec900c31fdd0bced1e0a41598710fcf4bf19512 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 29 Jan 2023 00:47:04 +0000 Subject: [PATCH 0925/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 5599b47eccd..6d7718016d1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -87,31 +87,6 @@

    PsyCommando updated:

  • Mapped ladders no longer change the turf they're on to the map default's open turf if they're on a lattice and any open turf types already during init. This could cause exterior/unsimulated open turfs to replace a simulated open turf and cause serious atmos issues.
  • Fixed some wall-mounted machines acting as fully constructed, when a circuitboard was installed and no wiring installed.
  • - -

    27 November 2022

    -

    PsyCommando updated:

    -
      -
    • Fixed bad icons on /obj/machinery/partyalarm.
    • -
    • Fixed bad icons on /obj/machinery/dummy_airlock_controller.
    • -
    • Fixed bad icons on /obj/machinery/button/holosign.
    • -
    • Fixed bad icons on /obj/item/personal_shield.
    • -
    • Fixed bad icons on /obj/item/shield/energy.
    • -
    • Fixed bad icons on /turf/simulated/floor/tiled/stone.
    • -
    • Fixed bad icons on /obj/item/bone/skull.
    • -
    • Fixed bad icons on /obj/item/bee_smoker.
    • -
    • Fixed bad icons on /obj/item/shovel/spade.
    • -
    • Fixed bad icons on /obj/structure/crystal.
    • -
    • Fixed bad icons on /obj/item/storage/belt/archaeology.
    • -
    • Fixed /obj/abstract/map_data not showing up in mapping tool.
    • -
    • Fixed /obj/item/underwear not showing up in mapping tool.
    • -
    • Fixed /obj/abstract not showing up in mapping tool.
    • -
    • Fixed easily missed bad icon_state name on /obj/item/crowbar/brace_jack.
    • -
    • Fixed easily missed bad icon_state name on /turf/simulated/floor/tiled/monofloor.
    • -
    • Fixed some metallic materials causing runtimes from not having wall icon states defined properly.
    • -
    • Made a bunch of /obj/structure/closet/crate show a more accurate icon in the map editor instead of the default blank locker icon.
    • -
    • Added simple directional icons for airlock controller buttons and sensors.
    • -
    • Allowed connecting fuel pipes to TEG circulators.
    • -
    From 5a856d52c51c21fe2427b4da3af3bff058501a82 Mon Sep 17 00:00:00 2001 From: comma Date: Sun, 29 Jan 2023 13:51:46 +0300 Subject: [PATCH 0926/1518] Can see scrubber mode in examine Needs basic atmo skill level --- code/modules/atmospherics/components/unary/vent_scrubber.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/atmospherics/components/unary/vent_scrubber.dm b/code/modules/atmospherics/components/unary/vent_scrubber.dm index 0d728ecc980..9e210474b83 100644 --- a/code/modules/atmospherics/components/unary/vent_scrubber.dm +++ b/code/modules/atmospherics/components/unary/vent_scrubber.dm @@ -249,6 +249,8 @@ to_chat(user, "You are too far away to read the gauge.") if(welded) to_chat(user, "It seems welded shut.") + if(!(stat & NOPOWER) && use_power && user.skill_check(SKILL_ATMOS,SKILL_BASIC)) + to_chat(user, "It's running in [scrubbing] mode.") /obj/machinery/atmospherics/unary/vent_scrubber/refresh() ..() From 9f94719ad6d4fe4e1c12d0f903c8d0e51f15c3e0 Mon Sep 17 00:00:00 2001 From: quardbreak <44920739+quardbreak@users.noreply.github.com> Date: Mon, 30 Jan 2023 00:10:30 +0300 Subject: [PATCH 0927/1518] THIS HOT [Radiocarbon Spectrometer] will make your [CI] BUSTED --- .../fabrication/designs/imprinter/designs_misc_circuits.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm index e11723ad803..58541dd651d 100644 --- a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm +++ b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm @@ -443,6 +443,9 @@ /datum/fabricator_recipe/imprinter/circuit/merchant_pad path = /obj/item/stock_parts/circuitboard/merchant_pad +/datum/fabricator_recipe/imprinter/circuit/radiocarbon_spectrometer + path = /obj/item/stock_parts/circuitboard/radiocarbon_spectrometer + /datum/fabricator_recipe/imprinter/circuit/jukebox path = /obj/item/stock_parts/circuitboard/jukebox From c88d5364aaf4704078b51c8ad551e5cd6f564397 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 31 Jan 2023 00:04:16 -0500 Subject: [PATCH 0928/1518] Small fixes/code modernization Updates to SPAN_X() Fix cryopod panels being offset wrong Replace static usage of \The with The --- code/game/machinery/cryopod.dm | 28 +++++++------- code/game/machinery/oxygen_pump.dm | 38 +++++++++---------- code/game/objects/structures/transit_tubes.dm | 10 ++--- code/modules/augment/passive/nanoaura.dm | 2 +- 4 files changed, 39 insertions(+), 39 deletions(-) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index bb4e20d6cfd..55e7d889dc8 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -16,7 +16,7 @@ density = 0 interact_offline = 1 obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED - directional_offset = "{'NORTH':{'y':-24}, 'SOUTH':{'y':32}, 'EAST':{'x':-24}, 'WEST':{'x':-24}}" + directional_offset = "{'NORTH':{'y':-24}, 'SOUTH':{'y':32}, 'EAST':{'x':24}, 'WEST':{'x':-24}}" //Used for logging people entering cryosleep and important items they are carrying. var/list/frozen_crew = list() @@ -85,7 +85,7 @@ if(!allow_items) return if(frozen_items.len == 0) - to_chat(user, "There is nothing to recover from storage.") + to_chat(user, SPAN_NOTICE("There is nothing to recover from storage.")) return TOPIC_HANDLED var/obj/item/I = input(user, "Please choose which object to retrieve.","Object recovery",null) as null|anything in frozen_items @@ -93,10 +93,10 @@ return TOPIC_HANDLED if(!(I in frozen_items)) - to_chat(user, "\The [I] is no longer in storage.") + to_chat(user, SPAN_NOTICE("\The [I] is no longer in storage.")) return TOPIC_HANDLED - visible_message("The console beeps happily as it disgorges \the [I].", range = 3) + visible_message(SPAN_NOTICE("The console beeps happily as it disgorges \the [I]."), range = 3) I.dropInto(loc) frozen_items -= I @@ -106,10 +106,10 @@ if(!allow_items) return TOPIC_HANDLED if(frozen_items.len == 0) - to_chat(user, "There is nothing to recover from storage.") + to_chat(user, SPAN_NOTICE("There is nothing to recover from storage.")) return TOPIC_HANDLED - visible_message("The console beeps happily as it disgorges the desired objects.", range = 3) + visible_message(SPAN_NOTICE("The console beeps happily as it disgorges the desired objects."), range = 3) for(var/obj/item/I in frozen_items) I.dropInto(loc) @@ -435,7 +435,7 @@ if(istype(G, /obj/item/grab)) var/obj/item/grab/grab = G if(occupant) - to_chat(user, "\The [src] is in use.") + to_chat(user, SPAN_NOTICE("\The [src] is in use.")) return if(!ismob(grab.affecting)) @@ -492,7 +492,7 @@ return if(src.occupant) - to_chat(usr, "\The [src] is in use.") + to_chat(usr, SPAN_NOTICE("\The [src] is in use.")) return set_occupant(usr) @@ -527,8 +527,8 @@ if(occupant.client) if(!silent) - to_chat(occupant, "[on_enter_occupant_message]") - to_chat(occupant, "If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.") + to_chat(occupant, SPAN_NOTICE("[on_enter_occupant_message]")) + to_chat(occupant, SPAN_NOTICE("If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.")) occupant.client.perspective = EYE_PERSPECTIVE occupant.client.eye = src occupant.forceMove(src) @@ -556,13 +556,13 @@ /obj/structure/broken_cryo/attack_hand(mob/user) ..() if (closed) - to_chat(user, "You tug at the glass but can't open it with your hands alone.") + to_chat(user, SPAN_NOTICE("You tug at the glass but can't open it with your hands alone.")) else - to_chat(user, "The glass is already open.") + to_chat(user, SPAN_NOTICE("The glass is already open.")) /obj/structure/broken_cryo/attackby(obj/item/W, mob/user) if (busy) - to_chat(user, "Someone else is attempting to open this.") + to_chat(user, SPAN_NOTICE("Someone else is attempting to open this.")) return if (closed) if (IS_CROWBAR(W)) @@ -578,7 +578,7 @@ var/obj/dead = new remains_type(loc) dead.set_dir(dir) //skeleton is oriented as cryo else - to_chat(user, "The glass cover is already open.") + to_chat(user, SPAN_NOTICE("The glass cover is already open.")) /obj/machinery/cryopod/proc/on_mob_spawn() playsound(src, 'sound/machines/ding.ogg', 30, 1) \ No newline at end of file diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index 82d7fd2d4a0..f093c4dbc7e 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -34,7 +34,7 @@ qdel(tank) if(breather) breather.drop_from_inventory(contained) - src.visible_message("The mask rapidly retracts just before /the [src] is destroyed!") + src.visible_message(SPAN_NOTICE("The mask rapidly retracts just before /the [src] is destroyed!")) qdel(contained) contained = null breather = null @@ -52,7 +52,7 @@ /obj/machinery/oxygen_pump/physical_attack_hand(mob/user) if((stat & MAINT) && tank) - user.visible_message("\The [user] removes \the [tank] from \the [src].", "You remove \the [tank] from \the [src].") + user.visible_message(SPAN_NOTICE("\The [user] removes \the [tank] from \the [src]."), SPAN_NOTICE("You remove \the [tank] from \the [src].")) user.put_in_hands(tank) src.add_fingerprint(user) tank.add_fingerprint(user) @@ -85,9 +85,9 @@ tank.forceMove(src) breather.drop_from_inventory(contained, src) if(user) - visible_message("\The [user] detaches \the [contained] and it rapidly retracts back into \the [src]!") + visible_message(SPAN_NOTICE("\The [user] detaches \the [contained] and it rapidly retracts back into \the [src]!")) else - visible_message("\The [contained] rapidly retracts back into \the [src]!") + visible_message(SPAN_NOTICE("\The [contained] rapidly retracts back into \the [src]!")) if(breather.internals) breather.internals.icon_state = "internal0" breather = null @@ -98,44 +98,44 @@ user = target // Check target validity if(!GET_EXTERNAL_ORGAN(target, BP_HEAD)) - to_chat(user, "\The [target] doesn't have a head.") + to_chat(user, SPAN_WARNING("\The [target] doesn't have a head.")) return if(!target.check_has_mouth()) - to_chat(user, "\The [target] doesn't have a mouth.") + to_chat(user, SPAN_WARNING("\The [target] doesn't have a mouth.")) return var/obj/item/mask = target.get_equipped_item(slot_wear_mask_str) if(mask && target != breather) - to_chat(user, "\The [target] is already wearing a mask.") + to_chat(user, SPAN_WARNING("\The [target] is already wearing a mask.")) return var/obj/item/head = target.get_equipped_item(slot_head_str) if(head && (head.body_parts_covered & SLOT_FACE)) - to_chat(user, "Remove their [head] first.") + to_chat(user, SPAN_WARNING("Remove their [head] first.")) return if(!tank) - to_chat(user, "There is no tank in \the [src].") + to_chat(user, SPAN_WARNING("There is no tank in \the [src].")) return if(stat & MAINT) - to_chat(user, "Please close \the maintenance hatch first.") + to_chat(user, SPAN_WARNING("Please close the maintenance hatch first.")) return if(!Adjacent(target)) - to_chat(user, "Please stay close to \the [src].") + to_chat(user, SPAN_WARNING("Please stay close to \the [src].")) return //when there is a breather: if(breather && target != breather) - to_chat(user, "\The pump is already in use.") + to_chat(user, SPAN_WARNING("The pump is already in use.")) return //Checking if breather is still valid mask = target.get_equipped_item(slot_wear_mask_str) if(target == breather && (!mask || mask != contained)) - to_chat(user, "\The [target] is not using the supplied mask.") + to_chat(user, SPAN_WARNING("\The [target] is not using the supplied mask.")) return return 1 /obj/machinery/oxygen_pump/attackby(obj/item/W, mob/user) if(IS_SCREWDRIVER(W)) stat ^= MAINT - user.visible_message("\The [user] [stat & MAINT ? "opens" : "closes"] \the [src].", "You [stat & MAINT ? "open" : "close"] \the [src].") + user.visible_message(SPAN_NOTICE("\The [user] [stat & MAINT ? "opens" : "closes"] \the [src]."), SPAN_NOTICE("You [stat & MAINT ? "open" : "close"] \the [src].")) if(stat & MAINT) icon_state = icon_state_open if(!stat) @@ -143,22 +143,22 @@ //TO-DO: Open icon if(istype(W, /obj/item/tank) && (stat & MAINT)) if(tank) - to_chat(user, "\The [src] already has a tank installed!") + to_chat(user, SPAN_WARNING("\The [src] already has a tank installed!")) else if(!user.unEquip(W, src)) return tank = W - user.visible_message("\The [user] installs \the [tank] into \the [src].", "You install \the [tank] into \the [src].") + user.visible_message(SPAN_NOTICE("\The [user] installs \the [tank] into \the [src]."), SPAN_NOTICE("You install \the [tank] into \the [src].")) src.add_fingerprint(user) if(istype(W, /obj/item/tank) && !stat) - to_chat(user, "Please open the maintenance hatch first.") + to_chat(user, SPAN_WARNING("Please open the maintenance hatch first.")) /obj/machinery/oxygen_pump/examine(mob/user) . = ..() if(tank) to_chat(user, "The meter shows [round(tank.air_contents.return_pressure())].") else - to_chat(user, "It is missing a tank!") + to_chat(user, SPAN_WARNING("It is missing a tank!")) /obj/machinery/oxygen_pump/Process() @@ -180,7 +180,7 @@ /obj/machinery/oxygen_pump/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] if(!tank) - to_chat(usr, "It is missing a tank!") + to_chat(usr, SPAN_WARNING("It is missing a tank!")) data["tankPressure"] = 0 data["releasePressure"] = 0 data["defaultReleasePressure"] = 0 diff --git a/code/game/objects/structures/transit_tubes.dm b/code/game/objects/structures/transit_tubes.dm index 3e3dd61a511..51bedbcb6c1 100644 --- a/code/game/objects/structures/transit_tubes.dm +++ b/code/game/objects/structures/transit_tubes.dm @@ -74,17 +74,17 @@ /obj/structure/transit_tube/Bumped(mob/AM) var/obj/structure/transit_tube/T = locate() in AM.loc if(T) - to_chat(AM, "The tube's support pylons block your way.") + to_chat(AM, SPAN_WARNING("The tube's support pylons block your way.")) return ..() else AM.dropInto(loc) - to_chat(AM, "You slip under the tube.") + to_chat(AM, SPAN_INFO("You slip under the tube.")) /obj/structure/transit_tube/station/Bumped(mob/AM) if(!pod_moving && icon_state == "open" && istype(AM, /mob)) for(var/obj/structure/transit_tube_pod/pod in loc) if(pod.contents.len) - to_chat(AM, "The pod is already occupied.") + to_chat(AM, SPAN_NOTICE("The pod is already occupied.")) return else if(!pod.moving && (pod.dir in directions())) AM.forceMove(pod) @@ -545,7 +545,7 @@ if("SOUTHWEST", "SW") return 10 else - return 0 + return 0 @@ -570,4 +570,4 @@ if(10) return "SW" else - return + return diff --git a/code/modules/augment/passive/nanoaura.dm b/code/modules/augment/passive/nanoaura.dm index 713805bff2d..662be61f8eb 100644 --- a/code/modules/augment/passive/nanoaura.dm +++ b/code/modules/augment/passive/nanoaura.dm @@ -78,6 +78,6 @@ /obj/aura/nanoaura/Destroy() - to_chat(user, SPAN_WARNING("\The nanites dissolve!")) + to_chat(user, SPAN_WARNING("The nanites dissolve!")) unit = null return ..() From 91bfac5c80137704c4e08a6939534f7c499ccbb9 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Tue, 31 Jan 2023 18:13:10 +1100 Subject: [PATCH 0929/1518] Automatic changelog generation for PR #2940 [ci skip] --- html/changelogs/AutoChangeLog-pr-2940.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2940.yml diff --git a/html/changelogs/AutoChangeLog-pr-2940.yml b/html/changelogs/AutoChangeLog-pr-2940.yml new file mode 100644 index 00000000000..35349ab47dd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2940.yml @@ -0,0 +1,4 @@ +author: quardbreak +delete-after: true +changes: + - bugfix: Fixed missing circuit recipe for radiocarbon spectrometer. From 1c17d5b814c4efc0e0a3c6dd7f54318678c7ca0f Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Wed, 1 Feb 2023 00:48:51 +0000 Subject: [PATCH 0930/1518] Automatic changelog generation [ci skip] --- html/changelog.html | 13 ++++++------- html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-2940.yml | 4 ---- 3 files changed, 9 insertions(+), 11 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2940.yml diff --git a/html/changelog.html b/html/changelog.html index 6d7718016d1..f35b31035df 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
    +

    01 February 2023

    +

    quardbreak updated:

    +
      +
    • Fixed missing circuit recipe for radiocarbon spectrometer.
    • +
    +

    18 January 2023

    NataKilar updated:

      @@ -80,13 +86,6 @@

      PsyCommando updated:

    • Fixed airlock machinery generally falling out of sync with eachother.
    • Added new icons for airlock sensor and airlock access button. They have overlays and directions now.
    - -

    30 November 2022

    -

    PsyCommando updated:

    -
      -
    • Mapped ladders no longer change the turf they're on to the map default's open turf if they're on a lattice and any open turf types already during init. This could cause exterior/unsimulated open turfs to replace a simulated open turf and cause serious atmos issues.
    • -
    • Fixed some wall-mounted machines acting as fully constructed, when a circuitboard was installed and no wiring installed.
    • -
    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index f9f60d933b1..5646c4c1168 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14443,3 +14443,6 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2023-01-18: NataKilar: - bugfix: Items no longer appear heavily damaged regardless of their health +2023-02-01: + quardbreak: + - bugfix: Fixed missing circuit recipe for radiocarbon spectrometer. diff --git a/html/changelogs/AutoChangeLog-pr-2940.yml b/html/changelogs/AutoChangeLog-pr-2940.yml deleted file mode 100644 index 35349ab47dd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-2940.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: quardbreak -delete-after: true -changes: - - bugfix: Fixed missing circuit recipe for radiocarbon spectrometer. From 2d5726bf0508fc6a6df5761f1aa06af206a585ab Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 29 Jan 2023 22:30:50 +1100 Subject: [PATCH 0931/1518] Removed detrimental overlay code in typing indicator. --- code/controllers/subsystems/typing.dm | 29 ++++++++++++++------------- code/modules/mob/mob_defines.dm | 2 +- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/code/controllers/subsystems/typing.dm b/code/controllers/subsystems/typing.dm index a844669f5a1..c6ac9dce6a1 100644 --- a/code/controllers/subsystems/typing.dm +++ b/code/controllers/subsystems/typing.dm @@ -129,7 +129,7 @@ SUBSYSTEM_DEF(typing) return if(display) if(!target.typing_indicator) - target.typing_indicator = new(target) + target.typing_indicator = new(null, target) target.is_typing = TRUE target.typing_indicator.show_typing_indicator() else if(target.typing_indicator) @@ -143,26 +143,30 @@ I IS TYPIN'!' Updated 09/10/2022 to include chatbar using Spookerton's SStyping system from Polaris. */ -/atom/movable/overlay/typing_indicator - expected_master_type = /atom/movable - follow_proc = /atom/movable/proc/move_to_turf_or_null +/atom/movable/typing_indicator icon = 'icons/mob/talk.dmi' icon_state = "typing" mouse_opacity = 0 vis_flags = VIS_INHERIT_ID - follow_proc = null // Sits in vis_contents instead. + var/atom/movable/master -/atom/movable/overlay/typing_indicator/Destroy() - if(ismovable(master)) - var/atom/movable/AM = master - remove_vis_contents(AM, src) +/atom/movable/typing_indicator/Initialize(ml, _master) + . = ..() + master = _master + if(!ismovable(master)) + PRINT_STACK_TRACE("Typing indicator initialized with [isnull(master) ? "null" : master] as master.") + return INITIALIZE_HINT_QDEL + +/atom/movable/typing_indicator/Destroy() + if(master) + remove_vis_contents(master, src) if(ismob(master)) var/mob/owner = master if(owner.typing_indicator == src) owner.typing_indicator = null return ..() -/atom/movable/overlay/typing_indicator/proc/hide_typing_indicator() +/atom/movable/typing_indicator/proc/hide_typing_indicator() set waitfor = FALSE if(ismob(master)) var/mob/owner = master @@ -175,7 +179,7 @@ Updated 09/10/2022 to include chatbar using Spookerton's SStyping system from Po var/atom/movable/owner = master remove_vis_contents(owner, src) -/atom/movable/overlay/typing_indicator/proc/show_typing_indicator() +/atom/movable/typing_indicator/proc/show_typing_indicator() // Make it visible after being hidden. set_invisibility(0) @@ -199,6 +203,3 @@ Updated 09/10/2022 to include chatbar using Spookerton's SStyping system from Po transform = M alpha = 0 animate(src, transform = 0, alpha = 255, time = 0.2 SECONDS, easing = EASE_IN) - -/atom/movable/overlay/typing_indicator/SetInitLoc() - forceMove(null) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index a1f08e45bad..4dbcbc9f397 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -177,6 +177,6 @@ var/holder_type /// If this mob is or was piloted by a player with typing indicators enabled, an instance of one. - var/atom/movable/overlay/typing_indicator/typing_indicator + var/atom/movable/typing_indicator/typing_indicator /// Whether this mob is currently typing, if piloted by a player. var/is_typing \ No newline at end of file From 3faecf0c10ba079881c26c5c845a2e505aa550e3 Mon Sep 17 00:00:00 2001 From: quardbreak <44920739+quardbreak@users.noreply.github.com> Date: Wed, 1 Feb 2023 23:35:16 +0300 Subject: [PATCH 0932/1518] corporate content modpack: adds missing loadout and lockers include --- mods/content/corporate/_corporate.dme | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/content/corporate/_corporate.dme b/mods/content/corporate/_corporate.dme index dc0fc83ae5f..2ab5787a2c8 100644 --- a/mods/content/corporate/_corporate.dme +++ b/mods/content/corporate/_corporate.dme @@ -26,6 +26,7 @@ #include "clothing\under\uniforms.dm" #include "datum\ai_icons.dm" #include "datum\ai_laws.dm" +#include "datum\loadout.dm" #include "datum\robolimbs.dm" #include "datum\antagonists\commando.dm" #include "datum\antagonists\deathsquad.dm" @@ -38,5 +39,6 @@ #include "items\medals.dm" #include "items\wristcomp.dm" #include "machines\machines.dm" +#include "structures\lockers.dm" // END_INCLUDE #endif From 623ed59a32605954db39b88adcbf79798589e770 Mon Sep 17 00:00:00 2001 From: quardbreak <44920739+quardbreak@users.noreply.github.com> Date: Wed, 1 Feb 2023 23:46:51 +0300 Subject: [PATCH 0933/1518] no namename, no whitered --- mods/content/corporate/datum/loadout.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/content/corporate/datum/loadout.dm b/mods/content/corporate/datum/loadout.dm index 00d68c950c2..5d33e0adf7f 100644 --- a/mods/content/corporate/datum/loadout.dm +++ b/mods/content/corporate/datum/loadout.dm @@ -15,7 +15,7 @@ /decl/loadout_option/accessory/armband_nt name = "corporate armband" - path = /obj/item/clothing/accessory/armband/whitered + path = /obj/item/clothing/accessory/armband/whitegreen /decl/loadout_option/suit/labcoat_corp name = "labcoat, corporate colors" @@ -23,7 +23,7 @@ flags = GEAR_HAS_TYPE_SELECTION /decl/loadout_option/uniform/corporate - namename = "corporate uniform selection" + name = "corporate uniform selection" path = /obj/item/clothing/under /decl/loadout_option/uniform/corporate/get_gear_tweak_options() From 669ea155d965d4e2649949e8563fd39da04624e5 Mon Sep 17 00:00:00 2001 From: quardbreak <44920739+quardbreak@users.noreply.github.com> Date: Thu, 2 Feb 2023 16:35:40 +0300 Subject: [PATCH 0934/1518] random loot: removes artifact from spawn chance --- code/game/objects/random/subtypes/misc.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/objects/random/subtypes/misc.dm b/code/game/objects/random/subtypes/misc.dm index d3f51fc1845..f654fd0fae6 100644 --- a/code/game/objects/random/subtypes/misc.dm +++ b/code/game/objects/random/subtypes/misc.dm @@ -350,7 +350,6 @@ /obj/item/storage/firstaid/surgery = 4, /obj/item/cell/infinite = 1, /obj/random/archaeological_find = 2, - /obj/structure/artifact = 1, /obj/item/multitool/hacktool = 2, /obj/item/surgicaldrill = 7, /obj/item/sutures = 7, From b71940056f14fea1bec277d9d8448228f86c18d6 Mon Sep 17 00:00:00 2001 From: comma Date: Sat, 4 Feb 2023 22:00:33 +0300 Subject: [PATCH 0935/1518] Fixes network stock parts not getting holder machine methods Base proc only looked for methods in immediate loc, added override for stock party subtype that looks deeper --- .../networking/device_types/stock_part.dm | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/code/modules/modular_computers/networking/device_types/stock_part.dm b/code/modules/modular_computers/networking/device_types/stock_part.dm index 189560b6556..c0093d547c6 100644 --- a/code/modules/modular_computers/networking/device_types/stock_part.dm +++ b/code/modules/modular_computers/networking/device_types/stock_part.dm @@ -18,4 +18,14 @@ var/atom/A = holder var/obj/machinery/M = A.loc if(istype(M)) - return M \ No newline at end of file + return M + +/datum/extension/network_device/stock_part/get_holder_methods() + var/obj/machinery/M = get_command_target() + if(istype(M)) + return M.public_methods?.Copy() + +/datum/extension/network_device/stock_part/get_holder_variables() + var/obj/machinery/M = get_command_target() + if(istype(M)) + return M.public_variables?.Copy() \ No newline at end of file From 0a79f007e6beb807581fc5987d5704122400dc20 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 20 Oct 2022 14:43:44 +1100 Subject: [PATCH 0936/1518] Porting CrimsonShrike's port of VG's holomaps to Bay. --- code/__defines/holomap.dm | 37 ++ code/__defines/misc.dm | 4 + code/__defines/subsystems.dm | 1 + code/__defines/turfs.dm | 1 + code/_onclick/hud/global_hud.dm | 11 + code/controllers/subsystems/holomap.dm | 112 +++++ code/game/area/area_abstract.dm | 4 + code/game/area/area_space.dm | 2 +- code/game/area/areas.dm | 1 + .../circuitboards/machinery/holomap.dm | 11 + code/game/turfs/exterior/_exterior.dm | 2 +- code/game/turfs/exterior/exterior_wall.dm | 1 + code/game/turfs/flooring/flooring_premade.dm | 4 +- code/game/turfs/simulated/floor.dm | 1 + code/game/turfs/simulated/walls.dm | 1 + code/game/turfs/unsimulated/beach.dm | 2 +- code/game/turfs/unsimulated/floor.dm | 1 + code/game/turfs/unsimulated/walls.dm | 1 + .../imprinter/designs_misc_circuits.dm | 5 +- code/modules/holomap/holomap.dm | 417 ++++++++++++++++++ code/modules/mining/mine_turfs.dm | 3 +- code/modules/overmap/exoplanets/_exoplanet.dm | 2 +- code/modules/turbolift/turbolift_areas.dm | 1 + icons/480x480.dmi | Bin 2074 -> 46289 bytes icons/effects/64x64.dmi | Bin 0 -> 4090 bytes icons/misc/holomap_markers.dmi | Bin 0 -> 9371 bytes icons/obj/machines/stationmap.dmi | Bin 0 -> 3988 bytes maps/example/example_areas.dm | 3 + maps/exodus/exodus_areas.dm | 20 +- maps/ministation/ministation_areas.dm | 12 + maps/nexus/nexus_areas.dm | 4 + maps/tradeship/tradeship_areas.dm | 30 +- nebula.dme | 4 + test/check-paths.sh | 2 +- 34 files changed, 687 insertions(+), 13 deletions(-) create mode 100644 code/__defines/holomap.dm create mode 100644 code/controllers/subsystems/holomap.dm create mode 100644 code/game/objects/items/weapons/circuitboards/machinery/holomap.dm create mode 100644 code/modules/holomap/holomap.dm create mode 100644 icons/effects/64x64.dmi create mode 100644 icons/misc/holomap_markers.dmi create mode 100644 icons/obj/machines/stationmap.dmi diff --git a/code/__defines/holomap.dm b/code/__defines/holomap.dm new file mode 100644 index 00000000000..76517fb8f11 --- /dev/null +++ b/code/__defines/holomap.dm @@ -0,0 +1,37 @@ +// +// Constants and standard colors for the holomap +// + +#define HOLOMAP_ICON 'icons/480x480.dmi' // Icon file to start with when drawing holomaps (to get a 480x480 canvas). +#define HOLOMAP_ICON_SIZE 480 // Pixel width & height of the holomap icon. Used for auto-centering etc. +#define HOLOMAP_MARGIN 100 // minimum marging on sides when combining maps +#define UI_HOLOMAP "CENTER-7, CENTER-7" // Screen location of the holomap "hud" + +// Holomap colors +#define COLOR_HOLOMAP_OBSTACLE "#ffffffdd" // Color of walls and barriers +#define COLOR_HOLOMAP_PATH "#66666699" // Color of floors +#define COLOR_HOLOMAP_HOLOFIER "#79ff79" // Whole map is multiplied by this to give it a green holoish look + +#define HOLOMAP_AREACOLOR_BASE "#ffffffff" +#define HOLOMAP_AREACOLOR_COMMAND "#386d8099" +#define HOLOMAP_AREACOLOR_SECURITY "#ae121299" +#define HOLOMAP_AREACOLOR_MEDICAL "#ffffffa5" +#define HOLOMAP_AREACOLOR_SCIENCE "#f45dff99" +#define HOLOMAP_AREACOLOR_EXPLORATION "#a154a699" +#define HOLOMAP_AREACOLOR_ENGINEERING "#f1c23199" +#define HOLOMAP_AREACOLOR_CARGO "#e06f0099" +#define HOLOMAP_AREACOLOR_HALLWAYS "#ffffff66" +#define HOLOMAP_AREACOLOR_AIRLOCK "#0000ffcc" +#define HOLOMAP_AREACOLOR_ESCAPE "#ff0000cc" +#define HOLOMAP_AREACOLOR_CREW "#5bc1c199" +#define HOLOMAP_AREACOLOR_MAINTENANCE "#9c895066" +// If someone can come up with a non-conflicting color for the lifts, please update this. +#define HOLOMAP_AREACOLOR_LIFTS null + +// Handy defines to lookup the pixel offsets for holomap +// Currently set to 0, left here in case of need for per map offsets +#define HOLOMAP_PIXEL_OFFSET_X (0) +#define HOLOMAP_PIXEL_OFFSET_Y (0) + +#define HOLOMAP_LEGEND_X 96 +#define HOLOMAP_LEGEND_Y 156 \ No newline at end of file diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index bac4ed8b814..f19c82b693e 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -3,6 +3,9 @@ #define TURF_FLAG_NOJAUNT BITFLAG(0) // This is used in literally one place, turf.dm, to block ethereal jaunt. #define TURF_FLAG_NORUINS BITFLAG(1) // Used by the ruin generator to skip placing loaded ruins on this turf. #define TURF_FLAG_BACKGROUND BITFLAG(2) // Used by shuttle movement to determine if it should be ignored by turf translation. +#define TURF_IS_HOLOMAP_OBSTACLE BITFLAG(3) +#define TURF_IS_HOLOMAP_PATH BITFLAG(4) +#define TURF_IS_HOLOMAP_ROCK BITFLAG(5) #define TRANSITIONEDGE 7 // Distance from edge to move to another z-level. #define RUIN_MAP_EDGE_PAD 15 @@ -86,6 +89,7 @@ #define AREA_FLAG_PRISON BITFLAG(9) // Area is a prison for the purposes of brigging objectives. #define AREA_FLAG_HOLY BITFLAG(10) // Area is holy for the purposes of marking turfs as cult-resistant. #define AREA_FLAG_SECURITY BITFLAG(11) // Area is security for the purposes of newscaster init. +#define AREA_FLAG_HIDE_FROM_HOLOMAP BITFLAG(12) // if we shouldn't be drawn on station holomaps //Map template flags #define TEMPLATE_FLAG_ALLOW_DUPLICATES BITFLAG(0) // Lets multiple copies of the template to be spawned diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm index 66233d9a88d..d6d14de4cc4 100644 --- a/code/__defines/subsystems.dm +++ b/code/__defines/subsystems.dm @@ -52,6 +52,7 @@ #define SS_INIT_LIGHTING -6 #define SS_INIT_WEATHER -7 #define SS_INIT_ZCOPY -8 +#define SS_INIT_HOLOMAP -9 #define SS_INIT_XENOARCH -10 #define SS_INIT_TICKER -20 #define SS_INIT_UNIT_TESTS -100 diff --git a/code/__defines/turfs.dm b/code/__defines/turfs.dm index a710b7d0e2b..450199ca4e5 100644 --- a/code/__defines/turfs.dm +++ b/code/__defines/turfs.dm @@ -19,6 +19,7 @@ #define SMOOTH_BLACKLIST 3 //Smooth with all but a blacklist of subtypes #define RANGE_TURFS(CENTER, RADIUS) block(locate(max(CENTER.x-(RADIUS), 1), max(CENTER.y-(RADIUS),1), CENTER.z), locate(min(CENTER.x+(RADIUS), world.maxx), min(CENTER.y+(RADIUS), world.maxy), CENTER.z)) +#define BLOCK_TURFS(X1, Y1, X2, Y2, Z) block(locate(X1, Y1, Z), locate(X2, Y2, Z)) #define EXT_LAYER_CONSTANT 0.001 #define EXT_EDGE_OCEAN (10 * EXT_LAYER_CONSTANT) diff --git a/code/_onclick/hud/global_hud.dm b/code/_onclick/hud/global_hud.dm index a1d067535f5..70e7aa2f7df 100644 --- a/code/_onclick/hud/global_hud.dm +++ b/code/_onclick/hud/global_hud.dm @@ -14,6 +14,7 @@ var/global/datum/global_hud/hud var/obj/screen/thermal var/obj/screen/meson var/obj/screen/science + var/obj/screen/holomap // makes custom colored overlay, can also generate scanline /datum/global_hud/proc/setup_overlay(icon_state, color) @@ -36,3 +37,13 @@ var/global/datum/global_hud/hud thermal = setup_overlay("scanline", "#ff0000") meson = setup_overlay("scanline", "#9fd800") science = setup_overlay("scanline", "#d600d6") + + //Holomap screen object is invisible and work + //By setting it as n images location, without icon changes + //Make it part of global hud since it's inmutable + holomap = new /obj/screen() + holomap.name = "holomap" + holomap.icon = null + holomap.layer = HUD_BASE_LAYER + holomap.screen_loc = UI_HOLOMAP + holomap.mouse_opacity = 0 \ No newline at end of file diff --git a/code/controllers/subsystems/holomap.dm b/code/controllers/subsystems/holomap.dm new file mode 100644 index 00000000000..dd544596c29 --- /dev/null +++ b/code/controllers/subsystems/holomap.dm @@ -0,0 +1,112 @@ +// Minimap generation system adapted from vorestation, adapted from /vg/. +// Seems to be much simpler/saner than /vg/'s implementation. + +//The structure holding a given map +/datum/holomapdata + var/icon/holomap_base + var/list/icon/holomap_areas = list() + var/icon/holomap_combined + var/icon/holomap_areas_combined + var/icon/holomap_small + +SUBSYSTEM_DEF(minimap) + name = "Holomap" + flags = SS_NO_FIRE + init_order = SS_INIT_HOLOMAP + + var/list/datum/holomapdata/holomaps = list() + var/list/station_holomaps = list() + +/datum/controller/subsystem/minimap/Initialize() + holomaps.len = world.maxz + for (var/z = 1 to world.maxz) + generateHolomap(z) + + //Update machinery if it has not been + for(var/obj/machinery/holomap/M in station_holomaps) + M.update_map_data() + + ..() + +/datum/controller/subsystem/minimap/proc/generateHolomap(zlevel) + var/datum/holomapdata/data = new() + data.holomap_base = generateBaseHolomap(zlevel) + data.holomap_areas = generateHolomapAreaOverlays(zlevel) + + var/icon/combinedareas = icon(HOLOMAP_ICON, "blank") + + for(var/area/A in data.holomap_areas) + var/icon/single = data.holomap_areas[A] + if(A.holomap_color) + single.Blend(A.holomap_color, ICON_MULTIPLY) + combinedareas.Blend(single, ICON_OVERLAY) + + data.holomap_areas_combined = combinedareas + + var/icon/map_base = icon(data.holomap_base) + + // Generate the full sized map by blending the base and areas onto the backdrop + var/icon/big_map = icon(HOLOMAP_ICON, "stationmap") + big_map.Blend(map_base, ICON_OVERLAY) + big_map.Blend(combinedareas, ICON_OVERLAY) + data.holomap_combined = big_map + + // Generate the "small" map + var/icon/small_map = icon(HOLOMAP_ICON, "blank") + //Make it green. + small_map.Blend(map_base, ICON_OVERLAY) + small_map.Blend(COLOR_HOLOMAP_HOLOFIER, ICON_MULTIPLY) + small_map.Blend(combinedareas, ICON_OVERLAY) + small_map.Scale(WORLD_ICON_SIZE, WORLD_ICON_SIZE) + + // And rotate it in every direction of course! + var/icon/actual_small_map = icon(small_map) + actual_small_map.Insert(new_icon = small_map, dir = SOUTH) + actual_small_map.Insert(new_icon = turn(small_map, 90), dir = WEST) + actual_small_map.Insert(new_icon = turn(small_map, 180), dir = NORTH) + actual_small_map.Insert(new_icon = turn(small_map, 270), dir = EAST) + data.holomap_small = actual_small_map + + holomaps[zlevel] = data + +// Generates the "base" holomap for one z-level, showing only the physical structure of walls and paths. +/datum/controller/subsystem/minimap/proc/generateBaseHolomap(zlevel = 1) + // Save these values now to avoid a bazillion array lookups + var/offset_x = HOLOMAP_PIXEL_OFFSET_X + var/offset_y = HOLOMAP_PIXEL_OFFSET_Y + + // Sanity checks - Better to generate a helpful error message now than have DrawBox() runtime + var/icon/canvas = icon(HOLOMAP_ICON, "blank") + if(world.maxx + offset_x > canvas.Width()) + CRASH("Minimap for z=[zlevel] : world.maxx ([world.maxx]) + holomap_offset_x ([offset_x]) must be <= [canvas.Width()]") + if(world.maxy + offset_y > canvas.Height()) + CRASH("Minimap for z=[zlevel] : world.maxy ([world.maxy]) + holomap_offset_y ([offset_y]) must be <= [canvas.Height()]") + + for(var/turf/tile as anything in BLOCK_TURFS(1,1,world.maxx,world.maxy,zlevel)) + var/area/A = get_area(tile) + if ((A && (A.area_flags & AREA_FLAG_HIDE_FROM_HOLOMAP)) || (tile.turf_flags & TURF_IS_HOLOMAP_ROCK)) + continue + if((tile.turf_flags & TURF_IS_HOLOMAP_OBSTACLE) || (locate(/obj/structure/grille) in tile)) + canvas.DrawBox(COLOR_HOLOMAP_OBSTACLE, tile.x + offset_x, tile.y + offset_y) + else if((tile.turf_flags & TURF_IS_HOLOMAP_PATH) || (locate(/obj/structure/catwalk) in tile)) + canvas.DrawBox(COLOR_HOLOMAP_PATH, tile.x + offset_x, tile.y + offset_y) + CHECK_TICK + return canvas + +// Generate overlays based on areas +/datum/controller/subsystem/minimap/proc/generateHolomapAreaOverlays(zlevel) + var/list/icon/areas = list() + + var/offset_x = HOLOMAP_PIXEL_OFFSET_X + var/offset_y = HOLOMAP_PIXEL_OFFSET_Y + + for(var/x = 1 to world.maxx) + for(var/y = 1 to world.maxy) + var/turf/tile = locate(x, y, zlevel) + if(tile && tile.loc) + var/area/areaToPaint = tile.loc + if(areaToPaint.holomap_color) + if(!areas[areaToPaint]) + areas[areaToPaint] = icon(HOLOMAP_ICON, "blank") + areas[areaToPaint].DrawBox(HOLOMAP_AREACOLOR_BASE, x + offset_x, y + offset_y) //We draw white because we want a generic version to use later. However if there is no colour we ignore it + return areas \ No newline at end of file diff --git a/code/game/area/area_abstract.dm b/code/game/area/area_abstract.dm index c0ee630d75c..a7cad4fbd60 100644 --- a/code/game/area/area_abstract.dm +++ b/code/game/area/area_abstract.dm @@ -1,5 +1,6 @@ /area/hallway name = "hallway" + holomap_color = HOLOMAP_AREACOLOR_HALLWAYS /area/maintenance area_flags = AREA_FLAG_RAD_SHIELDED @@ -7,13 +8,16 @@ turf_initializer = /decl/turf_initializer/maintenance forced_ambience = list('sound/ambience/maintambience.ogg') req_access = list(access_maint_tunnels) + holomap_color = HOLOMAP_AREACOLOR_HALLWAYS /area/shuttle requires_power = 0 sound_env = SMALL_ENCLOSED base_turf = /turf/space area_flags = AREA_FLAG_SHUTTLE | AREA_FLAG_RAD_SHIELDED + holomap_color = HOLOMAP_AREACOLOR_CREW /area/ship name = "\improper Generic Ship" ambience = list('sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg') + holomap_color = HOLOMAP_AREACOLOR_CREW diff --git a/code/game/area/area_space.dm b/code/game/area/area_space.dm index 0ec6cb45f9d..c4bc55dbe31 100644 --- a/code/game/area/area_space.dm +++ b/code/game/area/area_space.dm @@ -10,7 +10,7 @@ var/global/area/space_area power_equip = 0 power_environ = 0 has_gravity = 0 - area_flags = AREA_FLAG_EXTERNAL | AREA_FLAG_IS_NOT_PERSISTENT | AREA_FLAG_IS_BACKGROUND + area_flags = AREA_FLAG_EXTERNAL | AREA_FLAG_IS_NOT_PERSISTENT | AREA_FLAG_IS_BACKGROUND | AREA_FLAG_HIDE_FROM_HOLOMAP ambience = list('sound/ambience/ambispace1.ogg','sound/ambience/ambispace2.ogg','sound/ambience/ambispace3.ogg','sound/ambience/ambispace4.ogg','sound/ambience/ambispace5.ogg') is_outside = OUTSIDE_YES diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 25b4f160fad..bb86b91f607 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -12,6 +12,7 @@ var/global/list/areas = list() mouse_opacity = 0 var/proper_name /// Automatically set by SetName and Initialize; cached result of strip_improper(name). + var/holomap_color // Color of this area on the holomap. Must be a hex color (as string) or null. var/fire var/party diff --git a/code/game/objects/items/weapons/circuitboards/machinery/holomap.dm b/code/game/objects/items/weapons/circuitboards/machinery/holomap.dm new file mode 100644 index 00000000000..8365797b46c --- /dev/null +++ b/code/game/objects/items/weapons/circuitboards/machinery/holomap.dm @@ -0,0 +1,11 @@ +/obj/item/stock_parts/circuitboard/holomap + name = "circuitboard (holomap)" + board_type = "machine" + build_path = /obj/machinery/holomap + origin_tech = "{'engineering':1}" + req_components = list() + additional_spawn_components = list( + /obj/item/stock_parts/console_screen = 1, + /obj/item/stock_parts/keyboard = 1, + /obj/item/stock_parts/power/apc/buildable = 1 + ) diff --git a/code/game/turfs/exterior/_exterior.dm b/code/game/turfs/exterior/_exterior.dm index 5ceffedd623..24f624ffdf6 100644 --- a/code/game/turfs/exterior/_exterior.dm +++ b/code/game/turfs/exterior/_exterior.dm @@ -5,7 +5,7 @@ icon_state = "0" layer = PLATING_LAYER open_turf_type = /turf/exterior/open - turf_flags = TURF_FLAG_BACKGROUND + turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH var/base_color var/diggable = 1 var/dirt_color = "#7c5e42" diff --git a/code/game/turfs/exterior/exterior_wall.dm b/code/game/turfs/exterior/exterior_wall.dm index 59eb58b0b4e..9b51f45f062 100644 --- a/code/game/turfs/exterior/exterior_wall.dm +++ b/code/game/turfs/exterior/exterior_wall.dm @@ -12,6 +12,7 @@ var/global/list/natural_walls = list() opacity = TRUE density = TRUE blocks_air = TRUE + turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_OBSTACLE var/strata var/paint_color diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm index fd0fc9a541e..4250d6f3bb3 100644 --- a/code/game/turfs/flooring/flooring_premade.dm +++ b/code/game/turfs/flooring/flooring_premade.dm @@ -342,12 +342,12 @@ name = "coastline" icon = 'icons/misc/beach2.dmi' icon_state = "sandwater" - turf_flags = TURF_IS_WET + turf_flags = TURF_IS_WET | TURF_IS_HOLOMAP_PATH /turf/simulated/floor/beach/water name = "water" icon_state = "water" - turf_flags = TURF_IS_WET + turf_flags = TURF_IS_WET | TURF_IS_HOLOMAP_PATH /turf/simulated/floor/beach/water/is_flooded(lying_mob, absolute) . = absolute ? ..() : lying_mob diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index dff990701e4..a2b6ac8f336 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -6,6 +6,7 @@ thermal_conductivity = 0.040 heat_capacity = 10000 explosion_resistance = 1 + turf_flags = TURF_IS_HOLOMAP_PATH // Damage to flooring. var/broken diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 269e75d0965..3a598173670 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -28,6 +28,7 @@ var/global/list/wall_fullblend_objects = list( explosion_resistance = 10 color = COLOR_GRAY40 atom_flags = ATOM_FLAG_CAN_BE_PAINTED + turf_flags = TURF_IS_HOLOMAP_OBSTACLE var/damage = 0 var/can_open = 0 diff --git a/code/game/turfs/unsimulated/beach.dm b/code/game/turfs/unsimulated/beach.dm index f9eabf8a09d..58ec57d520b 100644 --- a/code/game/turfs/unsimulated/beach.dm +++ b/code/game/turfs/unsimulated/beach.dm @@ -14,7 +14,7 @@ /turf/unsimulated/beach/water name = "Water" icon_state = "water" - turf_flags = TURF_IS_WET + turf_flags = TURF_IS_WET | TURF_IS_HOLOMAP_PATH /turf/unsimulated/beach/water/Initialize(var/ml) . = ..() diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index 489990be804..24402cba184 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -2,6 +2,7 @@ name = "floor" icon = 'icons/turf/floors.dmi' icon_state = "Floor3" + turf_flags = TURF_IS_HOLOMAP_PATH /turf/unsimulated/floor/infinity //non-doomsday version for transit and wizden name = "\proper infinity" diff --git a/code/game/turfs/unsimulated/walls.dm b/code/game/turfs/unsimulated/walls.dm index 776ad29e082..35ae20c3970 100644 --- a/code/game/turfs/unsimulated/walls.dm +++ b/code/game/turfs/unsimulated/walls.dm @@ -4,6 +4,7 @@ icon_state = "riveted" opacity = 1 density = 1 + turf_flags = TURF_IS_HOLOMAP_OBSTACLE /turf/unsimulated/wall/fakeglass name = "window" diff --git a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm index 58541dd651d..f45503fd492 100644 --- a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm +++ b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm @@ -489,4 +489,7 @@ path = /obj/item/stock_parts/circuitboard/fax_machine /datum/fabricator_recipe/imprinter/circuit/photocopier - path = /obj/item/stock_parts/circuitboard/photocopier \ No newline at end of file + path = /obj/item/stock_parts/circuitboard/photocopier + +/datum/fabricator_recipe/imprinter/circuit/holomap + path = /obj/item/stock_parts/circuitboard/holomap diff --git a/code/modules/holomap/holomap.dm b/code/modules/holomap/holomap.dm new file mode 100644 index 00000000000..1b2968516a2 --- /dev/null +++ b/code/modules/holomap/holomap.dm @@ -0,0 +1,417 @@ +/obj/machinery/holomap + name = "holomap" + desc = "A screen that projects a map of the surrounding structure." + icon = 'icons/obj/machines/stationmap.dmi' + icon_state = "station_map" + anchored = TRUE + density = FALSE + use_power = POWER_USE_IDLE + idle_power_usage = 10 + active_power_usage = 500 + light_color = "#64c864" + uncreated_component_parts = null + construct_state = /decl/machine_construction/default/panel_closed + base_type = /obj/machinery/holomap + layer = ABOVE_WINDOW_LAYER // Above windows. + directional_offset = "{'NORTH':{'y':-32}, 'SOUTH':{'y':32}, 'EAST':{'x':-32}, 'WEST':{'x':32}}" + + var/light_power_on = 1 + var/light_range_on = 2 + var/mob/watching_mob + var/image/small_station_map + var/image/floor_markings + var/image/panel + /// z-level on which the station map was initialized. + var/original_zLevel = 1 + /// set to FALSE when you initialize the station map on a zLevel that has its own icon formatted for use by station holomaps. + var/bogus = TRUE + var/datum/station_holomap/holomap_datum + +/obj/machinery/holomap/Destroy() + SSminimap.station_holomaps -= src + stopWatching() + QDEL_NULL(holomap_datum) + return ..() + +/obj/machinery/holomap/Initialize() + holomap_datum = new() + original_zLevel = loc.z + bogus = FALSE + . = ..() + SSminimap.station_holomaps += src + if(SSminimap.initialized) + update_map_data() + floor_markings = image('icons/obj/machines/stationmap.dmi', "decal_station_map") + floor_markings.dir = src.dir + update_icon() + +/obj/machinery/holomap/proc/update_map_data() + if(!SSminimap.holomaps[original_zLevel]) + bogus = TRUE + holomap_datum.initialize_holomap_bogus() + update_icon() + return + + holomap_datum.initialize_holomap(get_turf(src), reinit = TRUE) + + small_station_map = image(icon = SSminimap.holomaps[original_zLevel].holomap_small) + small_station_map.plane = ABOVE_LIGHTING_PLANE + small_station_map.layer = ABOVE_LIGHTING_LAYER + small_station_map.pixel_x = 10 + small_station_map.pixel_y = 10 + + update_icon() + +/obj/machinery/holomap/attack_hand(var/mob/user) + if(watching_mob && (watching_mob != user)) + to_chat(user, SPAN_WARNING("Someone else is currently watching the holomap.")) + return + if(user.loc != loc) + to_chat(user, SPAN_WARNING("You need to stand in front of \the [src].")) + return + startWatching(user) + +// Let people bump up against it to watch +/obj/machinery/holomap/Bumped(var/atom/movable/AM) + if(!watching_mob && isliving(AM) && AM.loc == loc) + startWatching(AM) + +// In order to actually get Bumped() we need to block movement. We're (visually) on a wall, so people +// couldn't really walk into us anyway. But in reality we are on the turf in front of the wall, so bumping +// against where we seem is actually trying to *exit* our real loc +/obj/machinery/holomap/CheckExit(atom/movable/mover as mob|obj, turf/target as turf) + if(get_dir(target, loc) == dir) // Opposite of "normal" since we are visually in the next turf over + return FALSE + else + return TRUE + +/obj/machinery/holomap/proc/startWatching(var/mob/user) + if(!isliving(user) || !anchored || !operable() || !user.client) + return FALSE + + var/datum/global_hud/global_hud = get_global_hud() + holomap_datum.station_map.loc = global_hud.holomap // Put the image on the holomap hud + holomap_datum.station_map.alpha = 0 // Set to transparent so we can fade in + animate(holomap_datum.station_map, alpha = 255, time = 5, easing = LINEAR_EASING) + flick("station_map_activate", src) + user.client.screen |= global_hud.holomap + user.client.images |= holomap_datum.station_map + + watching_mob = user + events_repository.register(/decl/observ/moved, watching_mob, src, /obj/machinery/holomap/proc/checkPosition) + events_repository.register(/decl/observ/destroyed, watching_mob, src, /obj/machinery/holomap/proc/stopWatching) + update_use_power(POWER_USE_ACTIVE) + + if(bogus) + to_chat(user, SPAN_WARNING("The holomap failed to initialize. This area of space cannot be mapped.")) + else + to_chat(user, SPAN_NOTICE("A hologram of your current location appears before your eyes.")) + + START_PROCESSING_MACHINE(src, MACHINERY_PROCESS_SELF) + +/obj/machinery/holomap/Process() + if(!operable()) + stopWatching() + return PROCESS_KILL + +/obj/machinery/holomap/proc/checkPosition() + if(!watching_mob || (watching_mob.loc != loc) || (dir != watching_mob.dir)) + stopWatching() + +/obj/machinery/holomap/proc/stopWatching() + if(watching_mob) + if(watching_mob.client) + animate(holomap_datum.station_map, alpha = 0, time = 5, easing = LINEAR_EASING) + var/mob/M = watching_mob + addtimer(CALLBACK(src, .proc/clear_image, M, holomap_datum.station_map), 5, TIMER_CLIENT_TIME)//we give it time to fade out + events_repository.unregister(/decl/observ/moved, watching_mob, src) + events_repository.unregister(/decl/observ/destroyed, watching_mob, src) + watching_mob = null + update_use_power(POWER_USE_IDLE) + if(holomap_datum) + holomap_datum.legend_deselect() + +/obj/machinery/holomap/proc/clear_image(mob/M, image/I) + if (M.client) + M.client.images -= I + +/obj/machinery/holomap/on_update_icon() + . = ..() + cut_overlays() + if(stat & BROKEN) + icon_state = "station_mapb" + set_light(0) + else if((stat & NOPOWER) || !anchored) + icon_state = "station_map0" + set_light(0) + else + icon_state = "station_map" + set_light(0.8, 0.1, 2, 2, "#1dbe17") + // Put the little "map" overlay down where it looks nice + if(small_station_map) + add_overlay(small_station_map) + if(floor_markings) + floor_markings.dir = src.dir + floor_markings.pixel_x = -src.pixel_x + floor_markings.pixel_y = -src.pixel_y + add_overlay(floor_markings) + if(panel_open) + add_overlay("station_map-panel") + +/obj/machinery/holomap/explosion_act(severity) + . = ..() + if(!QDELETED(src)) + switch(severity) + if(1) + qdel(src) + if(2) + if(prob(50)) + qdel(src) + else + set_broken() + if(3) + if(prob(25)) + set_broken() + +/obj/screen/levelselect + icon = 'icons/misc/mark.dmi' + layer = HUD_ITEM_LAYER + var/active = TRUE + var/datum/station_holomap/owner = null + +/obj/screen/levelselect/Initialize(mapload, datum/station_holomap/_owner) + . = ..() + owner = _owner + +/obj/screen/levelselect/Click() + return (!usr.incapacitated() && !isghost(usr)) +/obj/screen/levelselect/up + icon_state = "fup" + +/obj/screen/levelselect/up/Click() + if(..()) + if(owner) + owner.set_level(owner.displayed_level - 1) + +/obj/screen/levelselect/down + icon_state = "fdn" + +/obj/screen/levelselect/down/Click() + if(..()) + if(owner) + owner.set_level(owner.displayed_level + 1) + +/obj/screen/legend + icon = null + maptext_height = 128 + maptext_width = 128 + layer = HUD_ITEM_LAYER + pixel_x = HOLOMAP_LEGEND_X + appearance_flags = PIXEL_SCALE | RESET_COLOR + var/saved_color + var/datum/station_holomap/owner = null + var/has_areas = FALSE + +/obj/screen/legend/cursor + icon = 'icons/misc/holomap_markers.dmi' + icon_state = "you" + maptext_x = 11 + pixel_x = HOLOMAP_LEGEND_X - 3 + has_areas = TRUE + +/obj/screen/legend/Initialize(mapload, map_color, text) + . = ..() + saved_color = map_color + maptext = "[text]" + alpha = 255 + +/obj/screen/legend/Click(location, control, params) + if(!usr.incapacitated() && !isghost(usr)) + if(istype(owner)) + owner.legend_select(src) + +/obj/screen/legend/proc/Setup(z_level) + has_areas = FALSE + //Get the areas for this z level and mark if we're empty + overlays.Cut() + for(var/area/A in SSminimap.holomaps[z_level].holomap_areas) + if(A.holomap_color == saved_color) + var/image/area = image(SSminimap.holomaps[z_level].holomap_areas[A]) + area.pixel_x = ((HOLOMAP_ICON_SIZE / 2) - world.maxx / 2) - pixel_x + area.pixel_y = ((HOLOMAP_ICON_SIZE / 2) - world.maxy / 2) - pixel_y + overlays += area + has_areas = TRUE + +//What happens when we are clicked on / when another is clicked on +/obj/screen/legend/proc/Select() + //Start blinking + animate(src, alpha = 0, time = 2, loop = -1, easing = JUMP_EASING | EASE_IN | EASE_OUT) + animate(alpha = 254, time = 2, loop = -1, easing = JUMP_EASING | EASE_IN | EASE_OUT) + +/obj/screen/legend/proc/Deselect() + //Stop blinking + animate(src, flags = ANIMATION_END_NOW) + +//Cursor doesnt do anything specific. +/obj/screen/legend/cursor/Setup() + +/obj/screen/legend/cursor/Select() + +/obj/screen/legend/cursor/Deselect() + +// Simple datum to keep track of a running holomap. Each machine capable of displaying the holomap will have one. +/datum/station_holomap + var/image/station_map + var/image/cursor + var/list/obj/screen/legend/legend + var/list/obj/screen/maptexts + var/list/obj/screen/levelselect/lbuttons + var/list/image/levels + var/list/z_levels + var/z = -1 + var/displayed_level = 1 //Index of level to display + +/datum/station_holomap/Destroy(force) + QDEL_NULL(station_map) + QDEL_NULL(cursor) + QDEL_NULL_LIST(legend) + QDEL_NULL_LIST(levels) + QDEL_NULL_LIST(lbuttons) + QDEL_NULL_LIST(maptexts) + QDEL_NULL_LIST(z_levels) + . = ..() + +/datum/station_holomap/proc/initialize_holomap(turf/T, isAI = null, mob/user = null, reinit = FALSE) + z = T.z + if(!station_map || reinit) + station_map = image(SSminimap.holomaps[z].holomap_combined) + if(!cursor || reinit) + cursor = image('icons/misc/holomap_markers.dmi', "you") + cursor.layer = HUD_ABOVE_ITEM_LAYER + + if(!LAZYLEN(legend) || reinit) + QDEL_NULL_LIST(legend) + legend = list( + new /obj/screen/legend(null, HOLOMAP_AREACOLOR_COMMAND, "■ Command"), + new /obj/screen/legend(null, HOLOMAP_AREACOLOR_SECURITY, "■ Security"), + new /obj/screen/legend(null, HOLOMAP_AREACOLOR_MEDICAL, "■ Medical"), + new /obj/screen/legend(null, HOLOMAP_AREACOLOR_SCIENCE, "■ Research"), + new /obj/screen/legend(null, HOLOMAP_AREACOLOR_EXPLORATION, "■ Exploration"), + new /obj/screen/legend(null, HOLOMAP_AREACOLOR_ENGINEERING, "■ Engineering"), + new /obj/screen/legend(null, HOLOMAP_AREACOLOR_CARGO, "■ Supply"), + new /obj/screen/legend(null, HOLOMAP_AREACOLOR_AIRLOCK, "■ Airlock"), + new /obj/screen/legend(null, HOLOMAP_AREACOLOR_ESCAPE, "■ Escape"), + new /obj/screen/legend(null, HOLOMAP_AREACOLOR_CREW, "■ Crew"), + new /obj/screen/legend/cursor(null, HOLOMAP_AREACOLOR_BASE, "You are here") + ) + if(reinit) + QDEL_NULL_LIST(maptexts) + QDEL_NULL_LIST(levels) + QDEL_NULL_LIST(z_levels) + QDEL_NULL_LIST(lbuttons) + + station_map = image(icon(HOLOMAP_ICON, "stationmap")) + station_map.layer = UNDER_HUD_LAYER + + //This is where the fun begins + if(length(global.using_map.overmap_ids)) + var/obj/effect/overmap/visitable/O = global.overmap_sectors["[z]"] + + var/current_z_offset_x = (HOLOMAP_ICON_SIZE / 2) - world.maxx / 2 + var/current_z_offset_y = (HOLOMAP_ICON_SIZE / 2) - world.maxy / 2 + + //For the given z level fetch the related map sector and build the list + if(istype(O)) + var/z_count = length(O.map_z) + var/current_z_index = 1 + z_levels = O.map_z.Copy() + + if(z_count > 1) + if(!LAZYLEN(lbuttons)) + //Add the buttons for switching levels + LAZYADD(lbuttons, new /obj/screen/levelselect/up(null, src)) + LAZYADD(lbuttons, new /obj/screen/levelselect/down(null, src)) + lbuttons[1].pixel_y = HOLOMAP_MARGIN - 22 + lbuttons[2].pixel_y = HOLOMAP_MARGIN + 5 + lbuttons[1].pixel_x = 254 + lbuttons[2].pixel_x = 196 + + //Each level now has to be built and offset properly. Then stored to be showed later + for(var/level = 1; level <= z_count; level++) + if (z == O.map_z[level]) + current_z_index = level + + //Turfs and walls + var/image/map_image = image(SSminimap.holomaps[O.map_z[level]].holomap_base) + + map_image.color = COLOR_HOLOMAP_HOLOFIER + map_image.layer = HUD_BASE_LAYER + + map_image.pixel_x = (HOLOMAP_ICON_SIZE / 2) - world.maxx / 2 + map_image.pixel_y = (HOLOMAP_ICON_SIZE / 2) - world.maxy / 2 + + //Store the image for future use + //LAZYADD(levels, map_image) + LAZYSET(levels, "[O.map_z[level]]", map_image) + + var/obj/screen/maptext_overlay = new(null) + maptext_overlay.icon = null + maptext_overlay.layer = HUD_ITEM_LAYER + maptext_overlay.appearance_flags |= RESET_COLOR | PIXEL_SCALE + maptext_overlay.maptext = STYLE_SMALLFONTS_OUTLINE("
    LEVEL [level-1]
    ", 7, COLOR_WHITE, COLOR_BLACK) + maptext_overlay.maptext_width = 96 + maptext_overlay.pixel_x = (HOLOMAP_ICON_SIZE / 2) - (maptext_overlay.maptext_width / 2) + maptext_overlay.pixel_y = HOLOMAP_MARGIN + + LAZYSET(maptexts, "[O.map_z[level]]", maptext_overlay) + + //Reset to starting zlevel + set_level(current_z_index) + if(isAI) + T = get_turf(user.client.eye) + cursor.pixel_x = (T.x - 6 + current_z_offset_x) * PIXEL_MULTIPLIER + cursor.pixel_y = (T.y - 6 + current_z_offset_y) * PIXEL_MULTIPLIER + + +/datum/station_holomap/proc/set_level(level) + if(level > z_levels.len) + return + + displayed_level = level + + station_map.overlays.Cut() + station_map.vis_contents.Cut() + + if(z == z_levels[displayed_level]) + station_map.overlays += cursor + + station_map.overlays += levels["[z_levels[displayed_level]]"] + station_map.vis_contents += maptexts["[z_levels[displayed_level]]"] + + //Fix legend position + var/pixel_y = HOLOMAP_LEGEND_Y + for(var/obj/screen/legend/element in legend) + element.owner = src + element.pixel_y = pixel_y //Set adjusted pixel y as it will be needed for area placement + element.Setup(z_levels[displayed_level]) + if(element.has_areas) + pixel_y -= 10 + station_map.vis_contents += element + + if(displayed_level > 1) + station_map.vis_contents += lbuttons[1] + + if(displayed_level < z_levels.len) + station_map.vis_contents += lbuttons[2] + +/datum/station_holomap/proc/legend_select(obj/screen/legend/L) + legend_deselect() + L.Select() + +/datum/station_holomap/proc/legend_deselect() + for(var/obj/screen/legend/entry in legend) + entry.Deselect() + +/datum/station_holomap/proc/initialize_holomap_bogus() + station_map = image('icons/480x480.dmi', "stationmap") + station_map.overlays |= image('icons/effects/64x64.dmi', "notfound", pixel_x = 7 * WORLD_ICON_SIZE, pixel_y = 7 * WORLD_ICON_SIZE) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index d5e65ff9921..4c059974e73 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -5,6 +5,7 @@ blocks_air = 1 density = 1 opacity = 1 + turf_flags = TURF_IS_HOLOMAP_OBSTACLE var/global/list/mining_floors = list() /**********************Asteroid**************************/ @@ -22,7 +23,7 @@ var/global/list/mining_floors = list() initial_flooring = null initial_gas = null temperature = TCMB - turf_flags = TURF_FLAG_BACKGROUND + turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH var/dug = 0 //0 = has not yet been dug, 1 = has already been dug var/overlay_detail diff --git a/code/modules/overmap/exoplanets/_exoplanet.dm b/code/modules/overmap/exoplanets/_exoplanet.dm index 4bd89d390a2..dade341d28a 100644 --- a/code/modules/overmap/exoplanets/_exoplanet.dm +++ b/code/modules/overmap/exoplanets/_exoplanet.dm @@ -298,5 +298,5 @@ name = "\improper Planetary surface" ambience = list('sound/effects/wind/wind_2_1.ogg','sound/effects/wind/wind_2_2.ogg','sound/effects/wind/wind_3_1.ogg','sound/effects/wind/wind_4_1.ogg','sound/effects/wind/wind_4_2.ogg','sound/effects/wind/wind_5_1.ogg') always_unpowered = 1 - area_flags = AREA_FLAG_IS_BACKGROUND | AREA_FLAG_EXTERNAL + area_flags = AREA_FLAG_IS_BACKGROUND | AREA_FLAG_EXTERNAL | AREA_FLAG_HIDE_FROM_HOLOMAP is_outside = OUTSIDE_YES diff --git a/code/modules/turbolift/turbolift_areas.dm b/code/modules/turbolift/turbolift_areas.dm index dbf568aec2e..fcc9558991b 100644 --- a/code/modules/turbolift/turbolift_areas.dm +++ b/code/modules/turbolift/turbolift_areas.dm @@ -4,6 +4,7 @@ base_turf = /turf/simulated/open requires_power = 0 sound_env = SMALL_ENCLOSED + holomap_color = HOLOMAP_AREACOLOR_LIFTS var/lift_floor_label = null var/lift_floor_name = null diff --git a/icons/480x480.dmi b/icons/480x480.dmi index 90ea9fbd55cbef9fa3da246b5092b86ccca22ec1..0b6d072855ac702f84d96e8204461feb432fac8d 100644 GIT binary patch literal 46289 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 literal 2074 zcmeAS@N?(olHy`uVBq!ia0y~yV0-|=9Be?5+AI5}0;!^^kcbkO)Z*l#%z~24{5%GR ziaEN+_wqRyh_GGQ`CW7025zUMmr9~94_I?dFZ(e0TibQ>4Ra?idRt|Eh-X?J-^Kat zCaZMRzy5HQFq=7}>w3S7y=-Y4zA)Xb zk-liTnEw?61ADTki(^Q|oVQmE84oB395}GN>*M~0?z9Jfj@#B)Zf0lraW$Ns;XpT! z1OpQr4+A4JTSEgQv%`S~Mumg}3<3rT3>*>$3@oG4qrozo97eOjXz4IoDvs6$XqDuS Yx23H5EZ#i}ft5Xjr>mdKI;Vst0NeF~X#fBK diff --git a/icons/effects/64x64.dmi b/icons/effects/64x64.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5ebf9ff164eb017a8c02f83bb3a1616104e5bef3 GIT binary patch literal 4090 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 literal 0 HcmV?d00001 diff --git a/icons/misc/holomap_markers.dmi b/icons/misc/holomap_markers.dmi new file mode 100644 index 0000000000000000000000000000000000000000..3ea32c120d0e4bebb8b7e65acf78f87250ade248 GIT binary patch literal 9371 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 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/stationmap.dmi b/icons/obj/machines/stationmap.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f57bf08913e7599511193a02e37f3484868961f7 GIT binary patch literal 3988 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 dt4Y`)XSh(H?$