diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml
index 6f77c68dd8..80954a63f1 100644
--- a/.github/workflows/ci_suite.yml
+++ b/.github/workflows/ci_suite.yml
@@ -46,12 +46,26 @@ jobs:
tools/build/build --ci lint tgui-test
tools/bootstrap/python -m dmi.test
tools/bootstrap/python -m mapmerge2.dmm_test
- ~/dreamchecker > ${GITHUB_WORKSPACE}/output-annotations.txt 2>&1
- - name: Annotate Lints
- uses: yogstation13/DreamAnnotate@v2
- if: always()
+ ~/dreamchecker 2>&1 | bash tools/ci/annotate_dm.sh
+
+ odlint:
+ if: ( !contains(github.event.head_commit.message, '[ci skip]') )
+ name: "Lint with OpenDream"
+ runs-on: ubuntu-22.04
+ concurrency:
+ group: odlint-${{ github.head_ref || github.run_id }}
+ cancel-in-progress: true
+ steps:
+ - uses: actions/checkout@v4
+ - uses: robinraju/release-downloader@v1.9
with:
- outputFile: output-annotations.txt
+ repository: "OpenDreamProject/OpenDream"
+ tag: "latest"
+ fileName: "DMCompiler_linux-x64.tar.gz"
+ extract: true
+ - name: Run OpenDream
+ run: |
+ ./DMCompiler_linux-x64/DMCompiler cev_eris.dme --suppress-unimplemented --define=CIBUILDING
compile_all_maps:
if: "!contains(github.event.head_commit.message, '[ci skip]')"
diff --git a/.gitignore b/.gitignore
index 6479b42d73..17be3d7898 100644
--- a/.gitignore
+++ b/.gitignore
@@ -223,3 +223,6 @@ aux*.pdb
# Screenshot tests
/artifacts
yarn.lock
+
+# Running OpenDream locally
+tgstation.json
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 7b16ed6b3b..3c61a0aea1 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -1,12 +1,12 @@
{
- "version": "0.2.0",
- "configurations": [
- {
- "type": "byond",
- "request": "launch",
- "name": "Launch and Build TGUI and DM",
- "preLaunchTask": "TGUI Compile",
- "dmb": "${workspaceFolder}/${command:CurrentDMB}"
- },
- ]
- }
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "byond",
+ "request": "launch",
+ "name": "Launch and Build TGUI and DM",
+ "preLaunchTask": "TGUI Compile",
+ "dmb": "${workspaceFolder}/${command:CurrentDMB}"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 36c5e27828..c8ad058862 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -1,12 +1,22 @@
{
- "version": "2.0.0",
- "tasks": [
- {
- "label": "TGUI Compile",
- "type": "shell",
- "command": "bin/build.cmd",
- "presentation": {"echo": true, "reveal": "always", "focus": false, "panel": "shared", "showReuseMessage": false, "clear": true},
- "group": {"kind": "build", "isDefault": true},
- }
- ]
-}
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "TGUI Compile",
+ "type": "shell",
+ "command": "bin/build.cmd",
+ "presentation": {
+ "echo": true,
+ "reveal": "always",
+ "focus": false,
+ "panel": "shared",
+ "showReuseMessage": false,
+ "clear": true
+ },
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/__odlint.dm b/__odlint.dm
new file mode 100644
index 0000000000..b7c120514a
--- /dev/null
+++ b/__odlint.dm
@@ -0,0 +1,10 @@
+// This file is included right at the start of the DME.
+// Its purpose is to enable multiple lints (pragmas) that are supported by OpenDream to better validate the codebase
+// These are essentially nitpicks the DM compiler should pick up on but doesnt
+
+#if !defined(SPACEMAN_DMM) && defined(OPENDREAM)
+// This is in a separate file as a hack to avoid SpacemanDMM
+// evaluating the #pragma lines, even if its outside a block it cares about
+// (Also so people can code-own it. Shoutout to AA)
+#include "tools/ci/od_lints.dm"
+#endif
diff --git a/cev_eris.dme b/cev_eris.dme
index 22738bb10f..3832b3bf7f 100644
--- a/cev_eris.dme
+++ b/cev_eris.dme
@@ -7,6 +7,7 @@
#define DEBUG
// END_PREFERENCES
// BEGIN_INCLUDE
+#include "__odlint.dm"
#include "code\_compile_options.dm"
#include "code\_debugger.dm"
#include "code\client_macros.dm"
@@ -254,7 +255,6 @@
#include "code\controllers\subsystems\spawn_data.dm"
#include "code\controllers\subsystems\staverbs.dm"
#include "code\controllers\subsystems\sun.dm"
-#include "code\controllers\subsystems\supply.dm"
#include "code\controllers\subsystems\tgui.dm"
#include "code\controllers\subsystems\throwing.dm"
#include "code\controllers\subsystems\ticker.dm"
@@ -270,7 +270,6 @@
#include "code\controllers\subsystems\processing\nano.dm"
#include "code\controllers\subsystems\processing\objs.dm"
#include "code\controllers\subsystems\processing\processing.dm"
-#include "code\controllers\subsystems\processing\projectiles.dm"
#include "code\controllers\subsystems\processing\turf.dm"
#include "code\controllers\subsystems\processing\organs\internal_wounds.dm"
#include "code\controllers\subsystems\tickets\mentor_tickets.dm"
@@ -546,7 +545,6 @@
#include "code\game\shuttle_engines.dm"
#include "code\game\skincmd.dm"
#include "code\game\sound.dm"
-#include "code\game\supplyshuttle.dm"
#include "code\game\world.dm"
#include "code\game\antagonist\_antagonist_setup.dm"
#include "code\game\antagonist\antagonist.dm"
@@ -624,7 +622,6 @@
#include "code\game\gamemodes\events\hidden_events\bluespace_rift.dm"
#include "code\game\gamemodes\events\hidden_events\kaiser.dm"
#include "code\game\gamemodes\events\holidays\Christmas.dm"
-#include "code\game\gamemodes\events\holidays\Holidays.dm"
#include "code\game\gamemodes\events\weather\rad_storm.dm"
#include "code\game\gamemodes\malfunction\malf_hardware.dm"
#include "code\game\gamemodes\malfunction\malf_research.dm"
@@ -726,7 +723,6 @@
#include "code\game\machinery\status_display.dm"
#include "code\game\machinery\status_display_ai.dm"
#include "code\game\machinery\suit_storage_unit.dm"
-#include "code\game\machinery\supply_display.dm"
#include "code\game\machinery\supplybeacon.dm"
#include "code\game\machinery\surveillance_pod.dm"
#include "code\game\machinery\teleporter.dm"
@@ -950,10 +946,6 @@
#include "code\game\objects\items\devices\organ_module\active\multitool\miner.dm"
#include "code\game\objects\items\devices\organ_module\passive\armor.dm"
#include "code\game\objects\items\devices\organ_module\passive\muscle.dm"
-#include "code\game\objects\items\devices\PDA\cart.dm"
-#include "code\game\objects\items\devices\PDA\chatroom.dm"
-#include "code\game\objects\items\devices\PDA\PDA.dm"
-#include "code\game\objects\items\devices\PDA\radio.dm"
#include "code\game\objects\items\devices\radio\beacon.dm"
#include "code\game\objects\items\devices\radio\electropack.dm"
#include "code\game\objects\items\devices\radio\encryptionkey.dm"
@@ -1500,22 +1492,6 @@
#include "code\modules\bs_snare\circuits.dm"
#include "code\modules\bs_snare\machinery.dm"
#include "code\modules\bs_snare\snare.dm"
-#include "code\modules\cargo\exports.dm"
-#include "code\modules\cargo\order.dm"
-#include "code\modules\cargo\packs.dm"
-#include "code\modules\cargo\supplyshuttle.dm"
-#include "code\modules\cargo\exports\gear.dm"
-#include "code\modules\cargo\exports\large_objects.dm"
-#include "code\modules\cargo\exports\manifest.dm"
-#include "code\modules\cargo\exports\medical_shit.dm"
-#include "code\modules\cargo\exports\misc.dm"
-#include "code\modules\cargo\exports\money.dm"
-#include "code\modules\cargo\exports\parts.dm"
-#include "code\modules\cargo\exports\research.dm"
-#include "code\modules\cargo\exports\rnd_shit.dm"
-#include "code\modules\cargo\exports\sheets.dm"
-#include "code\modules\cargo\exports\tools.dm"
-#include "code\modules\cargo\exports\weapons.dm"
#include "code\modules\client\client_defines.dm"
#include "code\modules\client\client_procs.dm"
#include "code\modules\client\darkmode.dm"
@@ -1805,7 +1781,6 @@
#include "code\modules\long_range_scanner\long_range_scanner.dm"
#include "code\modules\maps\dmm_suite.dm"
#include "code\modules\maps\swapmaps.dm"
-#include "code\modules\maps\writer.dm"
#include "code\modules\maps\tg\map_template.dm"
#include "code\modules\maps\tg\reader.dm"
#include "code\modules\materials\material_decs.dm"
@@ -1865,6 +1840,7 @@
#include "code\modules\mining\money_bag.dm"
#include "code\modules\mining\ore.dm"
#include "code\modules\mining\ore_datum.dm"
+#include "code\modules\mining\plasticflaps.dm"
#include "code\modules\mining\satchel_ore_boxdm.dm"
#include "code\modules\mining\drilling\cave_generator.dm"
#include "code\modules\mining\drilling\cave_mineral.dm"
@@ -2344,6 +2320,8 @@
#include "code\modules\organs\internal\stomach.dm"
#include "code\modules\organs\internal\internal_wounds\_internal_wound.dm"
#include "code\modules\organs\internal\internal_wounds\bone.dm"
+#include "code\modules\organs\internal\internal_wounds\brain.dm"
+#include "code\modules\organs\internal\internal_wounds\eyes.dm"
#include "code\modules\organs\internal\internal_wounds\organic.dm"
#include "code\modules\organs\internal\internal_wounds\robotic.dm"
#include "code\modules\organs\internal\internal_wounds\sanity.dm"
@@ -2375,7 +2353,6 @@
#include "code\modules\overmap\ships\engines\thermal.dm"
#include "code\modules\paperwork\carbonpaper.dm"
#include "code\modules\paperwork\clipboard.dm"
-#include "code\modules\paperwork\faxmachine.dm"
#include "code\modules\paperwork\filingcabinet.dm"
#include "code\modules\paperwork\folders.dm"
#include "code\modules\paperwork\handlabeler.dm"
@@ -2700,7 +2677,6 @@
#include "code\modules\shuttles\shuttle_emergency.dm"
#include "code\modules\shuttles\shuttle_ferry.dm"
#include "code\modules\shuttles\shuttle_specops.dm"
-#include "code\modules\shuttles\shuttle_supply.dm"
#include "code\modules\shuttles\shuttles_multi.dm"
#include "code\modules\sprite_accessories\_accessory.dm"
#include "code\modules\sprite_accessories\_accessory_facial.dm"
diff --git a/code/__DEFINES/chemistry.dm b/code/__DEFINES/chemistry.dm
index d0fb039b93..fb020ed812 100644
--- a/code/__DEFINES/chemistry.dm
+++ b/code/__DEFINES/chemistry.dm
@@ -58,6 +58,8 @@
#define CE_DYNAMICFINGERS "dynamic fingers"
#define CE_BONE_MEND "bone mending" // Ossisine
#define CE_ONCOCIDAL "anticancer"
+#define CE_BRAINHEAL "neural tissue restoration"
+#define CE_EYEHEAL "sensory organ regeneration stimulant"
// Chem effects for robotic/assisted organs
#define CE_MECH_STABLE "cooling"
diff --git a/code/__DEFINES/dcs/helpers.dm b/code/__DEFINES/dcs/helpers.dm
index 4d726e96d6..d1ff4fbc8d 100644
--- a/code/__DEFINES/dcs/helpers.dm
+++ b/code/__DEFINES/dcs/helpers.dm
@@ -26,3 +26,7 @@
/// A wrapper for _LoadComponent that allows us to pretend we're using normal named arguments
#define LoadComponent(arguments...) _LoadComponent(list(##arguments))
+
+/// A null statement to guard against EmptyBlock lint without necessitating the use of pass()
+/// Used to avoid proc-call overhead. But use sparingly. Probably pointless in most places.
+#define EMPTY_BLOCK_GUARD ;
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index c8261166e2..d13f05b20a 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -94,7 +94,7 @@
// /mob/living signals
#define COMSIG_LIVING_STUN_EFFECT "stun_effect_act" //mob/living/proc/stun_effect_act()
-#define COMSIG_CARBON_HAPPY "carbon_happy" //drugs o ethanol in blood
+#define COMSIG_CARBON_HAPPY "carbon_happy" //drugs or ethanol in blood
// /mob/living/carbon signals
#define COMSIG_CARBON_ELECTROCTE "carbon_electrocute act" //mob/living/carbon/electrocute_act()
diff --git a/code/__DEFINES/spawner/_spawner.dm b/code/__DEFINES/spawner/_spawner.dm
index d9d93405ba..aba0bd0d71 100644
--- a/code/__DEFINES/spawner/_spawner.dm
+++ b/code/__DEFINES/spawner/_spawner.dm
@@ -387,6 +387,15 @@
#define SPAWN_TAG_MEDICINE_CONTRABAND SPAWN_TAG_MEDICINE+";"+SPAWN_CONTRABAND
#define SPAWN_TAG_MEDICINE_ADVANCED SPAWN_TAG_MEDICINE+";"+SPAWN_MEDICINE_ADVANCED
+//ITEMS - DRUGS
+#define SPAWN_DRUG "drug"
+#define SPAWN_CIGARETTE "cigarettes"
+#define SPAWN_CIGARETTE_MAINTS "maint cigarettes"
+
+#define SPAWN_TAG_DRUG SPAWN_TAG_ITEM+";"+SPAWN_DRUG
+#define SPAWN_TAG_CIGARETTE SPAWN_TAG_DRUG+";"+SPAWN_CIGARETTE
+#define SPAWN_TAG_CIGARETTE_MAINTS SPAWN_TAG_DRUG+";"+SPAWN_CIGARETTE_MAINTS
+
//ITEMS - BEAKER
#define SPAWN_TAG_VIAL SPAWN_TAG_ITEM+";"+SPAWN_SCIENCE+";"+SPAWN_MEDICAL+";beaker;vial"
diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm
index d67b6b1df4..d689a1f703 100644
--- a/code/__HELPERS/_logging.dm
+++ b/code/__HELPERS/_logging.dm
@@ -116,9 +116,6 @@
if (config.log_adminwarn)
game_log("ADMINWARN", text)
-/proc/log_pda(text)
- if (config.log_pda)
- game_log("PDA", text)
/**
* Appends a tgui-related log entry. All arguments are optional.
diff --git a/code/__HELPERS/artwork_names.dm b/code/__HELPERS/artwork_names.dm
index ee8bbf5ec3..5f62d461dd 100644
--- a/code/__HELPERS/artwork_names.dm
+++ b/code/__HELPERS/artwork_names.dm
@@ -106,6 +106,7 @@ GLOBAL_LIST_INIT(art_description_types_statue, file2list("strings/artist_strings
var/description_artwork_statue = pick(description_artwork_statue_verb,description_artwork_statue_stationary)
var/description_statue = "[description_artwork_statue] [get_artwork_description()]"
+ description_statue += qualitydesc
desc += " [description_statue]"
return description_statue
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index f747feb7bd..89b369cd2b 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -123,7 +123,8 @@ var/global/list/organ_tag_to_name = list(
groin = "groin",l_leg = "left leg",
chest2= "back", heart = "heart",
lungs = "lungs", liver = "liver",
- "left kidney" = "left kidney", "right kidney" = "right kidney",
+ "left kidney" = "left kidney",
+ "right kidney" = "right kidney",
stomach = "stomach", brain = "brain"
)
diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm
index 6866322efd..9ebca36570 100644
--- a/code/__HELPERS/names.dm
+++ b/code/__HELPERS/names.dm
@@ -17,63 +17,6 @@ var/command_name
/proc/system_name()
return "Nyx"
-/proc/station_name()
- if (station_name)
- return station_name
-
- var/random = rand(1, 5)
- var/name = ""
-
- //Rare: Pre-Prefix
- if (prob(10))
- name = pick("Imperium", "Heretical", "Cuban", "Psychic", "Elegant", "Common", "Uncommon", "Rare", "Unique", "Houseruled", "Religious", "Atheist", "Traditional", "Houseruled", "Mad", "Super", "Ultra", "Secret", "Top Secret", "Deep", "Death", "Zybourne", "Central", "Main", "Government", "Uoi", "Fat", "Automated", "Experimental", "Augmented")
- station_name = name + " "
-
- // Prefix
- switch(Holiday)
- //get normal name
- if(null, "", 0)
- name = pick("", "Stanford", "Dorf", "Alium", "Prefix", "Clowning", "Aegis", "Ishimura", "Scaredy", "Death-World", "Mime", "Honk", "Rogue", "MacRagge", "Ultrameens", "Safety", "Paranoia", "Explosive", "Neckbear", "Donk", "Muppet", "North", "West", "East", "South", "Slant-ways", "Widdershins", "Rimward", "Expensive", "Procreatory", "Imperial", "Unidentified", "Immoral", "Carp", "Ork", "Pete", "Control", "Nettle", "Aspie", "Class", "Crab", "Fist", "Corrogated", "Skeleton", "Race", "Fatguy", "Gentleman", "Capitalist", "Communist", "Bear", "Beard", "Derp", "Space", "Spess", "Star", "Moon", "System", "Mining", "Neckbeard", "Research", "Supply", "Military", "Orbital", "Battle", "Science", "Asteroid", "Home", "Production", "Transport", "Delivery", "Extraplanetary", "Orbital", "Correctional", "Robot", "Hats", "Pizza")
- if(name)
- station_name += name + " "
-
- //For special days like christmas, easter, new-years etc ~Carn
- if("Friday the 13th")
- name = pick("Mike", "Friday", "Evil", "Myers", "Murder", "Deathly", "Stabby")
- station_name += name + " "
- random = 13
- else
- //get the first word of the Holiday and use that
- var/i = findtext(Holiday, " ", 1, 0)
- name = copytext(Holiday, 1, i)
- station_name += name + " "
-
- // Suffix
- name = pick("Station", "Fortress", "Frontier", "Suffix", "Death-trap", "Space-hulk", "Lab", "Hazard", "Spess Junk", "Fishery", "No-Moon", "Tomb", "Crypt", "Hut", "Monkey", "Bomb", "Trade Post", "Fortress", "Village", "Town", "City", "Edition", "Hive", "Complex", "Base", "Facility", "Depot", "Outpost", "Installation", "Drydock", "Observatory", "Array", "Relay", "Monitor", "Platform", "Construct", "Hangar", "Prison", "Center", "Port", "Waystation", "Factory", "Waypoint", "Stopover", "Hub", "HQ", "Office", "Object", "Fortification", "Colony", "Planet-Cracker", "Roost", "Fat Camp")
- station_name += name + " "
-
- // ID Number
- switch(random)
- if(1)
- station_name += "[rand(1, 99)]"
- if(2)
- station_name += pick("Alpha", "Beta", "Gamma", "Delta", "Epsilon", "Zeta", "Eta", "Theta", "Iota", "Kappa", "Lambda", "Mu", "Nu", "Xi", "Omicron", "Pi", "Rho", "Sigma", "Tau", "Upsilon", "Phi", "Chi", "Psi", "Omega")
- if(3)
- station_name += pick("II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII", "XIII", "XIV", "XV", "XVI", "XVII", "XVIII", "XIX", "XX")
- if(4)
- station_name += pick("Alpha", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf", "Hotel", "India", "Juliet", "Kilo", "Lima", "Mike", "November", "Oscar", "Papa", "Quebec", "Romeo", "Sierra", "Tango", "Uniform", "Victor", "Whiskey", "X-ray", "Yankee", "Zulu")
- if(5)
- station_name += pick("One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen")
- if(13)
- station_name += pick("13", "XIII", "Thirteen")
-
-
- if (config && config.server_name)
- world.name = "[config.server_name]: [name]"
- else
- world.name = station_name
-
- return station_name
/proc/world_name(var/name)
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index 9e2e67cd60..908ed52f35 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -367,7 +367,7 @@ proc/TextPreview(var/string, var/len=40)
//For generating neat chat tag-images
//The icon var could be local in the proc, but it's a waste of resources
// to always create it and then throw it out.
-/var/icon/text_tag_icons = new('./icons/chattags.dmi')
+/var/icon/text_tag_icons = new('icons/chattags.dmi')
/proc/create_text_tag(var/tagname, var/tagdesc = tagname, var/client/C = null)
if(!(C && C.get_preference_value(/datum/client_preference/chat_tags) == GLOB.PREF_SHOW))
return tagdesc
diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm
index 64490cafee..7eb9642197 100644
--- a/code/__HELPERS/turfs.dm
+++ b/code/__HELPERS/turfs.dm
@@ -246,7 +246,7 @@
//Used for clicks on blackspace
/proc/screen_loc2turf(text, turf/origin)
if(!origin)
- return null
+ return
var/tZ = splittext(text, ",")
var/tX = splittext(tZ[1], "-")
var/tY = text2num(tX[2])
@@ -255,4 +255,5 @@
tZ = origin.z
tX = max(1, min(origin.x + 7 - tX, world.maxx))
tY = max(1, min(origin.y + 7 - tY, world.maxy))
- return locate(tX, tY, tZ)
+ return (locate(tX, tY, tZ))
+
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index aa2e8b8d29..c3bcd2e4d3 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -22,16 +22,15 @@
while (i)
var/char = text2ascii(hex, i)
switch(char)
- if(48) // 0 -- do nothing
- if(49 to 57) num += (char - 48) * power // 1-9
- if(97, 65) num += power * 10 // A
- if(98, 66) num += power * 11 // B
- if(99, 67) num += power * 12 // C
- if(100, 68) num += power * 13 // D
- if(101, 69) num += power * 14 // E
- if(102, 70) num += power * 15 // F
- else
- return
+ if(48) pass()
+ if(49 to 57) num += (char - 48) * power// 1-9
+ if(97,65) num += power * 10// A
+ if(98,66) num += power * 11// B
+ if(99,67) num += power * 12// C
+ if(100,68) num += power * 13// D
+ if(101,69) num += power * 14// E
+ if(102,70) num += power * 15// F
+ else return
power *= 16
i--
return num
@@ -84,6 +83,7 @@ var/global/list/hexdigits = list("0", "1", "2", "3", "4", "5", "6", "7", "8", "9
if (SOUTHWEST) return "southwest"
if (UP) return "up"
if (DOWN) return "down"
+ return NONE
// Turns text into proper directions
/proc/text2dir(direction)
@@ -96,6 +96,7 @@ var/global/list/hexdigits = list("0", "1", "2", "3", "4", "5", "6", "7", "8", "9
if ("NORTHWEST") return 9
if ("SOUTHEAST") return 6
if ("SOUTHWEST") return 10
+ return NONE
//Converts an angle (degrees) into a ss13 direction
GLOBAL_LIST_INIT(modulo_angle_to_dir, list(NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH,SOUTHWEST,WEST,NORTHWEST))
diff --git a/code/_compile_options.dm b/code/_compile_options.dm
index a950431b6f..2f97c6bde4 100644
--- a/code/_compile_options.dm
+++ b/code/_compile_options.dm
@@ -71,7 +71,7 @@
#warn compiling in TESTING mode. testing() debug messages will be visible.
#endif
-#ifdef CIBUILDING
+#if defined(CIBUILDING) && !defined(OPENDREAM)
#define UNIT_TESTS
#endif
@@ -118,3 +118,16 @@
/// Call by name proc reference, checks if the proc is existing global proc
#define GLOBAL_PROC_REF(X) (/proc/##X)
#endif
+
+#if defined(OPENDREAM)
+ #if !defined(CIBUILDING)
+ #warn You are building with OpenDream. Remember to build TGUI manually.
+ #warn You can do this by running tgui-build.cmd from the bin directory.
+ #endif
+#else
+ #if !defined(CBT) && !defined(SPACEMAN_DMM)
+ #warn Building with Dream Maker is no longer supported and will result in errors.
+ #warn In order to build, run BUILD.cmd in the root directory.
+ #warn Consider switching to VSCode editor instead, where you can press Ctrl+Shift+B to build.
+ #endif
+#endif
diff --git a/code/_onclick/hud/screen_objects/base_screen_objects.dm b/code/_onclick/hud/screen_objects/base_screen_objects.dm
index 1962aecf8a..5328d06810 100644
--- a/code/_onclick/hud/screen_objects/base_screen_objects.dm
+++ b/code/_onclick/hud/screen_objects/base_screen_objects.dm
@@ -641,7 +641,6 @@
update_icon()
/obj/screen/nutrition/update_icon()
- set src in usr.client.screen
var/mob/living/carbon/human/H = parentmob
cut_overlays()
switch(H.nutrition)
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 9a7050d4cf..f5bc93ef95 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -40,7 +40,7 @@ avoid code duplication. This includes items that may sometimes act as a standard
var/mob/living/carbon/human/H = user
if(H.blocking)
H.stop_blocking()
- if(ishuman(user) && !(user == A) && !(user.loc == A) && (volumeClass >= ITEM_SIZE_NORMAL) && wielded && user.a_intent == I_HURT && !istype(src, /obj/item/gun) && !istype(A, /obj/structure) && !istype(A, /turf/simulated/wall) && A.loc != user)
+ if(ishuman(user) && !(user == A) && !(user.loc == A) && (volumeClass >= ITEM_SIZE_NORMAL) && wielded && user.a_intent == I_HURT && !istype(src, /obj/item/gun) && !istype(A, /obj/structure) && !istype(A, /turf/simulated/wall) && A.loc != user && !no_swing)
swing_attack(A, user, params)
if(istype(A, /turf/simulated/floor)) // shitty hack so you can attack floors while wielding a large weapon
return A.attackby(src, user, params)
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 644e5196b5..1a3122b2be 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -538,9 +538,6 @@ GLOBAL_LIST_EMPTY(storyteller_cache)
if("popup_admin_pm")
config.popup_admin_pm = 1
- if("allow_holidays")
- Holiday = 1
-
if("use_irc_bot")
use_irc_bot = 1
@@ -852,7 +849,7 @@ GLOBAL_LIST_EMPTY(storyteller_cache)
else //probably windows, if not this should work anyway
config.python_path = "python"
- world.name = station_name()
+ world.name = station_name
/datum/configuration/proc/LoadChatFilter()
diff --git a/code/controllers/subsystems/mapping.dm b/code/controllers/subsystems/mapping.dm
index 76d34a0555..29d93ee08d 100644
--- a/code/controllers/subsystems/mapping.dm
+++ b/code/controllers/subsystems/mapping.dm
@@ -25,12 +25,18 @@ SUBSYSTEM_DEF(mapping)
admin_notice("Error: No asteroid z-levels defined in config!")
if(config.use_overmap)
+
if(!GLOB.maps_data.overmap_z)
build_overmap()
+ #ifdef TESTING
else
testing("Overmap already exist in GLOB.maps_data for [GLOB.maps_data.overmap_z].")
+ #endif
+
+ #ifdef TESTING
else
testing("Overmap generation disabled in config.")
+ #endif
// world.max_z_changed() // This is to set up the player z-level list, maxz hasn't actually changed (probably)
maploader = new()
diff --git a/code/controllers/subsystems/supply.dm b/code/controllers/subsystems/supply.dm
deleted file mode 100644
index b717e75e54..0000000000
--- a/code/controllers/subsystems/supply.dm
+++ /dev/null
@@ -1,187 +0,0 @@
-SUBSYSTEM_DEF(supply)
- name = "Supply"
- wait = 30 SECONDS
- priority = SS_PRIORITY_SUPPLY
- flags = SS_NO_FIRE
-
-/datum/controller/subsystem/supply
- //supply points
- var/centcom_message = ""
- var/list/exports = list() //List of export datums
- var/contraband = 0
- var/hacked = 0
- //control
- var/ordernum
- var/list/shoppinglist = list()
- var/list/requestlist = list()
- var/list/supply_packs = list()
- //shuttle movement
- var/movetime = 300
- var/datum/shuttle/autodock/ferry/supply/shuttle
-
-/datum/controller/subsystem/supply/Initialize(start_timeofday)
- ordernum = rand(1, 9000)
-
- for(var/typepath in subtypesof(/datum/supply_pack))
- var/datum/supply_pack/P = new typepath()
- supply_packs[P.name] = P
-
- return ..()
-
-
-/datum/controller/subsystem/supply/stat_entry()
- ..("Credits: [get_account_credits(department_accounts[DEPARTMENT_GUILD])]")
-
-//To stop things being sent to centcom which should not be sent to centcom. Recursively checks for these types.
-/datum/controller/subsystem/supply/proc/forbidden_atoms_check(atom/A)
- if(isliving(A))
- return TRUE
- if(istype(A, /obj/item/disk/nuclear))
- return TRUE
- if(istype(A, /obj/machinery/nuclearbomb))
- return TRUE
- if(istype(A, /obj/item/device/radio/beacon))
- return TRUE
-
- for(var/i in 1 to A.contents.len)
- var/atom/B = A.contents[i]
- if(.(B))
- return TRUE
-
-//Sellin
-/datum/controller/subsystem/supply/proc/sell()
- var/msg = ""
- var/sold_atoms = ""
- var/points = 0
-
- for(var/area/subarea in shuttle.shuttle_area)
- for(var/atom/movable/AM in subarea)
- if(AM.anchored)
- continue
- SEND_SIGNAL_OLD(shuttle, COMSIG_SHUTTLE_SUPPLY, AM)
- sold_atoms += export_item_and_contents(AM, contraband, hacked, dry_run = FALSE)
-
- for(var/A in exports)
- var/datum/export/E = A
- var/export_text = E.total_printout()
- if(!export_text)
- continue
-
- msg += "[export_text]
"
- points += E.total_cost
-
- msg += "
Total exports value: [points] credits.
"
- exports.Cut()
-
- var/datum/money_account/GA = department_accounts[DEPARTMENT_GUILD]
- var/datum/transaction/T = new(points, "Asters Guild", "Exports", "Asters Automated Trading System")
- T.apply_to(GA)
-
- centcom_message = msg
-
-
-//Buyin
-/datum/controller/subsystem/supply/proc/buy()
- if(!shoppinglist.len)
- return
-
- var/list/clear_turfs = list()
-
- for(var/area/subarea in shuttle.shuttle_area)
- for(var/turf/T in subarea)
- if(T.density)
- continue
-
- var/contcount
- for(var/atom/A in T.contents)
- if(!A.simulated)
- continue
- contcount++
- if(contcount)
- continue
- clear_turfs += T
-
- for(var/S in shoppinglist)
- if(!clear_turfs.len)
- break
-
- var/i = rand(1,clear_turfs.len)
- var/turf/pickedloc = clear_turfs[i]
- clear_turfs.Cut(i,i+1)
-
- var/datum/supply_order/SO = S
- var/datum/supply_pack/SP = SO.object
- var/obj/A = new SP.containertype(pickedloc)
- A.name = "[SP.name][SO.reason ? " ([SO.reason])":"" ]"
-
- //supply manifest generation begin
-
- var/obj/item/paper/manifest/slip
- if(!SP.contraband)
- slip = new /obj/item/paper/manifest(A)
- slip.is_copy = 0
- slip.info = "
Shipping Manifest
"
- slip.info +="Order #[SO.id]
"
- slip.info +="Destination: [station_name]
"
- slip.info +="[shoppinglist.len] PACKAGES IN THIS SHIPMENT
"
- slip.info +="CONTENTS:
"
-
- //spawn the stuff, finish generating the manifest while you're at it
- if(SP.access)
- if(isnum(SP.access))
- A.req_access = list(SP.access)
- else if(islist(SP.access))
- var/list/L = SP.access // access var is a plain var, we need a list
- A.req_access = L.Copy()
- else
- to_chat(world, "Supply pack with invalid access restriction [SP.access] encountered!")
-
- var/list/contains
- if(istype(SP,/datum/supply_pack/randomised))
- var/datum/supply_pack/randomised/SPR = SP
- contains = list()
- if(SPR.contains.len)
- for(var/j=1,j<=SPR.num_contained,j++)
- contains += pick(SPR.contains)
- else
- contains = SP.contains
-
- for(var/typepath in contains)
- if(!typepath)
- continue
-
- var/atom/movable/B2
- if(ispath(typepath, /obj/spawner))
- var/obj/randomcatcher/CATCH = new /obj/randomcatcher
- B2 = CATCH.get_item(typepath)
- B2.forceMove(A)
- else
- B2 = new typepath(A)
- B2.surplus_tag = TRUE
- var/list/n_contents = B2.GetAllContents()
- for(var/atom/movable/I in n_contents)
- I.surplus_tag = TRUE
- /* So you can't really just buy crates, then instantly resell them for a potential profit depending on if the crate hasn't had its cost scaled properly.
- * Yes, there are limits, I could itterate over every content of the item too and set its surplus_tag to TRUE
- * But that doesn't work with stackables when you can just make a new stack, and gets comp-expensive and not worth it just to spite people getting extra numbers
- */
-
- if(SP.amount && B2:amount) B2:amount = SP.amount
- if(slip) slip.info += "- [B2.name]
" //add the item to the manifest
-
- //manifest finalisation
- if(slip)
- slip.info += "
"
- slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
"
- slip.update_icon()
-
- shoppinglist.Cut()
- return
-
-//Deducts credits from the guild account to pay for external purchases
-/proc/pay_for_order(datum/supply_order/order, terminal)
- var/datum/money_account/GA = department_accounts[DEPARTMENT_GUILD]
- if (!GA)
- return FALSE
-
- return charge_to_account(GA.account_number, order.orderer, "Order of [order.object.name]", terminal, order.object.cost)
diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm
index 1c87e3a966..28dcd31d9d 100644
--- a/code/controllers/subsystems/ticker.dm
+++ b/code/controllers/subsystems/ticker.dm
@@ -260,8 +260,6 @@ SUBSYSTEM_DEF(ticker)
GLOB.storyteller.set_up()
to_chat(world, "Enjoy the game!")
SEND_SOUND(world, sound('sound/AI/welcome.ogg')) // Skie
- //Holiday Round-start stuff ~Carn
- Holiday_Game_Start()
for(var/mob/new_player/N in SSmobs.mob_list)
N.new_player_panel_proc()
@@ -486,22 +484,22 @@ SUBSYSTEM_DEF(ticker)
var/turf/playerTurf = get_turf(Player)
if(evacuation_controller.round_over() && evacuation_controller.emergency_evacuation)
if(isNotAdminLevel(playerTurf.z))
- to_chat(Player, "You managed to survive, but were marooned on [station_name()] as [Player.real_name]...")
+ to_chat(Player, "You managed to survive, but were marooned on [station_name] as [Player.real_name]...")
else
- to_chat(Player, "You managed to survive the events on [station_name()] as [Player.real_name].")
+ to_chat(Player, "You managed to survive the events on [station_name] as [Player.real_name].")
else if(isAdminLevel(playerTurf.z))
- to_chat(Player, "You successfully underwent crew transfer after events on [station_name()] as [Player.real_name].")
+ to_chat(Player, "You successfully underwent crew transfer after events on [station_name] as [Player.real_name].")
else if(issilicon(Player))
- to_chat(Player, "You remain operational after the events on [station_name()] as [Player.real_name].")
+ to_chat(Player, "You remain operational after the events on [station_name] as [Player.real_name].")
else
- to_chat(Player, "You missed the crew transfer after the events on [station_name()] as [Player.real_name].")
+ to_chat(Player, "You missed the crew transfer after the events on [station_name] as [Player.real_name].")
else
if(isghost(Player))
var/mob/observer/ghost/O = Player
if(!O.started_as_observer)
- to_chat(Player, "You did not survive the events on [station_name()]...")
+ to_chat(Player, "You did not survive the events on [station_name]...")
else
- to_chat(Player, "You did not survive the events on [station_name()]...")
+ to_chat(Player, "You did not survive the events on [station_name]...")
to_chat(world, "
")
for(var/mob/living/silicon/ai/aiPlayer in SSmobs.mob_list)
@@ -575,3 +573,4 @@ SUBSYSTEM_DEF(ticker)
if(GAME_STATE_PLAYING)
Master.SetRunLevel(RUNLEVEL_GAME)
if(GAME_STATE_FINISHED)
+ EMPTY_BLOCK_GUARD
diff --git a/code/datums/autolathe/autolathe_datums.dm b/code/datums/autolathe/autolathe_datums.dm
index f7845ec928..ee117c565b 100644
--- a/code/datums/autolathe/autolathe_datums.dm
+++ b/code/datums/autolathe/autolathe_datums.dm
@@ -93,7 +93,7 @@
adjust_materials = FALSE
for(var/a in mats)
- var/amount = mats[a] * multiplier
+ var/amount = mats[a]
if(amount)
LAZYAPLUS(materials, a, amount)
diff --git a/code/datums/autolathe/biomatter.dm b/code/datums/autolathe/biomatter.dm
index 21ff73ff37..0ec11fbee3 100644
--- a/code/datums/autolathe/biomatter.dm
+++ b/code/datums/autolathe/biomatter.dm
@@ -16,6 +16,12 @@
name = "Soap"
build_path = /obj/item/soap/nanotrasen
+/datum/design/bioprinter/candles
+ name = "Box of Candles"
+ build_path = /obj/item/storage/fancy/candle_box
+ materials = list(MATERIAL_BIOMATTER = 15, MATERIAL_CARDBOARD = 1)
+
+
//[NUTRIMENTS]
/datum/design/bioprinter/ez
name = "EZ-Nutrient"
@@ -85,6 +91,10 @@
name = "NT Church Garment"
build_path = /obj/item/clothing/under/rank/church
+/datum/design/bioprinter/nt_clothes/ritual_robe
+ name = "NT Ritual Robe"
+ build_path = /obj/item/clothing/suit/storage/toggle/robe/ritual_robe
+
/datum/design/bioprinter/nt/spacehelmet/medicus
name = "NT Medicus Helmet"
build_path = /obj/item/clothing/head/space/medicus
@@ -147,7 +157,7 @@
build_path = /obj/item/clothing/accessory/holster
/datum/design/bioprinter/leather/holster/accessory/scabbard
- name = "scabbard"
+ name = "uniform scabbard"
build_path = /obj/item/clothing/accessory/holster/scabbard
/datum/design/bioprinter/leather/holster/accessory/knife
diff --git a/code/datums/autolathe/clothing.dm b/code/datums/autolathe/clothing.dm
index bc088b5305..f946d7d1a5 100644
--- a/code/datums/autolathe/clothing.dm
+++ b/code/datums/autolathe/clothing.dm
@@ -23,11 +23,11 @@
/datum/design/autolathe/clothing/generic_vest_security
name = "security armor"
- build_path = /obj/item/clothing/suit/armor/vest/security
+ build_path = /obj/item/clothing/suit/armor/vest/toggle
/datum/design/autolathe/clothing/generic_vest_security_full
name = "fullbody security armor"
- build_path = /obj/item/clothing/suit/armor/vest/full/security
+ build_path = /obj/item/clothing/suit/armor/vest/toggle/full
/datum/design/autolathe/clothing/generic_vest_webbing
name = "webbed armor vest"
diff --git a/code/datums/autolathe/containers.dm b/code/datums/autolathe/containers.dm
index d8961a095a..693bd5a34c 100644
--- a/code/datums/autolathe/containers.dm
+++ b/code/datums/autolathe/containers.dm
@@ -77,11 +77,11 @@
build_path = /obj/item/storage/hcases/parts
/datum/design/autolathe/container/hcase_med
- name = "Parts Hardcase"
+ name = "Medical Hardcase"
build_path = /obj/item/storage/hcases/med
/datum/design/autolathe/container/hcase_engi
- name = "Parts Hardcase"
+ name = "Tool Hardcase"
build_path = /obj/item/storage/hcases/engi
/datum/design/autolathe/bodybag/cryobag
diff --git a/code/datums/objective/custom.dm b/code/datums/objective/custom.dm
index 8b2fa8b37e..104c608a57 100644
--- a/code/datums/objective/custom.dm
+++ b/code/datums/objective/custom.dm
@@ -8,7 +8,7 @@
if(..())
return TRUE
if(href_list["set_explane"])
- var/new_explane = input(usr, "Set explanation text", "Custom objective", explanation_text, "message")
+ var/new_explane = input(usr, "Set explanation text", "Custom objective", explanation_text)
if(!new_explane)
return
explanation_text = new_explane
diff --git a/code/datums/outfits/jobs/_defines.dm b/code/datums/outfits/jobs/_defines.dm
index b26fcf9461..25ba882d3e 100644
--- a/code/datums/outfits/jobs/_defines.dm
+++ b/code/datums/outfits/jobs/_defines.dm
@@ -1,25 +1,26 @@
#define OUTFIT_JOB_NAME(job_name) ("Job - " + job_name)
#define BACKPACK_OVERRIDE_ENGINEERING \
-backpack_overrides[/decl/backpack_outfit/backpack] = /obj/item/storage/backpack/industrial; \
-backpack_overrides[/decl/backpack_outfit/satchel] = /obj/item/storage/backpack/satchel/industrial; \
+backpack_overrides[/decl/backpack_outfit/backpack] = /obj/item/storage/backpack/industrial; \
+backpack_overrides[/decl/backpack_outfit/satchel] = /obj/item/storage/backpack/satchel/industrial; \
#define BACKPACK_OVERRIDE_MEDICAL \
-backpack_overrides[/decl/backpack_outfit/backpack] = /obj/item/storage/backpack/medical; \
-backpack_overrides[/decl/backpack_outfit/backsport] = /obj/item/storage/backpack/sport/white; \
-backpack_overrides[/decl/backpack_outfit/satchel] = /obj/item/storage/backpack/satchel/medical; \
+backpack_overrides[/decl/backpack_outfit/backpack] = /obj/item/storage/backpack/medical; \
+backpack_overrides[/decl/backpack_outfit/backsport] = /obj/item/storage/backpack/sport/white; \
+backpack_overrides[/decl/backpack_outfit/satchel] = /obj/item/storage/backpack/satchel/medical; \
#define BACKPACK_OVERRIDE_RESEARCH \
-backpack_overrides[/decl/backpack_outfit/backpack] = /obj/item/storage/backpack/purple/scientist; \
-backpack_overrides[/decl/backpack_outfit/backsport] = /obj/item/storage/backpack/sport/purple; \
-backpack_overrides[/decl/backpack_outfit/satchel] = /obj/item/storage/backpack/satchel/purple/scientist; \
+backpack_overrides[/decl/backpack_outfit/backpack] = /obj/item/storage/backpack/purple/scientist; \
+backpack_overrides[/decl/backpack_outfit/backsport] = /obj/item/storage/backpack/sport/purple; \
+backpack_overrides[/decl/backpack_outfit/satchel] = /obj/item/storage/backpack/satchel/purple/scientist; \
#define BACKPACK_OVERRIDE_SECURITY \
-backpack_overrides[/decl/backpack_outfit/backpack] = /obj/item/storage/backpack/ironhammer; \
-backpack_overrides[/decl/backpack_outfit/backsport] = /obj/item/storage/backpack/sport/ironhammer; \
-backpack_overrides[/decl/backpack_outfit/satchel] = /obj/item/storage/backpack/satchel/ironhammer; \
+backpack_overrides[/decl/backpack_outfit/backpack] = /obj/item/storage/backpack/ironhammer; \
+backpack_overrides[/decl/backpack_outfit/backsport] = /obj/item/storage/backpack/sport/ironhammer; \
+backpack_overrides[/decl/backpack_outfit/satchel] = /obj/item/storage/backpack/satchel/ironhammer; \
#define BACKPACK_OVERRIDE_NEOTHEOLOGY \
- backpack_overrides[/decl/backpack_outfit/backpack] = /obj/item/storage/backpack/neotheology; \
- backpack_overrides[/decl/backpack_outfit/backsport] = /obj/item/storage/backpack/sport/neotheology; \
- backpack_overrides[/decl/backpack_outfit/satchel] = /obj/item/storage/backpack/satchel/neotheology; \
+backpack_overrides[/decl/backpack_outfit/backpack] = /obj/item/storage/backpack/neotheology; \
+backpack_overrides[/decl/backpack_outfit/backsport] = /obj/item/storage/backpack/sport/neotheology; \
+backpack_overrides[/decl/backpack_outfit/satchel] = /obj/item/storage/backpack/satchel/neotheology; \
+
diff --git a/code/datums/outfits/jobs/science.dm b/code/datums/outfits/jobs/science.dm
index 15569b7410..d3333b105e 100644
--- a/code/datums/outfits/jobs/science.dm
+++ b/code/datums/outfits/jobs/science.dm
@@ -31,11 +31,10 @@
name = OUTFIT_JOB_NAME("Moebius Roboticist")
uniform = /obj/item/clothing/under/rank/roboticist
suit = /obj/item/clothing/suit/storage/robotech_jacket
- belt = /obj/item/storage/belt/utility/full
+ belt = /obj/item/storage/belt/utility
pda_slot = slot_r_store
id_type = /obj/item/card/id/dkgrey
pda_type = /obj/item/modular_computer/pda/moebius/roboticist
- l_hand = /obj/item/storage/toolbox/mechanical
/decl/hierarchy/outfit/job/science/roboticist/New()
..()
diff --git a/code/datums/outfits/jobs/security.dm b/code/datums/outfits/jobs/security.dm
index a568f6a76e..bc8e2ba48d 100644
--- a/code/datums/outfits/jobs/security.dm
+++ b/code/datums/outfits/jobs/security.dm
@@ -23,7 +23,7 @@
id_type = /obj/item/card/id/hos
head = /obj/item/clothing/head/HoS
pda_type = /obj/item/modular_computer/pda/heads/hos
- backpack_contents = list(/obj/item/handcuffs = 1,/obj/item/ammo_magazine/magnum/rubber = 1,/obj/item/device/lighting/toggleable/flashlight/seclite = 1, /obj/item/cell/small/high = 2, /obj/item/gun/energy/gun/martin = 1, /obj/item/clothing/accessory/cross = 1)
+ backpack_contents = list(/obj/item/handcuffs = 1,/obj/item/ammo_magazine/magnum/rubber = 1,/obj/item/device/lighting/toggleable/flashlight/seclite = 1, /obj/item/cell/small/high = 2, /obj/item/gun/energy/gun/martin = 1, /obj/item/flame/lighter/zippo/syndicate = 1, /obj/item/storage/fancy/cigarettes/lucky = 1, /obj/item/clothing/accessory/cross = 1)
/decl/hierarchy/outfit/job/security/gunserg
name = OUTFIT_JOB_NAME("Ironhammer Gunnery Sergeant")
diff --git a/code/datums/perks/oddity.dm b/code/datums/perks/oddity.dm
index 8c10735e51..8206801ea7 100644
--- a/code/datums/perks/oddity.dm
+++ b/code/datums/perks/oddity.dm
@@ -442,7 +442,7 @@
return
var/datum/money_account/KROMER = holder.mind.initial_account
if(holder.get_equipped_item(slot_wear_mask) != my_mask)
- if(!charge_to_account(KROMER.account_number, KROMER.get_name(), "THIS WAS NOT VERY BIG SHOT OF YOU", station_name(), 1997))
+ if(!charge_to_account(KROMER.account_number, KROMER.get_name(), "THIS WAS NOT VERY BIG SHOT OF YOU", station_name, 1997))
holder.adjustCloneLoss(rand(19, 97))
to_chat(src, SPAN_DANGER("You feel like you didn't have enough KROMERS."))
holder.stats.removePerk(type)
@@ -454,7 +454,7 @@
my_mask.style = rand(-2, 2)//EXCLUSIVE OFFICIAL SPAMTON
var/KROMER_GOOD = TRUE
if(KROMER)
- if(!charge_to_account(KROMER.account_number, KROMER.get_name(), "BIG SHOT", station_name(), rand(1, 4)))
+ if(!charge_to_account(KROMER.account_number, KROMER.get_name(), "BIG SHOT", station_name, rand(1, 4)))
KROMER_GOOD = FALSE
else
KROMER_GOOD = FALSE
diff --git a/code/datums/topic/admin.dm b/code/datums/topic/admin.dm
index 8b515812a4..a84a8fb435 100644
--- a/code/datums/topic/admin.dm
+++ b/code/datums/topic/admin.dm
@@ -1080,46 +1080,6 @@
var/obj/item/photo/H = bundle.pages[page]
H.show(source.owner)
-
-/datum/admin_topic/centcomfaxreply
- keyword = "CentcomFaxReply"
-
-/datum/admin_topic/centcomfaxreply/Run(list/input)
- var/mob/sender = locate(input["CentcomFaxReply"])
- var/obj/machinery/photocopier/faxmachine/fax = locate(input["originfax"])
-
- //todo: sanitize
- var/msg = input(source.owner, "Please enter a message to reply to [key_name(sender)] via secure connection. NOTE: BBCode does not work, but HTML tags do! Use
for line breaks.", "Outgoing message from Centcom", "") as message|null
- if(!msg)
- return
-
- var/customname = input(source.owner, "Pick a title for the report", "Title") as text|null
-
- // Create the reply message
- var/obj/item/paper/P = new /obj/item/paper( null ) //hopefully the null loc won't cause trouble for us
- P.name = "[command_name()]- [customname]"
- P.info = msg
- P.update_icon()
-
- // Stamps
- var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
- stampoverlay.icon_state = "paper_stamp-cent"
- if(!P.stamped)
- P.stamped = new
- P.stamped += /obj/item/stamp
- P.overlays += stampoverlay
- P.stamps += "
This paper has been stamped by the [boss_name] Quantum Relay."
-
- if(fax.recievefax(P))
- to_chat(source.owner, "\blue Message reply to transmitted successfully.")
- log_admin("[key_name(source.owner)] replied to a fax message from [key_name(sender)]: [msg]")
- message_admins("[key_name_admin(source.owner)] replied to a fax message from [key_name_admin(sender)]", 1)
- else
- to_chat(source.owner, "\red Message reply failed.")
-
- QDEL_IN(P, 100)
-
-
/datum/admin_topic/jumpto
keyword = "jumpto"
require_perms = list(R_ADMIN)
diff --git a/code/datums/uplink/badassery.dm b/code/datums/uplink/badassery.dm
index 672bab8d7c..951bcc0107 100644
--- a/code/datums/uplink/badassery.dm
+++ b/code/datums/uplink/badassery.dm
@@ -83,6 +83,13 @@
path = /obj/item/storage/case/donut
desc = "A rare donut case, that can only be purchased on the black market. Contains masterfully made donuts, with unique effects for those who eat them."
+/datum/uplink_item/item/badassery/luckystrike
+ name = "Lucky Strikes Pack"
+ item_cost = 1
+ antag_roles = list(ROLE_CONTRACTOR,ROLE_MARSHAL,ROLE_INQUISITOR,ROLE_MERCENARY,ROLE_CARRION)
+ path = /obj/item/storage/fancy/cigarettes/lucky
+ desc = "An old pack of Lucky Strikes brand cigarettes, surplus from the Corporate wars. Used by the Syndicate extremely frequently, for some reason."
+
/datum/uplink_item/item/badassery/contract
name = "Ask for new contract"
item_cost = 4
diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm
index 2b9006c99c..444cec93c6 100644
--- a/code/defines/procs/announce.dm
+++ b/code/defines/procs/announce.dm
@@ -103,13 +103,13 @@ datum/announcement/proc/Log(message as text, message_title as text)
return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name
/proc/level_seven_announcement()
- command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
+ command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard [station_name]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
/proc/level_eight_announcement() //new announcment so the crew doesn't have to fuck around trying to figure out if its a blob, hivemind, or a literal fungus
- command_announcement.Announce("Confirmed outbreak of level 8 Bio-mechanical infestation aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
+ command_announcement.Announce("Confirmed outbreak of level 8 Bio-mechanical infestation aboard [station_name]. All personnel must contain the outbreak.", "Biohazard Alert")
/proc/level_eight_beta_announcement() //announcment which tells the crew that the hivemind has been killed, job well done crew.
- command_announcement.Announce("Diagnostic Systems report level 8 Bio-mechanical infestation aboard [station_name()] has been contained.")
+ command_announcement.Announce("Diagnostic Systems report level 8 Bio-mechanical infestation aboard [station_name] has been contained.")
/proc/ion_storm_announcement()
command_announcement.Announce("It has come to our attention that the ship passed through an ion storm. Please monitor all electronic equipment for malfunctions.", "Anomaly Alert")
diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm
index b4e5d79c5b..43b437ca7d 100644
--- a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm
+++ b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm
@@ -57,7 +57,7 @@ var/global/universe_has_ended = 0
spawn(rand(30,60) SECONDS)
var/txt = {"
-AUTOMATED ALERT: Attention [station_name()], this is a high alert broadcast to all ships from the central communication hub of the [boss_name], a catastrophe has happened on the ship [station_name()], information regarding the incident is classified.
+AUTOMATED ALERT: Attention [station_name], this is a high alert broadcast to all ships from the central communication hub of the [boss_name], a catastrophe has happened on the ship [station_name], information regarding the incident is classified.
We highly suggest, that all corporate owned, and free ships within listening range depart into Bluespace. Until the incident ends, all employees aboard HTU operated ships will have their pay-rolls will be frozen, and their have benefits cut, independent ships not included.
diff --git a/code/game/gamemodes/events/brand_intelligence.dm b/code/game/gamemodes/events/brand_intelligence.dm
index 30e3d88acb..1904c83ed7 100644
--- a/code/game/gamemodes/events/brand_intelligence.dm
+++ b/code/game/gamemodes/events/brand_intelligence.dm
@@ -25,7 +25,7 @@
/datum/event/brand_intelligence/announce()
- command_announcement.Announce("Rampant brand intelligence has been detected aboard [station_name()], please stand-by.", "Machine Learning Alert")
+ command_announcement.Announce("Rampant brand intelligence has been detected aboard [station_name], please stand-by.", "Machine Learning Alert")
/datum/event/brand_intelligence/start()
diff --git a/code/game/gamemodes/events/carp_migration.dm b/code/game/gamemodes/events/carp_migration.dm
index 3b184b58c6..7f6a5ac2a5 100644
--- a/code/game/gamemodes/events/carp_migration.dm
+++ b/code/game/gamemodes/events/carp_migration.dm
@@ -46,9 +46,9 @@
/datum/event/carp_migration/announce()
var/announcement = ""
if(severity == EVENT_LEVEL_MAJOR)
- announcement = "Massive migration of unknown biological entities has been detected near [station_name()], please stand-by."
+ announcement = "Massive migration of unknown biological entities has been detected near [station_name], please stand-by."
else
- announcement = "Unknown biological [spawned_carp.len == 1 ? "entity has" : "entities have"] been detected near [station_name()], please stand-by."
+ announcement = "Unknown biological [spawned_carp.len == 1 ? "entity has" : "entities have"] been detected near [station_name], please stand-by."
command_announcement.Announce(announcement, "Lifesign Alert")
/datum/event/carp_migration/start()
diff --git a/code/game/gamemodes/events/grid_check.dm b/code/game/gamemodes/events/grid_check.dm
index daaa3958e5..d66809a2ca 100644
--- a/code/game/gamemodes/events/grid_check.dm
+++ b/code/game/gamemodes/events/grid_check.dm
@@ -32,13 +32,13 @@ So sometimes this event can result in people finding new and interesting things
power_failure(0, strength, GLOB.maps_data.contact_levels)
/datum/event/grid_check/announce()
- command_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the ship's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg')
+ command_announcement.Announce("Abnormal activity detected in [station_name]'s powernet. As a precautionary measure, the ship's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg')
/proc/power_failure(var/announce = 1, var/severity = 2, var/list/affected_z_levels)
if(announce)
- command_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the ship's power will be shut off for an indeterminate duration.", "Critical Power Failure", new_sound = 'sound/AI/poweroff.ogg')
+ command_announcement.Announce("Abnormal activity detected in [station_name]'s powernet. As a precautionary measure, the ship's power will be shut off for an indeterminate duration.", "Critical Power Failure", new_sound = 'sound/AI/poweroff.ogg')
for(var/obj/machinery/power/smes/buildable/S in GLOB.smes_list)
if (is_valid_smes(S))
@@ -53,7 +53,7 @@ So sometimes this event can result in people finding new and interesting things
var/list/skipped_areas = list(/area/turret_protected/ai)
if(announce)
- command_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
+ command_announcement.Announce("Power has been restored to [station_name]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
for(var/obj/machinery/power/apc/C in GLOB.apc_list)
C.failure_timer = 0
if(C.cell)
@@ -70,7 +70,7 @@ So sometimes this event can result in people finding new and interesting things
/proc/power_restore_quick(var/announce = 1)
if(announce)
- command_announcement.Announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
+ command_announcement.Announce("All SMESs on [station_name] have been recharged. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg')
for(var/obj/machinery/power/smes/S in GLOB.smes_list)
S.failure_timer = 0
S.charge = S.capacity
diff --git a/code/game/gamemodes/events/holidays/Christmas.dm b/code/game/gamemodes/events/holidays/Christmas.dm
index 7d0f74e095..a6673fbf6f 100644
--- a/code/game/gamemodes/events/holidays/Christmas.dm
+++ b/code/game/gamemodes/events/holidays/Christmas.dm
@@ -1,21 +1,3 @@
-/proc/Christmas_Game_Start()
- for(var/obj/structure/flora/tree/pine/xmas in world)
- if(isNotStationLevel(xmas.z)) continue
- for(var/turf/simulated/floor/T in RANGE_TURFS(1,xmas))
- for(var/i=1,i<=rand(1,5),i++)
- new /obj/item/a_gift(T)
- //for(var/mob/living/simple_animal/corgi/Ian/Ian in SSmobs.mob_list)
- // Ian.place_on_head(new /obj/item/clothing/head/space/santahat(Ian))
-
-/proc/ChristmasEvent()
- for(var/obj/structure/flora/tree/pine/xmas in world)
- var/mob/living/simple_animal/hostile/tree/evil_tree = new /mob/living/simple_animal/hostile/tree(xmas.loc)
- evil_tree.icon_state = xmas.icon_state
- evil_tree.icon_living = evil_tree.icon_state
- evil_tree.icon_dead = evil_tree.icon_state
- evil_tree.icon_gib = evil_tree.icon_state
- qdel(xmas)
-
/obj/item/toy
price_tag = 5
bad_type = /obj/item/toy
diff --git a/code/game/gamemodes/events/holidays/Holidays.dm b/code/game/gamemodes/events/holidays/Holidays.dm
deleted file mode 100644
index 37e408ae07..0000000000
--- a/code/game/gamemodes/events/holidays/Holidays.dm
+++ /dev/null
@@ -1,152 +0,0 @@
-//Uncommenting ALLOW_HOLIDAYS in config.txt will enable Holidays
-var/global/Holiday = null
-
-//Just thinking ahead! Here's the foundations to a more robust Holiday event system.
-//It's easy as hell to add stuff. Just set Holiday to something using the switch (or something else)
-//then use if(Holiday == "MyHoliday") to make stuff happen on that specific day only
-//Please, Don't spam stuff up with easter eggs, I'd rather somebody just delete this than people cause
-//the game to lag even more in the name of one-day content.
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////
-//ALSO, MOST IMPORTANTLY: Don't add stupid stuff! Discuss bonus content with Project-Heads first please!//
-//////////////////////////////////////////////////////////////////////////////////////////////////////////
-// ~Carn
-
-/hook/startup/proc/updateHoliday()
- Get_Holiday()
- return 1
-
-//sets up the Holiday global variable. Shouldbe called on game configuration or something.
-/proc/Get_Holiday()
- if(!Holiday) return // Holiday stuff was not enabled in the config!
-
- Holiday = null // reset our switch now so we can recycle it as our Holiday name
-
- var/YY = text2num(time2text(world.timeofday, "YY")) // get the current year
- var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month
- var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day
-
- //Main switch. If any of these are too dumb/inappropriate, or you have better ones, feel free to change whatever
- switch(MM)
- if(1) //Jan
- switch(DD)
- if(1) Holiday = "New Year's Day"
-
- if(2) //Feb
- switch(DD)
- if(2) Holiday = "Groundhog Day"
- if(14) Holiday = "Valentine's Day"
- if(17) Holiday = "Random Acts of Kindness Day"
-
- if(3) //Mar
- switch(DD)
- if(14) Holiday = "Pi Day"
- if(17) Holiday = "St. Patrick's Day"
- if(27)
- if(YY == 16)
- Holiday = "Easter"
- if(31)
- if(YY == 13)
- Holiday = "Easter"
-
- if(4) //Apr
- switch(DD)
- if(1)
- Holiday = "April Fool's Day"
- if(YY == 18 && prob(50)) Holiday = "Easter"
- if(5)
- if(YY == 15) Holiday = "Easter"
- if(16)
- if(YY == 17) Holiday = "Easter"
- if(20)
- Holiday = "Four-Twenty"
- if(YY == 14 && prob(50)) Holiday = "Easter"
- if(22) Holiday = "Earth Day"
-
- if(5) //May
- switch(DD)
- if(1) Holiday = "Labour Day"
- if(4) Holiday = "FireFighter's Day"
- if(12) Holiday = "Owl and Pussycat Day" //what a dumb day of observence...but we -do- have costumes already :3
-
- if(6) //Jun
-
- if(7) //Jul
- switch(DD)
- if(1) Holiday = "Doctor's Day"
- if(2) Holiday = "UFO Day"
- if(8) Holiday = "Writer's Day"
- if(30) Holiday = "Friendship Day"
-
- if(8) //Aug
- switch(DD)
- if(5) Holiday = "Beer Day"
-
- if(9) //Sep
- switch(DD)
- if(19) Holiday = "Talk-Like-a-Pirate Day"
- if(28) Holiday = "Stupid-Questions Day"
-
- if(10) //Oct
- switch(DD)
- if(4) Holiday = "Animal's Day"
- if(7) Holiday = "Smiling Day"
- if(16) Holiday = "Boss' Day"
- if(31) Holiday = "Halloween"
-
- if(11) //Nov
- switch(DD)
- if(1) Holiday = "Vegan Day"
- if(13) Holiday = "Kindness Day"
- if(19) Holiday = "Flowers Day"
- if(21) Holiday = "Saying-'Hello' Day"
-
- if(12) //Dec
- switch(DD)
- if(10) Holiday = "Human-Rights Day"
- if(14) Holiday = "Monkey Day"
- if(21) if(YY==12) Holiday = "End of the World"
- if(22) Holiday = "Orgasming Day" //lol. These all actually exist
- if(24) Holiday = "Christmas Eve"
- if(25) Holiday = "Christmas"
- if(26) Holiday = "Boxing Day"
- if(31) Holiday = "New Year's Eve"
-
- if(!Holiday)
- //Friday the 13th
- if(DD == 13)
- if(time2text(world.timeofday, "DDD") == "Fri")
- Holiday = "Friday the 13th"
-
-//Allows GA and GM to set the Holiday variable
-ADMIN_VERB_ADD(/client/proc/Set_Holiday, R_SERVER, null)
-/client/proc/Set_Holiday(T as text|null)
- set name = ".Set Holiday"
- set category = "Fun"
- set desc = "Force-set the Holiday variable to make the game think it's a certain day."
- if(!check_rights(R_SERVER)) return
-
- Holiday = T
- //get a new station name
- station_name = null
- station_name()
- //update our hub status
- world.update_status()
- Holiday_Game_Start()
-
- message_admins("ADMIN: Event: [key_name(src)] force-set Holiday to \"[Holiday]\"")
- log_admin("[key_name(src)] force-set Holiday to \"[Holiday]\"")
-
-
-//Run at the start of a round
-/proc/Holiday_Game_Start()
- if(Holiday)
- to_chat(world, "and...")
- to_chat(world, "Happy [Holiday] Everybody!
")
- switch(Holiday) //special holidays
- if("Easter")
- //do easter stuff
- if("Christmas Eve","Christmas")
- Christmas_Game_Start()
-
- return
diff --git a/code/game/gamemodes/events/infestation.dm b/code/game/gamemodes/events/infestation.dm
index 5afe9d6bea..72ae3ad328 100644
--- a/code/game/gamemodes/events/infestation.dm
+++ b/code/game/gamemodes/events/infestation.dm
@@ -194,7 +194,7 @@ It focuses on spawning large numbers of moderate-to-weak monsters, and includes
//Occasional chance to play the same generic announcement as spiders and carp
//Just to screw with the metagamers even more
if (prob(8))
- command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
+ command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
else
var/list/areanames = list()
for (var/b in chosen_burrows)
diff --git a/code/game/gamemodes/events/ion_storm.dm b/code/game/gamemodes/events/ion_storm.dm
index cfa8883dd9..5cc2819bff 100644
--- a/code/game/gamemodes/events/ion_storm.dm
+++ b/code/game/gamemodes/events/ion_storm.dm
@@ -90,14 +90,6 @@
target.add_ion_law(law)
target.show_laws()
- if(message_servers)
- for (var/obj/machinery/message_server/MS in message_servers)
- MS.spamfilter.Cut()
- var/i
- for (i = 1, i <= MS.spamfilter_limit, i++)
- MS.spamfilter += pick("kitty","HONK","rev","malf","liberty","freedom","drugs", "[station_short]", \
- "admin","ponies","heresy","meow","Pun Pun","monkey","Ian","moron","pizza","message","spam",\
- "director", "Hello", "Hi!"," ","nuke","crate","dwarf","xeno")
/datum/event/ionstorm/end()
spawn(rand(5000,8000))
diff --git a/code/game/gamemodes/events/money_hacker.dm b/code/game/gamemodes/events/money_hacker.dm
index 6c3d1f82db..88d98100e6 100644
--- a/code/game/gamemodes/events/money_hacker.dm
+++ b/code/game/gamemodes/events/money_hacker.dm
@@ -20,7 +20,7 @@
var/message = "A brute force hack has been detected (in progress since [stationtime2text()]). The target of the attack is: Financial account #[affected_account.account_number], \
without intervention this attack will succeed in approximately 10 minutes. Required intervention: temporary suspension of affected accounts until the attack has ceased. \
Notifications will be sent as updates occur.
"
- var/my_department = "[station_name()] firewall subroutines"
+ var/my_department = "[station_name] firewall subroutines"
for(var/obj/machinery/message_server/MS in world)
if(!MS.active) continue
@@ -62,7 +62,7 @@
//crew wins
message = "The attack has ceased, the affected accounts can now be brought online."
- var/my_department = "[station_name()] firewall subroutines"
+ var/my_department = "[station_name] firewall subroutines"
for(var/obj/machinery/message_server/MS in world)
if(!MS.active) continue
diff --git a/code/game/gamemodes/events/money_spam.dm b/code/game/gamemodes/events/money_spam.dm
deleted file mode 100644
index 4ff1660895..0000000000
--- a/code/game/gamemodes/events/money_spam.dm
+++ /dev/null
@@ -1,121 +0,0 @@
-//Disabled due to pending computer rework
-
-/datum/event/pda_spam
- endWhen = 36000
- var/last_spam_time = 0
- var/obj/machinery/message_server/useMS
-
-/datum/event/pda_spam/setup()
- last_spam_time = world.time
- pick_message_server()
-
-/datum/event/pda_spam/proc/pick_message_server()
- if(message_servers)
- for (var/obj/machinery/message_server/MS in message_servers)
- if(MS.active)
- useMS = MS
- break
-/*
-/datum/event/pda_spam/tick()
- if(world.time > last_spam_time + 3000)
- //if there's no spam managed to get to receiver for five minutes, give up
- kill()
- return
-
- if(!useMS || !useMS.active)
- useMS = null
- pick_message_server()
-
- if(useMS)
- if(prob(5))
- // /obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "")
- var/obj/item/device/pda/P
- var/list/viables = list()
- for(var/obj/item/device/pda/check_pda in sortAtom(PDAs))
- if (!check_pda.owner||check_pda.toff||check_pda == src||check_pda.hidden)
- continue
- viables.Add(check_pda)
-
- if(!viables.len)
- return
- P = pick(viables)
-
- var/sender
- var/message
- switch(pick(1,2,3,4,5,6,7))
- if(1)
- sender = pick("MaxBet","MaxBet Online Casino","There is no better time to register","I'm excited for you to join us")
- message = pick("Triple deposits are waiting for you at MaxBet Online when you register to play with us.",\
- "You can qualify for a 200% Welcome Bonus at MaxBet Online when you sign up today.",\
- "Once you are a player with MaxBet, you will also receive lucrative weekly and monthly promotions.",\
- "You will be able to enjoy over 450 top-flight casino games at MaxBet.")
- if(2)
- sender = pick(300;"QuickDatingSystem",200;"Find your russian bride")
- message = pick("Your profile caught my attention and I wanted to write and say hello (QuickDating).",\
- "If you will write to me on my email [pick(first_names_female)]@[pick(last_names)].[pick("ru","ck","tj","ur","nt")] I shall necessarily send you a photo (QuickDating).",\
- "I want that we write each other and I hope, that you will like my profile and you will answer me (QuickDating).",\
- "You have (1) new message!",\
- "You have (2) new profile views!")
- if(3)
- sender = pick("Galactic Payments Association","Better Business Bureau","Nyx E-Payments","NAnoTrasen Finance Deparmtent","Luxury Replicas")
- message = pick("Luxury watches for Blowout sale prices!",\
- "Watches, Jewelry & Accessories, Bags & Wallets !",\
- "Deposit 100[CREDS] and get 300[CREDS] totally free!",\
- " 100K NT.|WOWGOLD �nly [CREDS]89 ",\
- "We have been filed with a complaint from one of your customers in respect of their business relations with you.",\
- "We kindly ask you to open the COMPLAINT REPORT (attached) to reply on this complaint..")
- if(4)
- sender = pick("Buy Dr. Maxman","Having dysfuctional troubles?")
- message = pick("DR MAXMAN: REAL Doctors, REAL Science, REAL Results!",\
- "Dr. Maxman was created by George Acuilar, M.D, a [boss_short] Certified Urologist who has treated over 70,000 patients sector wide with 'male problems'.",\
- "After seven years of research, Dr Acuilar and his team came up with this simple breakthrough male enhancement formula.",\
- "Men of all species report AMAZING increases in length, width and stamina.")
- if(5)
- sender = pick("Dr","Crown prince","King Regent","Professor","Captain")
- sender += " " + pick("Robert","Alfred","Josephat","Kingsley","Sehi","Zbahi")
- sender += " " + pick("Mugawe","Nkem","Gbatokwia","Nchekwube","Ndim","Ndubisi")
- message = pick("YOUR FUND HAS BEEN MOVED TO [pick("Salusa","Segunda","Cepheus","Andromeda","Gruis","Corona","Aquila","ARES","Asellus")] DEVELOPMENTARY BANK FOR ONWARD REMITTANCE.",\
- "We are happy to inform you that due to the delay, we have been instructed to IMMEDIATELY deposit all funds into your account",\
- "Dear fund beneficiary, We have please to inform you that overdue funds payment has finally been approved and released for payment",\
- "Due to my lack of agents I require an off-world financial account to immediately deposit the sum of 1 POINT FIVE MILLION credits.",\
- "Greetings sir, I regretfully to inform you that as I lay dying here due to my lack ofheirs I have chosen you to recieve the full sum of my lifetime savings of 1.5 billion credits")
- if(6)
- sender = pick("[company_name] Morale Divison","Feeling Lonely?","Bored?")
- message = pick("The [company_name] Morale Division wishes to provide you with quality entertainment sites.",\
- "Simply enter your [company_name] Bank account system number and pin. With three easy steps this service could be yours!")
- if(7)
- sender = pick("You have won free tickets!","Click here to claim your prize!","You are the 1000th vistor!","You are our lucky grand prize winner!")
- message = pick("You have won tickets to the newest ACTION JAXSON MOVIE!",\
- "You have won tickets to the newest crime drama DETECTIVE MYSTERY IN THE CLAMITY CAPER!",\
- "You have won tickets to the newest romantic comedy 16 RULES OF LOVE!",\
- "You have won tickets to the newest thriller THE CULT OF THE SLEEPING ONE!")
-
- if (useMS.send_pda_message("[P.owner]", sender, message)) //Message been filtered by spam filter.
- return
-
- last_spam_time = world.time
-
- if (prob(50)) //Give the AI an increased chance to intercept the message
- for(var/mob/living/silicon/ai/ai in SSmobs.mob_list)
- // Allows other AIs to intercept the message but the AI won't intercept their own message.
- if(ai.aiPDA != P && ai.aiPDA != src)
- ai.show_message("Intercepted message from [sender] (Unknown / spam?) to [P:owner]: [message]")
-
- //Commented out because we don't send messages like this anymore. Instead it will just popup in their chat window.
- //P.tnote += "← From [sender] (Unknown / spam?):
[message]
"
-
- if (!P.message_silent)
- playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1)
- for (var/mob/O in hearers(3, P.loc))
- if(!P.message_silent) O.show_message(text("\icon[P] *[P.ttone]*"))
- //Search for holder of the PDA.
- var/mob/living/L = null
- if(P.loc && isliving(P.loc))
- L = P.loc
- //Maybe they are a pAI!
- else
- L = get(P, /mob/living/silicon)
-
- if(L)
- L << "\icon[P] Message from [sender] (Unknown / spam?), \"[message]\" (Unable to Reply)"
-*/
diff --git a/code/game/gamemodes/events/prison_break.dm b/code/game/gamemodes/events/prison_break.dm
index 4c9ee63460..9eef0774e0 100644
--- a/code/game/gamemodes/events/prison_break.dm
+++ b/code/game/gamemodes/events/prison_break.dm
@@ -45,7 +45,7 @@
/datum/event/prison_break/announce()
if(areas && areas.len > 0)
- command_announcement.Announce("[pick("Gr3y.T1d3 virus","Malignant trojan")] detected in [station_name()] [(eventDept == "Security")? "imprisonment":"containment"] subroutines. Secure any compromised areas immediately. Station AI involvement is recommended.", "[eventDept] Alert")
+ command_announcement.Announce("[pick("Gr3y.T1d3 virus","Malignant trojan")] detected in [station_name] [(eventDept == "Security")? "imprisonment":"containment"] subroutines. Secure any compromised areas immediately. Station AI involvement is recommended.", "[eventDept] Alert")
/datum/event/prison_break/start()
@@ -54,7 +54,7 @@
areas += A
if(areas && areas.len > 0)
- var/my_department = "[station_name()] firewall subroutines"
+ var/my_department = "[station_name] firewall subroutines"
var/rc_message = "An unknown malicious program has been detected in the [english_list(areaName)] lighting and airlock control systems at [stationtime2text()]. Systems will be fully compromised within approximately three minutes. Direct intervention is required immediately.
"
for(var/obj/machinery/message_server/MS in world)
MS.send_rc_message("Engineering", my_department, rc_message, "", "", 2)
diff --git a/code/game/gamemodes/events/spider_infestation.dm b/code/game/gamemodes/events/spider_infestation.dm
index 5b5cb72ac8..6d856575f8 100644
--- a/code/game/gamemodes/events/spider_infestation.dm
+++ b/code/game/gamemodes/events/spider_infestation.dm
@@ -31,7 +31,7 @@
/datum/event/spider_infestation/announce()
- command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
+ command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
/datum/event/spider_infestation/start()
diff --git a/code/game/machinery/autolathe/autolathe.dm b/code/game/machinery/autolathe/autolathe.dm
index 69833d0b31..dd78e52513 100644
--- a/code/game/machinery/autolathe/autolathe.dm
+++ b/code/game/machinery/autolathe/autolathe.dm
@@ -552,8 +552,14 @@
return FALSE
if(!length(eating.get_matter()))
- to_chat(user, SPAN_WARNING("\The [eating] does not contain significant amounts of useful materials and cannot be accepted."))
- return FALSE
+ var/matterless = TRUE
+ for(var/obj/O in eating.GetAllContents()) // can now recycle empty shells to get at the contents
+ if(length(O.get_matter()))
+ matterless = FALSE
+ break
+ if(matterless)
+ to_chat(user, SPAN_WARNING("\The [eating] does not contain significant amounts of useful materials and cannot be accepted."))
+ return FALSE
if(istype(eating, /obj/item/computer_hardware/hard_drive/portable))
var/obj/item/computer_hardware/hard_drive/portable/DISK = eating
diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm
index f5c9142794..f63d98b29d 100644
--- a/code/game/machinery/bioprinter.dm
+++ b/code/game/machinery/bioprinter.dm
@@ -19,7 +19,8 @@
var/list/products = list(
OP_HEART = list(/obj/item/organ/internal/vital/heart, 50),
OP_LUNGS = list(/obj/item/organ/internal/vital/lungs, 40),
- OP_KIDNEYS = list(/obj/item/organ/internal/kidney, 20),
+ OP_KIDNEY_LEFT = list(/obj/item/organ/internal/kidney/left, 20),
+ OP_KIDNEY_RIGHT = list(/obj/item/organ/internal/kidney/right, 20),
OP_EYES = list(/obj/item/organ/internal/eyes, 30),
OP_LIVER = list(/obj/item/organ/internal/liver, 50),
OP_STOMACH = list(/obj/item/organ/internal/stomach, 40)
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index 600e18df52..7e06c7eec6 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -497,6 +497,7 @@
//world << "speed: [speed]"
switch(speed)
if(0)
+ EMPTY_BLOCK_GUARD
// do nothing
if(1)
process_bot()
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index c657a915e4..3005d4582c 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -122,8 +122,6 @@
dat += "
None detected"
else
dat += "
[bdat]"
-
- else
else
dat += text("{Log In}", src)
user << browse(text("Medical Records[]", dat), "window=med_rec")
@@ -311,7 +309,6 @@
if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!issilicon(usr))) || src.active2 != a2))
return
src.active2.fields["b_dna"] = t1
- else
if (href_list["p_stat"])
if (src.active1)
@@ -381,7 +378,6 @@
for(var/datum/data/record/E in data_core.medical)
if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
M = E
- else
//Foreach continue //goto(2540)
src.active1 = R
src.active2 = M
@@ -434,16 +430,12 @@
for(var/datum/data/record/R in data_core.medical)
if ((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"])))
src.active2 = R
- else
- //Foreach continue //goto(3229)
if (!( src.active2 ))
src.temp = text("Could not locate record [].", t1)
else
for(var/datum/data/record/E in data_core.general)
if ((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"]))
src.active1 = E
- else
- //Foreach continue //goto(3334)
src.screen = 4
if (href_list["print_p"])
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index 7267122ce5..52af5fc1a0 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -23,11 +23,6 @@
var/message = "System bootup complete. Please select an option." // The message that shows on the main menu.
var/auth = 0 // Are they authenticated?
var/optioncount = 8
- // Custom Message Properties
- var/customsender = "System Administrator"
- var/obj/item/device/pda/customrecepient
- var/customjob = "Admin"
- var/custommessage = "This is a test, please ignore."
/obj/machinery/computer/message_monitor/attackby(obj/item/O as obj, mob/living/user as mob)
@@ -113,13 +108,10 @@
if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
dat += " ERROR: Server not found!
"
else
- dat += " [++i]. View Message Logs
"
dat += " [++i]. View Request Console Logs "
- dat += " [++i]. Clear Message Logs
"
dat += " [++i]. Clear Request Console Logs
"
dat += " [++i]. Set Custom Key
"
dat += " [++i]. Send Admin Message
"
- dat += " [++i]. Modify Spam Filter
"
else
for(var/n = ++i; n <= optioncount; n++)
dat += " [n]. ---------------
"
@@ -135,22 +127,6 @@
else
dat += "
Reg, #514 forbids sending messages to a Head of Staff containing Erotic Rendering Properties."
- //Message Logs
- if(1)
- var/index = 0
- //var/recipient = "Unspecified" //name of the person
- //var/sender = "Unspecified" //name of the sender
- //var/message = "Blank" //transferred message
- dat += "Back - Refresh
"
- dat += "X | Sender | Recipient | Message |
"
- for(var/datum/data_pda_msg/pda in src.linkedServer.pda_msgs)
- index++
- if(index > 3000)
- break
- // Del - Sender - Recepient - Message
- // X - Al Green - Your Mom - WHAT UP!?
- dat += "X | [pda.sender] | [pda.recipient] | [pda.message] |
"
- dat += "
"
//Hacking screen.
if(2)
if(isAI(user) || isrobot(user))
@@ -194,23 +170,6 @@
10010000001110100011010000110000101110100001000000111010
001101001011011010110010100101110"}
- //Fake messages
- if(3)
- dat += "Back - Reset
"
-
- dat += {"
- Sender |
- Sender's Job |
- Recipient |
- Message |
"}
- //Sender - Sender's Job - Recepient - Message
- //Al Green- Your Dad - Your Mom - WHAT UP!?
-
- dat += {"[customsender] |
- [customjob] |
- [customrecepient ? customrecepient.owner : "NONE"] |
- [custommessage] |
"}
- dat += "
Send"
//Request Console Logs
if(4)
@@ -238,18 +197,6 @@
[rc.rec_dpt] | [rc.message] | [rc.stamp] | [rc.id_auth] | [rc.priority] | "}
dat += ""
- //Spam filter modification
- if(5)
- dat += "Back - Refresh
"
- var/index = 0
- for(var/token in src.linkedServer.spamfilter)
- index++
- if(index > 3000)
- break
- dat += "[index] \[[token]\]
"
- dat += "
"
- if (linkedServer.spamfilter.len < linkedServer.spamfilter_limit)
- dat += "Add token
"
dat += "
-[station_name()] blueprints
+[station_name] blueprints
Property of [company_name]. For heads of staff only. Store in high-secure storage.
"}
switch (get_area_type())
@@ -223,6 +223,7 @@ move an amendment to the drawing.
if(BORDER_NONE)
pending+=NT
if(BORDER_BETWEEN)
+ EMPTY_BLOCK_GUARD
//do nothing, may be later i'll add 'rejected' list as optimization
if(BORDER_2NDTILE)
found+=NT //tile included to new area, but we dont seek more
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
deleted file mode 100644
index dd7f83ec01..0000000000
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ /dev/null
@@ -1,1372 +0,0 @@
-
-//The advanced pea-green monochrome lcd of tomorrow.
-
-var/global/list/obj/item/device/pda/PDAs = list()
-
-/obj/item/device/pda
- name = "\improper PDA"
- desc = "A portable microcomputer by Thinktronic Systems, LTD. Functionality determined by a preprogrammed ROM cartridge."
- icon = 'icons/obj/pda.dmi'
- icon_state = "pda"
- item_state = "electronic"
- volumeClass = ITEM_SIZE_SMALL
- slot_flags = SLOT_ID | SLOT_BELT
- spawn_blacklisted = TRUE
- //Main variables
- var/owner
- var/default_cartridge = 0 // Access level defined by cartridge
- var/obj/item/cartridge/cartridge = null //current cartridge
- var/mode = 0 //Controls what menu the PDA will display. 0 is hub; the rest are either built in or based on cartridge.
-
- var/lastmode = 0
- var/ui_tick = 0
- var/nanoUI[0]
-
- //Secondary variables
- var/scanmode = 0 //1 is medical scanner, 2 is forensics, 3 is reagent scanner.
- var/fon = 0 //Is the flashlight function on?
- var/f_lum = 2 //Luminosity for the flashlight function
- var/message_silent = 0 //To beep or not to beep, that is the question
- var/news_silent = 1 //To beep or not to beep, that is the question. The answer is No.
- var/toff = 0 //If 1, messenger disabled
- var/tnote[0] //Current Texts
- var/last_text //No text spamming
- var/last_honk //Also no honk spamming that's bad too
- var/ttone = "beep" //The PDA ringtone!
- var/newstone = "beep, beep" //The news ringtone!
- var/lock_code = "" // Lockcode to unlock uplink
- var/honkamt = 0 //How many honks left when infected with honk.exe
- var/mimeamt = 0 //How many silence left when infected with mime.exe
- var/note = "Congratulations, your ship has chosen the Thinktronic 5230 Personal Data Assistant!" //Current note in the notepad function
- var/notehtml = ""
- var/cart = "" //A place to stick cartridge menu information
- var/detonate = 1 // Can the PDA be blown up?
- var/hidden = 0 // Is the PDA hidden from the PDA list?
- var/active_conversation = null // New variable that allows us to only view a single conversation.
- var/list/conversations = list() // For keeping up with who we have PDA messsages from.
- var/new_message = 0 //To remove hackish overlay check
- var/new_news = 0
-
- var/active_feed // The selected feed
- var/list/warrant // The warrant as we last knew it
- var/list/feeds = list() // The list of feeds as we last knew them
- var/list/feed_info = list() // The data and contents of each feed as we last knew them
-
- var/list/cartmodes = list(40, 42, 43, 433, 44, 441, 45, 451, 46, 48, 47, 49) // If you add more cartridge modes add them to this list as well.
- var/list/no_auto_update = list(1, 40, 43, 44, 441, 45, 451) // These modes we turn off autoupdate
- var/list/update_every_five = list(3, 41, 433, 46, 47, 48, 49) // These we update every 5 ticks
-
- var/obj/item/card/id/id = null //Making it possible to slot an ID card into the PDA so it can function as both.
- var/ownjob = null //related to above - this is assignment (potentially alt title)
- var/ownrank = null // this one is rank, never alt title
-
- var/obj/item/device/paicard/pai = null // A slot for a personal AI device
-
-/obj/item/device/pda/examine(mob/user)
- var/turf/T = get_turf(src)
- ..(user, afterDesc = "The time [stationtime2text()], and Coordinates: [T.x],[T.y],[T.z] are displayed in the corner of the screen.")
-
-/obj/item/device/pda/medical
- default_cartridge = /obj/item/cartridge/medical
- icon_state = "pda-m"
-
-/obj/item/device/pda/viro
- default_cartridge = /obj/item/cartridge/medical
- icon_state = "pda-v"
-
-/obj/item/device/pda/engineering
- default_cartridge = /obj/item/cartridge/engineering
- icon_state = "pda-e"
-
-/obj/item/device/pda/security
- default_cartridge = /obj/item/cartridge/security
- icon_state = "pda-s"
-
-/obj/item/device/pda/detective
- default_cartridge = /obj/item/cartridge/detective
- icon_state = "pda-det"
-
-/obj/item/device/pda/warden
- default_cartridge = /obj/item/cartridge/security
- icon_state = "pda-warden"
-
-/obj/item/device/pda/janitor
- default_cartridge = /obj/item/cartridge/janitor
- icon_state = "pda-j"
- ttone = "slip"
-
-/obj/item/device/pda/science
- default_cartridge = /obj/item/cartridge/signal/science
- icon_state = "pda-tox"
- ttone = "boom"
-
-/obj/item/device/pda/clown
- default_cartridge = /obj/item/cartridge/clown
- icon_state = "pda-clown"
- desc = "A portable microcomputer by Thinktronic Systems, LTD. The surface is coated with polytetrafluoroethylene and banana drippings."
- ttone = "honk"
-
-/obj/item/device/pda/heads
- default_cartridge = /obj/item/cartridge/head
- icon_state = "pda-h"
- news_silent = 1
-
-/obj/item/device/pda/heads/hop
- default_cartridge = /obj/item/cartridge/hop
- icon_state = "pda-hop"
-
-/obj/item/device/pda/heads/hos
- default_cartridge = /obj/item/cartridge/hos
- icon_state = "pda-hos"
-
-/obj/item/device/pda/heads/ce
- default_cartridge = /obj/item/cartridge/ce
- icon_state = "pda-ce"
-
-/obj/item/device/pda/heads/cmo
- default_cartridge = /obj/item/cartridge/cmo
- icon_state = "pda-cmo"
-
-/obj/item/device/pda/heads/rd
- default_cartridge = /obj/item/cartridge/rd
- icon_state = "pda-rd"
-
-/obj/item/device/pda/captain
- default_cartridge = /obj/item/cartridge/captain
- icon_state = "pda-c"
- detonate = 0
- //toff = 1
-
-/obj/item/device/pda/cargo
- default_cartridge = /obj/item/cartridge/quartermaster
- icon_state = "pda-cargo"
-
-/obj/item/device/pda/quartermaster
- default_cartridge = /obj/item/cartridge/quartermaster
- icon_state = "pda-q"
-
-/obj/item/device/pda/shaftminer
- icon_state = "pda-miner"
-
-/obj/item/device/pda/syndicate
- default_cartridge = /obj/item/cartridge/syndicate
- icon_state = "pda-syn"
- name = "Military PDA"
- owner = "John Doe"
- hidden = 1
-
-/obj/item/device/pda/chaplain
- icon_state = "pda-holy"
- ttone = "holy"
-
-/obj/item/device/pda/lawyer
- default_cartridge = /obj/item/cartridge/lawyer
- icon_state = "pda-lawyer"
- ttone = "..."
-
-/obj/item/device/pda/botanist
- //default_cartridge = /obj/item/cartridge/botanist
- icon_state = "pda-hydro"
-
-/obj/item/device/pda/roboticist
- icon_state = "pda-robot"
-
-/obj/item/device/pda/clear
- icon_state = "pda-transp"
- desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a special edition with a transparent case."
- note = "Congratulations, you have chosen the Thinktronic 5230 Personal Data Assistant Deluxe Special Max Turbo Limited Edition!"
-
-/obj/item/device/pda/chef
- icon_state = "pda-chef"
-
-/obj/item/device/pda/bar
- icon_state = "pda-bar"
-
-/obj/item/device/pda/atmos
- default_cartridge = /obj/item/cartridge/atmos
- icon_state = "pda-atmo"
-
-/obj/item/device/pda/chemist
- default_cartridge = /obj/item/cartridge/chemistry
- icon_state = "pda-chem"
-
-
-// Special AI/pAI PDAs that cannot explode.
-/obj/item/device/pda/ai
- icon_state = "NONE"
- ttone = "data"
- newstone = "news"
- detonate = 0
-
-
-/obj/item/device/pda/ai/proc/set_name_and_job(newname as text, newjob as text, newrank as null|text)
- owner = newname
- ownjob = newjob
- if(newrank)
- ownrank = newrank
- else
- ownrank = ownjob
- name = newname + " (" + ownjob + ")"
-
-
-//AI verb and proc for sending PDA messages.
-/obj/item/device/pda/ai/verb/cmd_send_pdamesg()
- set category = "AI IM"
- set name = "Send Message"
- set src in usr
- if(usr.stat == 2)
- to_chat(usr, "You can't send PDA messages because you are dead!")
- return
- var/list/plist = available_pdas()
- if (plist)
- var/c = input(usr, "Please select a PDA") as null|anything in sortList(plist)
- if (!c) // if the user hasn't selected a PDA file we can't send a message
- return
- var/selected = plist[c]
- create_message(usr, selected, 0)
-
-
-/obj/item/device/pda/ai/verb/cmd_toggle_pda_receiver()
- set category = "AI IM"
- set name = "Toggle Sender/Receiver"
- set src in usr
- if(usr.stat == 2)
- to_chat(usr, "You can't do that because you are dead!")
- return
- toff = !toff
- to_chat(usr, "PDA sender/receiver toggled [(toff ? "Off" : "On")]!")
-
-
-/obj/item/device/pda/ai/verb/cmd_toggle_pda_silent()
- set category = "AI IM"
- set name = "Toggle Ringer"
- set src in usr
- if(usr.stat == 2)
- to_chat(usr, "You can't do that because you are dead!")
- return
- message_silent=!message_silent
- to_chat(usr, "PDA ringer toggled [(message_silent ? "Off" : "On")]!")
-
-
-/obj/item/device/pda/ai/verb/cmd_show_message_log()
- set category = "AI IM"
- set name = "Show Message Log"
- set src in usr
- if(usr.stat == 2)
- to_chat(usr, "You can't do that because you are dead!")
- return
- var/HTML = "AI PDA Message Log"
- for(var/index in tnote)
- if(index["sent"])
- HTML += addtext("→ To ", index["owner"],":
", index["message"], "
")
- else
- HTML += addtext("← From ", index["owner"],":
", index["message"], "
")
- HTML +=""
- usr << browse(HTML, "window=log;size=400x444;border=1;can_resize=1;can_close=1;can_minimize=0")
-
-
-/obj/item/device/pda/ai/can_use()
- return 1
-
-
-/obj/item/device/pda/ai/attack_self(mob/user as mob)
- if ((honkamt > 0) && (prob(60)))//For clown virus.
- honkamt--
- playsound(loc, 'sound/items/bikehorn.ogg', 30, 1)
- return
-
-
-/obj/item/device/pda/ai/pai
- ttone = "assist"
-
-
-/*
- * The Actual PDA
- */
-
-/obj/item/device/pda/New()
- ..()
- PDAs += src
- PDAs = sortNames(PDAs)
- if(default_cartridge)
- cartridge = new default_cartridge(src)
- new /obj/item/pen(src)
- update_icon()
-
-/obj/item/device/pda/proc/can_use()
-
- if(!ismob(loc))
- return 0
-
- var/mob/M = loc
- if(M.stat || M.restrained() || M.paralysis || M.stunned || M.weakened)
- return 0
- if((src in M.contents) || ( istype(loc, /turf) && in_range(src, M) ))
- return 1
- else
- return 0
-
-/obj/item/device/pda/GetAccess()
- if(id)
- return id.GetAccess()
- else
- return ..()
-
-/obj/item/device/pda/MouseDrop(obj/over_object, src_location, over_location)
- if((!istype(over_object, /obj/screen)) && can_use())
- return attack_self(usr)
- return ..()
-
-
-/obj/item/device/pda/nano_ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = NANOUI_FOCUS)
- ui_tick++
- var/datum/nanoui/old_ui = SSnano.get_open_ui(user, src, "main")
- var/auto_update = 1
- if(mode in no_auto_update)
- auto_update = 0
- if(old_ui && (mode == lastmode && ui_tick % 5 && (mode in update_every_five)))
- return
-
- lastmode = mode
-
- var/title = "Personal Data Assistant"
- var/turf/T = get_turf(src) //The coordinates of the PDA will be displayed onscreen
- var/data[0] // This is the data that will be sent to the PDA
-
- data["owner"] = owner // Who is your daddy...
- data["ownjob"] = ownjob // ...and what does he do?
-
- data["mode"] = mode // The current view
- data["scanmode"] = scanmode // Scanners
- data["fon"] = fon // Flashlight on?
- data["pai"] = (isnull(pai) ? 0 : 1) // pAI inserted?
- data["note"] = note // current pda notes
- data["message_silent"] = message_silent // does the pda make noise when it receives a message?
- data["news_silent"] = news_silent // does the pda make noise when it receives news?
- data["toff"] = toff // is the messenger function turned off?
- data["active_conversation"] = active_conversation // Which conversation are we following right now?
-
-
- data["idInserted"] = (id ? 1 : 0)
- data["idLink"] = (id ? text("[id.registered_name], [id.assignment]") : "--------")
-
- data["cart_loaded"] = cartridge ? 1:0
- if(cartridge)
- var/cartdata[0]
- cartdata["access"] = list(\
- "access_security" = cartridge.access_security,\
- "access_engine" = cartridge.access_engine,\
- "access_atmos" = cartridge.access_atmos,\
- "access_moebius" = cartridge.access_moebius,\
- "access_clown" = cartridge.access_clown,\
- "access_mime" = cartridge.access_mime,\
- "access_janitor" = cartridge.access_janitor,\
- "access_quartermaster" = cartridge.access_quartermaster,\
- "access_hydroponics" = cartridge.access_hydroponics,\
- "access_reagent_scanner" = cartridge.access_reagent_scanner,\
- "access_remote_door" = cartridge.access_remote_door,\
- "access_status_display" = cartridge.access_status_display,\
- "access_detonate_pda" = cartridge.access_detonate_pda\
- )
-
- if(mode in cartmodes)
- data["records"] = cartridge.create_NanoUI_values()
-
- if(mode == 0)
- cartdata["name"] = strip_improper(cartridge.name)
- if(isnull(cartridge.radio))
- cartdata["radio"] = 0
- else
- if(istype(cartridge.radio, /obj/item/radio/integrated/beepsky))
- cartdata["radio"] = 1
- if(istype(cartridge.radio, /obj/item/radio/integrated/signal))
- cartdata["radio"] = 2
- if(istype(cartridge.radio, /obj/item/radio/integrated/mule))
- cartdata["radio"] = 3
-
- if(mode == 2)
- cartdata["charges"] = cartridge.charges ? cartridge.charges : 0
- data["cartridge"] = cartdata
-
- data["location"] = "[T.x],[T.y],[T.z]"
- data["stationTime"] = stationtime2text()
- data["new_Message"] = new_message
- data["new_News"] = new_news
-
- var/datum/reception/reception = get_reception(src, do_sleep = 0)
- var/has_reception = reception.telecomms_reception & TELECOMMS_RECEPTION_SENDER
- data["reception"] = has_reception
-
- if(mode==2)
- var/convopdas[0]
- var/pdas[0]
- var/count = 0
- for (var/obj/item/device/pda/P in PDAs)
- if (!P.owner||P.toff||P == src||P.hidden) continue
- if(conversations.Find("\ref[P]"))
- convopdas.Add(list(list("Name" = "[P]", "Reference" = "\ref[P]", "Detonate" = "[P.detonate]", "inconvo" = "1")))
- else
- pdas.Add(list(list("Name" = "[P]", "Reference" = "\ref[P]", "Detonate" = "[P.detonate]", "inconvo" = "0")))
- count++
-
- data["convopdas"] = convopdas
- data["pdas"] = pdas
- data["pda_count"] = count
-
- if(mode==21)
- data["messagescount"] = tnote.len
- data["messages"] = tnote
- else
- data["messagescount"] = null
- data["messages"] = null
-
- if(active_conversation)
- for(var/c in tnote)
- if(c["target"] == active_conversation)
- data["convo_name"] = sanitize(c["owner"])
- data["convo_job"] = sanitize(c["job"])
- break
- if(mode==41)
- data_core.get_manifest_json()
-
-
- if(mode==3)
- if(!isnull(T))
- var/datum/gas_mixture/environment = T.return_air()
-
- var/pressure = environment.return_pressure()
- var/total_moles = environment.total_moles
-
- if (total_moles)
- var/o2_level = environment.gas["oxygen"]/total_moles
- var/n2_level = environment.gas["nitrogen"]/total_moles
- var/co2_level = environment.gas["carbon_dioxide"]/total_moles
- var/plasma_level = environment.gas["plasma"]/total_moles
- var/unknown_level = 1-(o2_level+n2_level+co2_level+plasma_level)
- data["aircontents"] = list(\
- "pressure" = "[round(pressure,0.1)]",\
- "nitrogen" = "[round(n2_level*100,0.1)]",\
- "oxygen" = "[round(o2_level*100,0.1)]",\
- "carbon_dioxide" = "[round(co2_level*100,0.1)]",\
- "plasma" = "[round(plasma_level*100,0.01)]",\
- "other" = "[round(unknown_level, 0.01)]",\
- "temp" = "[round(environment.temperature-T0C,0.1)]",\
- "reading" = 1\
- )
- if(isnull(data["aircontents"]))
- data["aircontents"] = list("reading" = 0)
- if(mode==6)
- if(has_reception)
- feeds.Cut()
- for(var/datum/feed_channel/channel in news_network.network_channels)
- feeds[++feeds.len] = list("name" = channel.channel_name, "censored" = channel.censored)
- data["feedChannels"] = feeds
- if(mode==61)
- var/datum/feed_channel/FC
- for(FC in news_network.network_channels)
- if(FC.channel_name == active_feed["name"])
- break
-
- var/list/feed = feed_info[active_feed]
- if(!feed)
- feed = list()
- feed["channel"] = FC.channel_name
- feed["author"] = "Unknown"
- feed["censored"]= 0
- feed["updated"] = -1
- feed_info[active_feed] = feed
-
- if(FC.updated > feed["updated"] && has_reception)
- feed["author"] = FC.author
- feed["updated"] = FC.updated
- feed["censored"] = FC.censored
-
- var/list/messages = list()
- if(!FC.censored)
- var/index = 0
- for(var/datum/feed_message/FM in FC.messages)
- ++index
- if(FM.img)
- user << browse_rsc(FM.img, "tmp_photo[index].png")
- // News stories are HTML-stripped but require newline replacement to be properly displayed in NanoUI
- var/body = replacetext(FM.body, "\n", "
")
- messages[++messages.len] = list("author" = FM.author, "body" = body, "message_type" = FM.message_type, "time_stamp" = FM.time_stamp, "has_image" = (FM.img != null), "caption" = FM.caption, "index" = index)
- feed["messages"] = messages
-
- data["feed"] = feed
-
- data["manifest"] = list("__json_cache" = ManifestJSON)
-
- nanoUI = data
- // update the ui if it exists, returns null if no ui is passed/found
-
- ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open)
-
- if (!ui)
- // the ui does not exist, so we'll create a new() one
- // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
- ui = new(user, src, ui_key, "pda.tmpl", title, 520, 400, state =GLOB.inventory_state)
- // when the ui is first opened this is the data it will use
-
- ui.set_initial_data(data)
- // open the new ui window
- ui.open()
- // auto update every Master Controller tick
- ui.set_auto_update(auto_update)
-
-//NOTE: graphic resources are loaded on client login
-/obj/item/device/pda/attack_self(mob/user as mob)
- user.set_machine(src)
-
- if(active_uplink_check(user))
- return
-
- nano_ui_interact(user) //NanoUI requires this proc
- return
-
-/obj/item/device/pda/Topic(href, href_list)
- if(href_list["cartmenu"] && !isnull(cartridge))
- cartridge.Topic(href, href_list)
- return 1
- if(href_list["radiomenu"] && !isnull(cartridge) && !isnull(cartridge.radio))
- cartridge.radio.Topic(href, href_list)
- return 1
-
-
- ..()
- var/mob/user = usr
- var/datum/nanoui/ui = SSnano.get_open_ui(user, src, "main")
- var/mob/living/U = usr
- //Looking for master was kind of pointless since PDAs don't appear to have one.
- //if ((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) ) )
- if (usr.stat == DEAD)
- return 0
- if(!can_use()) //Why reinvent the wheel? There's a proc that does exactly that.
- U.unset_machine()
- if(ui)
- ui.close()
- return 0
-
- add_fingerprint(U)
- U.set_machine(src)
-
- switch(href_list["choice"])
-
-//BASIC FUNCTIONS===================================
-
- if("Close")//Self explanatory
- U.unset_machine()
- ui.close()
- return 0
- if("Refresh")//Refresh, goes to the end of the proc.
- if("Return")//Return
- if(mode<=9)
- mode = 0
- else
- mode = round(mode/10)
- if(mode==2)
- active_conversation = null
- if(mode==4)//Fix for cartridges. Redirects to hub.
- mode = 0
- else if(mode >= 40 && mode <= 49)//Fix for cartridges. Redirects to refresh the menu.
- cartridge.mode = mode
- if ("Authenticate")//Checks for ID
- id_check(U, 1)
- if("UpdateInfo")
- ownjob = id.assignment
- ownrank = id.rank
- name = "PDA-[owner] ([ownjob])"
- if("Eject")//Ejects the cart, only done from hub.
- verb_remove_cartridge()
-
-//MENU FUNCTIONS===================================
-
- if("0")//Hub
- mode = 0
- if("1")//Notes
- mode = 1
- if("2")//Messenger
- mode = 2
- if("21")//Read messages
- mode = 21
- if("3")//Atmos scan
- mode = 3
- if("4")//Redirects to hub
- mode = 0
- if("chatroom") // chatroom hub
- mode = 5
- if("41") //Manifest
- mode = 41
-
-
-//MAIN FUNCTIONS===================================
-
- if("Light")
- if(fon)
- fon = 0
- set_light(0)
- else
- fon = 1
- set_light(f_lum)
- if("Medical Scan")
- if(scanmode == 1)
- scanmode = 0
- else if((!isnull(cartridge)) && (cartridge.access_moebius))
- scanmode = 1
- if("Reagent Scan")
- if(scanmode == 3)
- scanmode = 0
- else if((!isnull(cartridge)) && (cartridge.access_reagent_scanner))
- scanmode = 3
- if("Halogen Counter")
- if(scanmode == 4)
- scanmode = 0
- else if((!isnull(cartridge)) && (cartridge.access_engine))
- scanmode = 4
- if("Honk")
- if ( !(last_honk && world.time < last_honk + 20) )
- playsound(loc, 'sound/items/bikehorn.ogg', 50, 1)
- last_honk = world.time
- if("Gas Scan")
- if(scanmode == 5)
- scanmode = 0
- else if((!isnull(cartridge)) && (cartridge.access_atmos))
- scanmode = 5
-
-//MESSENGER/NOTE FUNCTIONS===================================
-
- if ("Edit")
- var/n = input(U, "Please enter message", name, notehtml)
- if (in_range(src, U) && loc == U)
- n = sanitizeSafe(n, extra = 0)
- if (mode == 1)
- note = n
- notehtml = note
- note = replacetext(note, "\n", "
")
- else
- ui.close()
- if("Toggle Messenger")
- toff = !toff
- if("Toggle Ringer")//If viewing texts then erase them, if not then toggle silent status
- message_silent = !message_silent
- if("Toggle News")
- news_silent = !news_silent
- if("Clear")//Clears messages
- if(href_list["option"] == "All")
- tnote.Cut()
- conversations.Cut()
- if(href_list["option"] == "Convo")
- var/new_tnote[0]
- for(var/i in tnote)
- if(i["target"] != active_conversation)
- new_tnote[++new_tnote.len] = i
- tnote = new_tnote
- conversations.Remove(active_conversation)
-
- active_conversation = null
- if(mode==21)
- mode=2
-
- if("Ringtone")
- var/t = stripped_input(U, "Please enter new ringtone", name, ttone, 20)
- if (in_range(src, U) && loc == U)
- if (t)
- if(src.hidden_uplink && hidden_uplink.check_trigger(U, lowertext(t), lowertext(lock_code)))
- to_chat(U, "The PDA softly beeps.")
- ui.close()
- else
- ttone = t
- else
- ui.close()
- return 0
- if("Newstone")
- var/t = input(U, "Please enter new news tone", name, newstone) as text
- if (in_range(src, U) && loc == U)
- if (t)
- t = sanitize(t, 20)
- newstone = t
- else
- ui.close()
- return 0
- if("Message")
-
- var/obj/item/device/pda/P = locate(href_list["target"])
- var/tap = iscarbon(U)
- src.create_message(U, P, tap)
- if(mode == 2)
- if(href_list["target"] in conversations) // Need to make sure the message went through, if not welp.
- active_conversation = href_list["target"]
- mode = 21
-
- if("Select Conversation")
- var/P = href_list["convo"]
- for(var/n in conversations)
- if(P == n)
- active_conversation=P
- mode=21
- if("Select Feed")
- var/n = href_list["name"]
- for(var/f in feeds)
- if(f["name"] == n)
- active_feed = f
- mode=61
- if("Send Honk")//Honk virus
- if(cartridge && cartridge.access_clown)//Cartridge checks are kind of unnecessary since everything is done through switch.
- var/obj/item/device/pda/P = locate(href_list["target"])//Leaving it alone in case it may do something useful, I guess.
- if(!isnull(P))
- if (!P.toff && cartridge.charges > 0)
- cartridge.charges--
- U.show_message(SPAN_NOTICE("Virus sent!"), 1)
- P.honkamt = (rand(15,20))
- else
- to_chat(U, "PDA not found.")
- else
- ui.close()
- return 0
- if("Send Silence")//Silent virus
- if(cartridge && cartridge.access_mime)
- var/obj/item/device/pda/P = locate(href_list["target"])
- if(!isnull(P))
- if (!P.toff && cartridge.charges > 0)
- cartridge.charges--
- U.show_message(SPAN_NOTICE("Virus sent!"), 1)
- P.message_silent = 1
- P.news_silent = 1
- P.ttone = "silence"
- P.newstone = "silence"
- else
- to_chat(U, "PDA not found.")
- else
- ui.close()
- return 0
-
-
-//SYNDICATE FUNCTIONS===================================
-
- if("Toggle Door")
- if(cartridge && cartridge.access_remote_door)
- for(var/obj/machinery/door/blast/M in world)
- if(M.id == cartridge.remote_door_id)
- if(M.density)
- M.open()
- else
- M.close()
-
- if("Detonate")//Detonate PDA... maybe
- if(cartridge && cartridge.access_detonate_pda)
- var/obj/item/device/pda/P = locate(href_list["target"])
- var/datum/reception/reception = get_reception(src, P, "", do_sleep = 0)
- if(!(reception.message_server && reception.telecomms_reception & TELECOMMS_RECEPTION_SENDER))
- U.show_message(SPAN_WARNING("An error flashes on your [src]: Connection unavailable"), 1)
- return
- if(reception.telecomms_reception & TELECOMMS_RECEPTION_RECEIVER == 0) // Does our recepient have a broadcaster on their level?
- U.show_message(SPAN_WARNING("An error flashes on your [src]: Recipient unavailable"), 1)
- return
- if(!isnull(P))
- if (!P.toff && cartridge.charges > 0)
- cartridge.charges--
-
- var/difficulty = 2
-
- if(P.cartridge)
- difficulty += P.cartridge.access_moebius
- difficulty += P.cartridge.access_security
- difficulty += P.cartridge.access_engine
- difficulty += P.cartridge.access_clown
- difficulty += P.cartridge.access_janitor
- if(P.hidden_uplink)
- difficulty += 3
-
- if(prob(difficulty))
- U.show_message(SPAN_WARNING("An error flashes on your [src]."), 1)
- else if (prob(difficulty * 7))
- U.show_message(SPAN_WARNING("Energy feeds back into your [src]!"), 1)
- ui.close()
- detonate_act(src)
- log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge but failed, blowing themselves up")
- message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge but failed.", 1)
- else
- U.show_message(SPAN_NOTICE("Success!"), 1)
- log_admin("[key_name(U)] just attempted to blow up [P] with the Detomatix cartridge and succeeded")
- message_admins("[key_name_admin(U)] just attempted to blow up [P] with the Detomatix cartridge and succeeded.", 1)
- detonate_act(P)
- else
- to_chat(U, "No charges left.")
- else
- to_chat(U, "PDA not found.")
- else
- U.unset_machine()
- ui.close()
- return 0
-
-//pAI FUNCTIONS===================================
- if("pai")
- if(pai)
- if(pai.loc != src)
- pai = null
- else
- switch(href_list["option"])
- if("1") // Configure pAI device
- pai.attack_self(U)
- if("2") // Eject pAI device
- var/turf/T = get_turf_or_move(src.loc)
- if(T)
- pai.loc = T
- pai = null
-
- else
- mode = text2num(href_list["choice"])
- if(cartridge)
- cartridge.mode = mode
-
-//EXTRA FUNCTIONS===================================
-
- if (mode == 2||mode == 21)//To clear message overlays.
- new_message = 0
- update_icon()
-
- if (mode == 6||mode == 61)//To clear news overlays.
- new_news = 0
- update_icon()
-
- if ((honkamt > 0) && (prob(60)))//For clown virus.
- honkamt--
- playsound(loc, 'sound/items/bikehorn.ogg', 30, 1)
-
- return 1 // return 1 tells it to refresh the UI in NanoUI
-
-/obj/item/device/pda/update_icon()
- ..()
-
- cut_overlays()
- if(new_message || new_news)
- overlays += image('icons/obj/pda.dmi', "pda-r")
- if(locate(/obj/item/pen) in src)
- overlays += image('icons/obj/pda.dmi', "pda_pen")
-
-/obj/item/device/pda/proc/detonate_act(var/obj/item/device/pda/P)
- //TODO: sometimes these attacks show up on the message server
- var/i = rand(1,100)
- var/j = rand(0,1) //Possibility of losing the PDA after the detonation
- var/message = ""
- var/mob/living/M = null
- if(ismob(P.loc))
- M = P.loc
-
- //switch(i) //Yes, the overlapping cases are intended.
- if(i<=10) //The traditional explosion
- P.explode()
- j=1
- message += "Your [P] suddenly explodes!"
- if(i>=10 && i<= 20) //The PDA burns a hole in the holder.
- j=1
- if(M && isliving(M))
- M.apply_damage( rand(30,60) , BURN, used_weapon = src)
- message += "You feel a searing heat! Your [P] is burning!"
- if(i>=20 && i<=25) //EMP
- empulse(P.loc, 3, 6, 1)
- message += "Your [P] emits a wave of electromagnetic energy!"
- if(i>=25 && i<=40) //Smoke
- var/datum/effect/effect/system/smoke_spread/chem/S = new /datum/effect/effect/system/smoke_spread/chem
- S.attach(P.loc)
- S.set_up(P, 10, 0, P.loc)
- playsound(P.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
- S.start()
- message += "Large clouds of smoke billow forth from your [P]!"
- if(i>=40 && i<=45) //Bad smoke
- var/datum/effect/effect/system/smoke_spread/bad/B = new /datum/effect/effect/system/smoke_spread/bad
- B.attach(P.loc)
- B.set_up(P, 10, 0, P.loc)
- playsound(P.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
- B.start()
- message += "Large clouds of noxious smoke billow forth from your [P]!"
- if(i>=65 && i<=75) //Weaken
- if(M && isliving(M))
- M.apply_effects(0,1)
- message += "Your [P] flashes with a blinding white light! You feel weaker."
- if(i>=75 && i<=85) //Stun and stutter
- if(M && isliving(M))
- M.apply_effects(1,0,0,0,1)
- message += "Your [P] flashes with a blinding white light! You feel weaker."
- if(i>=85) //Sparks
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(2, 1, P.loc)
- s.start()
- message += "Your [P] begins to spark violently!"
- if(i>45 && i<65 && prob(50)) //Nothing happens
- message += "Your [P] bleeps loudly."
- j = prob(10)
-
- if(j) //This kills the PDA
- qdel(P)
- if(message)
- message += "It melts in a puddle of plastic."
- else
- message += "Your [P] shatters in a thousand pieces!"
-
- if(M && isliving(M))
- message = SPAN_WARNING("[message]")
- M.show_message(message, 1)
-
-/obj/item/device/pda/proc/remove_id()
- if (id)
- if (ismob(loc))
- var/mob/M = loc
- M.put_in_hands(id)
- to_chat(usr, SPAN_NOTICE("You remove the ID from the [name]."))
- playsound(loc, 'sound/machines/id_swipe.ogg', 100, 1)
- else
- id.loc = get_turf(src)
- id = null
-
-/obj/item/device/pda/proc/create_message(var/mob/living/U = usr, var/obj/item/device/pda/P, var/tap = 1)
- if(tap)
- U.visible_message(SPAN_NOTICE("\The [U] taps on \his PDA's screen."))
- var/t = input(U, "Please enter message", P.name, null) as text
- t = sanitize(t)
- //t = readd_quotes(t)
- t = replace_characters(t, list(""" = "\""))
- if (!t || !istype(P))
- return
- if (!in_range(src, U) && loc != U)
- return
-
- if (isnull(P)||P.toff || toff)
- return
-
- if (last_text && world.time < last_text + 5)
- return
-
- if(!can_use())
- return
-
- last_text = world.time
- var/datum/reception/reception = get_reception(src, P, t)
- t = reception.message
-
- if(reception.message_server && (reception.telecomms_reception & TELECOMMS_RECEPTION_SENDER)) // only send the message if it's stable
- if(reception.telecomms_reception & TELECOMMS_RECEPTION_RECEIVER == 0) // Does our recipient have a broadcaster on their level?
- to_chat(U, "ERROR: Cannot reach recipient.")
- return
- var/send_result = reception.message_server.send_pda_message("[P.owner]","[owner]","[t]")
- if (send_result)
- to_chat(U, "ERROR: Messaging server rejected your message. Reason: contains '[send_result]'.")
- return
-
- tnote.Add(list(list("sent" = 1, "owner" = "[P.owner]", "job" = "[P.ownjob]", "message" = "[t]", "target" = "\ref[P]")))
- P.tnote.Add(list(list("sent" = 0, "owner" = "[owner]", "job" = "[ownjob]", "message" = "[t]", "target" = "\ref[src]")))
- for(var/mob/M in GLOB.player_list)
- if((M.stat == DEAD && M.get_preference_value(/datum/client_preference/ghost_ears) == GLOB.PREF_ALL_SPEECH) || isangel(M)) // src.client is so that ghosts don't have to listen to mice
- if(isnewplayer(M))
- continue
- M.show_message("PDA Message - [owner] -> [P.owner]: [reception.message]")
-
- if(!conversations.Find("\ref[P]"))
- conversations.Add("\ref[P]")
- if(!P.conversations.Find("\ref[src]"))
- P.conversations.Add("\ref[src]")
-
-
-
- P.new_message_from_pda(src, t)
- SSnano.update_user_uis(U, src) // Update the sending user's PDA UI so that they can see the new message
- else
- to_chat(U, SPAN_NOTICE("ERROR: Messaging server is not responding."))
-
-/obj/item/device/pda/proc/new_info(var/beep_silent, var/message_tone, var/reception_message)
- if (!beep_silent)
- playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
- for (var/mob/O in hearers(2, loc))
- O.show_message(text("\icon[src] *[message_tone]*"))
- //Search for holder of the PDA.
- var/mob/living/L = null
- if(loc && isliving(loc))
- L = loc
- //Maybe they are a pAI!
- else
- L = get(src, /mob/living/silicon)
-
- if(L)
- if(reception_message)
- to_chat(L, reception_message)
- SSnano.update_user_uis(L, src) // Update the receiving user's PDA UI so that they can see the new message
-
-/obj/item/device/pda/proc/new_news(var/message)
- new_info(news_silent, newstone, news_silent ? "" : "\icon[src] [message]")
-
- if(!news_silent)
- new_news = 1
- update_icon()
-
-/obj/item/device/pda/ai/new_news(var/message)
- // Do nothing
-
-/obj/item/device/pda/proc/new_message_from_pda(var/obj/item/device/pda/sending_device, var/message)
- new_message(sending_device, sending_device.owner, sending_device.ownjob, message)
-
-/obj/item/device/pda/proc/new_message(var/sending_unit, var/sender, var/sender_job, var/message)
- var/reception_message = "\icon[src] Message from [sender] ([sender_job]), \"[message]\" (Reply)"
- new_info(message_silent, ttone, reception_message)
-
- log_pda("[usr] (PDA: [sending_unit]) sent \"[message]\" to [name]")
- new_message = 1
- update_icon()
-
-/obj/item/device/pda/ai/new_message(var/atom/movable/sending_unit, var/sender, var/sender_job, var/message)
- var/track = ""
- if(ismob(sending_unit.loc) && isAI(loc))
- track = "(Follow)"
-
- var/reception_message = "\icon[src] Message from [sender] ([sender_job]), \"[message]\" (Reply) [track]"
- new_info(message_silent, newstone, reception_message)
-
- log_pda("[usr] (PDA: [sending_unit]) sent \"[message]\" to [name]")
- new_message = 1
-
-/obj/item/device/pda/verb/verb_reset_pda()
- set category = "Object"
- set name = "Reset PDA"
- set src in usr
-
- if(issilicon(usr))
- return
-
- if(can_use(usr))
- mode = 0
- SSnano.update_uis(src)
- to_chat(usr, SPAN_NOTICE("You press the reset button on \the [src]."))
- else
- to_chat(usr, SPAN_NOTICE("You cannot do this while restrained."))
-
-/obj/item/device/pda/verb/verb_remove_id()
- set category = "Object"
- set name = "Remove id"
- set src in usr
-
- if(issilicon(usr))
- return
-
- if ( can_use(usr) )
- if(id)
- remove_id()
- else
- to_chat(usr, SPAN_NOTICE("This PDA does not have an ID in it."))
- else
- to_chat(usr, SPAN_NOTICE("You cannot do this while restrained."))
-
-
-/obj/item/device/pda/verb/verb_remove_pen()
- set category = "Object"
- set name = "Remove pen"
- set src in usr
-
- if(issilicon(usr))
- return
-
- if ( can_use(usr) )
- var/obj/item/pen/O = locate() in src
- if(O)
- if (ismob(loc))
- var/mob/M = loc
- if(M.get_active_hand() == null)
- M.put_in_hands(O)
- to_chat(usr, SPAN_NOTICE("You remove \the [O] from \the [src]."))
- update_icon()
- return
- O.loc = get_turf(src)
- to_chat(usr, SPAN_NOTICE("You remove \the [O] from \the [src], but you hands full and it drop on floor."))
- update_icon()
- else
- to_chat(usr, SPAN_NOTICE("This PDA does not have a pen in it."))
- else
- to_chat(usr, SPAN_NOTICE("You cannot do this while restrained."))
-
-/obj/item/device/pda/verb/verb_remove_cartridge()
- set category = "Object"
- set name = "Remove cartridge"
- set src in usr
-
- if(issilicon(usr))
- return
-
- if (can_use(usr) && !isnull(cartridge))
- var/turf/T = get_turf(src)
- cartridge.loc = T
- if (ismob(loc))
- var/mob/M = loc
- M.put_in_hands(cartridge)
- else
- cartridge.loc = get_turf(src)
- mode = 0
- scanmode = 0
- if (cartridge.radio)
- cartridge.radio.hostpda = null
- cartridge = null
- to_chat(usr, SPAN_NOTICE("You remove \the [cartridge] from the [name]."))
- else
- to_chat(usr, SPAN_NOTICE("You cannot do this while restrained."))
-
-/obj/item/device/pda/proc/id_check(mob/user as mob, choice as num)//To check for IDs; 1 for in-pda use, 2 for out of pda use.
- if(choice == 1)
- if (id)
- remove_id()
- return 1
- else
- var/obj/item/I = user.get_active_hand()
- if (istype(I, /obj/item/card/id) && user.unEquip(I))
- I.loc = src
- id = I
- return 1
- else
- var/obj/item/card/I = user.get_active_hand()
- if (istype(I, /obj/item/card/id) && I:registered_name && user.unEquip(I))
- var/obj/old_id = id
- I.loc = src
- id = I
- user.put_in_hands(old_id)
- return 1
- return 0
-
-// access to status display signals
-/obj/item/device/pda/attackby(obj/item/C as obj, mob/user as mob)
- ..()
- if(istype(C, /obj/item/cartridge) && !cartridge)
- cartridge = C
- user.drop_item()
- cartridge.loc = src
- to_chat(user, SPAN_NOTICE("You insert [cartridge] into [src]."))
- SSnano.update_uis(src) // update all UIs attached to src
- if(cartridge.radio)
- cartridge.radio.hostpda = src
-
- else if(istype(C, /obj/item/card/id))
- var/obj/item/card/id/idcard = C
- if(!idcard.registered_name)
- to_chat(user, SPAN_NOTICE("\The [src] rejects the ID."))
- return
- if(!owner)
- owner = idcard.registered_name
- ownjob = idcard.assignment
- ownrank = idcard.rank
- name = "PDA-[owner] ([ownjob])"
- to_chat(user, SPAN_NOTICE("Card scanned."))
- else
- //Basic safety check. If either both objects are held by user or PDA is on ground and card is in hand.
- if(((src in user.contents) && (C in user.contents)) || (istype(loc, /turf) && in_range(src, user) && (C in user.contents)) )
- if(id_check(user, 2))
- to_chat(user, SPAN_NOTICE("You put the ID into \the [src]'s slot."))
- playsound(loc, 'sound/machines/id_swipe.ogg', 100, 1)
- updateSelfDialog()//Update self dialog on success.
- return //Return in case of failed check or when successful.
- updateSelfDialog()//For the non-input related code.
- else if(istype(C, /obj/item/device/paicard) && !src.pai)
- user.drop_item()
- C.loc = src
- pai = C
- to_chat(user, SPAN_NOTICE("You slot \the [C] into [src]."))
- SSnano.update_uis(src) // update all UIs attached to src
- else if(istype(C, /obj/item/pen))
- var/obj/item/pen/O = locate() in src
- if(O)
- to_chat(user, SPAN_NOTICE("There is already a pen in \the [src]."))
- else
- user.drop_item()
- C.loc = src
- to_chat(user, SPAN_NOTICE("You slide \the [C] into \the [src]."))
- update_icon()
- return
-
-/obj/item/device/pda/attack(mob/living/C as mob, mob/living/user as mob)
- if (iscarbon(C))
- switch(scanmode)
- if(1)
-
- for (var/mob/O in viewers(C, null))
- O.show_message(SPAN_WARNING("\The [user] has analyzed [C]'s vitals!"), 1)
-
- user.show_message(SPAN_NOTICE("Analyzing Results for [C]:"))
- user.show_message(" Overall Status: [C.stat > 1 ? "dead" : "[C.health - C.halloss]% healthy"]", 1)
- user.show_message(text(" Damage Specifics: []-[]-[]-[]",
- (C.getOxyLoss() > 50) ? "warning" : "", C.getOxyLoss(),
- (C.getToxLoss() > 50) ? "warning" : "", C.getToxLoss(),
- (C.getFireLoss() > 50) ? "warning" : "", C.getFireLoss(),
- (C.getBruteLoss() > 50) ? "warning" : "", C.getBruteLoss()
- ), 1)
- user.show_message(SPAN_NOTICE(" Key: Suffocation/Toxin/Burns/Brute"), 1)
- user.show_message(SPAN_NOTICE(" Body Temperature: [C.bodytemperature-T0C]°C ([C.bodytemperature*1.8-459.67]°F)"), 1)
- if(C.timeofdeath && (C.stat == DEAD || (C.status_flags & FAKEDEATH)))
- user.show_message(SPAN_NOTICE(" Time of Death: [worldtime2stationtime(C.timeofdeath)]"))
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- var/list/damaged = H.get_damaged_organs(1,1)
- user.show_message(SPAN_NOTICE("Localized Damage, Brute/Burn:"),1)
- if(length(damaged)>0)
- for(var/obj/item/organ/external/org in damaged)
- user.show_message(text(" []: []-[]",
- capitalize(org.name), (org.brute_dam > 0) ? "warning" : "notice", org.brute_dam, (org.burn_dam > 0) ? "warning" : "notice", org.burn_dam),1)
- else
- user.show_message(SPAN_NOTICE(" Limbs are OK."),1)
-
- if(2)
- if(!C.fingers_trace || get_active_mutation(C, MUTATION_NOPRINTS))
- to_chat(user, SPAN_NOTICE("No fingerprints found on [C]"))
- else
- to_chat(user, text(SPAN_NOTICE("\The [C]'s Fingerprints: [C.fingers_trace]")))
- if(!C:blood_DNA)
- to_chat(user, SPAN_NOTICE("No blood found on [C]"))
- else
- to_chat(user, SPAN_NOTICE("Blood found on [C]. Analysing..."))
- spawn(15)
- for(var/blood in C:blood_DNA)
- to_chat(user, SPAN_NOTICE("Blood type: [C:blood_DNA[blood]]\nDNA: [blood]"))
-
- if(4)
- for (var/mob/O in viewers(C, null))
- O.show_message(SPAN_WARNING("\The [user] has analyzed [C]'s radiation levels!"), 1)
-
- user.show_message(SPAN_NOTICE("Analyzing Results for [C]:"))
- if(C.radiation)
- user.show_message(SPAN_NOTICE("Radiation Level: [C.radiation]"))
- else
- user.show_message(SPAN_NOTICE("No radiation detected."))
-
-/obj/item/device/pda/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
- if(!proximity) return
- switch(scanmode)
-
- if(3)
- if(!isobj(A))
- return
- if(!isnull(A.reagents))
- if(A.reagents.reagent_list.len > 0)
- var/reagents_length = A.reagents.reagent_list.len
- to_chat(user, "[reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found.")
- for (var/re in A.reagents.reagent_list)
- to_chat(user, SPAN_NOTICE(" [re]"))
- else
- to_chat(user, SPAN_NOTICE("No active chemical agents found in [A]."))
- else
- to_chat(user, SPAN_NOTICE("No significant chemical agents found in [A]."))
-
- if(5)
- analyze_gases(A, user)
-
- if (!scanmode && istype(A, /obj/item/paper) && owner)
- // JMO 20140705: Makes scanned document show up properly in the notes. Not pretty for formatted documents,
- // as this will clobber the HTML, but at least it lets you scan a document. You can restore the original
- // notes by editing the note again. (Was going to allow you to edit, but scanned documents are too long.)
- var/raw_scan = (A:info)
- var/formatted_scan = ""
- // Scrub out the tags (replacing a few formatting ones along the way)
-
- // Find the beginning and end of the first tag.
- var/tag_start = findtext(raw_scan,"<")
- var/tag_stop = findtext(raw_scan,">")
-
- // Until we run out of complete tags...
- while(tag_start&&tag_stop)
- var/pre = copytext(raw_scan,1,tag_start) // Get the stuff that comes before the tag
- var/tag = lowertext(copytext(raw_scan,tag_start+1,tag_stop)) // Get the tag so we can do intellegent replacement
- var/tagend = findtext(tag," ") // Find the first space in the tag if there is one.
-
- // Anything that's before the tag can just be added as is.
- formatted_scan = formatted_scan+pre
-
- // If we have a space after the tag (and presumably attributes) just crop that off.
- if (tagend)
- tag=copytext(tag,1,tagend)
-
- if (tag=="p"||tag=="/p"||tag=="br") // Check if it's I vertical space tag.
- formatted_scan=formatted_scan+"
" // If so, add some padding in.
-
- raw_scan = copytext(raw_scan,tag_stop+1) // continue on with the stuff after the tag
-
- // Look for the next tag in what's left
- tag_start = findtext(raw_scan,"<")
- tag_stop = findtext(raw_scan,">")
-
- // Anything that is left in the page. just tack it on to the end as is
- formatted_scan=formatted_scan+raw_scan
-
- // If there is something in there already, pad it out.
- if (length(note)>0)
- note = note + "
"
-
- // Store the scanned document to the notes
- note = "Scanned Document. Edit to restore previous notes/delete scan.
----------
" + formatted_scan + "
"
- // notehtml ISN'T set to allow user to get their old notes back. A better implementation would add a "scanned documents"
- // feature to the PDA, which would better convey the availability of the feature, but this will work for now.
-
- // Inform the user
- to_chat(user, SPAN_NOTICE("Paper scanned and OCRed to notekeeper.")) //concept of scanning paper copyright brainoblivion 2009
-
-
-
-/obj/item/device/pda/proc/explode() //This needs tuning. //Sure did.
- if(!src.detonate) return
- var/turf/T = get_turf(src)
- if(T)
- T.hotspot_expose(700,125)
- explosion(T, 100, 100)
- return
-
-/obj/item/device/pda/Destroy()
- PDAs -= src
- if (src.id && prob(90)) //IDs are kept in 90% of the cases
- src.id.loc = get_turf(src.loc)
- . = ..()
-
-/obj/item/device/pda/AltClick()
- if(can_use(usr))
- if(id)
- remove_id()
- else
- to_chat(usr, SPAN_NOTICE("This PDA does not have an ID in it."))
- else
- to_chat(usr, SPAN_NOTICE("You cannot do this while restrained."))
-
-
-/obj/item/device/pda/clown/Crossed(AM as mob|obj) //Clown PDA is slippery.
- if (isliving(AM))
- var/mob/living/M = AM
- if((locate(/obj/structure/multiz/stairs) in get_turf(loc)) || (locate(/obj/structure/multiz/ladder) in get_turf(loc)))
- visible_message(SPAN_DANGER("\The [M] carefully avoids stepping down on \the [src]."))
- return
- if(M.slip("the PDA",8) && M.real_name != src.owner && istype(src.cartridge, /obj/item/cartridge/clown))
- if(src.cartridge.charges < 5)
- src.cartridge.charges++
-
-/obj/item/device/pda/proc/available_pdas()
- var/list/names = list()
- var/list/plist = list()
- var/list/namecounts = list()
-
- if (toff)
- to_chat(usr, "Turn on your receiver in order to send messages.")
- return
-
- for (var/obj/item/device/pda/P in PDAs)
- if (!P.owner)
- continue
- else if(P.hidden)
- continue
- else if (P == src)
- continue
- else if (P.toff)
- continue
-
- var/name = P.owner
- if (name in names)
- namecounts[name]++
- name = text("[name] ([namecounts[name]])")
- else
- names.Add(name)
- namecounts[name] = 1
-
- plist[text("[name]")] = P
- return plist
-
-// Pass along the pulse to atoms in contents, largely added so pAIs are vulnerable to EMP
-/obj/item/device/pda/emp_act(severity)
- for(var/atom/A in src)
- A.emp_act(severity)
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
deleted file mode 100644
index 52cc14f629..0000000000
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ /dev/null
@@ -1,580 +0,0 @@
-/obj/item/cartridge
- name = "generic cartridge"
- desc = "A data cartridge for portable microcomputers."
- icon = 'icons/obj/pda.dmi'
- icon_state = "cart"
- item_state = "electronic"
- volumeClass = ITEM_SIZE_TINY
-
- var/obj/item/radio/integrated/radio = null
- var/access_security = 0
- var/access_engine = 0
- var/access_atmos = 0
- var/access_moebius = 0
- var/access_clown = 0
- var/access_mime = 0
- var/access_janitor = 0
-// var/access_flora = 0
- var/access_reagent_scanner = 0
- var/access_remote_door = 0 // Control some blast doors remotely!!
- var/remote_door_id = ""
- var/access_status_display = 0
- var/access_quartermaster = 0
- var/access_detonate_pda = 0
- var/access_hydroponics = 0
- var/charges = 0
- var/mode
- var/menu
- var/datum/data/record/active1 //General
- var/datum/data/record/active2 //Medical
- var/datum/data/record/active3 //Security
- var/selected_sensor // Power Sensor
- var/message1 // used for status_displays
- var/message2
- var/list/stored_data = list()
-
-/obj/item/cartridge/engineering
- name = "\improper Power-ON cartridge"
- icon_state = "cart-e"
- access_engine = 1
-
-/obj/item/cartridge/atmos
- name = "\improper BreatheDeep cartridge"
- icon_state = "cart-a"
- access_atmos = 1
-
-/obj/item/cartridge/medical
- name = "\improper Med-U cartridge"
- icon_state = "cart-m"
- access_moebius = 1
-
-/obj/item/cartridge/chemistry
- name = "\improper ChemWhiz cartridge"
- icon_state = "cart-chem"
- access_reagent_scanner = 1
-
-/obj/item/cartridge/security
- name = "\improper R.O.B.U.S.T. cartridge"
- icon_state = "cart-s"
- access_security = 1
-
-/obj/item/cartridge/security/Initialize()
- radio = new /obj/item/radio/integrated/beepsky(src)
- . = ..()
-
-/obj/item/cartridge/detective
- name = "\improper D.E.T.E.C.T. cartridge"
- icon_state = "cart-s"
- access_security = 1
- access_moebius = 1
-
-
-/obj/item/cartridge/janitor
- name = "\improper CustodiPRO cartridge"
- desc = "The ultimate in clean-room design."
- icon_state = "cart-j"
- access_janitor = 1
-
-/obj/item/cartridge/lawyer
- name = "\improper P.R.O.V.E. cartridge"
- icon_state = "cart-s"
- access_security = 1
-
-/obj/item/cartridge/clown
- name = "\improper Honkworks 5.0 cartridge"
- icon_state = "cart-clown"
- access_clown = 1
- charges = 5
-
-/obj/item/cartridge/mime
- name = "\improper Gestur-O 1000 cartridge"
- icon_state = "cart-mi"
- access_mime = 1
- charges = 5
-/*
-/obj/item/cartridge/botanist
- name = "Green Thumb v4.20"
- icon_state = "cart-b"
- access_flora = 1
-*/
-
-/obj/item/cartridge/signal
- name = "generic signaler cartridge"
- desc = "A data cartridge with an integrated radio signaler module."
- var/qdeled = 0
-
-/obj/item/cartridge/signal/science
- name = "\improper Signal Ace 2 cartridge"
- desc = "Complete with integrated radio signaler!"
- icon_state = "cart-tox"
- access_reagent_scanner = 1
- access_atmos = 1
-
-/obj/item/cartridge/signal/Initialize()
- radio = new /obj/item/radio/integrated/signal(src)
- . = ..()
-
-/obj/item/cartridge/signal/Destroy()
- qdel(radio)
- . = ..()
-
-/obj/item/cartridge/quartermaster
- name = "\improper Asters Guild Parts & Vendors cartridge"
- desc = "Perfect for the Guild Merchant on the go!"
- icon_state = "cart-q"
- access_quartermaster = 1
-
-/obj/item/cartridge/quartermaster/Initialize()
- radio = new /obj/item/radio/integrated/mule(src)
- . = ..()
-
-/obj/item/cartridge/head
- name = "\improper Easy-Record DELUXE"
- icon_state = "cart-h"
- access_status_display = 1
-
-/obj/item/cartridge/hop
- name = "\improper HumanResources9001 cartridge"
- icon_state = "cart-h"
- access_status_display = 1
- access_quartermaster = 1
- access_janitor = 1
- access_security = 1
-
-/obj/item/cartridge/hop/Initialize()
- radio = new /obj/item/radio/integrated/mule(src)
- . = ..()
-
-/obj/item/cartridge/hos
- name = "\improper R.O.B.U.S.T. DELUXE"
- icon_state = "cart-hos"
- access_status_display = 1
- access_security = 1
-
-/obj/item/cartridge/hos/Initialize()
- radio = new /obj/item/radio/integrated/beepsky(src)
- . = ..()
-
-/obj/item/cartridge/ce
- name = "\improper Power-On DELUXE"
- icon_state = "cart-ce"
- access_status_display = 1
- access_engine = 1
- access_atmos = 1
-
-/obj/item/cartridge/cmo
- name = "\improper Med-U DELUXE"
- icon_state = "cart-cmo"
- access_status_display = 1
- access_reagent_scanner = 1
- access_moebius = 1
-
-/obj/item/cartridge/rd
- name = "\improper Signal Ace DELUXE"
- icon_state = "cart-rd"
- access_status_display = 1
- access_reagent_scanner = 1
- access_atmos = 1
-
-/obj/item/cartridge/rd/Initialize()
- radio = new /obj/item/radio/integrated/signal(src)
- . = ..()
-
-/obj/item/cartridge/captain
- name = "\improper Value-PAK cartridge"
- desc = "Now with 200% more value!"
- icon_state = "cart-c"
- access_quartermaster = 1
- access_janitor = 1
- access_engine = 1
- access_security = 1
- access_moebius = 1
- access_reagent_scanner = 1
- access_status_display = 1
- access_atmos = 1
-
-/obj/item/cartridge/syndicate
- name = "\improper Detomatix cartridge"
- icon_state = "cart"
- access_remote_door = 1
- access_detonate_pda = 1
- remote_door_id = "smindicate" //Make sure this matches the syndicate shuttle's shield/door id!! //don't ask about the name, testing.
- charges = 4
-
-/obj/item/cartridge/proc/post_status(var/command, var/data1, var/data2)
-
- var/datum/radio_frequency/frequency = SSradio.return_frequency(1435)
- if(!frequency) return
-
- var/datum/signal/status_signal = new
- status_signal.source = src
- status_signal.transmission_method = 1
- status_signal.data["command"] = command
-
- switch(command)
- if("message")
- status_signal.data["msg1"] = data1
- status_signal.data["msg2"] = data2
- if(loc)
- var/obj/item/PDA = loc
- var/mob/user = PDA.fingerprintslast
- if(isliving(PDA.loc))
- name = PDA.loc
- log_admin("STATUS: [user] set status screen with [PDA]. Message: [data1] [data2]")
- message_admins("STATUS: [user] set status screen with [PDA]. Message: [data1] [data2]")
-
- if("alert")
- status_signal.data["picture_state"] = data1
-
- frequency.post_signal(src, status_signal)
-
-
-/*
- This generates the nano values of the cart menus.
- Because we close the UI when we insert a new cart
- we don't have to worry about null values on items
- the user can't access. Well, unless they are href hacking.
- But in that case their UI will just lock up.
-*/
-
-
-/obj/item/cartridge/proc/create_NanoUI_values(mob/user as mob)
- var/values[0]
-
- /* Signaler (Mode: 40) */
-
-
- if(istype(radio,/obj/item/radio/integrated/signal) && (mode==40))
- var/obj/item/radio/integrated/signal/R = radio
- values["signal_freq"] = format_frequency(R.frequency)
- values["signal_code"] = R.code
-
-
- /* Station Display (Mode: 42) */
-
- if(mode==42)
- values["message1"] = message1 ? message1 : "(none)"
- values["message2"] = message2 ? message2 : "(none)"
-
-
-
- /* Power Monitor (Mode: 43 / 433) */
-
- if(mode==43 || mode==433)
- var/list/sensors = list()
- var/obj/machinery/power/sensor/MS = null
-
- for(var/obj/machinery/power/sensor/S in GLOB.machines)
- sensors.Add(list(list("name_tag" = S.name_tag)))
- if(S.name_tag == selected_sensor)
- MS = S
- values["power_sensors"] = sensors
- if(selected_sensor && MS)
- values["sensor_reading"] = MS.return_reading_data()
-
-
- /* General Records (Mode: 44 / 441 / 45 / 451) */
- if(mode == 44 || mode == 441 || mode == 45 || mode ==451)
- if(istype(active1, /datum/data/record) && (active1 in data_core.general))
- values["general"] = active1.fields
- values["general_exists"] = 1
-
- else
- values["general_exists"] = 0
-
-
-
- /* Medical Records (Mode: 44 / 441) */
-
- if(mode == 44 || mode == 441)
- var/medData[0]
- for(var/datum/data/record/R in sortRecord(data_core.general))
- medData[++medData.len] = list(Name = R.fields["name"],"ref" = "\ref[R]")
- values["medical_records"] = medData
-
- if(istype(active2, /datum/data/record) && (active2 in data_core.medical))
- values["medical"] = active2.fields
- values["medical_exists"] = 1
- else
- values["medical_exists"] = 0
-
- /* Security Records (Mode:45 / 451) */
-
- if(mode == 45 || mode == 451)
- var/secData[0]
- for (var/datum/data/record/R in sortRecord(data_core.general))
- secData[++secData.len] = list(Name = R.fields["name"], "ref" = "\ref[R]")
- values["security_records"] = secData
-
- if(istype(active3, /datum/data/record) && (active3 in data_core.security))
- values["security"] = active3.fields
- values["security_exists"] = 1
- else
- values["security_exists"] = 0
-
- /* Security Bot Control (Mode: 46) */
-
- if(mode==46)
- var/botsData[0]
- var/beepskyData[0]
- if(istype(radio,/obj/item/radio/integrated/beepsky))
- var/obj/item/radio/integrated/beepsky/SC = radio
- beepskyData["active"] = SC.active
- if(SC.active && !isnull(SC.botstatus))
- var/area/loca = SC.botstatus["loca"]
- var/loca_name = sanitize(loca.name)
- beepskyData["botstatus"] = list("loca" = loca_name, "mode" = SC.botstatus["mode"])
- else
- beepskyData["botstatus"] = list("loca" = null, "mode" = -1)
- var/botsCount=0
- if(SC.botlist && SC.botlist.len)
- for(var/mob/living/bot/B in SC.botlist)
- botsCount++
- if(B.loc)
- botsData[++botsData.len] = list("Name" = sanitize(B.name), "Location" = sanitize(B.loc.loc.name), "ref" = "\ref[B]")
-
- if(!botsData.len)
- botsData[++botsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
-
- beepskyData["bots"] = botsData
- beepskyData["count"] = botsCount
-
- else
- beepskyData["active"] = 0
- botsData[++botsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
- beepskyData["botstatus"] = list("loca" = null, "mode" = null)
- beepskyData["bots"] = botsData
- beepskyData["count"] = 0
-
- values["beepsky"] = beepskyData
-
-
- /* MULEBOT Control (Mode: 48) */
-
- if(mode==48)
- var/muleData[0]
- var/mulebotsData[0]
- if(istype(radio,/obj/item/radio/integrated/mule))
- var/obj/item/radio/integrated/mule/QC = radio
- muleData["active"] = QC.active
- if(QC.active && !isnull(QC.botstatus))
- var/area/loca = QC.botstatus["loca"]
- var/loca_name = sanitize(loca.name)
- muleData["botstatus"] = list("loca" = loca_name, "mode" = QC.botstatus["mode"],"home"=QC.botstatus["home"],"powr" = QC.botstatus["powr"],"retn" =QC.botstatus["retn"], "pick"=QC.botstatus["pick"], "load" = QC.botstatus["load"], "dest" = sanitize(QC.botstatus["dest"]))
-
- else
- muleData["botstatus"] = list("loca" = null, "mode" = -1,"home"=null,"powr" = null,"retn" =null, "pick"=null, "load" = null, "dest" = null)
-
-
- var/mulebotsCount=0
- for(var/obj/machinery/bot/B in QC.botlist)
- mulebotsCount++
- if(B.loc)
- mulebotsData[++mulebotsData.len] = list("Name" = sanitize(B.name), "Location" = sanitize(B.loc.loc.name), "ref" = "\ref[B]")
-
- if(!mulebotsData.len)
- mulebotsData[++mulebotsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
-
- muleData["bots"] = mulebotsData
- muleData["count"] = mulebotsCount
-
- else
- muleData["botstatus"] = list("loca" = null, "mode" = -1,"home"=null,"powr" = null,"retn" =null, "pick"=null, "load" = null, "dest" = null)
- muleData["active"] = 0
- mulebotsData[++mulebotsData.len] = list("Name" = "No bots found", "Location" = "Invalid", "ref"= null)
- muleData["bots"] = mulebotsData
- muleData["count"] = 0
-
- values["mulebot"] = muleData
-
-
-
- /* Supply Shuttle Requests Menu (Mode: 47) */
-
- if(mode==47)
- var/supplyData[0]
- var/datum/shuttle/autodock/ferry/supply/shuttle = SSsupply.shuttle
- if (shuttle)
- supplyData["shuttle_moving"] = shuttle.has_arrive_time()
- supplyData["shuttle_eta"] = shuttle.eta_minutes()
- supplyData["shuttle_loc"] = shuttle.at_station() ? "Station" : "Dock"
- var/supplyOrderCount = 0
- var/supplyOrderData[0]
- for(var/S in SSsupply.shoppinglist)
- var/datum/supply_order/SO = S
-
- supplyOrderData[++supplyOrderData.len] = list("Number" = SO.id, "Name" = html_encode(SO.object.name), "ApprovedBy" = SO.orderer, "Comment" = html_encode(SO.reason))
- if(!supplyOrderData.len)
- supplyOrderData[++supplyOrderData.len] = list("Number" = null, "Name" = null, "OrderedBy"=null)
-
- supplyData["approved"] = supplyOrderData
- supplyData["approved_count"] = supplyOrderCount
-
- var/requestCount = 0
- var/requestData[0]
- for(var/S in SSsupply.requestlist)
- var/datum/supply_order/SO = S
- requestCount++
- requestData[++requestData.len] = list("Number" = SO.id, "Name" = html_encode(SO.object.name), "OrderedBy" = SO.orderer, "Comment" = html_encode(SO.reason))
- if(!requestData.len)
- requestData[++requestData.len] = list("Number" = null, "Name" = null, "orderedBy" = null, "Comment" = null)
-
- supplyData["requests"] = requestData
- supplyData["requests_count"] = requestCount
-
-
- values["supply"] = supplyData
-
-
-
- /* Janitor Supplies Locator (Mode: 49) */
- if(mode==49)
- var/JaniData[0]
- var/turf/cl = get_turf(src)
-
- if(cl)
- JaniData["user_loc"] = list("x" = cl.x, "y" = cl.y)
- else
- JaniData["user_loc"] = list("x" = 0, "y" = 0)
- var/MopData[0]
- for(var/obj/item/mop/M in world)
- var/turf/ml = get_turf(M)
- if(ml)
- if(ml.z != cl.z)
- continue
- var/direction = get_dir(src, M)
- MopData[++MopData.len] = list ("x" = ml.x, "y" = ml.y, "dir" = uppertext(dir2text(direction)), "status" = M.reagents.total_volume ? "Wet" : "Dry")
-
- if(!MopData.len)
- MopData[++MopData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
-
-
- var/BucketData[0]
- for(var/obj/structure/mopbucket/B in world)
- var/turf/bl = get_turf(B)
- if(bl)
- if(bl.z != cl.z)
- continue
- var/direction = get_dir(src,B)
- BucketData[++BucketData.len] = list ("x" = bl.x, "y" = bl.y, "dir" = uppertext(dir2text(direction)), "status" = B.reagents.total_volume/100)
-
- if(!BucketData.len)
- BucketData[++BucketData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
-
- var/CbotData[0]
- for(var/mob/living/bot/cleanbot/B in world)
- var/turf/bl = get_turf(B)
- if(bl)
- if(bl.z != cl.z)
- continue
- var/direction = get_dir(src,B)
- CbotData[++CbotData.len] = list("x" = bl.x, "y" = bl.y, "dir" = uppertext(dir2text(direction)), "status" = B.on ? "Online" : "Offline")
-
-
- if(!CbotData.len)
- CbotData[++CbotData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
- var/CartData[0]
- for(var/obj/structure/janitorialcart/B in world)
- var/turf/bl = get_turf(B)
- if(bl)
- if(bl.z != cl.z)
- continue
- var/direction = get_dir(src,B)
- CartData[++CartData.len] = list("x" = bl.x, "y" = bl.y, "dir" = uppertext(dir2text(direction)), "status" = B.reagents.total_volume/100)
- if(!CartData.len)
- CartData[++CartData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
-
-
-
-
- JaniData["mops"] = MopData
- JaniData["buckets"] = BucketData
- JaniData["cleanbots"] = CbotData
- JaniData["carts"] = CartData
- values["janitor"] = JaniData
-
- return values
-
-
-
-
-
-/obj/item/cartridge/Topic(href, href_list)
- ..()
-
- if (!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
- usr.unset_machine()
- usr << browse(null, "window=pda")
- return
-
-
-
-
- switch(href_list["choice"])
- if("Medical Records")
- var/datum/data/record/R = locate(href_list["target"])
- var/datum/data/record/M = locate(href_list["target"])
- loc:mode = 441
- mode = 441
- if (R in data_core.general)
- for (var/datum/data/record/E in data_core.medical)
- if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- M = E
- break
- active1 = R
- active2 = M
-
- if("Security Records")
- var/datum/data/record/R = locate(href_list["target"])
- var/datum/data/record/S = locate(href_list["target"])
- loc:mode = 451
- mode = 451
- if (R in data_core.general)
- for (var/datum/data/record/E in data_core.security)
- if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- S = E
- break
- active1 = R
- active3 = S
-
- if("Send Signal")
- spawn( 0 )
- radio:send_signal("ACTIVATE")
- return
-
- if("Signal Frequency")
- var/new_frequency = sanitize_frequency(radio:frequency + text2num(href_list["sfreq"]))
- radio:set_frequency(new_frequency)
-
- if("Signal Code")
- radio:code += text2num(href_list["scode"])
- radio:code = round(radio:code)
- radio:code = min(100, radio:code)
- radio:code = max(1, radio:code)
-
- if("Status")
- switch(href_list["statdisp"])
- if("message")
- post_status("message", message1, message2)
- if("alert")
- post_status("alert", href_list["alert"])
- if("setmsg1")
- message1 = reject_bad_text(sanitize(input("Line 1", "Enter Message Text", message1) as text|null, 40), 40)
- updateSelfDialog()
- if("setmsg2")
- message2 = reject_bad_text(sanitize(input("Line 2", "Enter Message Text", message2) as text|null, 40), 40)
- updateSelfDialog()
- else
- post_status(href_list["statdisp"])
-
- if("Power Select")
- selected_sensor = href_list["target"]
- loc:mode = 433
- mode = 433
- if("Power Clear")
- selected_sensor = null
- loc:mode = 43
- mode = 43
-
-
- return 1
diff --git a/code/game/objects/items/devices/PDA/chatroom.dm b/code/game/objects/items/devices/PDA/chatroom.dm
deleted file mode 100644
index 008dab6414..0000000000
--- a/code/game/objects/items/devices/PDA/chatroom.dm
+++ /dev/null
@@ -1,16 +0,0 @@
-var/list/chatrooms = list()
-
-/datum/chatroom
- var/name = "Generic Chatroom"
- var/list/logged_in = list()
- var/list/logs = list() // chat logs
- var/list/banned = list() // banned users
- var/list/whitelist = list() // whitelisted users
- var/list/muted = list()
- var/topic = "" // topic message for the chatroom
- var/password = "" // blank for no password.
- var/operator = "" // name of the operator
-
-/datum/chatroom/proc/attempt_connect(var/obj/item/device/pda/device, var/obj/password)
- if(!device)
- return
diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm
deleted file mode 100644
index ae2c9b795c..0000000000
--- a/code/game/objects/items/devices/PDA/radio.dm
+++ /dev/null
@@ -1,251 +0,0 @@
-/obj/item/radio/integrated
- name = "\improper PDA radio module"
- desc = "An electronic radio system."
- icon = 'icons/obj/module.dmi'
- icon_state = "power_mod"
- var/obj/item/device/pda/hostpda
-
- var/on = FALSE //Are we currently active??
- var/menu_message = ""
-
- New()
- ..()
- if (istype(loc.loc, /obj/item/device/pda))
- hostpda = loc.loc
-
- proc/post_signal(var/freq, var/key, var/value, var/key2, var/value2, var/key3, var/value3, s_filter)
-
- //world << "Post: [freq]: [key]=[value], [key2]=[value2]"
- var/datum/radio_frequency/frequency = SSradio.return_frequency(freq)
-
- if(!frequency) return
-
- var/datum/signal/signal = new()
- signal.source = src
- signal.transmission_method = 1
- signal.data[key] = value
- if(key2)
- signal.data[key2] = value2
- if(key3)
- signal.data[key3] = value3
-
- frequency.post_signal(src, signal, filter = s_filter)
-
- return
-
- proc/generate_menu()
-
-/obj/item/radio/integrated/beepsky
- var/list/botlist // list of bots
- var/mob/living/bot/secbot/active // the active bot; if null, show bot list
- var/list/botstatus // the status signal sent by the bot
-
- var/control_freq = BOT_FREQ
-
- // create a new QM cartridge, and register to receive bot control & beacon message
- New()
- ..()
- spawn(5)
- SSradio.add_object(src, control_freq, filter = RADIO_SECBOT)
-
- // receive radio signals
- // can detect bot status signals
- // create/populate list as they are recvd
-
- receive_signal(datum/signal/signal)
-// var/obj/item/device/pda/P = src.loc
-
- /*
- to_chat(world, "recvd:[P] : [signal.source]")
- for(var/d in signal.data)
- to_chat(world, "- [d] = [signal.data[d]]")
- */
- if (signal.data["type"] == "secbot")
- if(!botlist)
- botlist = new()
-
- if(!(signal.source in botlist))
- botlist += signal.source
-
- if(active == signal.source)
- var/list/b = signal.data
- botstatus = b.Copy()
-
-// if (istype(P)) P.updateSelfDialog()
-
- Topic(href, href_list)
- ..()
- var/obj/item/device/pda/PDA = src.hostpda
-
- switch(href_list["op"])
-
- if("control")
- active = locate(href_list["bot"])
- post_signal(control_freq, "command", "bot_status", "active", active, s_filter = RADIO_SECBOT)
-
- if("scanbots") // find all bots
- botlist = null
- post_signal(control_freq, "command", "bot_status", s_filter = RADIO_SECBOT)
-
- if("botlist")
- active = null
-
- if("stop", "go")
- post_signal(control_freq, "command", href_list["op"], "active", active, s_filter = RADIO_SECBOT)
- post_signal(control_freq, "command", "bot_status", "active", active, s_filter = RADIO_SECBOT)
-
- if("summon")
- post_signal(control_freq, "command", "summon", "active", active, "target", get_turf(PDA) , s_filter = RADIO_SECBOT)
- post_signal(control_freq, "command", "bot_status", "active", active, s_filter = RADIO_SECBOT)
-
-
-/obj/item/radio/integrated/beepsky/Destroy()
- SSradio.remove_object(src, control_freq)
- . = ..()
-
-/obj/item/radio/integrated/mule
- var/list/botlist = null // list of bots
- var/obj/machinery/bot/mulebot/active // the active bot; if null, show bot list
- var/list/botstatus // the status signal sent by the bot
- var/list/beacons
-
- var/beacon_freq = 1400
- var/control_freq = BOT_FREQ
-
- // create a new QM cartridge, and register to receive bot control & beacon message
- New()
- ..()
- spawn(5)
- SSradio.add_object(src, control_freq, filter = RADIO_MULEBOT)
- SSradio.add_object(src, beacon_freq, filter = RADIO_NAVBEACONS)
- spawn(10)
- post_signal(beacon_freq, "findbeacon", "delivery", s_filter = RADIO_NAVBEACONS)
-
- // receive radio signals
- // can detect bot status signals
- // and beacon locations
- // create/populate lists as they are recvd
-
- receive_signal(datum/signal/signal)
-// var/obj/item/device/pda/P = src.loc
-
- /*
- to_chat(world, "recvd:[P] : [signal.source]")
- for(var/d in signal.data)
- to_chat(world, "- [d] = [signal.data[d]]")
- */
- if(signal.data["type"] == "mulebot")
- if(!botlist)
- botlist = new()
-
- if(!(signal.source in botlist))
- botlist += signal.source
-
- if(active == signal.source)
- var/list/b = signal.data
- botstatus = b.Copy()
-
- else if(signal.data["beacon"])
- if(!beacons)
- beacons = new()
-
- beacons[signal.data["beacon"] ] = signal.source
-
-
-// if(istype(P)) P.updateSelfDialog()
-
- Topic(href, href_list)
- ..()
- var/cmd = "command"
- if(active) cmd = "command [active.suffix]"
-
- switch(href_list["op"])
-
- if("control")
- active = locate(href_list["bot"])
- post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
-
- if("scanbots") // find all bots
- botlist = null
- post_signal(control_freq, "command", "bot_status", s_filter = RADIO_MULEBOT)
-
- if("botlist")
- active = null
-
-
- if("unload")
- post_signal(control_freq, cmd, "unload", s_filter = RADIO_MULEBOT)
- post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
- if("setdest")
- if(beacons)
- var/dest = input("Select Bot Destination", "Mulebot [active.suffix] Interlink", active.destination) as null|anything in beacons
- if(dest)
- post_signal(control_freq, cmd, "target", "destination", dest, s_filter = RADIO_MULEBOT)
- post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
-
- if("retoff")
- post_signal(control_freq, cmd, "autoret", "value", 0, s_filter = RADIO_MULEBOT)
- post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
- if("reton")
- post_signal(control_freq, cmd, "autoret", "value", 1, s_filter = RADIO_MULEBOT)
- post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
-
- if("pickoff")
- post_signal(control_freq, cmd, "autopick", "value", 0, s_filter = RADIO_MULEBOT)
- post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
- if("pickon")
- post_signal(control_freq, cmd, "autopick", "value", 1, s_filter = RADIO_MULEBOT)
- post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
-
- if("stop", "go", "home")
- post_signal(control_freq, cmd, href_list["op"], s_filter = RADIO_MULEBOT)
- post_signal(control_freq, cmd, "bot_status", s_filter = RADIO_MULEBOT)
-
-
-
-/*
- * Radio Cartridge, essentially a signaler.
- */
-
-
-/obj/item/radio/integrated/signal
- var/frequency = 1457
- var/code = 30
- var/last_transmission
- var/datum/radio_frequency/radio_connection
-
- Initialize()
- . = ..()
-
- if (src.frequency < PUBLIC_LOW_FREQ || src.frequency > PUBLIC_HIGH_FREQ)
- src.frequency = sanitize_frequency(src.frequency)
-
- set_frequency(frequency)
-
- proc/set_frequency(new_frequency)
- SSradio.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = SSradio.add_object(src, frequency)
-
- proc/send_signal(message="ACTIVATE")
-
- if(last_transmission && world.time < (last_transmission + 5))
- return
- last_transmission = world.time
-
- var/time = time2text(world.realtime,"hh:mm:ss")
- var/turf/T = get_turf(src)
- lastsignalers.Add("[time] : [usr.key] used [src] @ location ([T.x],[T.y],[T.z]) : [format_frequency(frequency)]/[code]")
-
- var/datum/signal/signal = new
- signal.source = src
- signal.encryption = code
- signal.data["message"] = message
-
- radio_connection.post_signal(src, signal)
-
- return
-
-/obj/item/radio/integrated/signal/Destroy()
- SSradio.remove_object(src, frequency)
- . = ..()
diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm
index 63babfee62..dff63d02e4 100644
--- a/code/game/objects/items/devices/aicard.dm
+++ b/code/game/objects/items/devices/aicard.dm
@@ -7,7 +7,7 @@
slot_flags = SLOT_BELT
origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4)
matter = list(MATERIAL_STEEL = 1, MATERIAL_PLASTIC = 1, MATERIAL_GLASS = 1)
- commonLore = "An AI storage card. This device makes use of old Nanotransen flash sticks to store the core-programming of an AI. The highly specialised structure inside permits efficient storage of AI programs of sizes up to 150 TB"
+ commonLore = "An AI storage card. This device makes use of old nanotrasen flash sticks to store the core-programming of an AI. The highly specialised structure inside permits efficient storage of AI programs of sizes up to 150 TB"
//spawn_blacklisted = TRUE//antag_item_targets??
var/mob/living/silicon/ai/carded_ai
var/flush
diff --git a/code/game/objects/items/devices/scanners/health.dm b/code/game/objects/items/devices/scanners/health.dm
index 4d0384b274..0ce5b94191 100644
--- a/code/game/objects/items/devices/scanners/health.dm
+++ b/code/game/objects/items/devices/scanners/health.dm
@@ -2,7 +2,7 @@
/obj/item/device/scanner/health
name = "health analyzer"
desc = "A hand-held body scanner able to distinguish vital signs of the subject."
- icon_state = "health"
+ icon_state = "health0"
item_state = "analyzer"
throw_speed = 5
throw_range = 10
@@ -196,3 +196,21 @@
dat += span("highlight", "Blood Level Normal: [blood_percent]% [blood_volume]cl. Type: [blood_type]")
dat += "Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm."
. = jointext(dat, "
")
+
+/obj/item/device/scanner/health/cell_use_check(charge, mob/user)
+ . = TRUE
+ icon_state = "health"
+ if(!cell || !cell.checked_use(charge))
+ if(user)
+ to_chat(user, SPAN_WARNING("[src] battery is dead or missing."))
+ . = FALSE
+ icon_state = "health0"
+
+/obj/item/device/scanner/health/cell_check(charge, mob/user)
+ . = TRUE
+ icon_state = "health"
+ if(!cell || !cell.check_charge(charge))
+ if(user)
+ to_chat(user, SPAN_WARNING("[src] battery is dead or missing."))
+ . = FALSE
+ icon_state = "health0"
diff --git a/code/game/objects/items/devices/scanners/scanners.dm b/code/game/objects/items/devices/scanners/scanners.dm
index 1709448d00..ad7785fa09 100644
--- a/code/game/objects/items/devices/scanners/scanners.dm
+++ b/code/game/objects/items/devices/scanners/scanners.dm
@@ -28,7 +28,7 @@
var/window_width = 450
var/window_height = 600
- var/charge_per_use = 0
+ var/charge_per_use = 5
var/is_virtual = FALSE // for non-physical scanner to avoid displaying action messages
@@ -52,8 +52,9 @@
return
if (!user.IsAdvancedToolUser())
return
- if(!cell_use_check(charge_per_use, user))
- return
+ if(!is_virtual)
+ if(!cell_use_check(charge_per_use, user))
+ return
return TRUE
/obj/item/device/scanner/proc/is_valid_scan_target(atom/O)
diff --git a/code/game/objects/items/spraypaint.dm b/code/game/objects/items/spraypaint.dm
index 83e6f72318..5777def4e2 100644
--- a/code/game/objects/items/spraypaint.dm
+++ b/code/game/objects/items/spraypaint.dm
@@ -12,7 +12,7 @@
/obj/item/spraypaint/afterattack(atom/target, mob/user as mob, proximity)
if(!proximity) return
if(istype(target,/turf))
- var/graffititype = input("Choose what you'd like to paint") in list("Kot","Onestar","Doodle","Piss","Clown","Skull","Heart","Excelsior","Ironhammer","Moebius","Neotheology","Technomancer","Aster","Ancap yes","Ancap no")
+ var/graffititype = input("Choose what you'd like to paint") in list("Kot","Onestar","Carrion","Doodle","Piss","Clown","Skull","Heart","Excelsior","Ironhammer","Moebius","Neotheology","Technomancer","Aster","Ancap yes","Ancap no")
if(uses <= 0)
playsound(loc, 'sound/effects/interaction/graffiti_empty.ogg', 100, 1)
to_chat(user, SPAN_NOTICE("The spray can is empty."))
@@ -29,6 +29,8 @@
new /obj/effect/decal/cleanable/graffiti/graffiti_kot(target)
if("Onestar")
new /obj/effect/decal/cleanable/graffiti/graffiti_onestar(target)
+ if("Carrion")
+ new /obj/effect/decal/cleanable/graffiti/graffiti_carrion(target)
if("Doodle")
new /obj/effect/decal/cleanable/graffiti/graffiti_doodle(target)
if("Piss")
diff --git a/code/game/objects/items/weapons/candle.dm b/code/game/objects/items/weapons/candle.dm
index bc02d0ff38..e6ff00376c 100644
--- a/code/game/objects/items/weapons/candle.dm
+++ b/code/game/objects/items/weapons/candle.dm
@@ -1,5 +1,5 @@
/obj/item/flame/candle
- name = "red candle"
+ name = "wax candle"
desc = "a small pillar candle. Its specially-formulated fuel-oxidizer wax mixture allows continued combustion in airless environments."
icon = 'icons/obj/candle.dmi'
icon_state = "candle1"
@@ -15,9 +15,9 @@
/obj/item/flame/candle/update_icon()
var/i
- if(wax > 1500)
+ if(wax > 800)
i = 1
- else if(wax > 800)
+ else if(wax > 600)
i = 2
else i = 3
icon_state = "candle[i][lit ? "_lit" : ""]"
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index 0b3a203259..8565c48144 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -96,7 +96,7 @@ var/const/NO_EMAG_ACT = -50
/obj/item/card/id
name = "identification card"
desc = "A card used to provide ID and determine access across the ship."
- commonLore = "This card seems to be of old NanoTransen origin."
+ commonLore = "This card seems to be of old nanotrasen origin."
icon_state = "id"
item_state = "card-id"
slot_flags = SLOT_ID
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index 5d757d3624..faf627bc41 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -242,6 +242,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
item_state = "cigoff"
volumeClass = ITEM_SIZE_TINY
slot_flags = SLOT_EARS | SLOT_MASK
+ spawn_tags = SPAWN_CIGARETTE
attack_verb = list("burnt", "singed")
icon_on = "cigon" //Note - these are in masks.dmi not in cigarette.dmi
icon_off = "cigoff"
@@ -298,15 +299,70 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/smokable/cigarette/dromedaryco
desc = "A roll of tobacco and nicotine. They are just cancer sticks."
preloaded_reagents = list("nicotine" = 10)
+ icon_state = "dromoff"
+ item_state = "dromoff"
+ icon_on = "dromon"
+ icon_off = "dromoff"
+ type_butt = /obj/item/trash/cigbutt/dromedaryco
/obj/item/clothing/mask/smokable/cigarette/killthroat
- desc = "A roll of tobacco and nicotine. Gives the best bang for buck for your throat."
+ desc = "A roll of tobacco and nicotine. Gives the best bang for your throat."
preloaded_reagents = list("nicotine" = 10, "poisonberryjuice" = 3)
+ icon_state = "acmeoff"
+ item_state = "acmeoff"
+ icon_on = "acmeon"
+ icon_off = "acmeoff"
+ type_butt = /obj/item/trash/cigbutt/acme
/obj/item/clothing/mask/smokable/cigarette/homeless
desc = "A roll of tobacco and nicotine. Gives the feeling of fight."
preloaded_reagents = list("nicotine" = 6, "adrenaline" = 3)
-
+ icon_state = "nomadoff"
+ item_state = "nomadoff"
+ icon_on = "nomadon"
+ icon_off = "nomadoff"
+ spawn_tags = SPAWN_TAG_CIGARETTE_MAINTS
+ type_butt = /obj/item/trash/cigbutt/nomad
+
+/obj/item/clothing/mask/smokable/cigarette/lucky
+ desc = "A roll of tobacco and nicotine. Gives the feeling of old wars. Feelin' lucky?"
+ preloaded_reagents = list("nicotine" = 3, "serotrotium" = 6)
+ icon_state = "luckyoff"
+ item_state = "luckyoff"
+ icon_on = "luckyon"
+ icon_off = "luckyoff"
+ spawn_tags = SPAWN_TAG_CIGARETTE_MAINTS
+ type_butt = /obj/item/trash/cigbutt/lucky
+
+/obj/item/clothing/mask/smokable/cigarette/robusto
+ desc = "A roll of tobacco and nicotine. Gives the feeling of old wars. Let's crack some skulls!"
+ preloaded_reagents = list("nicotine" = 6, "violence" = 3)
+ icon_state = "robustoff"
+ item_state = "robustoff"
+ icon_on = "robuston"
+ icon_off = "robustoff"
+ spawn_tags = SPAWN_TAG_CIGARETTE_MAINTS
+ type_butt = /obj/item/trash/cigbutt/robusto
+
+/obj/item/clothing/mask/smokable/cigarette/buckshot
+ desc = "A roll of tobacco and nicotine. Maint cig, some say it helps take the edge off better than most."
+ preloaded_reagents = list("nicotine" = 6, "paracetamol" = 3)
+ icon_state = "klassikaoff"
+ item_state = "klassikaoff"
+ icon_on = "klassikaon"
+ icon_off = "klassikaoff"
+ spawn_tags = SPAWN_TAG_CIGARETTE_MAINTS
+ type_butt = /obj/item/trash/cigbutt/buckshot
+
+/obj/item/clothing/mask/smokable/cigarette/quasimorph
+ desc = "A roll of tobacco and nicotine. Maint cig, ancient paper, how old is this...?"
+ preloaded_reagents = list("nicotine" = 6, "dexalin" = 3)
+ icon_state = "kosmosoff"
+ item_state = "kosmosoff"
+ icon_on = "kosmoson"
+ icon_off = "kosmosoff"
+ spawn_tags = SPAWN_TAG_CIGARETTE_MAINTS
+ type_butt = /obj/item/trash/cigbutt/quasimorph
////////////
// CIGARS //
@@ -372,6 +428,27 @@ CIGARETTE PACKETS ARE IN FANCY.DM
desc = "A manky old cigar butt."
icon_state = "cigarbutt"
+/obj/item/trash/cigbutt/dromedaryco
+ icon_state = "drombutt"
+
+/obj/item/trash/cigbutt/acme
+ icon_state = "acmebutt"
+
+/obj/item/trash/cigbutt/nomad
+ icon_state = "nomadbutt"
+
+/obj/item/trash/cigbutt/lucky
+ icon_state = "luckybutt"
+
+/obj/item/trash/cigbutt/robusto
+ icon_state = "robustbutt"
+
+/obj/item/trash/cigbutt/buckshot
+ icon_state = "klassikabutt"
+
+/obj/item/trash/cigbutt/quasimorph
+ icon_state = "kosmosbutt"
+
/////////////////
//SMOKING PIPES//
/////////////////
diff --git a/code/game/objects/items/weapons/design_disks/NeoTheology.dm b/code/game/objects/items/weapons/design_disks/NeoTheology.dm
index 4a1190e4fa..a54915efa7 100644
--- a/code/game/objects/items/weapons/design_disks/NeoTheology.dm
+++ b/code/game/objects/items/weapons/design_disks/NeoTheology.dm
@@ -13,6 +13,7 @@
/datum/design/bioprinter/leather/holster/baton,
/datum/design/bioprinter/leather/holster/belt,
/datum/design/bioprinter/leather/holster/sheath,
+ /datum/design/bioprinter/leather/holster/accessory/scabbard,
/datum/design/bioprinter/small_generic,
/datum/design/bioprinter/medium_generic,
/datum/design/bioprinter/large_generic,
@@ -224,6 +225,17 @@
/datum/design/autolathe/device/headset_church
)
+/obj/item/computer_hardware/hard_drive/portable/design/nt_ritual
+ disk_name = "NeoTheology Supplies - \"Ritualis Supplies\""
+ icon_state = "neotheology"
+ spawn_blacklisted = TRUE
+
+ license = -1
+ designs = list(
+ /datum/design/bioprinter/nt_clothes/ritual_robe,
+ /datum/design/bioprinter/candles
+ )
+
// Basic melee
/obj/item/computer_hardware/hard_drive/portable/design/nt_melee
disk_name = "NeoTheology Armory - \"Hastatii Arms\""
diff --git a/code/game/objects/items/weapons/design_disks/asters.dm b/code/game/objects/items/weapons/design_disks/asters.dm
index 567c0debd5..bcacce9df2 100644
--- a/code/game/objects/items/weapons/design_disks/asters.dm
+++ b/code/game/objects/items/weapons/design_disks/asters.dm
@@ -120,7 +120,8 @@
rarity_value = 13 // between standard and bulletproof armor
license = 6
designs = list(
- /datum/design/autolathe/clothing/generic_vest_webbing,
+ /datum/design/autolathe/clothing/generic_vest_webbing = 2,
+ /datum/design/autolathe/clothing/generic_vest_security,
/datum/design/autolathe/clothing/generic_helmet_visored,
/datum/design/autolathe/clothing/generic_vest_security_full = 2,
/datum/design/autolathe/clothing/riot_helmet = 2,
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index d445e9fbb0..12ae17e9f3 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -107,7 +107,7 @@
/obj/item/melee/energy/sword
color
name = "energy sword"
- desc = "May the Force be with you."
+ desc = "A tight and compact hilt featuring a side switch for deploying a highly precise, deadly, and concentrated beam of light. Used by assassins, honor guards, and rich men, this sword of light strikes fear into even the coldest of mercenaries."
icon_state = "sword0"
activeDamages = list(ARMOR_ENERGY = list(DELEM(BURN,30), DELEM(BRUTE,15))) // Go forth and slay, padawan
active_throwforce = WEAPON_FORCE_LETHAL
@@ -120,6 +120,7 @@
)
throwforce = WEAPON_FORCE_HARMLESS
+ armor_divisor = ARMOR_PEN_HALF
throw_speed = 1
throw_range = 5
volumeClass = ITEM_SIZE_SMALL
@@ -162,6 +163,8 @@
icon_state = "sword[blade_color]"
..()
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ hitsound = 'sound/weapons/blade1.ogg'
+
tool_qualities = list(QUALITY_CUTTING = 30, QUALITY_WIRE_CUTTING = 20, QUALITY_LASER_CUTTING = 20, QUALITY_WELDING = 10, QUALITY_CAUTERIZING = 10)
/obj/item/melee/energy/sword/deactivate(mob/living/user)
@@ -224,6 +227,7 @@
throw_range = 1
volumeClass = ITEM_SIZE_BULKY
flags = NOBLOODY
+ hitsound = 'sound/weapons/blade1.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
var/mob/living/creator
var/datum/effect/effect/system/spark_spread/spark_system
diff --git a/code/game/objects/items/weapons/secdocs.dm b/code/game/objects/items/weapons/secdocs.dm
index b10d2a310f..e8f0760fbc 100644
--- a/code/game/objects/items/weapons/secdocs.dm
+++ b/code/game/objects/items/weapons/secdocs.dm
@@ -15,42 +15,43 @@
/obj/item/oddity/secdocs/Initialize()
icon_state = "folder-[pick("omega","psi","theta")]"
- name = pick("Attractor field theory",
- "World lines theory",
- "Evidence of an outside-context problem",
- "On the use of self-learning AI for public administration",
- "Evidence of time travel related changes in history",
- "Geography of nonexistent cities",
- "Production of Alliance nanomachines",
- "Known SAU equipment specifications",
- "Known access points to Discordia",
- "The Door phenomenon",
- "Parallel world-related mutations",
- "Mass hallucinations or breach from another world?",
- "Ironhammer budget: evidence of SAU overfund",
- "The truth behind the fall of One Star",
- "Are we next? The connection between One Star and dead alien civilizations",
- "Unknown device blueprints",
- "Psionic and bluespace relativity",
- "Data teleportation with the use of bluespace",
- "Synthesization of darkmatter",
- "Bluespace local-continuum energy extraction",
- "Is god real? On the origin of cruciforms",
- "Non-relativistic bluespace phenomenons",
- "Moebius technologies, evidence of unethical mind experimentation",
- "Psionics, innate force within all bluespace entities",
- "Effects of teleportation, entanglement with one's bluespace copy",
- "On the existence of carrion's and their population within major social hubs",
- "Hacking methods using excelsior brute-forcing methods",
- "On the presence of bluespace waves in galaxies",
- "Hanza hierarchy study, a shadow government?",
- "Old Earth and Serbians. The effects of military equipment in the hands of pirates on space trade",
- "Psionics, found to be a common trait amongst one-star citizens",
- "Freezing light using bluespace lasers. Applications for increased-capacity battery cells.",
- "Interspecies wars, study into why they started.",
- "Aster's guild and the link between the new bluespace combat operatives."
- "Increase of brain-size correlates with insanity. Empirical study into the link between insanity and high intelligence",
- "Mental instability and brain-modifying drugs found to play a crucial part in the acquisition of psionic powers",
+ name = pick(
+ "Attractor field theory",
+ "World lines theory",
+ "Evidence of an outside-context problem",
+ "On the use of self-learning AI for public administration",
+ "Evidence of time travel related changes in history",
+ "Geography of nonexistent cities",
+ "Production of Alliance nanomachines",
+ "Known SAU equipment specifications",
+ "Known access points to Discordia",
+ "The Door phenomenon",
+ "Parallel world-related mutations",
+ "Mass hallucinations or breach from another world?",
+ "Ironhammer budget: evidence of SAU overfund",
+ "The truth behind the fall of One Star",
+ "Are we next? The connection between One Star and dead alien civilizations",
+ "Unknown device blueprints",
+ "Psionic and bluespace relativity",
+ "Data teleportation with the use of bluespace",
+ "Synthesization of darkmatter",
+ "Bluespace local-continuum energy extraction",
+ "Is god real? On the origin of cruciforms",
+ "Non-relativistic bluespace phenomenons",
+ "Moebius technologies, evidence of unethical mind experimentation",
+ "Psionics, innate force within all bluespace entities",
+ "Effects of teleportation, entanglement with one's bluespace copy",
+ "On the existence of carrion's and their population within major social hubs",
+ "Hacking methods using excelsior brute-forcing methods",
+ "On the presence of bluespace waves in galaxies",
+ "Hanza hierarchy study, a shadow government?",
+ "Old Earth and Serbians. The effects of military equipment in the hands of pirates on space trade",
+ "Psionics, found to be a common trait amongst one-star citizens",
+ "Freezing light using bluespace lasers. Applications for increased-capacity battery cells.",
+ "Interspecies wars, study into why they started.",
+ "Aster's guild and the link between the new bluespace combat operatives.",
+ "Increase of brain-size correlates with insanity. Empirical study into the link between insanity and high intelligence",
+ "Mental instability and brain-modifying drugs found to play a crucial part in the acquisition of psionic powers",
)
diff --git a/code/game/objects/items/weapons/space_harpoon.dm b/code/game/objects/items/weapons/space_harpoon.dm
index 6b7a5cc173..0430cdf3af 100644
--- a/code/game/objects/items/weapons/space_harpoon.dm
+++ b/code/game/objects/items/weapons/space_harpoon.dm
@@ -7,7 +7,7 @@
icon_state = "harpoon-1"
item_state = "harpoon-1"
icon = 'icons/obj/items.dmi'
- commonLore = "There were only 3 prototypes present when old Nanotransen collapsed. 2 of them were used to rob mega-banks. Since then , all vaults now have bluespace interference protection."
+ commonLore = "There were only 3 prototypes present when old nanotrasen collapsed. 2 of them were used to rob mega-banks. Since then , all vaults now have bluespace interference protection."
volumeClass = ITEM_SIZE_NORMAL
throw_speed = 4
throw_range = 20
diff --git a/code/game/objects/items/weapons/storage/deferred.dm b/code/game/objects/items/weapons/storage/deferred.dm
index 6370ec2c34..d2ecd79b30 100644
--- a/code/game/objects/items/weapons/storage/deferred.dm
+++ b/code/game/objects/items/weapons/storage/deferred.dm
@@ -81,8 +81,8 @@
/obj/item/storage/deferred/comms
name = "communications kit"
- desc = "A box full of radios and beacons"
- initial_contents = list(/obj/item/device/radio/beacon = 6, /obj/item/device/radio = 6)
+ desc = "A box full of radios"
+ initial_contents = list(/obj/item/device/radio = 6)
/obj/item/storage/deferred/lights
name = "illumination kit"
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index d1c0d1b603..677ddebd35 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -90,7 +90,7 @@
/obj/item/storage/fancy/candle_box
name = "candle pack"
- desc = "A pack of red candles."
+ desc = "A pack of wax candles."
icon = 'icons/obj/candle.dmi'
icon_state = "candlebox5"
icon_type = "candle"
@@ -166,6 +166,7 @@
volumeClass = ITEM_SIZE_TINY
throwforce = WEAPON_FORCE_HARMLESS
slot_flags = SLOT_BELT
+ spawn_tags = SPAWN_CIGARETTE
storage_slots = 6
item_obj = /obj/item/clothing/mask/smokable/cigarette
can_hold = list(/obj/item/clothing/mask/smokable/cigarette, /obj/item/flame/lighter)
@@ -240,24 +241,56 @@
/obj/item/storage/fancy/cigarettes/dromedaryco
name = "\improper DromedaryCo packet"
desc = "A packet of six imported DromedaryCo cancer sticks. A label on the packaging reads, \"Wouldn't a slow death make a change?\""
- icon_state = "Dpacket"
- item_state = "Dpacket"
+ icon_state = "dromedary_packet"
+ item_state = "dromedary_packet"
item_obj = /obj/item/clothing/mask/smokable/cigarette/dromedaryco
/obj/item/storage/fancy/cigarettes/killthroat
name = "\improper AcmeCo packet"
desc = "A packet of six AcmeCo cigarettes. For those who somehow want to obtain the record for the most amount of cancerous tumors."
- icon_state = "Bpacket"
- item_state = "Bpacket" //Doesn't have an inhand state, but neither does dromedary, so, ya know..
+ icon_state = "acme_packet"
+ item_state = "acme_packet" //Doesn't have an inhand state, but neither does dromedary, so, ya know..
item_obj = /obj/item/clothing/mask/smokable/cigarette/killthroat
/obj/item/storage/fancy/cigarettes/homeless
name = "\improper Nomads packet"
desc = "A packet of six Nomads cigarettes. Nomads's Extra strong for when your life is more extra hard"
- icon_state = "Cpacket"
- item_state = "Cpacket"
+ icon_state = "nomad_packet"
+ item_state = "nomad_packet"
+ spawn_tags = SPAWN_TAG_CIGARETTE_MAINTS
item_obj = /obj/item/clothing/mask/smokable/cigarette/homeless
+/obj/item/storage/fancy/cigarettes/lucky
+ name = "\improper Lucky Strikes packet"
+ desc = "A packet of six Lucky Strikes cigarettes. For some reason the Syndicate loved these things back in the war, still around as surplus today."
+ icon_state = "luck_packet"
+ item_state = "luck_packet"
+ item_obj = /obj/item/clothing/mask/smokable/cigarette/lucky
+
+/obj/item/storage/fancy/cigarettes/robusto
+ name = "\improper Red Robusto packet"
+ desc = "A packet of six Red Robusto Cigarettes. Old Nanotrasen cigs, some say they make you more robust..."
+ icon_state = "robusto_packet"
+ item_state = "robusto_packet"
+ spawn_tags = SPAWN_TAG_CIGARETTE_MAINTS
+ item_obj = /obj/item/clothing/mask/smokable/cigarette/robusto
+
+/obj/item/storage/fancy/cigarettes/buckshot
+ name = "\improper Klassika Filter packet"
+ desc = "A packet of six Klassika Filter Cigarettes. Old unknown brand, says 'Klassika Filter' on the front..."
+ icon_state = "klassika_packet"
+ item_state = "klassika_packet"
+ spawn_tags = SPAWN_TAG_CIGARETTE_MAINTS
+ item_obj = /obj/item/clothing/mask/smokable/cigarette/buckshot
+
+/obj/item/storage/fancy/cigarettes/quasimorph
+ name = "\improper Kosmos packet"
+ desc = "A packet of six Kosmos Cigarettes. Old Russian brand, says 'Космос' on the front, along with a white rocket."
+ icon_state = "kosmos_packet"
+ item_state = "kosmos_packet"
+ spawn_tags = SPAWN_TAG_CIGARETTE_MAINTS
+ item_obj = /obj/item/clothing/mask/smokable/cigarette/quasimorph
+
/obj/item/storage/fancy/cigcartons
name = "carton of cigarettes"
desc = "A box containing 10 packets of cigarettes."
diff --git a/code/game/objects/items/weapons/storage/holster.dm b/code/game/objects/items/weapons/storage/holster.dm
index 86072b4988..319a831efd 100644
--- a/code/game/objects/items/weapons/storage/holster.dm
+++ b/code/game/objects/items/weapons/storage/holster.dm
@@ -231,7 +231,7 @@
)
/obj/item/clothing/accessory/holster/scabbard
- name = "scabbard"
+ name = "uniform scabbard"
desc = "A sturdy brown leather scabbard with a gold trim, made to house a variety of swords. Needs to be attached to your uniform to be properly held in place."
icon_state = "sheath"
overlay_state = "sword"
diff --git a/code/game/objects/items/weapons/storage/pouches.dm b/code/game/objects/items/weapons/storage/pouches.dm
index 785329cbaa..b3a81163ff 100644
--- a/code/game/objects/items/weapons/storage/pouches.dm
+++ b/code/game/objects/items/weapons/storage/pouches.dm
@@ -22,9 +22,10 @@
/obj/item/storage/pouch/verb/toggle_slide()
set name = "Toggle Slide"
- set desc = "Toggle the behavior of last item in [src] \"sliding\" into your hand."
set category = "Object"
+ desc = "Toggle the behavior of last item in [src] \"sliding\" into your hand."
+
sliding_behavior = !sliding_behavior
to_chat(usr, SPAN_NOTICE("Items will now [sliding_behavior ? "" : "not"] slide out of [src]"))
@@ -86,7 +87,7 @@
matter = list(MATERIAL_BIOMATTER = 9, MATERIAL_STEEL = 1 )
rarity_value = 33
- storage_slots = null
+ storage_slots = null
max_storage_space = DEFAULT_SMALL_STORAGE //Medkits typically hold 5 items in them, this is pocket medkit
max_volumeClass = ITEM_SIZE_NORMAL
@@ -115,7 +116,7 @@
matter = list(MATERIAL_BIOMATTER = 9, MATERIAL_STEEL = 1 )
rarity_value = 20
- storage_slots = 4
+ storage_slots = 4
max_volumeClass = ITEM_SIZE_NORMAL
can_hold = list(
diff --git a/code/game/objects/items/weapons/tools/_tools.dm b/code/game/objects/items/weapons/tools/_tools.dm
index 50f3436d9e..a2455fae86 100644
--- a/code/game/objects/items/weapons/tools/_tools.dm
+++ b/code/game/objects/items/weapons/tools/_tools.dm
@@ -99,9 +99,12 @@ GLOBAL_LIST(melleExtrasCache)
if(!GLOB.melleExtrasCache)
GLOB.melleExtrasCache = list()
if(!GLOB.melleExtrasCache["[type]-t"])
- GLOB.melleExtrasCache["[type]-t"] = toggleable ? switchedOn.Copy() : switchedOn
+ GLOB.melleExtrasCache["[type]-t"] = switchedOn:Copy()
if(!(maxUpgrades || objectFlags & OF_UNIQUEMELLEHANDLER))
+ del(switchedOn)
switchedOn = GLOB.melleExtrasCache["[type]-t"]
+ else
+ switchedOn = GLOB.melleExtrasCache["[type]-t"]:Copy()
if(maxHealth)
health = maxHealth
@@ -991,23 +994,23 @@ GLOBAL_LIST(melleExtrasCache)
switch(safety)
if(FLASH_PROTECTION_MODERATE)
to_chat(H, SPAN_WARNING("Your eyes sting a little."))
- E.damage += rand(1, 2)
+ E.take_damage(3, BURN)
if(E.damage > 12)
H.eye_blurry += rand(3,6)
if(FLASH_PROTECTION_MINOR)
to_chat(H, SPAN_WARNING("The searing light burns your eyes through your insufficient protection."))
- E.damage += rand(2, 3)
+ E.take_damage(rand(6, 9), BURN)
if(E.damage > 11)
- E.damage += rand(4,8)
+ E.take_damage(rand(4, 6), BURN)
if(FLASH_PROTECTION_NONE)
to_chat(H, SPAN_WARNING("Your eyes burn."))
- E.damage += rand(2, 4)
+ E.take_damage(rand(8, 12), BURN)
if(E.damage > 10)
- E.damage += rand(4,10)
+ E.take_damage(rand(4, 12))
if(FLASH_PROTECTION_REDUCED)
to_chat(H, SPAN_DANGER("Your equipment intensify the welder's glow. Your eyes itch and burn severely."))
H.eye_blurry += rand(12,20)
- E.damage += rand(12, 16)
+ E.take_damage(rand(16, 20))
if(safety 10)
to_chat(user, SPAN_WARNING("Your eyes are really starting to hurt. This can't be good for you!"))
diff --git a/code/game/objects/items/weapons/tools/karl.dm b/code/game/objects/items/weapons/tools/karl.dm
index 5b5e226c1f..eb1eb14bf1 100644
--- a/code/game/objects/items/weapons/tools/karl.dm
+++ b/code/game/objects/items/weapons/tools/karl.dm
@@ -42,10 +42,16 @@
var/projectile // Holder for bullettype
var/shot_sound // What sound should play when the gun fires
var/reqpower = 10 // Power needed to shoot
+ var/isPumping = FALSE // Whether someone is currently pumping the KARL to recharge it
/obj/item/tool/karl/New()
. = ..()
+ if(!GLOB.melleExtrasCache)
+ GLOB.melleExtrasCache = list()
+ if(!GLOB.melleExtrasCache["[type]-t"])
+ GLOB.melleExtrasCache["[type]-t"] = list(ARMOR_BLUNT = list(DELEM(BRUTE,25)))
+
// Init inbuilt gun
if(ispath(installation))
installation = new installation
@@ -93,13 +99,19 @@
if(gunmode)
if(cell)
if(!cell.fully_charged())
+ if(isPumping)
+ to_chat(user, SPAN_NOTICE("You are already pumping \the [src] to recharge it."))
+ return
var/pumping_time = wielded ? 1 SECOND : 2 SECONDS
+ isPumping = TRUE
if(do_after(user, pumping_time))
if(cell) // Check the cell is still there in case big brain player chose to remove it during pumping
cell.give(use_power_cost * 1 SECOND) // Enough to use the tool during 1 second
to_chat(user, SPAN_NOTICE("You recharge \the [src] by pumping it, cell charge at [round(cell.percent())]%."))
// Continue pumping till user cancels the pumping
+ isPumping = FALSE
attack_self(user)
+ isPumping = FALSE
else
to_chat(user, SPAN_NOTICE("\The [src]\'cell is fully charged'."))
else
@@ -112,10 +124,20 @@
. = ..()
if(.)
to_chat(user, SPAN_NOTICE("A dangerous energy blade now covers the edges of the tool."))
+ update_force()
/obj/item/tool/karl/turn_off(mob/user)
- to_chat(user, SPAN_NOTICE("The energy blade swiftly retracts."))
..()
+ to_chat(user, SPAN_NOTICE("The energy blade swiftly retracts."))
+ update_force()
+
+/obj/item/tool/karl/proc/update_force()
+ if(gunmode)
+ melleDamages = GLOB.melleDamagesCache[type]
+ else if(switched_on)
+ melleDamages = GLOB.melleExtrasCache["[type]-t"]
+ else
+ melleDamages = GLOB.melleDamagesCache[type]
// Same values than /obj/item/proc/use_tool
/obj/item/tool/karl/use_tool(mob/living/user, atom/target, base_time, required_quality, fail_chance, required_stat, instant_finish_tier = 110, forced_sound = null, sound_repeat = 2.5 SECONDS)
@@ -135,6 +157,9 @@
/obj/item/tool/karl/proc/toggle_karl_mode(mob/user)
gunmode = !gunmode
to_chat(user, SPAN_NOTICE("\The [src] switches to [gunmode ? "gun" : "tool"] mode."))
+ no_double_tact = gunmode ? TRUE : FALSE // No double tact in gunmode
+ no_swing = gunmode ? TRUE : FALSE // No swinging in gunmode
+ update_force()
update_icon()
update_wear_icon()
diff --git a/code/game/objects/items/weapons/tools/screwdrivers.dm b/code/game/objects/items/weapons/tools/screwdrivers.dm
index 83253386c6..48ad8a8112 100644
--- a/code/game/objects/items/weapons/tools/screwdrivers.dm
+++ b/code/game/objects/items/weapons/tools/screwdrivers.dm
@@ -54,7 +54,7 @@
/obj/item/tool/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user)
if(!istype(M) || user.a_intent == "help")
return ..()
- if(user.targeted_organ != BP_EYES && user.targeted_organ != BP_HEAD)
+ if(user.targeted_organ != BP_EYES)
return ..()
/* if((CLUMSY in user.mutations) && prob(50))
M = user */
diff --git a/code/game/objects/structures/artwork_statue.dm b/code/game/objects/structures/artwork_statue.dm
index ea146e590d..c1e52f1f03 100644
--- a/code/game/objects/structures/artwork_statue.dm
+++ b/code/game/objects/structures/artwork_statue.dm
@@ -1,3 +1,4 @@
+
/obj/structure/artwork_statue
name = "Weird Statue"
desc = "A work of art that reflects the ideas of its creator."
@@ -6,15 +7,35 @@
density = TRUE
spawn_frequency = 0
price_tag = 500
+ sanity_damage = 0
+ var/qualitydesc = null
/obj/structure/artwork_statue/Initialize()
. = ..()
name = get_artwork_name(TRUE)
icon_state = "artwork_statue_[rand(1,6)]"
- var/sanity_value = 2 + rand(0,2)
- AddComponent(/datum/component/atom_sanity, sanity_value, "")
+//weighted bell curve from -6 to 6, slight favour to positive numbers
+//extremely sanity rending/healing statues are possible but very rare.
+ var/sanity_value = clamp((rand(1,4) - rand(1,4)) - (rand(1,4) - rand(1,4)) + rand(0,1), -6, 6)
+ sanity_damage = sanity_value
price_tag += rand(0,5000)
+ switch(sanity_value)
+ if(4.9 to 6.1)
+ price_tag += 1500//there's a market for art so bad it's good
+ qualitydesc = " \
How awful. It's like a car crash- hard to look away."
+ if(1 to 4.8)
+ price_tag -= 500
+ qualitydesc = " \
This artwork is quite unpleasant to look at."
+ if(0)
+ price_tag -= 1000//far worse than bad art is uninteresting art
+ qualitydesc = " \
A very mediocre piece of art."
+ if(-4.8 to -1)
+ price_tag += 1000
+ qualitydesc = " \
A beautiful piece of artwork."
+ if(-6.1 to -4.9 )
+ price_tag += 2500
+ qualitydesc = " \
A stunning artwork. Looking at it fills you with awe."
/obj/structure/artwork_statue/attackby(obj/item/I, mob/living/user)
if(I.has_quality(QUALITY_BOLT_TURNING))
@@ -24,7 +45,3 @@
return
. = ..()
-/obj/structure/artwork_statue/get_item_cost(export)
- . = ..()
- GET_COMPONENT(comp_sanity, /datum/component/atom_sanity)
- . += comp_sanity.affect * 100
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index 5377f468ff..37da57f84d 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -83,7 +83,6 @@
spawnedAtoms.Add(new /obj/item/clothing/glasses/monocle(NULLSPACE))
spawnedAtoms.Add(new /obj/item/storage/fancy/crayons(NULLSPACE))
spawnedAtoms.Add(new /obj/item/reagent_containers/spray/waterflower(NULLSPACE))
- spawnedAtoms.Add(new /obj/item/device/pda/clown(NULLSPACE))
spawnedAtoms.Add(new /obj/item/clothing/mask/gas/plaguedoctor(NULLSPACE))
spawnedAtoms.Add(new /obj/item/clothing/gloves/color/green(NULLSPACE))
spawnedAtoms.Add(new /obj/item/clothing/gloves/color/rainbow(NULLSPACE))
diff --git a/code/game/objects/structures/medical_stand.dm b/code/game/objects/structures/medical_stand.dm
index 5fdaa1feea..29aa09301e 100644
--- a/code/game/objects/structures/medical_stand.dm
+++ b/code/game/objects/structures/medical_stand.dm
@@ -283,7 +283,7 @@
to_chat(user, SPAN_WARNING("There is no tank in \the [src]."))
return
if(is_loosen)
- to_chat(user, SPAN_WARNING("Tighten \the nut with a wrench first."))
+ to_chat(user, SPAN_WARNING("Tighten the nut with a wrench first."))
return
if(!Adjacent(target))
return
diff --git a/code/game/objects/structures/transit_tubes.dm b/code/game/objects/structures/transit_tubes.dm
index 62c5a4b37d..47ba60191f 100644
--- a/code/game/objects/structures/transit_tubes.dm
+++ b/code/game/objects/structures/transit_tubes.dm
@@ -557,7 +557,6 @@
return 6
if("SOUTHWEST", "SW")
return 10
- else
return 0
@@ -582,5 +581,4 @@
return "NW"
if(10)
return "SW"
- else
return
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
deleted file mode 100644
index 8b22d62c0a..0000000000
--- a/code/game/supplyshuttle.dm
+++ /dev/null
@@ -1,84 +0,0 @@
-//Config stuff
-#define SUPPLY_DOCKZ 2 //Z-level of the Dock.
-#define SUPPLY_STATIONZ 1 //Z-level of the Station.
-
-//Supply packs are in /code/modules/cargo/packs.dm
-
-
-/obj/item/paper/manifest
- name = "supply manifest"
- var/is_copy = 1
-
-/obj/structure/plasticflaps //HOW DO YOU CALL THOSE THINGS ANYWAY
- name = "\improper plastic flaps"
- desc = "Completely impassable - or are they?"
- icon = 'icons/obj/stationobjs.dmi' //Change this.
- icon_state = "plasticflaps"
- density = FALSE
- anchored = TRUE
- layer = ABOVE_MOB_LAYER
- matter = list(MATERIAL_PLASTIC = 4)
- var/list/mobs_can_pass = list(
- /mob/living/carbon/slime,
- /mob/living/simple_animal/mouse,
- /mob/living/silicon/robot/drone
- )
-
- atmos_canpass = CANPASS_PROC
-
-/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
- if(istype(A) && A.checkpass(PASSGLASS))
- return prob(60)
-
- var/obj/structure/bed/B = A
- if (istype(A, /obj/structure/bed))//if it's a bed/chair and someone is buckled, it will not pass
- var/datum/component/buckling/buckle = B.GetComponent(/datum/component/buckling)
- if(buckle.buckled)
- return 0
-
- var/mob/living/M = A
- if(istype(M))
- if(M.lying)
- return ..()
- for(var/mob_type in mobs_can_pass)
- if(istype(A, mob_type))
- return ..()
- return issmall(M)
-
- return ..()
-
-/obj/structure/plasticflaps/attackby(obj/item/I, mob/user)
- if((QUALITY_BOLT_TURNING in I.tool_qualities) && (!istype(src, /obj/structure/plasticflaps/mining)))
- user.visible_message(
- SPAN_NOTICE("\The [user] start disassembling \the [src]."),
- SPAN_NOTICE("You start disassembling \the [src].")
- )
- if(I.use_tool(user, src, WORKTIME_FAST, QUALITY_BOLT_TURNING, FAILCHANCE_NORMAL, required_stat = STAT_MEC))
- user.visible_message(
- SPAN_NOTICE("\The [user] disassembled \the [src]!"),
- SPAN_NOTICE("You disassembled \the [src]!")
- )
- drop_materials(drop_location(), user)
- qdel(src)
- return ..()
-
-/obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates
- name = "airtight plastic flaps"
- desc = "Heavy duty, airtight, plastic flaps."
-
-/obj/structure/plasticflaps/mining/New() //set the turf below the flaps to block air
- update_turf_underneath(1)
- ..()
-
-/obj/structure/plasticflaps/mining/Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor
- update_turf_underneath(0)
- . = ..()
-
-/obj/structure/plasticflaps/mining/proc/update_turf_underneath(var/should_pass)
- var/turf/T = get_turf(loc)
- if(T)
- if(should_pass)
- T.blocks_air = 1
- else
- if(istype(T, /turf/simulated/floor))
- T.blocks_air = 0
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index c2c01c4754..db449b1df4 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -8,7 +8,7 @@
var/list/resources
var/seismic_activity = 1 // SEISMIC_MIN
- var/thermite = 0
+ var/thermite = FALSE
oxygen = MOLES_O2STANDARD
nitrogen = MOLES_N2STANDARD
var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed
diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm
index cc6c3132c4..96bcf0b084 100644
--- a/code/game/turfs/simulated/wall_attacks.dm
+++ b/code/game/turfs/simulated/wall_attacks.dm
@@ -152,14 +152,14 @@
return
if(isnull(construction_stage) || !reinf_material)
to_chat(user, SPAN_NOTICE("You begin removing the outer plating..."))
- if(I.use_tool(user, src, WORKTIME_LONG, tool_type, FAILCHANCE_NORMAL, required_stat = STAT_MEC))
+ if(I.use_tool(user, src, WORKTIME_SLOW * material.heat_resistance, tool_type, FAILCHANCE_NORMAL, required_stat = STAT_MEC))
to_chat(user, SPAN_NOTICE("You remove the outer plating."))
dismantle_wall()
user.visible_message(SPAN_WARNING("The wall was torn open by [user]!"))
return
if(construction_stage == 4)
to_chat(user, SPAN_NOTICE("You begin removing the outer plating..."))
- if(I.use_tool(user, src, WORKTIME_NORMAL, tool_type, FAILCHANCE_NORMAL, required_stat = STAT_MEC))
+ if(I.use_tool(user, src, WORKTIME_SLOW * material.heat_resistance, tool_type, FAILCHANCE_NORMAL, required_stat = STAT_MEC))
construction_stage = 3
update_icon()
to_chat(user, SPAN_NOTICE("You press firmly on the cover, dislodging it."))
@@ -235,7 +235,7 @@
return attack_hand(user)
var/dam_threshhold = material.integrity
if(reinf_material)
- dam_threshhold = CEILING(max(dam_threshhold,reinf_material.integrity) * 0.5, 1)
+ dam_threshhold += reinf_material.integrity * 0.5
var/dam_prob = material.hardness * 1.4
if (locate(/obj/effect/overlay/wallrot) in src)
dam_prob *= 0.5 //Rot makes reinforced walls breakable
diff --git a/code/game/turfs/simulated/wall_types.dm b/code/game/turfs/simulated/wall_types.dm
index ad53633aea..61d0950a20 100644
--- a/code/game/turfs/simulated/wall_types.dm
+++ b/code/game/turfs/simulated/wall_types.dm
@@ -1,3 +1,9 @@
+/turf/simulated/wall/steelr_wall
+ icon_state = "rgeneric"
+ description_info = "Can be deconstructed by following these steps \n Use a cutting tool on the wall \n Use a screw-driving tool on the wall \n Use a welder \n Use a wrench \n Use a welder \n Pry off the outer shell"
+
+/turf/simulated/wall/steelr_wall/New(var/newloc)
+ ..(newloc, MATERIAL_STEEL, MATERIAL_STEEL) //2strong
/turf/simulated/wall/r_wall
icon_state = "rgeneric"
description_info = "Can be deconstructed by following these steps \n Use a cutting tool on the wall \n Use a screw-driving tool on the wall \n Use a welder \n Use a wrench \n Use a welder \n Pry off the outer shell"
@@ -6,6 +12,13 @@
/turf/simulated/wall/r_wall/New(var/newloc)
..(newloc, MATERIAL_PLASTEEL, MATERIAL_PLASTEEL) //3strong
+/turf/simulated/wall/v_wall
+ icon_state = "rgeneric"
+ description_info = "Can be deconstructed by following these steps \n Use a cutting tool on the wall \n Use a screw-driving tool on the wall \n Use a welder for some minutes \n Use a wrench \n Use a welder \n Pry off the outer shell"
+
+/turf/simulated/wall/v_wall/New(var/newloc)
+ ..(newloc, MATERIAL_OSMIUM, MATERIAL_OSMIUM) //4strong
+
/turf/simulated/wall/cult
icon_state = "cult"
@@ -88,6 +101,8 @@
/turf/simulated/wall/iron/New(var/newloc)
..(newloc,MATERIAL_IRON)
+/turf/simulated/wall/plasteel/New(var/newloc)
+ ..(newloc, MATERIAL_PLASTEEL)
/turf/simulated/wall/uranium/New(var/newloc)
..(newloc,MATERIAL_URANIUM)
/turf/simulated/wall/diamond/New(var/newloc)
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index eec62c09ef..c58aad5abf 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -332,7 +332,7 @@
/turf/simulated/wall/take_damage(damage)
if(locate(/obj/effect/overlay/wallrot) in src)
damage *= 10
- . = health - damage < 0 ? damage - (damage - health) : damage
+ . = min(health, damage)
health -= damage
if(health <= 0)
var/leftover = abs(health)
@@ -403,15 +403,20 @@
O.anchored = TRUE
O.density = TRUE
O.layer = 5
+
+ thermite = FALSE
+ take_damage((material.integrity*2.5) / material.heat_resistance) // thermite overkills steel immediately but not plasteel
+
+ if(istype(src, /turf/simulated/floor))
+ var/turf/simulated/floor/F = src
+ F.burn_tile()
+ F.icon_state = "wall_thermite"
+ to_chat(user, SPAN_WARNING("The thermite starts melting the wall away."))
+ else
+ to_chat(user, SPAN_WARNING("The thermite starts melting through the wall."))
- src.ChangeTurf(/turf/simulated/floor/plating)
-
- var/turf/simulated/floor/F = src
- F.burn_tile()
- F.icon_state = "wall_thermite"
- to_chat(user, SPAN_WARNING("The thermite starts melting through the wall."))
- spawn(100)
+ spawn(10 SECONDS)
if(O)
qdel(O)
// F.sd_LumReset() //TODO: ~Carn
diff --git a/code/game/world.dm b/code/game/world.dm
index 13d6e160f2..3dc1065911 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -137,8 +137,6 @@ var/game_id
var/datum/callback/cb
#ifdef UNIT_TESTS
cb = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(RunUnitTests))
-#else
- cb = VARSET_CALLBACK(global, universe_has_ended, TRUE)
#endif
SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_addtimer), cb, 10 SECONDS))
@@ -306,7 +304,7 @@ var/world_topic_spam_protect_time = world.timeofday
if (config && config.server_name)
s += "[config.server_name] — "
- s += "[station_name()]";
+ s += "[station_name]";
s += " ("
s += "" //Change this to wherever you want the hub to link to.
// s += "[game_version]"
diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm
index c480749626..8a22e12ffb 100644
--- a/code/modules/admin/verbs/modifyvariables.dm
+++ b/code/modules/admin/verbs/modifyvariables.dm
@@ -267,12 +267,15 @@ var/list/VVckey_edit = list("key", "ckey")
if("list")
mod_list(variable, O, original_name, objectvar)
+
+ /* Lists can't be restored
if("restore to default")
- new_var = initial(variable)
+ new_var = initial(O.)
if(assoc)
L[assoc_key] = new_var
else
L[L.Find(variable)] = new_var
+ */
if("edit referenced object")
modify_variables(variable)
diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm
index cb75ffb5ed..ee55bb5ce4 100644
--- a/code/modules/asset_cache/asset_list_items.dm
+++ b/code/modules/asset_cache/asset_list_items.dm
@@ -399,8 +399,8 @@
var/filename = sanitizeFileName("[design.build_path].png")
var/atom/item = design.build_path
- var/icon_file = initial(item.icon)
- var/icon_state = initial(item.icon_state)
+ var/icon_file = initial(item:icon)
+ var/icon_state = initial(item:icon_state)
// eugh
if (!icon_file)
@@ -424,7 +424,7 @@
for(var/type in subtypesof(/obj/item/stack/material) - typesof(/obj/item/stack/material/cyborg))
var/filename = sanitizeFileName("[type].png")
- var/atom/item = initial(type)
+ var/atom/item = type
var/icon_file = initial(item.icon)
var/icon_state = initial(item.icon_state)
var/icon/I = icon(icon_file, icon_state, SOUTH)
@@ -440,8 +440,8 @@
var/filename = sanitizeFileName("[CR.result].png")
var/atom/item = initial(CR.result)
- var/icon_file = initial(item.icon)
- var/icon_state = initial(item.icon_state)
+ var/icon_file = initial(item:icon)
+ var/icon_state = initial(item:icon_state)
// eugh
if (!icon_file)
@@ -485,13 +485,13 @@
for(var/type in subtypesof(/obj/item/tool_upgrade))
var/filename = sanitizeFileName("[type].png")
- var/obj/item/item = initial(type)
+ var/obj/item/item = type
// no.
if (initial(item.bad_type) == type)
continue
- var/icon_file = initial(item.icon)
- var/icon_state = initial(item.icon_state)
+ var/icon_file = initial(item:icon)
+ var/icon_state = initial(item:icon_state)
#ifdef UNIT_TESTS
if(!(icon_state in icon_states(icon_file)))
@@ -507,9 +507,9 @@
for(var/type in subtypesof(/datum/perk))
var/filename = sanitizeFileName("[type].png")
- var/datum/perk/item = initial(type)
- var/icon_file = initial(item.icon)
- var/icon_state = initial(item.icon_state)
+ var/datum/perk/item = type
+ var/icon_file = initial(item:icon)
+ var/icon_state = initial(item:icon_state)
#ifdef UNIT_TESTS
if(!(icon_state in icon_states(icon_file)))
//stack_trace("perks [type] with icon '[icon_file]' missing state '[icon_state]'")
diff --git a/code/modules/biomatter_manipulation/toxic_biomass.dm b/code/modules/biomatter_manipulation/toxic_biomass.dm
index 11ad16a4e8..c12af192c4 100644
--- a/code/modules/biomatter_manipulation/toxic_biomass.dm
+++ b/code/modules/biomatter_manipulation/toxic_biomass.dm
@@ -35,7 +35,7 @@
/obj/effect/decal/cleanable/solid_biomass
name = "solid biomass"
desc = "It's good to do not touch this. And better to kill it with fire. Very toxic."
- var/commonLore = "Precursor of the blob. Was commonly found hidden in old Nanotransen ventilations, causing the feared blob infestation."
+ var/commonLore = "Precursor of the blob. Was commonly found hidden in old nanotrasen ventilations, causing the feared blob infestation."
icon = 'icons/obj/bioreactor_misc.dmi'
icon_state = "biomass-1"
anchored = TRUE
diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm
deleted file mode 100644
index f5f379cfc8..0000000000
--- a/code/modules/cargo/exports.dm
+++ /dev/null
@@ -1,159 +0,0 @@
-/* How it works:
- The shuttle arrives at Centcom dock and calls sell(), which recursively loops through all the shuttle contents that are unanchored.
- The loop only checks contents of storage types, see supply.dm shuttle code.
-
- Each object in the loop is checked for applies_to() of various export datums, except the invalid ones.
- Objects on shutlle floor are checked only against shuttle_floor = TRUE exports.
-
- If applies_to() returns TRUE, sell_object() is called on object and checks against exports are stopped for this object.
- sell_object() must add object amount and cost to export's total_cost and total_amount.
-
- When all the shuttle objects are looped, export cycle is over. The shuttle calls total_printout() for each valid export.
- If total_printout() returns something, the export datum's total_cost is added to cargo credits, then export_end() is called to reset total_cost and total_amount.
-*/
-
-/* The rule in figuring out item export cost:
- Export cost of goods in the shipping crate must be always equal or lower than:
- packcage cost - crate cost - manifest cost
- Crate cost is 500cr for a regular plasteel crate and 100cr for a large wooden one. Manifest cost is always 200cr.
- This is to avoid easy cargo points dupes.
-
-Credit dupes that require a lot of manual work shouldn't be removed, unless they yield too much profit for too little work.
- For example, if some player buys metal and glass sheets and uses them to make and sell reinforced glass:
-
- 100 glass + 50 metal -> 100 reinforced glass
- (1500cr -> 1600cr)
-
- then the player gets the profit from selling his own wasted time.
-*/
-/proc/export_item_and_contents(atom/movable/AM, contraband, hacked, dry_run = FALSE)
-/*
- if(!exports_list.len)
- setupExports()
-*/
- var/sold_str = ""
- var/cost = 0
-
- var/list/contents = AM.GetAllContents()
- contents.Insert(1, AM)
-
- // We go backwards, so it'll be innermost objects sold first
- for(var/i in reverseRange(contents))
- var/atom/movable/thing = i
- var/found_export
- for(var/datum/export/E in SSsupply.exports)
- if(!E)
- continue
- if(E.applies_to(thing, contraband, hacked))
- if(dry_run)
- cost += E.get_cost(thing, contraband, hacked)
- else
- E.sell_object(thing, contraband, hacked)
- sold_str += " [thing.name]"
- found_export = TRUE
- break
- if(!found_export)
- var/item_value = thing.get_item_cost(TRUE)
- if(thing.surplus_tag)
- item_value = round(item_value * 0.4)
- if(item_value)
- cost += item_value
- sold_str += " [thing.name]"
- if(!dry_run)
- var/datum/export/new_export = new()
- new_export.unit_name = thing.name
- new_export.cost = item_value
- new_export.include_subtypes = FALSE
- new_export.export_types = list(thing.type)
- new_export.sell_object(thing, contraband, hacked)
- SSsupply.exports.Add(new_export)
- if(!dry_run)
- qdel(thing)
-
- if(dry_run)
- return cost
- else
- return sold_str
-
-/datum/export
- var/unit_name = "" // Unit name. Only used in "Received [total_amount] [name]s [message]." message
- var/message = ""
- var/cost = 100 // Cost of item, in cargo credits. Must not alow for infinite price dupes, see above.
- var/contraband = FALSE // Export must be unlocked with multitool.
- var/hacked = FALSE // Export must be unlocked with emag.
- var/list/export_types = list() // Type of the exported object. If none, the export datum is considered base type.
- var/include_subtypes = TRUE // Set to FALSE to make the datum apply only to a strict type.
- var/list/exclude_types = list() // Types excluded from export
-
- // Used by print-out
- var/total_cost = 0
- var/total_amount = 0
-
-// Checks the cost. 0 cost items are skipped in export.
-/datum/export/proc/get_cost(obj/O, contr = 0, emag = 0)
- return cost * get_amount(O, contr, emag)
-
-// Checks the amount of exportable in object. Credits in the bill, sheets in the stack, etc.
-// Usually acts as a multiplier for a cost, so item that has 0 amount will be skipped in export.
-/datum/export/proc/get_amount(obj/O, contr = 0, emag = 0)
- return TRUE
-
-// Checks if the item is fit for export datum.
-/datum/export/proc/applies_to(obj/O, contr = 0, emag = 0)
- if(contraband && !contr)
- return FALSE
- if(hacked && !emag)
- return FALSE
- if(!include_subtypes && !(O.type in export_types))
- return FALSE
- if(include_subtypes && (!is_type_in_list(O, export_types) || is_type_in_list(O, exclude_types)))
- return FALSE
- if(!get_cost(O, contr, emag))
- return FALSE
- return TRUE
-
-// Called only once, when the object is actually sold by the datum.
-// Adds item's cost and amount to the current export cycle.
-// get_cost, get_amount and applies_to do not neccesary mean a successful sale.
-/datum/export/proc/sell_object(obj/O, contr = 0, emag = 0)
- var/cost = get_cost(O)
- var/amount = get_amount(O)
- total_cost += cost
- total_amount += amount
-
-// Total printout for the cargo console.
-// Called before the end of current export cycle.
-// It must always return something if the datum adds or removes any credts.
-/datum/export/proc/total_printout(contr = 0, emag = 0)
- if(!total_cost && !total_amount)
- return ""
- var/msg = "[total_cost] credits: Received [total_amount] "
- if(total_cost > 0)
- msg = "+" + msg
-
- if(unit_name)
- msg += unit_name
- if(total_amount > 1)
- msg += "s"
- if(message)
- msg += " "
-
- if(message)
- msg += message
-
- msg += "."
- return msg
-
-// The current export cycle is over now. Delete export datums.
-/datum/export/proc/export_end()
- qdel(src)
-
-/*
-var/list/exports_list = list()
-
-/proc/setupExports()
- for(var/subtype in subtypesof(/datum/export))
- var/datum/export/E = new subtype
- if(E.export_types && E.export_types.len) // Exports without a type are invalid/base types
- exports_list += E
-*/
\ No newline at end of file
diff --git a/code/modules/cargo/exports/gear.dm b/code/modules/cargo/exports/gear.dm
deleted file mode 100644
index d988053aac..0000000000
--- a/code/modules/cargo/exports/gear.dm
+++ /dev/null
@@ -1,199 +0,0 @@
-// Armor, gloves, space suits - it all goes here
-
-/datum/export/gear
-
-// Security gear
-/datum/export/gear/sec_helmet
- cost = 100
- include_subtypes = FALSE
- unit_name = "helmet"
- export_types = list(/obj/item/clothing/head/armor/helmet)
-
-/datum/export/gear/sec_armor
- cost = 200
- include_subtypes = FALSE
- unit_name = "armor vest"
- export_types = list(/obj/item/clothing/suit/armor/vest)
- include_subtypes = FALSE
-
-
-/datum/export/gear/riot_helmet
- cost = 250
- unit_name = "riot helmet"
- export_types = list(/obj/item/clothing/head/armor/faceshield/riot)
-
-/datum/export/gear/riot_armor
- cost = 500
- unit_name = "riot armor suit"
- export_types = list(/obj/item/clothing/suit/armor/heavy/riot)
-
-/datum/export/gear/bulletproof_armor
- cost = 500
- unit_name = "bulletproof armor vest"
- export_types = list(/obj/item/clothing/suit/armor/bulletproof)
-
-/datum/export/gear/reflector_armor
- cost = 650
- unit_name = "reflector armor vest"
- export_types = list(/obj/item/clothing/suit/armor/laserproof)
-
-
-/datum/export/gear/riot_shield
- cost = 400
- unit_name = "riot shield"
- export_types = list(/obj/item/shield/riot)
-
-
-// Masks
-/datum/export/gear/mask/breath
- cost = 20
- unit_name = "breath mask"
- export_types = list(/obj/item/clothing/mask/breath)
-
-/datum/export/gear/mask/gas
- cost = 50
- unit_name = "gas mask"
- export_types = list(/obj/item/clothing/mask/gas)
- include_subtypes = FALSE
-
-
-
-// EVA gear
-/datum/export/gear/space
- include_subtypes = TRUE
-
-/datum/export/gear/space/helmet
- cost = 400
- unit_name = "space helmet"
- export_types = list(/obj/item/clothing/head/space)
- include_subtypes = FALSE
-
-/datum/export/gear/space/suit
- cost = 600
- unit_name = "space suit"
- export_types = list(/obj/item/clothing/suit/space)
- include_subtypes = FALSE
-
-/datum/export/gear/space/helmet/emergency
- cost = 200
- unit_name = "emergency space helmet"
- export_types = list(/obj/item/clothing/head/space/emergency)
- include_subtypes = TRUE
-
-/datum/export/gear/space/suit/emergency
- cost = 300
- unit_name = "emergency space suit"
- export_types = list(/obj/item/clothing/suit/space/emergency)
- include_subtypes = TRUE
-
-
-/datum/export/gear/space/voidsuit
- cost = 1200 //650 for the suit, 550 for the helmet
- unit_name = "void suit"
- export_types = list(/obj/item/clothing/suit/space/void)
-
-
-/datum/export/gear/space/syndiehelmet
- cost = 1000
- unit_name = "Syndicate space helmet"
- export_types = list(/obj/item/clothing/head/space/syndicate)
- include_subtypes = TRUE
-
-/datum/export/gear/space/syndiesuit
- cost = 1500
- unit_name = "Syndicate space suit"
- export_types = list(/obj/item/clothing/suit/space/syndicate)
- include_subtypes = TRUE
-
-/datum/export/gear/space/syndievoid
- cost = 2500 //1500 for the suit, 1000 for the helmet
- unit_name = "Syndicate void suit"
- export_types = list(/obj/item/clothing/suit/space/void/merc)
- include_subtypes = TRUE
-
-/datum/export/gear/space/helmet/captain
- cost = 1000
- unit_name = "Captain's space helmet"
- export_types = list(/obj/item/clothing/head/space/capspace)
-
-/datum/export/gear/space/suit/captain
- cost = 1500
- unit_name = "Captain's space suit"
- export_types = list(/obj/item/clothing/suit/space/captain)
-
-
-// Radsuits
-/datum/export/gear/radhelmet
- cost = 50
- unit_name = "radsuit hood"
- export_types = list(/obj/item/clothing/head/radiation)
-
-/datum/export/gear/radsuit
- cost = 100
- unit_name = "radsuit"
- export_types = list(/obj/item/clothing/suit/radiation)
-
-// Biosuits
-/datum/export/gear/biohood
- cost = 50
- unit_name = "biosuit hood"
- export_types = list(/obj/item/clothing/head/bio_hood)
-
-/datum/export/gear/biosuit
- cost = 100
- unit_name = "biosuit"
- export_types = list(/obj/item/clothing/suit/bio_suit)
-
-//--------------------------------------------
-//---------------GLASSES----------------------
-//--------------------------------------------
-
-/datum/export/gear/glasses
- cost = 150
- include_subtypes = FALSE
- unit_name = "glasses"
- export_types = list(/obj/item/clothing/glasses)
-
-/datum/export/gear/glasses/hud
- cost = 200
- include_subtypes = TRUE
- unit_name = "hud glasses"
- export_types = list(/obj/item/clothing/glasses/hud)
-
-/datum/export/gear/glasses/meson
- cost = 350
- unit_name = "meson glasses"
- export_types = list(/obj/item/clothing/glasses/powered/meson)
-
-/datum/export/gear/glasses/night
- cost = 2000
- unit_name = "night vision glasses"
- export_types = list(/obj/item/clothing/glasses/powered/night)
-
-/datum/export/gear/glasses/thermal
- cost = 3000
- include_subtypes = TRUE
- unit_name = "thermal vision glasses"
- export_types = list(/obj/item/clothing/glasses/powered/thermal)
-
-/datum/export/gear/glasses/welding
- cost = 100
- include_subtypes = TRUE
- unit_name = "welding glasses"
- export_types = list(/obj/item/clothing/glasses/welding)
-
-
-//--------------------------------------------
-//----------------SHOES-----------------------
-//--------------------------------------------
-
-
-/datum/export/gear/shoes/jackboots
- cost = 100
- unit_name = "jackboots"
- export_types = list(/obj/item/clothing/shoes/jackboots)
-
-/datum/export/gear/shoes/magboots
- cost = 500
- unit_name = "magboots"
- export_types = list(/obj/item/clothing/shoes/magboots)
\ No newline at end of file
diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm
deleted file mode 100644
index 1443ecd6cc..0000000000
--- a/code/modules/cargo/exports/large_objects.dm
+++ /dev/null
@@ -1,102 +0,0 @@
-// Large objects that don't fit in crates, but must be sellable anyway.
-
-// Crates, boxes, lockers.
-/datum/export/large/crate
- cost = 200
- unit_name = "crate"
- export_types = list(/obj/structure/closet/crate)
- exclude_types = list(/obj/structure/closet/crate/large)
-
-/datum/export/large/crate/wooden
- cost = 100
- unit_name = "wooden crate"
- export_types = list(/obj/structure/closet/crate/large)
- exclude_types = list()
-
-/datum/export/large/crate/wooden/ore
- unit_name = "ore box"
- export_types = list(/obj/structure/ore_box)
-
-
-// Reagent dispensers.
-/datum/export/large/reagent_dispenser
- cost = 100 // +0-400 depending on amount of reagents left
- var/contents_cost = 400
-
-/datum/export/large/reagent_dispenser/get_cost(obj/O)
- var/obj/structure/reagent_dispensers/D = O
- var/ratio = D.reagents.total_volume / D.reagents.maximum_volume
-
- return ..() + round(contents_cost * ratio)
-
-/datum/export/large/reagent_dispenser/water
- unit_name = "watertank"
- export_types = list(/obj/structure/reagent_dispensers/watertank)
- contents_cost = 200
-
-/datum/export/large/reagent_dispenser/fuel
- unit_name = "fueltank"
- contents_cost = 800
- export_types = list(/obj/structure/reagent_dispensers/fueltank)
-
-/datum/export/large/reagent_dispenser/beer
- unit_name = "beer keg"
- contents_cost = 700
- export_types = list(/obj/structure/reagent_dispensers/beerkeg)
-
-/datum/export/large/reagent_dispenser/rum
- unit_name = "rum keg"
- contents_cost = 700
- export_types = list(/obj/structure/reagent_dispensers/rumkeg)
-
-
-// Heavy engineering equipment. Singulo/Tesla parts mostly.
-/datum/export/large/emitter
- cost = 400
- unit_name = "emitter"
- export_types = list(/obj/machinery/power/emitter)
-
-/datum/export/large/field_generator
- cost = 400
- unit_name = "field generator"
- export_types = list(/obj/machinery/field_generator)
-
-/datum/export/large/collector
- cost = 600
- unit_name = "collector"
- export_types = list(/obj/machinery/power/rad_collector)
-
-/datum/export/large/collector/pa
- cost = 300
- unit_name = "particle accelerator part"
- export_types = list(/obj/structure/particle_accelerator)
-
-/datum/export/large/collector/pa/controls
- cost = 500
- unit_name = "particle accelerator control console"
- export_types = list(/obj/machinery/particle_accelerator/control_box)
-
-/datum/export/large/pipedispenser
- cost = 500
- unit_name = "pipe dispenser"
- export_types = list(/obj/machinery/pipedispenser)
-
-
-/datum/export/large/singularitygen
- cost = 4000 // If you have one left after engine setup, sell it.
- unit_name = "unused gravitational singularity generator"
- export_types = list(/obj/machinery/the_singularitygen)
- include_subtypes = FALSE
-
-
-
-// Misc
-/datum/export/large/medical_stand
- cost = 300
- unit_name = "medical stand"
- export_types = list(/obj/structure/medical_stand)
-
-/datum/export/large/barrier
- cost = 325
- unit_name = "security barrier"
- export_types = list(/obj/machinery/deployable/barrier)
diff --git a/code/modules/cargo/exports/manifest.dm b/code/modules/cargo/exports/manifest.dm
deleted file mode 100644
index 5806ea24c2..0000000000
--- a/code/modules/cargo/exports/manifest.dm
+++ /dev/null
@@ -1,76 +0,0 @@
-// Approved manifest.
-// +200 credits flat.
-/datum/export/manifest_correct
- cost = 200
- unit_name = "approved manifest"
- export_types = list(/obj/item/paper/manifest)
-
-/datum/export/manifest_correct/applies_to(obj/O)
- if(!..())
- return FALSE
-
- var/obj/item/paper/manifest/M = O
- if(M.is_approved() && !M.errors)
- return TRUE
- return FALSE
-
-// Correctly denied manifest.
-// Refunds the package cost minus the cost of crate.
-/datum/export/manifest_error_denied
- cost = -500
- unit_name = "correctly denied manifest"
- export_types = list(/obj/item/paper/manifest)
-
-/datum/export/manifest_error_denied/applies_to(obj/O)
- if(!..())
- return FALSE
-
- var/obj/item/paper/manifest/M = O
- if(M.is_denied() && M.errors)
- return TRUE
- return FALSE
-
-/datum/export/manifest_error_denied/get_cost(obj/O)
- var/obj/item/paper/manifest/M = O
- return ..() + M.order_cost
-
-
-// Erroneously approved manifest.
-// Substracts the package cost.
-/datum/export/manifest_error
- unit_name = "erroneously approved manifest"
- export_types = list(/obj/item/paper/manifest)
-
-/datum/export/manifest_error/applies_to(obj/O)
- if(!..())
- return FALSE
-
- var/obj/item/paper/manifest/M = O
- if(M.is_approved() && M.errors)
- return TRUE
- return FALSE
-
-/datum/export/manifest_error/get_cost(obj/O)
- var/obj/item/paper/manifest/M = O
- return -M.order_cost
-
-
-// Erroneously denied manifest.
-// Substracts the package cost minus the cost of crate.
-/datum/export/manifest_correct_denied
- cost = 500
- unit_name = "erroneously denied manifest"
- export_types = list(/obj/item/paper/manifest)
-
-/datum/export/manifest_correct_denied/applies_to(obj/O)
- if(!..())
- return FALSE
-
- var/obj/item/paper/manifest/M = O
- if(M.is_denied() && !M.errors)
- return TRUE
- return FALSE
-
-/datum/export/manifest_correct_denied/get_cost(obj/O)
- var/obj/item/paper/manifest/M = O
- return ..() - M.order_cost
diff --git a/code/modules/cargo/exports/medical_shit.dm b/code/modules/cargo/exports/medical_shit.dm
deleted file mode 100644
index d1f9ffa0ce..0000000000
--- a/code/modules/cargo/exports/medical_shit.dm
+++ /dev/null
@@ -1,7 +0,0 @@
-//Items from medbay
-
-/datum/export/medical/cryobag
- cost = 250
- include_subtypes = FALSE
- unit_name = "bluespace crystal"
- export_types = list(/obj/item/bodybag/cryobag)
diff --git a/code/modules/cargo/exports/misc.dm b/code/modules/cargo/exports/misc.dm
deleted file mode 100644
index 665c10c828..0000000000
--- a/code/modules/cargo/exports/misc.dm
+++ /dev/null
@@ -1,16 +0,0 @@
-//All other
-
-/datum/export/misc/ashtray
- cost = 5
- unit_name = "ashtray"
- export_types = list(/obj/item/material/ashtray)
-
-/datum/export/misc/candle
- cost = 15
- unit_name = "candle"
- export_types = list(/obj/item/trash/candle)
-
-/datum/export/misc/headset
- cost = 20
- unit_name = "headset"
- export_types = list(/obj/item/device/radio/headset)
diff --git a/code/modules/cargo/exports/money.dm b/code/modules/cargo/exports/money.dm
deleted file mode 100644
index 364e8c3461..0000000000
--- a/code/modules/cargo/exports/money.dm
+++ /dev/null
@@ -1,41 +0,0 @@
-// Space Cash. Now it isn't that useless.
-/datum/export/stack/cash
- cost = 1 // Multiplied both by value of each bill and by amount of bills in stack.
- unit_name = "credit chip"
- export_types = list(/obj/item/spacecash)
-
-/datum/export/stack/cash/get_amount(obj/O)
- var/obj/item/spacecash/C = O
- return ..() * C.worth
-
-
-// Coins. At least the coins that do not contain any materials.
-// Material-containing coins cost just as much as their materials do, see materials.dm for exact rates.
-/datum/export/coin
- cost = 1 // Multiplied by coin's value
- unit_name = "credit coin"
- message = "worth of rare coins"
- export_types = list(/obj/item/coin)
-
-/datum/export/coin/get_cost(obj/O, contr = 0, emag = 0)
- var/price = 0
- switch(O.name)
- if(COIN_STANDARD)
- price = 15
- if(COIN_IRON)
- price = 50
- if(COIN_SILVER)
- price = 100
- if(COIN_GOLD)
- price = 150
- if(COIN_URANIUM)
- price = 180
- if(COIN_PLASMA)
- price = 220
- if(COIN_PLATINUM)
- price = 300
- if(COIN_DIAMOND)
- price = 350
- else
- price = 1
- return ..() * price
diff --git a/code/modules/cargo/exports/parts.dm b/code/modules/cargo/exports/parts.dm
deleted file mode 100644
index 6d03074c7f..0000000000
--- a/code/modules/cargo/exports/parts.dm
+++ /dev/null
@@ -1,16 +0,0 @@
-// Circuit boards, spare parts, etc.
-
-/datum/export/solar/assembly
- cost = 50
- unit_name = "solar panel assembly"
- export_types = list(/obj/item/solar_assembly)
-
-/datum/export/solar/tracker_board
- cost = 100
- unit_name = "solar tracker board"
- export_types = list(/obj/item/electronics/tracker)
-
-/datum/export/solar/control_board
- cost = 150
- unit_name = "solar panel control board"
- export_types = list(/obj/item/electronics/circuitboard/solar_control)
diff --git a/code/modules/cargo/exports/research.dm b/code/modules/cargo/exports/research.dm
deleted file mode 100644
index 4ee620782e..0000000000
--- a/code/modules/cargo/exports/research.dm
+++ /dev/null
@@ -1,16 +0,0 @@
-// Sell tech levels
-/datum/export/tech
- cost = 500
- unit_name = "technology data"
- export_types = list(/obj/item/computer_hardware/hard_drive)
-
-/datum/export/tech/get_cost(obj/O)
- var/obj/item/computer_hardware/hard_drive/D = O
- var/cost = 0
-
- for(var/f in D.find_files_by_type(/datum/computer_file/binary/tech))
- var/datum/computer_file/binary/tech/T = f
- cost += T.node.getCost()
-
- return ..() * cost
-
diff --git a/code/modules/cargo/exports/rnd_shit.dm b/code/modules/cargo/exports/rnd_shit.dm
deleted file mode 100644
index d94bf41b3d..0000000000
--- a/code/modules/cargo/exports/rnd_shit.dm
+++ /dev/null
@@ -1,31 +0,0 @@
-//Items from RnD. NOT techs!
-
-/datum/export/rnd/mass_spectrometer
- cost = 400
- include_subtypes = FALSE
- unit_name = "mass spectrometer"
- export_types = list(/obj/item/device/scanner/mass_spectrometer)
-
-/datum/export/rnd/advanced_mass_spectrometer
- cost = 700
- unit_name = "advanced mass spectrometer"
- export_types = list(/obj/item/device/scanner/mass_spectrometer/adv)
-
-/datum/export/rnd/slime_extract
- cost = 150
- unit_name = "slime extract"
- export_types = list(/obj/item/slime_extract)
- exclude_types = list(/obj/item/slime_extract/adamantine,
- /obj/item/slime_extract/bluespace)
-
-/datum/export/rnd/slime_extract/adamantine
- cost = 1000
- unit_name = "adamantine slime extract"
- export_types = list(/obj/item/slime_extract/adamantine)
- exclude_types = list()
-
-/datum/export/rnd/slime_extract/bluespace
- cost = 1400
- unit_name = "bluespace slime extract"
- export_types = list(/obj/item/slime_extract/bluespace)
- exclude_types = list()
diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm
deleted file mode 100644
index 88e29af159..0000000000
--- a/code/modules/cargo/exports/sheets.dm
+++ /dev/null
@@ -1,178 +0,0 @@
-//
-// Sheet Exports
-//
-
-/datum/export/stack
- unit_name = "sheet"
-
-/datum/export/stack/get_amount(obj/O)
- var/obj/item/stack/S = O
- if(istype(S))
- return S.amount
- return 0
-
-
-// Leather, skin and other farming by-products.
-/*
-/datum/export/stack/skin
- unit_name = ""
-
-// Monkey hide. Cheap.
-/datum/export/stack/skin/monkey
- cost = 150
- unit_name = "monkey hide"
- export_types = list(/obj/item/stack/sheet/animalhide/monkey)
-
-// Human skin. Illegal
-/datum/export/stack/skin/human
- cost = 2000
- contraband = 1
- unit_name = "piece"
- message = "of human skin"
- export_types = list(/obj/item/stack/sheet/animalhide/human)
-
-// Goliath hide. Expensive.
-/datum/export/stack/skin/goliath_hide
- cost = 2500
- unit_name = "goliath hide"
- export_types = list(/obj/item/asteroid/goliath_hide)
-
-// Cat hide. Just in case Runtime is catsploding again.
-/datum/export/stack/skin/cat
- cost = 2000
- contraband = 1
- unit_name = "cat hide"
- export_types = list(/obj/item/stack/sheet/animalhide/cat)
-
-// Corgi hide. You monster.
-/datum/export/stack/skin/corgi
- cost = 2500
- contraband = 1
- unit_name = "corgi hide"
- export_types = list(/obj/item/stack/sheet/animalhide/corgi)
-
-// Lizard hide. Very expensive.
-/datum/export/stack/skin/lizard
- cost = 5000
- unit_name = "lizard hide"
- export_types = list(/obj/item/stack/sheet/animalhide/lizard)
-
-// Alien hide. Extremely expensive.
-/datum/export/stack/skin/xeno
- cost = 15000
- unit_name = "alien hide"
- export_types = list(/obj/item/stack/sheet/animalhide/xeno)
-*/
-
-// Common materials.
-
-// Metal. Common building material.
-/datum/export/stack/metal
- cost = 2
- message = "of metal"
- export_types = list(/obj/item/stack/material/steel)
-
-// Glass. Common building material.
-/datum/export/stack/glass
- cost = 2
- message = "of glass"
- export_types = list(/obj/item/stack/material/glass)
-
-// Plasteel. Lightweight, strong and contains some plasma too.
-/datum/export/stack/plasteel
- cost = 10
- message = "of plasteel"
- export_types = list(/obj/item/stack/material/plasteel)
-
-// Reinforced Glass. Common building material. 1 glass + 0.5 metal, cost is rounded up.
-/datum/export/stack/rglass
- cost = 8
- message = "of reinforced glass"
- export_types = list(/obj/item/stack/material/glass/reinforced)
-
-// Wood. Quite expensive in the grim and dark 26 century.
-/datum/export/stack/wood
- cost = 10
- unit_name = "wood plank"
- export_types = list(/obj/item/stack/material/wood)
-
-// Cardboard. Cheap.
-/datum/export/stack/cardboard
- cost = 1
- message = "of cardboard"
- export_types = list(/obj/item/stack/material/cardboard)
-
-// Sandstone. Literally dirt cheap.
-/datum/export/stack/sandstone
- cost = 1
- unit_name = "block"
- message = "of sandstone"
- export_types = list(/obj/item/stack/material/sandstone)
-
-// Cable.
-/datum/export/stack/cable
- cost = 0.2
- unit_name = "cable piece"
- export_types = list(/obj/item/stack/cable_coil)
-
-/datum/export/stack/cable/get_cost(O)
- return round(..(O))
-
-/datum/export/stack/cable/get_amount(obj/O)
- var/obj/item/stack/cable_coil/S = O
- if(istype(S))
- return S.amount
- return 0
-
-
-// Diamonds. Rare and expensive.
-/datum/export/stack/diamond
- cost = 30
- export_types = list(/obj/item/stack/material/diamond)
- message = "of diamonds"
-
-// Plasma. The oil of 26 century.
-/datum/export/stack/plasma
- cost = 25
- export_types = list(/obj/item/stack/material/plasma)
- message = "of plasma"
-
-/datum/export/stack/plasma/get_cost(obj/O, contr = 0, emag = 0)
- . = ..(O)
- if(emag) // Syndicate pays you more for the plasma.
- . = round(. * 1.5)
-
-// Uranium. Still useful for both power generation and nuclear annihilation.
-/datum/export/stack/uranium
- cost = 20
- export_types = list(/obj/item/stack/material/uranium)
- message = "of uranium"
-
-// Gold. Used in electronics and corrosion-resistant plating.
-/datum/export/stack/gold
- cost = 25
- export_types = list(/obj/item/stack/material/gold)
- message = "of gold"
-
-// Silver.
-/datum/export/stack/silver
- cost = 10
- export_types = list(/obj/item/stack/material/silver)
- message = "of silver"
-
-// Plastic.
-/datum/export/stack/plastic
- cost = 20
- export_types = list(/obj/item/stack/material/plastic)
- message = "of plastic"
-
-// Platinum.
-/datum/export/stack/platinum
- cost = 40
- message = "of platinum"
- export_types = list(/obj/item/stack/material/platinum)
-
-/datum/export/stack/nanopaste
- cost = 80
- message = "of nanopaste"
- export_types = list(/obj/item/stack/nanopaste)
diff --git a/code/modules/cargo/exports/tools.dm b/code/modules/cargo/exports/tools.dm
deleted file mode 100644
index 1e3a66b31f..0000000000
--- a/code/modules/cargo/exports/tools.dm
+++ /dev/null
@@ -1,87 +0,0 @@
-// Various tools and handheld engineering devices.
-
-/datum/export/toolbox
- cost = 4
- unit_name = "toolbox"
- export_types = list(/obj/item/storage/toolbox)
-
-// mechanical toolbox: 22cr
-// emergency toolbox: 17-20cr
-// electrical toolbox: 36cr
-// robust: priceless
-
-// Basic tools
-/datum/export/screwdriver
- cost = 2
- unit_name = "screwdriver"
- export_types = list(/obj/item/tool/screwdriver)
- include_subtypes = FALSE
-
-/datum/export/wrench
- cost = 2
- unit_name = "wrench"
- export_types = list(/obj/item/tool/wrench)
-
-/datum/export/crowbar
- cost = 2
- unit_name = "crowbar"
- export_types = list(/obj/item/tool/crowbar)
-
-/datum/export/wirecutters
- cost = 2
- unit_name = "pair"
- message = "of wirecutters"
- export_types = list(/obj/item/tool/wirecutters)
-
-
-// Welding tools
-/datum/export/weldingtool
- cost = 5
- unit_name = "welding tool"
- export_types = list(/obj/item/tool/weldingtool)
- include_subtypes = FALSE
-
-
-// Fire extinguishers
-/datum/export/extinguisher
- cost = 15
- unit_name = "fire extinguisher"
- export_types = list(/obj/item/extinguisher)
- include_subtypes = FALSE
-
-/datum/export/extinguisher/mini
- cost = 2
- unit_name = "pocket fire extinguisher"
- export_types = list(/obj/item/extinguisher/mini)
-
-
-// Flashlights
-/datum/export/flashlight
- cost = 5
- unit_name = "flashlight"
- export_types = list(/obj/item/device/lighting/toggleable/flashlight)
-
-// Analyzers and Scanners
-/datum/export/analyzer
- cost = 5
- unit_name = "analyzer"
- export_types = list(/obj/item/device/scanner/gas)
-
-/datum/export/analyzer/t_scanner
- cost = 10
- unit_name = "t-ray scanner"
- export_types = list(/obj/item/device/t_scanner)
-
-
-/datum/export/radio
- cost = 5
- unit_name = "radio"
- export_types = list(/obj/item/device/radio)
-
-
-// High-tech tools.
-/datum/export/rcd
- cost = 2000
- unit_name = "rapid construction device"
- export_types = list(/obj/item/rcd)
-
diff --git a/code/modules/cargo/exports/weapons.dm b/code/modules/cargo/exports/weapons.dm
deleted file mode 100644
index 8a64fa887c..0000000000
--- a/code/modules/cargo/exports/weapons.dm
+++ /dev/null
@@ -1,59 +0,0 @@
-// Weapon exports. Stun batons, disablers, etc.
-
-/datum/export/weapon
- include_subtypes = FALSE
-
-/datum/export/weapon/baton
- cost = 100
- unit_name = "stun baton"
- export_types = list(/obj/item/melee/baton)
-
-/datum/export/weapon/knife
- cost = 300
- unit_name = "combat knife"
- export_types = list(/obj/item/tool/knife)
-
-/datum/export/weapon/taser
- cost = 350
- unit_name = "taser"
- export_types = list(/obj/item/gun/energy/taser)
-
-/datum/export/weapon/laser
- cost = 500
- unit_name = "laser gun"
- export_types = list(/obj/item/gun/energy/laser)
-
-/datum/export/weapon/energy_gun
- cost = 900
- unit_name = "energy gun"
- export_types = list(/obj/item/gun/energy/gun,
- /obj/item/gun/energy)
-
-/datum/export/weapon/shotgun
- cost = 350
- unit_name = "combat shotgun"
- export_types = list(/obj/item/gun/projectile/shotgun)
-
-
-/datum/export/weapon/flashbang
- cost = 15
- unit_name = "flashbang grenade"
- export_types = list(/obj/item/grenade/flashbang)
-
-/datum/export/weapon/teargas
- cost = 15
- unit_name = "tear gas grenade"
- export_types = list(/obj/item/grenade/chem_grenade/teargas)
-
-
-/datum/export/weapon/flash
- cost = 10
- unit_name = "handheld flash"
- export_types = list(/obj/item/device/flash)
- include_subtypes = TRUE
-
-/datum/export/weapon/handcuffs
- cost = 5
- unit_name = "pair"
- message = "of handcuffs"
- export_types = list(/obj/item/handcuffs)
diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm
deleted file mode 100644
index fbb16e8299..0000000000
--- a/code/modules/cargo/order.dm
+++ /dev/null
@@ -1,100 +0,0 @@
-/obj/item/paper/manifest
- spawn_blacklisted = TRUE
- var/order_cost = 0
- var/order_id = 0
- var/errors = 0
-
-/obj/item/paper/manifest/New(atom/A, id, cost)
- ..()
- order_id = id
- order_cost = cost
-
- if(prob(MANIFEST_ERROR_CHANCE))
- errors |= MANIFEST_ERROR_NAME
- if(prob(MANIFEST_ERROR_CHANCE))
- errors |= MANIFEST_ERROR_CONTENTS
- if(prob(MANIFEST_ERROR_CHANCE))
- errors |= MANIFEST_ERROR_ITEM
-
-/obj/item/paper/manifest/proc/is_approved()
- return stamped && stamped.len && !is_denied()
-
-/obj/item/paper/manifest/proc/is_denied()
- return stamped && (/obj/item/stamp/denied in stamped)
-
-/datum/supply_order
- var/id
- var/orderer
- var/orderer_rank
- var/orderer_ckey
- var/reason
- var/datum/supply_pack/object
-
-/datum/supply_order/New(datum/supply_pack/object, orderer, orderer_rank, orderer_ckey, reason)
- id = SSsupply.ordernum++
- src.object = object
- src.orderer = orderer
- src.orderer_rank = orderer_rank
- src.orderer_ckey = orderer_ckey
- src.reason = reason
-
-/datum/supply_order/proc/generateRequisition(turf/T)
- var/obj/item/paper/reqform = new(T)
-
- reqform.name = "requisition form - #[id] ([object.name])"
- reqform.info += "[station_name()] Supply Requisition Form
"
- reqform.info += "Order #[id]
"
- reqform.info += "Item: [object.name]
"
- reqform.info += "Access Restrictions: [get_access_desc(object.access)]
"
- reqform.info += "Requested by: [orderer]
"
- reqform.info += "Rank: [orderer_rank]
"
- reqform.info += "Contents:
"
- reqform.info += object.true_manifest
- if(reason)
- reqform.info += "Reason: [reason]
"
- reqform.info += "
"
- reqform.info += "STAMP BELOW TO APPROVE THIS REQUISITION:
"
-
- reqform.update_icon()
- return reqform
-
-/datum/supply_order/proc/generateManifest(obj/structure/closet/crate/C)
- var/obj/item/paper/manifest/P = new(C, id, object.cost)
-
- P.name = "shipping manifest - #[id] ([object.name])"
- P.info += "Shipping Manifest
"
- P.info += "
"
- P.info += "Order #[id]
"
- P.info += "Destination: [station_name()]
"
- P.info += "Item: [object.name]
"
- P.info += "Contents:
"
- P.info += ""
- for(var/atom/movable/AM in C.contents - P)
- if((P.errors & MANIFEST_ERROR_CONTENTS))
- if(prob(50))
- P.info += "- [AM.name]
"
- else
- continue
- P.info += "- [AM.name]
"
- P.info += "
"
- P.info += "Stamp below to confirm receipt of goods:
"
-
- P.update_icon()
- P.forceMove(C)
- //C.manifest = P
- //C.update_icon()
-
- return P
-
-/datum/supply_order/proc/generate(turf/T)
- var/obj/structure/closet/crate/C = object.generate(T)
- var/obj/item/paper/manifest/M = generateManifest(C)
-
- if(M.errors & MANIFEST_ERROR_ITEM)
- if(istype(C, /obj/structure/closet/crate/secure) || istype(C, /obj/structure/closet/crate/large))
- M.errors &= ~MANIFEST_ERROR_ITEM
- else
- var/lost = max(round(C.contents.len / 10), 1)
- while(--lost >= 0)
- qdel(pick(C.contents))
- return C
diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
deleted file mode 100644
index e182b7347d..0000000000
--- a/code/modules/cargo/packs.dm
+++ /dev/null
@@ -1,1630 +0,0 @@
-//SUPPLY PACKS
-//NOTE: only secure crate types use the access var (and are lockable)
-//NOTE: hidden packs only show up when the computer has been hacked.
-//ANOTER NOTE: Contraband is obtainable through modified supplycomp circuitboards.
-//BIG NOTE: Don't add living things to crates, that's bad, it will break the shuttle.
-//NEW NOTE: Do NOT set the price of any crates below 7 points. Doing so allows infinite points.
-
-var/list/all_supply_groups = list("Operations","Security","Hospitality","Engineering","Medical / Science","Hydroponics","Mining","Supply","Resource Integration Gear","Miscellaneous")
-
-/datum/supply_pack
- var/name = "Crate"
- var/group = "Operations"
- var/true_manifest = ""
- var/hidden = FALSE
- var/contraband = FALSE
- var/cost = 400 // Minimum cost, or infinite points are possible.
- var/access = FALSE
- var/list/contains = null
- var/crate_name = "crate"
- var/containertype = /obj/structure/closet/crate
- var/dangerous = FALSE // Should we message admins?
- var/special = FALSE //Event/Station Goals/Admin enabled packs
- var/special_enabled = FALSE
- var/amount = 0
-
-/datum/supply_pack/New()
- true_manifest += ""
- for(var/path in contains)
- if(!path)
- continue
- var/atom/movable/AM = path
- true_manifest += "- [initial(AM.name)]
"
- true_manifest += "
"
-
-/datum/supply_pack/proc/generate(turf/T)
- var/obj/structure/closet/crate/C = new containertype(T)
- C.name = crate_name
- if(access)
- C.req_access = list(access)
-
- fill(C)
-
- return C
-
-/datum/supply_pack/proc/fill(obj/structure/closet/crate/C)
- for(var/item in contains)
- var/atom/movable/n_item
- if(ispath(item, /obj/spawner))
- var/obj/randomcatcher/CATCH = new /obj/randomcatcher
- n_item = CATCH.get_item(item)
- else
- n_item = new item(C)
- n_item.surplus_tag = TRUE
- var/list/n_contents = n_item.GetAllContents()
- for(var/atom/movable/I in n_contents)
- n_item.surplus_tag = TRUE
- /*So you can't really just buy crates, then instantly resell them for a potential profit depending on if the crate hasn't had its cost scaled properly.
- * Yes, there are limits, I could itterate over every content of the item too and set its surplus_tag to TRUE
- * But that doesn't work with stackables when you can just make a new stack, and gets comp-expensive and not worth it just to spite people getting extra numbers
- */
- if(src.amount && istype(n_item, /obj/item/stack/material/steel))
- var/obj/item/stack/material/n_sheet = n_item
- n_sheet.setAmount(src.amount)
-
-//----------------------------------------------
-//-----------------OPERATIONS-------------------
-//----------------------------------------------
-
-/datum/supply_pack/mule
- name = "MULEbot Crate"
- contains = list(/obj/machinery/bot/mulebot)
- cost = 1200
- containertype = /obj/structure/largecrate/mule
- crate_name = "MULEbot Crate"
- group = "Operations"
-
-/datum/supply_pack/lunchboxes
- name = "Lunchboxes"
- contains = list(/obj/item/storage/lunchbox/cat,
- /obj/item/storage/lunchbox/cat,
- /obj/item/storage/lunchbox/cat,
- /obj/item/storage/lunchbox/cat,
- /obj/item/storage/lunchbox,
- /obj/item/storage/lunchbox,
- /obj/item/storage/lunchbox,
- /obj/item/storage/lunchbox,
- /obj/item/storage/lunchbox/rainbow,
- /obj/item/storage/lunchbox/rainbow,
- /obj/item/storage/lunchbox/rainbow,
- /obj/item/storage/lunchbox/rainbow)
- cost = 400
- containertype = /obj/structure/closet/crate
- crate_name = "\improper Lunchboxes"
- group = "Operations"
-
-/datum/supply_pack/artscrafts
- name = "Arts and Crafts supplies"
- contains = list(/obj/item/storage/fancy/crayons,
- /obj/item/device/camera,
- /obj/item/device/camera_film,
- /obj/item/device/camera_film,
- /obj/item/storage/photo_album,
- /obj/item/packageWrap,
- /obj/item/contraband/poster,
- /obj/item/wrapping_paper,
- /obj/item/wrapping_paper,
- /obj/item/wrapping_paper)
- cost = 400
- crate_name = "Arts and Crafts crate"
- group = "Operations"
-
-/datum/supply_pack/price_scanner
- name = "Export scanners"
- contains = list(/obj/item/device/scanner/price,
- /obj/item/device/scanner/price)
- cost = 400
- crate_name = "Export scanners crate"
- group = "Operations"
-
-//----------------------------------------------
-//-----------------SECURITY---------------------
-//----------------------------------------------
-
-/datum/supply_pack/specialops
- name = "Special Ops supplies"
- contains = list(/obj/item/storage/box/emps,
- /obj/item/grenade/smokebomb,
- /obj/item/grenade/smokebomb,
- /obj/item/grenade/smokebomb,
- /obj/item/grenade/chem_grenade/incendiary)
- cost = 1500
- crate_name = "Special Ops crate"
- group = "Security"
- hidden = TRUE
-
-/datum/supply_pack/fsenergy
- name = "FS Energy Weapons"
- contains = list(/obj/item/gun/energy/plasma/cassad,
- /obj/item/gun/energy/gun,
- /obj/item/gun/energy/gun,
- /obj/item/gun/energy/gun/martin,
- /obj/item/gun/energy/gun/martin)
- cost = 4500
- containertype = /obj/structure/closet/crate/secure/weapon
- crate_name = "FS Energy Weapons"
- group = "Security"
-
-/datum/supply_pack/fssmall
- name = "FS Handgun Pack"
- contains = list(/obj/item/gun/projectile/colt,
- /obj/item/gun/projectile/paco,
- /obj/item/gun/projectile/selfload,
- /obj/item/gun/projectile/olivaw)
- cost = 2000
- containertype = /obj/structure/closet/crate/secure/weapon
- crate_name = "FS Handgun Pack"
- group = "Security"
-
-/datum/supply_pack/fsrevolver
- name = "FS Revolver Pack"
- contains = list(/obj/item/gun/projectile/revolver/havelock,
- /obj/item/gun/projectile/revolver/havelock,
- /obj/item/gun/projectile/revolver/consul)
- cost = 2400
- containertype = /obj/structure/closet/crate/secure/weapon
- crate_name = "FS Revolver Pack"
- group = "Security"
-
-/datum/supply_pack/fshunting //3 hunting rifles
- name = "FS Hunting Rifle Pack"
- contains = list(/obj/item/gun/projectile/boltgun/fs,
- /obj/item/gun/projectile/boltgun/fs,
- /obj/item/gun/projectile/boltgun/fs)
- cost = 2700
- containertype = /obj/structure/closet/crate/secure/weapon
- crate_name = "FS Hunting Rifle Pack"
- group = "Security"
-
-/datum/supply_pack/fsassault
- name = "FS Assault Pack"
- contains = list(/obj/item/gun/projectile/automatic/modular/ak/frozen_star,
- /obj/item/gun/projectile/automatic/modular/ak/frozen_star,
- /obj/item/gun/projectile/automatic/modular/ak/frozen_star)
- cost = 3600
- containertype = /obj/structure/closet/crate/secure/weapon
- crate_name = "FS Assault Pack"
- group = "Security"
-
-/datum/supply_pack/ntweapons
- name = "NT Energy Weapons"
- contains = list(/obj/item/gun/energy/laser,
- /obj/item/gun/energy/laser,
- /obj/item/gun/energy/taser,
- /obj/item/gun/energy/taser,
- /obj/item/gun/energy/nt_svalinn,
- /obj/item/gun/energy/nt_svalinn)
- cost = 4500
- containertype = /obj/structure/closet/crate/secure/weapon
- crate_name = "FS Energy Weapons"
- group = "Security"
-
-/datum/supply_pack/eweapons
- name = "Incendiary weapons crate"
- contains = list(/obj/item/flamethrower/full,
- /obj/item/tank/plasma,
- /obj/item/tank/plasma,
- /obj/item/tank/plasma,
- /obj/item/grenade/chem_grenade/incendiary,
- /obj/item/grenade/chem_grenade/incendiary,
- /obj/item/grenade/chem_grenade/incendiary,
- /obj/item/ammo_magazine/ammobox/shotgun/incendiaryshells)
- cost = 2000
- containertype = /obj/structure/closet/crate/secure/weapon
- crate_name = "Incendiary weapons crate"
- group = "Security"
-
-/datum/supply_pack/armor
- name = "IH Surplus Armor"
- contains = list(/obj/item/clothing/suit/armor/vest,
- /obj/item/clothing/suit/armor/vest/security,
- /obj/item/clothing/suit/armor/vest/detective,
- /obj/item/clothing/suit/storage/vest,
- /obj/item/clothing/head/armor/helmet,
- /obj/item/clothing/head/armor/helmet)
- cost = 1500
- containertype = /obj/structure/closet/crate/secure
- crate_name = "IH Surplus Amor"
- group = "Security"
-
-/datum/supply_pack/riot
- name = "IH Riot gear crate"
- contains = list(/obj/item/melee/baton,
- /obj/item/melee/baton,
- /obj/item/melee/baton,
- /obj/item/shield/riot,
- /obj/item/shield/riot,
- /obj/item/shield/riot,
- /obj/item/storage/box/flashbangs,
- /obj/item/storage/box/flashbangs,
- /obj/item/storage/box/flashbangs,
- /obj/item/handcuffs,
- /obj/item/handcuffs,
- /obj/item/handcuffs,
- /obj/item/clothing/head/armor/riot_hud,
- /obj/item/clothing/suit/armor/heavy/riot,
- /obj/item/clothing/head/armor/riot_hud,
- /obj/item/clothing/suit/armor/heavy/riot,
- /obj/item/clothing/head/armor/riot_hud,
- /obj/item/clothing/suit/armor/heavy/riot)
- cost = 4500
- containertype = /obj/structure/closet/crate/secure
- crate_name = "IH Riot gear crate"
- group = "Security"
-/*
-/datum/supply_pack/loyalty
- name = "Moebius Loyalty implant crate"
- contains = list (/obj/item/storage/lockbox/loyalty)
- cost = 6000
- containertype = /obj/structure/closet/crate/secure
- crate_name = "Moebius Loyalty implant crate"
- group = "Security"
-*/
-/datum/supply_pack/ballisticarmor
- name = "IH Ballistic Armor"
- contains = list(/obj/item/clothing/suit/armor/bulletproof/ironhammer,
- /obj/item/clothing/suit/armor/bulletproof/ironhammer,
- /obj/item/clothing/head/armor/bulletproof/ironhammer_nvg,
- /obj/item/clothing/head/armor/bulletproof/ironhammer_nvg)
- cost = 3000
- containertype = /obj/structure/closet/crate/secure
- crate_name = "IH Ballistic Armor Pack"
- group = "Security"
-
-/datum/supply_pack/shotgunammo_beanbag
- name = "FS Shotgun shells (Beanbag)"
- contains = list(/obj/item/ammo_magazine/ammobox/shotgun/beanbag,
- /obj/item/ammo_magazine/ammobox/shotgun/beanbag,
- /obj/item/ammo_magazine/ammobox/shotgun/beanbag,
- /obj/item/ammo_magazine/ammobox/shotgun/beanbag,
- /obj/item/ammo_magazine/ammobox/shotgun/beanbag)
- cost = 1000
- crate_name = "FS Shotgun shells (Beanbag)"
- group = "Security"
-
-/datum/supply_pack/shotgunammo_slug
- name = "FS Shotgun shells (slug)"
- contains = list(/obj/item/ammo_magazine/ammobox/shotgun,
- /obj/item/ammo_magazine/ammobox/shotgun,
- /obj/item/ammo_magazine/ammobox/shotgun,
- /obj/item/ammo_magazine/ammobox/shotgun,
- /obj/item/ammo_magazine/ammobox/shotgun)
- cost = 1000
- containertype = /obj/structure/closet/crate/secure
- crate_name = "FS Shotgun shells (slug)"
- group = "Security"
-
-/datum/supply_pack/shotgunammo_buckshot
- name = "FS Shotgun shells (buckshot)"
- contains = list(/obj/item/ammo_magazine/ammobox/shotgun/buckshot,
- /obj/item/ammo_magazine/ammobox/shotgun/buckshot,
- /obj/item/ammo_magazine/ammobox/shotgun/buckshot,
- /obj/item/ammo_magazine/ammobox/shotgun/buckshot,
- /obj/item/ammo_magazine/ammobox/shotgun/buckshot)
- cost = 1000
- containertype = /obj/structure/closet/crate/secure
- crate_name = "FS Shotgun shells (buckshot)"
- group = "Security"
-
-
-/datum/supply_pack/energyarmor
- name = "IH Ablative Armor"
- contains = list(/obj/item/clothing/suit/armor/laserproof/full,
- /obj/item/clothing/suit/armor/laserproof/full,
- /obj/item/clothing/head/armor/laserproof,
- /obj/item/clothing/head/armor/laserproof)
- cost = 3000
- containertype = /obj/structure/closet/crate/secure
- crate_name = "IH Ablative Armor crate"
- group = "Security"
-
-/datum/supply_pack/securitybarriers
- name = "IH Security Barrier crate"
- contains = list(/obj/machinery/deployable/barrier,
- /obj/machinery/deployable/barrier,
- /obj/machinery/deployable/barrier,
- /obj/machinery/deployable/barrier)
- cost = 2000
- containertype = /obj/structure/closet/crate/secure/gear
- crate_name = "IH Security Barrier crate"
- group = "Security"
-
-/datum/supply_pack/securitywallshield
- name = "Wall shield Generators"
- contains = list(/obj/machinery/shieldwallgen,
- /obj/machinery/shieldwallgen,
- /obj/machinery/shieldwallgen,
- /obj/machinery/shieldwallgen)
- cost = 2000
- containertype = /obj/structure/closet/crate/secure
- crate_name = "wall shield generators crate"
- group = "Security"
-
-//----------------------------------------------
-//-----------------HOSPITALITY------------------
-//----------------------------------------------
-/*
-
-/datum/supply_pack/vending_coffee
- name = "Hotdrinks supply crate"
- contains = list(/obj/item/vending_refill/coffee,
- /obj/item/vending_refill/coffee,
- /obj/item/vending_refill/coffee)
- cost = 1000
- containertype = /obj/structure/closet/crate/freezer
- crate_name = "hotdrinks supply crate"
- group = "Hospitality"
-
-/datum/supply_pack/vending_snack
- name = "Snack supply crate"
- contains = list(/obj/item/vending_refill/snack,
- /obj/item/vending_refill/snack,
- /obj/item/vending_refill/snack)
- cost = 1000
- containertype = /obj/structure/closet/crate/freezer
- crate_name = "snack supply crate"
- group = "Hospitality"
-
-/datum/supply_pack/vending_cola
- name = "Softdrinks supply crate"
- contains = list(/obj/item/vending_refill/cola,
- /obj/item/vending_refill/cola,
- /obj/item/vending_refill/cola)
- cost = 1000
- containertype = /obj/structure/closet/crate/freezer
- crate_name = "softdrinks supply crate"
- group = "Hospitality"
-
-/datum/supply_pack/vending_cigarette
- name = "Cigarette supply crate"
- contains = list(/obj/item/vending_refill/cigarette,
- /obj/item/vending_refill/cigarette,
- /obj/item/vending_refill/cigarette)
- cost = 1000
- containertype = /obj/structure/closet/crate/freezer
- crate_name = "cigarette supply crate"
- group = "Hospitality"
-*/
-
-/datum/supply_pack/bardrinks
- name = "Bartending resupply crate"
- contains = list(/obj/item/reagent_containers/food/drinks/bottle/gin = 2,/obj/item/reagent_containers/food/drinks/bottle/whiskey = 2,
- /obj/item/reagent_containers/food/drinks/bottle/tequilla = 2,/obj/item/reagent_containers/food/drinks/bottle/vodka = 2,
- /obj/item/reagent_containers/food/drinks/bottle/vermouth = 2,/obj/item/reagent_containers/food/drinks/bottle/rum = 2,
- /obj/item/reagent_containers/food/drinks/bottle/wine = 3,/obj/item/reagent_containers/food/drinks/bottle/cognac = 2,
- /obj/item/reagent_containers/food/drinks/bottle/kahlua = 3,/obj/item/reagent_containers/food/drinks/bottle/small/beer = 6,
- /obj/item/reagent_containers/food/drinks/bottle/small/ale = 6,/obj/item/reagent_containers/food/drinks/bottle/orangejuice = 2,
- /obj/item/reagent_containers/food/drinks/bottle/tomatojuice = 2,/obj/item/reagent_containers/food/drinks/bottle/limejuice = 2,
- /obj/item/reagent_containers/food/drinks/bottle/cream = 2,/obj/item/reagent_containers/food/drinks/cans/tonic = 6,
- /obj/item/reagent_containers/food/drinks/bottle/cola = 5,/obj/item/reagent_containers/food/drinks/bottle/space_up = 5,
- /obj/item/reagent_containers/food/drinks/bottle/space_mountain_wind = 5,/obj/item/reagent_containers/food/drinks/cans/sodawater = 15,
- /obj/item/reagent_containers/food/drinks/flask/barflask = 2,/obj/item/reagent_containers/food/drinks/bottle/bluecuracao = 2,
- /obj/item/reagent_containers/food/drinks/drinkingglass = 30,/obj/item/reagent_containers/food/drinks/bottle/grenadine = 5,
- /obj/item/reagent_containers/food/drinks/bottle/melonliquor = 2,/obj/item/reagent_containers/food/drinks/bottle/absinthe = 1)
- cost = 3000
- containertype = /obj/structure/closet/crate/freezer
- crate_name = "bartending resupply crate"
- group = "Hospitality"
-
-/datum/supply_pack/party
- name = "Party equipment"
- contains = list(/obj/item/storage/box/drinkingglasses,
- /obj/item/reagent_containers/food/drinks/shaker,
- /obj/item/reagent_containers/food/drinks/flask/barflask,
- /obj/item/reagent_containers/food/drinks/bottle/patron,
- /obj/item/reagent_containers/food/drinks/bottle/goldschlager,
- /obj/item/storage/fancy/cigarettes/dromedaryco,
- /obj/item/pizzabox/margherita,
- /obj/item/reagent_containers/food/snacks/sliceable/chocolatecake,
- /obj/item/reagent_containers/food/drinks/bottle/small/ale,
- /obj/item/reagent_containers/food/drinks/bottle/small/ale,
- /obj/item/reagent_containers/food/drinks/bottle/small/beer,
- /obj/item/reagent_containers/food/drinks/bottle/small/beer,
- /obj/item/reagent_containers/food/drinks/bottle/small/beer,
- /obj/item/reagent_containers/food/drinks/bottle/small/beer)
- cost = 1500
- containertype = /obj/structure/closet/crate
- crate_name = "Party equipment"
- group = "Hospitality"
-
-/datum/supply_pack/cakes
- name = "Party Cakes"
- contains = list(
- /obj/item/reagent_containers/food/snacks/sliceable/carrotcake,
- /obj/item/reagent_containers/food/snacks/sliceable/cheesecake,
- /obj/item/reagent_containers/food/snacks/sliceable/plaincake,
- /obj/item/reagent_containers/food/snacks/sliceable/orangecake,
- /obj/item/reagent_containers/food/snacks/sliceable/limecake,
- /obj/item/reagent_containers/food/snacks/sliceable/lemoncake,
- /obj/item/reagent_containers/food/snacks/sliceable/chocolatecake
- )
- cost = 2000
- containertype = /obj/structure/closet/crate
- crate_name = "Party Cake Box"
- group = "Hospitality"
-
-//----------------------------------------------
-//-----------------ENGINEERING------------------
-//----------------------------------------------
-
-/datum/supply_pack/internals
- name = "Internals crate"
- contains = list(/obj/item/clothing/mask/gas,
- /obj/item/clothing/mask/gas,
- /obj/item/clothing/mask/gas,
- /obj/item/tank/air,
- /obj/item/tank/air,
- /obj/item/tank/air)
- cost = 600
- containertype = /obj/structure/closet/crate/internals
- crate_name = "Internals crate"
- group = "Engineering"
-
-/datum/supply_pack/sleeping_agent
- name = "Canister: \[N2O\]"
- contains = list(/obj/machinery/portable_atmospherics/canister/sleeping_agent)
- cost = 2000
- containertype = /obj/structure/largecrate
- crate_name = "N2O crate"
- group = "Engineering"
-
-/datum/supply_pack/oxygen
- name = "Canister: \[O2\]"
- contains = list(/obj/machinery/portable_atmospherics/canister/oxygen)
- cost = 1000
- containertype = /obj/structure/largecrate
- crate_name = "O2 crate"
- group = "Engineering"
-
-/datum/supply_pack/nitrogen
- name = "Canister: \[N2\]"
- contains = list(/obj/machinery/portable_atmospherics/canister/nitrogen)
- cost = 1000
- containertype = /obj/structure/largecrate
- crate_name = "N2 crate"
- group = "Engineering"
-
-/datum/supply_pack/air
- name = "Canister \[Air\]"
- contains = list(/obj/machinery/portable_atmospherics/canister/air)
- cost = 1000
- containertype = /obj/structure/largecrate
- crate_name = "Air crate"
- group = "Engineering"
-
-/datum/supply_pack/evacuation
- name = "Emergency equipment"
- contains = list(/obj/item/storage/toolbox/emergency,
- /obj/item/storage/toolbox/emergency,
- /obj/item/clothing/suit/storage/hazardvest,
- /obj/item/clothing/suit/storage/hazardvest,
- /obj/item/tank/emergency_oxygen,
- /obj/item/tank/emergency_oxygen,
- /obj/item/tank/emergency_oxygen,
- /obj/item/tank/emergency_oxygen,
- /obj/item/tank/emergency_oxygen,
- /obj/item/clothing/mask/gas,
- /obj/item/clothing/mask/gas,
- /obj/item/clothing/mask/gas,
- /obj/item/clothing/mask/gas,
- /obj/item/clothing/mask/gas)
- cost = 1000
- containertype = /obj/structure/closet/crate/internals
- crate_name = "Emergency crate"
- group = "Engineering"
-
-/datum/supply_pack/inflatable
- name = "Inflatable barriers"
- contains = list(/obj/item/storage/briefcase/inflatable,
- /obj/item/storage/briefcase/inflatable,
- /obj/item/storage/briefcase/inflatable,
- /obj/item/storage/briefcase/inflatable,
- /obj/item/storage/briefcase/inflatable)
- cost = 1000
- containertype = /obj/structure/closet/crate/secure
- crate_name = "Inflatable Barrier Crate"
- group = "Engineering"
-
-/datum/supply_pack/lightbulbs
- name = "Replacement lights"
- contains = list(/obj/item/storage/box/lights/mixed,
- /obj/item/storage/box/lights/mixed,
- /obj/item/storage/box/lights/mixed,
- /obj/item/storage/box/lights/mixed)
- cost = 500
- containertype = /obj/structure/closet/crate
- crate_name = "Replacement lights"
- group = "Engineering"
-
-/datum/supply_pack/metal120
- name = "120 metal sheets"
- contains = list(/obj/item/stack/material/steel)
- amount = 120
- cost = 500
- containertype = /obj/structure/closet/crate/secure
- crate_name = "Metal sheets crate"
- group = "Engineering"
-
-/datum/supply_pack/metal480
- name = "Bulk metal crate"
- contains = list(/obj/item/stack/material/steel/full,
- /obj/item/stack/material/steel/full,
- /obj/item/stack/material/steel/full,
- /obj/item/stack/material/steel/full)
- cost = 1200
- containertype = /obj/structure/largecrate
- crate_name = "Bulk metal crate"
- group = "Engineering"
-
-/datum/supply_pack/glass50
- name = "120 glass sheets"
- contains = list(/obj/item/stack/material/glass)
- amount = 120
- cost = 500
- containertype = /obj/structure/closet/crate/secure
- crate_name = "Glass sheets crate"
- group = "Engineering"
-
-/datum/supply_pack/wood50
- name = "120 wooden planks"
- contains = list(/obj/item/stack/material/wood)
- amount = 120
- cost = 2500
- containertype = /obj/structure/closet/crate
- crate_name = "Wooden planks crate"
- group = "Engineering"
-
-/datum/supply_pack/plasteel60
- name = "60 Plasteel Sheets"
- contains = list(/obj/item/stack/material/plasteel)
- amount = 60
- cost = 2000
- containertype = /obj/structure/closet/crate/secure
- crate_name = "Plasteel sheets crate"
- group = "Engineering"
-
-/datum/supply_pack/electrical
- name = "Electrical maintenance crate"
- contains = list(/obj/item/storage/toolbox/electrical,
- /obj/item/storage/toolbox/electrical,
- /obj/item/clothing/gloves/insulated,
- /obj/item/clothing/gloves/insulated,
- /obj/item/cell/large,
- /obj/item/cell/large,
- /obj/item/cell/large/high,
- /obj/item/cell/large/high)
- cost = 1200
- containertype = /obj/structure/closet/crate
- crate_name = "Electrical maintenance crate"
- group = "Engineering"
-
-/datum/supply_pack/mechanical
- name = "Mechanical maintenance crate"
- contains = list(/obj/item/storage/belt/utility/full,
- /obj/item/storage/belt/utility/full,
- /obj/item/storage/belt/utility/full,
- /obj/item/clothing/suit/storage/hazardvest,
- /obj/item/clothing/suit/storage/hazardvest,
- /obj/item/clothing/suit/storage/hazardvest,
- /obj/item/clothing/head/welding,
- /obj/item/clothing/head/welding,
- /obj/item/clothing/gloves/insulated,
- /obj/item/clothing/head/hardhat)
- cost = 1000
- containertype = /obj/structure/closet/crate
- crate_name = "Mechanical maintenance crate"
- group = "Engineering"
-
-/datum/supply_pack/toolmods
- contains = list(/obj/spawner/tool_upgrade,
- /obj/spawner/tool_upgrade,
- /obj/spawner/tool_upgrade,
- /obj/spawner/tool_upgrade,
- /obj/spawner/tool_upgrade,
- /obj/spawner/tool_upgrade,
- /obj/spawner/tool_upgrade,
- /obj/spawner/tool_upgrade,
- /obj/spawner/tool_upgrade,
- /obj/spawner/tool_upgrade,
- /obj/spawner/tool_upgrade)
- name = "Unsorted Tool Upgrades"
- cost = 2000
- containertype = /obj/structure/closet/crate
- crate_name = "Tool upgrade Crate"
- group = "Engineering"
-
-/datum/supply_pack/omnitool
- contains = list(/obj/item/tool/omnitool,
- /obj/item/tool/omnitool)
- name = "\"Munchkin 5000\" omnitool"
- cost = 1000
- containertype = /obj/structure/closet/crate
- crate_name = "omnitool crate"
- group = "Engineering"
-
-/datum/supply_pack/fueltank
- name = "Fuel tank crate"
- contains = list(/obj/structure/reagent_dispensers/fueltank)
- cost = 800
- containertype = /obj/structure/largecrate
- crate_name = "fuel tank crate"
- group = "Engineering"
-
-/datum/supply_pack/solar
- name = "Solar Pack crate"
- contains = list(/obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly,
- /obj/item/solar_assembly, // 21 Solar Assemblies. 1 Extra for the controller
- /obj/item/electronics/circuitboard/solar_control,
- /obj/item/electronics/tracker,
- /obj/item/paper/solar)
- cost = 2000
- containertype = /obj/structure/closet/crate
- crate_name = "Solar pack crate"
- group = "Engineering"
-
-/datum/supply_pack/engine
- name = "Emitter crate"
- contains = list(/obj/machinery/power/emitter,
- /obj/machinery/power/emitter)
- cost = 1500
- containertype = /obj/structure/closet/crate/secure
- crate_name = "Emitter crate"
- group = "Engineering"
-
-/datum/supply_pack/engine/field_gen
- name = "Field Generator crate"
- contains = list(/obj/machinery/field_generator,
- /obj/machinery/field_generator)
- containertype = /obj/structure/closet/crate/secure
- crate_name = "Field Generator crate"
-
-/datum/supply_pack/engine/sing_gen
- name = "Singularity Generator crate"
- contains = list(/obj/machinery/the_singularitygen)
- containertype = /obj/structure/closet/crate/secure
- crate_name = "Singularity Generator crate"
-
-/datum/supply_pack/engine/collector
- name = "Collector crate"
- contains = list(/obj/machinery/power/rad_collector,
- /obj/machinery/power/rad_collector,
- /obj/machinery/power/rad_collector)
- containertype = /obj/structure/closet/crate/secure
- crate_name = "Collector crate"
-
-/datum/supply_pack/engine/PA
- name = "Particle Accelerator crate"
- cost = 4000
- contains = list(/obj/structure/particle_accelerator/fuel_chamber,
- /obj/machinery/particle_accelerator/control_box,
- /obj/structure/particle_accelerator/particle_emitter/center,
- /obj/structure/particle_accelerator/particle_emitter/left,
- /obj/structure/particle_accelerator/particle_emitter/right,
- /obj/structure/particle_accelerator/power_box,
- /obj/structure/particle_accelerator/end_cap)
- containertype = /obj/structure/closet/crate/secure
- crate_name = "Particle Accelerator crate"
-
-/datum/supply_pack/mech_ripley
- name = "exosuit assembly crate"
- contains = list(
- /obj/structure/heavy_vehicle_frame,
- /obj/item/mech_equipment/drill,
- /obj/item/mech_equipment/clamp,
- /obj/item/mech_equipment/light,
- /obj/item/mech_component/sensors/cheap,
- /obj/item/mech_component/chassis/cheap,
- /obj/item/mech_component/manipulators/cheap,
- /obj/item/mech_component/propulsion/cheap,
- /obj/item/electronics/circuitboard/exosystem/utility,
- /obj/item/robot_parts/robot_component/actuator,
- /obj/item/robot_parts/robot_component/actuator,
- /obj/item/robot_parts/robot_component/camera,
- /obj/item/robot_parts/robot_component/radio,
- /obj/item/robot_parts/robot_component/exosuit_control,
- /obj/item/robot_parts/robot_component/armour/exosuit/plain,
- /obj/item/robot_parts/robot_component/diagnosis_unit,
- /obj/item/cell/large
- )
- cost = 2000
- containertype = /obj/structure/closet/crate/secure/scisecurecrate
- crate_name = "standard exosuit assembly crate"
- group = "Engineering"
-
-/datum/supply_pack/robotics
- name = "Robotics assembly crate"
- contains = list(/obj/item/device/assembly/prox_sensor,
- /obj/item/device/assembly/prox_sensor,
- /obj/item/device/assembly/prox_sensor,
- /obj/item/storage/toolbox/electrical,
- /obj/item/device/flash,
- /obj/item/device/flash,
- /obj/item/device/flash,
- /obj/item/device/flash,
- /obj/item/cell/large/high,
- /obj/item/cell/large/high)
- cost = 1000
- containertype = /obj/structure/closet/crate/secure/scisecurecrate
- crate_name = "Robotics assembly"
- access = access_robotics
- group = "Engineering"
-
-//Contains six, you'll probably want to build several of these
-/datum/supply_pack/shield_diffuser
- contains = list(/obj/item/electronics/circuitboard/shield_diffuser,
- /obj/item/electronics/circuitboard/shield_diffuser,
- /obj/item/electronics/circuitboard/shield_diffuser,
- /obj/item/electronics/circuitboard/shield_diffuser,
- /obj/item/electronics/circuitboard/shield_diffuser,
- /obj/item/electronics/circuitboard/shield_diffuser,
- /obj/item/electronics/circuitboard/shield_diffuser)
- name = "Shield diffuser circuitry"
- cost = 3000
- containertype = /obj/structure/closet/crate/secure
- crate_name = "Shield diffuser circuitry crate"
- group = "Engineering"
- access = access_ce
-
-/datum/supply_pack/shield_gen
- contains = list(/obj/item/electronics/circuitboard/shield_generator)
- name = "Hull shield generator circuitry"
- cost = 5000
- containertype = /obj/structure/closet/crate/secure
- crate_name = "hull shield generator circuitry crate"
- group = "Engineering"
-
-/*/datum/supply_pack/shield_cap
- contains = list(/obj/item/electronics/circuitboard/shield_cap)
- name = "Bubble shield capacitor circuitry"
- cost = 5000
- containertype = /obj/structure/closet/crate/secure
- crate_name = "shield capacitor circuitry crate"
- group = "Engineering"
- */
-
-/datum/supply_pack/lrange_scanner
- contains = list(/obj/item/electronics/circuitboard/long_range_scanner)
- name = "Long range scanner circuitry"
- cost = 5000
- containertype = /obj/structure/closet/crate/secure
- crate_name = "long range scanner circuitry crate"
- group = "Engineering"
-
-/datum/supply_pack/smbig
- name = "Supermatter Core (CAUTION)"
- contains = list(/obj/machinery/power/supermatter)
- cost = 20000
- containertype = /obj/structure/closet/crate/secure/woodseccrate
- crate_name = "Supermatter crate (CAUTION)"
- group = "Engineering"
- access = access_ce
-
-/datum/supply_pack/teg
- contains = list(/obj/machinery/power/generator)
- name = "Mark I Thermoelectric Generator"
- cost = 300
- containertype = /obj/structure/closet/crate/secure/large
- crate_name = "Mk1 TEG crate"
- group = "Engineering"
-
-/datum/supply_pack/circulator
- contains = list(/obj/machinery/atmospherics/binary/circulator)
- name = "Binary atmospheric circulator"
- cost = 1500
- containertype = /obj/structure/closet/crate/secure/large
- crate_name = "Atmospheric circulator crate"
- group = "Engineering"
-
-/datum/supply_pack/air_dispenser
- contains = list(/obj/machinery/pipedispenser/orderable)
- name = "Pipe Dispenser"
- cost = 500
- containertype = /obj/structure/closet/crate/secure/large
- crate_name = "Pipe Dispenser Crate"
- group = "Engineering"
-
-/datum/supply_pack/disposals_dispenser
- contains = list(/obj/machinery/pipedispenser/disposal/orderable)
- name = "Disposals Pipe Dispenser"
- cost = 500
- containertype = /obj/structure/closet/crate/secure/large
- crate_name = "Disposal Dispenser Crate"
- group = "Engineering"
-
-
-//----------------------------------------------
-//------------MEDICAL / SCIENCE-----------------
-//----------------------------------------------
-
-/datum/supply_pack/medical
- name = "Medical kits crate"
- contains = list(/obj/item/storage/firstaid/regular,
- /obj/item/storage/firstaid/fire,
- /obj/item/storage/firstaid/toxin,
- /obj/item/storage/firstaid/o2,
- /obj/item/storage/firstaid/adv,
- /obj/item/reagent_containers/glass/bottle/antitoxin,
- /obj/item/reagent_containers/glass/bottle/inaprovaline,
- /obj/item/reagent_containers/glass/bottle/stoxin,
- /obj/item/storage/box/syringes,
- /obj/item/storage/box/autoinjectors)
- cost = 1000
- containertype = /obj/structure/closet/crate/medical
- crate_name = "Medical kits crate"
- group = "Medical / Science"
-
-/datum/supply_pack/medical
- name = "Medical supply crate"
- contains = list(/obj/item/storage/firstaid/regular,
- /obj/item/storage/firstaid/regular)
- cost = 1000
- containertype = /obj/structure/closet/crate/medical
- crate_name = "Medical supply crate"
- group = "Medical / Science"
-
-/datum/supply_pack/research
- name = "Research Data crate"
- contains = list(/obj/item/computer_hardware/hard_drive/portable/research_points,
- /obj/item/computer_hardware/hard_drive/portable/research_points)
- cost = 5000
- containertype = /obj/structure/closet/crate/secure
- crate_name = "Research data crate"
- access = access_moebius
- group = "Medical / Science"
-
-/datum/supply_pack/coolanttank
- name = "Coolant tank crate"
- contains = list(/obj/structure/reagent_dispensers/coolanttank)
- cost = 1600
- containertype = /obj/structure/largecrate
- crate_name = "Coolant tank crate"
- group = "Medical / Science"
-
-/datum/supply_pack/plasma
- name = "Plasma assembly crate"
- contains = list(/obj/item/tank/plasma,
- /obj/item/tank/plasma,
- /obj/item/tank/plasma,
- /obj/item/device/assembly/igniter,
- /obj/item/device/assembly/igniter,
- /obj/item/device/assembly/igniter,
- /obj/item/device/assembly/prox_sensor,
- /obj/item/device/assembly/prox_sensor,
- /obj/item/device/assembly/prox_sensor,
- /obj/item/device/assembly/timer,
- /obj/item/device/assembly/timer,
- /obj/item/device/assembly/timer)
- cost = 1500
- containertype = /obj/structure/closet/crate/secure/scisecurecrate
- crate_name = "Plasma assembly crate"
- access = access_tox_storage
- group = "Medical / Science"
-
-/datum/supply_pack/surgery
- name = "Surgery crate"
- contains = list(/obj/item/tool/cautery,
- /obj/item/tool/surgicaldrill,
- /obj/item/clothing/mask/breath/medical,
- /obj/item/tank/anesthetic,
- /obj/item/tool/hemostat,
- /obj/item/tool/scalpel,
- /obj/item/tool/retractor,
- /obj/item/tool/bonesetter,
- /obj/item/tool/saw/circular)
- cost = 1000
- containertype = /obj/structure/closet/crate/secure
- crate_name = "Surgery crate"
- access = access_moebius
- group = "Medical / Science"
-
-/datum/supply_pack/sterile
- name = "Sterile equipment crate"
- contains = list(/obj/item/clothing/under/rank/medical/green,
- /obj/item/clothing/under/rank/medical/green,
- /obj/item/clothing/head/surgery/green,
- /obj/item/clothing/head/surgery/green,
- /obj/item/storage/box/masks,
- /obj/item/storage/box/gloves)
- cost = 500
- containertype = /obj/structure/closet/crate
- crate_name = "Sterile equipment crate"
- group = "Medical / Science"
-
-/datum/supply_pack/bloodpacks
- name = "Blood Pack Variety Crate"
- cost = 1500
- contains = list(/obj/item/reagent_containers/blood/empty,
- /obj/item/reagent_containers/blood/empty,
- /obj/item/reagent_containers/blood/APlus,
- /obj/item/reagent_containers/blood/AMinus,
- /obj/item/reagent_containers/blood/BPlus,
- /obj/item/reagent_containers/blood/BMinus,
- /obj/item/reagent_containers/blood/OPlus,
- /obj/item/reagent_containers/blood/OMinus)
- containertype = /obj/structure/closet/crate/freezer
- crate_name = "blood freezer"
- group = "Medical / Science"
-
-/datum/supply_pack/medical_stand
- name = "Medical stand Crate"
- cost = 300
- contains = list(/obj/structure/medical_stand)
- containertype = /obj/structure/closet/crate/medical
- crate_name = "medical stand crate"
- group = "Medical / Science"
-
-/datum/supply_pack/body_bags
- name = "Body Bags Crate"
- cost = 600
- contains = list(/obj/item/storage/box/bodybags,
- /obj/item/storage/box/bodybags,
- /obj/item/storage/box/bodybags,
- /obj/item/storage/box/bodybags)
- crate_name = "body bags crate"
- group = "Medical / Science"
-
-
-/datum/supply_pack/floodlight
- name = "Emergency Floodlight Crate"
- cost = 500
- contains = list(/obj/machinery/floodlight,
- /obj/machinery/floodlight)
- containertype = /obj/structure/closet/crate/scicrate
- crate name = "Emergency Floodlight Crate"
- group = "Medical / Science"
-
-/datum/supply_pack/nanites
- name = "Raw Nanites"
- contains = list(
- /obj/item/reagent_containers/glass/beaker/vial/nanites
- )
- cost = 1000
- crate_name = "Raw Nanites Container"
- group = "Medical / Science"
- containertype = /obj/structure/closet/crate/medical
-
-/datum/supply_pack/uncapnanites
- name = "Raw Uncapped Nanites"
- contains = list(
- /obj/item/reagent_containers/glass/beaker/vial/uncapnanites
- )
- cost = 2000
- crate_name = "Raw Nanites Container"
- group = "Medical / Science"
- contraband = TRUE
- containertype = /obj/structure/closet/crate/medical
-
-//----------------------------------------------
-//-----------------HYDROPONICS------------------
-//----------------------------------------------
-
-/datum/supply_pack/monkey
- name = "Monkey crate"
- contains = list (/obj/item/storage/box/monkeycubes)
- cost = 1500
- containertype = /obj/structure/closet/crate/freezer
- crate_name = "Monkey crate"
- group = "Hydroponics"
-
-/datum/supply_pack/hydroponics // -- Skie
- name = "Hydroponics Supply Crate"
- contains = list(/obj/item/reagent_containers/spray/plantbgone,
- /obj/item/reagent_containers/spray/plantbgone,
- /obj/item/reagent_containers/glass/bottle/ammonia,
- /obj/item/reagent_containers/glass/bottle/ammonia,
- /obj/item/tool/hatchet,
- /obj/item/tool/minihoe,
- /obj/item/device/scanner/plant,
- /obj/item/clothing/gloves/botanic_leather,
- /obj/item/clothing/suit/apron) // Updated with new things
- cost = 900
- containertype = /obj/structure/closet/crate/hydroponics
- crate_name = "Hydroponics crate"
- group = "Hydroponics"
-
-// Bees
-/datum/supply_pack/bees
- name = "Bee crate"
- contains = list(/obj/item/bee_pack,
- /obj/item/bee_smoker,
- /obj/item/electronics/circuitboard/honey_extractor)
- cost = 700
- containertype = /obj/structure/closet/crate
- crate_name = "Bee crate"
- group = "Hydroponics"
-
-//farm animals - useless and annoying, but potentially a good source of food
-/datum/supply_pack/cow
- name = "Cow crate"
- cost = 3000
- containertype = /obj/structure/largecrate/animal/cow
- crate_name = "Cow crate"
- group = "Hydroponics"
-
-/datum/supply_pack/goat
- name = "Goat crate"
- cost = 2500
- containertype = /obj/structure/largecrate/animal/goat
- crate_name = "Goat crate"
- group = "Hydroponics"
-
-/datum/supply_pack/chicken
- name = "Chicken crate"
- cost = 1500
- containertype = /obj/structure/largecrate/animal/chick
- crate_name = "Chicken crate"
- group = "Hydroponics"
-
-/datum/supply_pack/corgi
- name = "Corgi crate"
- cost = 4000
- containertype = /obj/structure/largecrate/animal/corgi
- crate_name = "Corgi crate"
- group = "Hydroponics"
-
-/datum/supply_pack/cat
- name = "Cat crate"
- cost = 3000
- containertype = /obj/structure/largecrate/animal/cat
- crate_name = "Cat crate"
- group = "Hydroponics"
-
-/datum/supply_pack/seeds
- name = "Seeds crate"
- contains = list(/obj/item/seeds/chiliseed,
- /obj/item/seeds/berryseed,
- /obj/item/seeds/cornseed,
- /obj/item/seeds/eggplantseed,
- /obj/item/seeds/tomatoseed,
- /obj/item/seeds/appleseed,
- /obj/item/seeds/soyaseed,
- /obj/item/seeds/wheatseed,
- /obj/item/seeds/carrotseed,
- /obj/item/seeds/harebell,
- /obj/item/seeds/lemonseed,
- /obj/item/seeds/orangeseed,
- /obj/item/seeds/grassseed,
- /obj/item/seeds/sunflowerseed,
- /obj/item/seeds/chantermycelium,
- /obj/item/seeds/potatoseed,
- /obj/item/seeds/sugarcaneseed)
- cost = 800
- containertype = /obj/structure/closet/crate/hydroponics
- crate_name = "Seeds crate"
- group = "Hydroponics"
-
-/datum/supply_pack/weedcontrol
- name = "Weed control crate"
- contains = list(/obj/item/clothing/mask/gas,
- /obj/item/grenade/chem_grenade/antiweed,
- /obj/item/grenade/chem_grenade/antiweed,
- /obj/item/grenade/chem_grenade/antiweed,
- /obj/item/grenade/chem_grenade/antiweed)
- cost = 1000
- containertype = /obj/structure/closet/crate/secure/hydrosec
- crate_name = "Weed control crate"
- group = "Hydroponics"
-
-/datum/supply_pack/exoticseeds
- name = "Exotic seeds crate"
- contains = list(/obj/item/seeds/libertymycelium,
- /obj/item/seeds/reishimycelium,
- /obj/item/seeds/random,
- /obj/item/seeds/random,
- /obj/item/seeds/random,
- /obj/item/seeds/random,
- /obj/item/seeds/random,
- /obj/item/seeds/random,
- /obj/item/seeds/kudzuseed)
- cost = 1000
- containertype = /obj/structure/closet/crate/hydroponics
- crate_name = "Exotic Seeds crate"
- group = "Hydroponics"
-
-/datum/supply_pack/watertank
- name = "Water tank crate"
- contains = list(/obj/structure/reagent_dispensers/watertank)
- cost = 800
- containertype = /obj/structure/largecrate
- crate_name = "Water tank crate"
- group = "Hydroponics"
-/*
-/datum/supply_pack/bee_keeper
- name = "Beekeeping crate"
- contains = list(/obj/item/beezeez,
- /obj/item/bee_net,
- /obj/item/apiary,
- /obj/item/queen_bee)
- cost = 2000
- contraband = TRUE
- containertype = /obj/structure/closet/crate/hydroponics
- crate_name = "Beekeeping crate"
- group = "Hydroponics"
-*/
-//----------------------------------------------
-//--------------------MINING--------------------
-//----------------------------------------------
-/*
-/datum/supply_pack/mining
- name = "Mining Explosives Crate"
- contains = list(/obj/item/mining_charge,
- /obj/item/mining_charge,
- /obj/item/mining_charge,
- /obj/item/mining_charge,
- /obj/item/mining_charge,
- /obj/item/mining_charge,
- /obj/item/mining_charge,
- /obj/item/mining_charge,
- /obj/item/mining_charge,
- /obj/item/mining_charge,)
- cost = 1500
- containertype = /obj/structure/closet/crate/secure/gear
- crate_name = "Mining Explosives Crate"
- access = access_mining
- group = "Mining"
-*/
-/datum/supply_pack/mining_drill
- name = "Drill Crate"
- contains = list(/obj/machinery/mining/deep_drill)
- cost = 2000
- containertype = /obj/structure/closet/crate/secure/large
- crate_name = "Drill Crate"
- group = "Mining"
-
-/datum/supply_pack/mining_supply
- name = "Mining Supply Crate"
- contains = list(/obj/item/reagent_containers/spray/cleaner,
- /obj/item/device/lighting/toggleable/flashlight,
- /obj/item/tool/pickaxe/jackhammer)
- cost = 5000
- containertype = /obj/structure/closet/crate/secure/gear
- crate_name = "Mining Supply Crate"
- group = "Mining"
-
-//----------------------------------------------
-//--------------------SUPPLY--------------------
-//----------------------------------------------
-
-/datum/supply_pack/food
- name = "Kitchen supply crate"
- contains = list(/obj/item/reagent_containers/food/condiment/flour,
- /obj/item/reagent_containers/food/condiment/flour,
- /obj/item/reagent_containers/food/condiment/flour,
- /obj/item/reagent_containers/food/condiment/flour,
- /obj/item/reagent_containers/food/drinks/milk,
- /obj/item/reagent_containers/food/drinks/milk,
- /obj/item/storage/fancy/egg_box,
- /obj/item/reagent_containers/food/snacks/tofu,
- /obj/item/reagent_containers/food/snacks/tofu,
- /obj/item/reagent_containers/food/snacks/meat,
- /obj/item/reagent_containers/food/snacks/meat,
- /obj/item/reagent_containers/food/condiment/enzyme,
- /obj/item/reagent_containers/food/condiment/enzyme,)
-
- cost = 900
- containertype = /obj/structure/closet/crate/freezer
- crate_name = "Food crate"
- group = "Supply"
-
-/datum/supply_pack/toner
- name = "Toner cartridges"
- contains = list(/obj/item/device/toner,
- /obj/item/device/toner,
- /obj/item/device/toner,
- /obj/item/device/toner,
- /obj/item/device/toner,
- /obj/item/device/toner)
- cost = 600
- crate_name = "Toner cartridges"
- group = "Supply"
-
-/datum/supply_pack/misc/posters
- name = "Corporate Posters Crate"
- contains = list(/obj/item/contraband/poster,
- /obj/item/contraband/poster,
- /obj/item/contraband/poster,
- /obj/item/contraband/poster,
- /obj/item/contraband/poster)
- cost = 700
- crate_name = "Corporate Posters Crate"
- group = "Supply"
-
-/datum/supply_pack/janitor
- name = "Janitorial supplies"
- contains = list(/obj/item/reagent_containers/glass/bucket,
- /obj/item/mop,
- /obj/item/holyvacuum,
- /obj/item/caution,
- /obj/item/caution,
- /obj/item/caution,
- /obj/item/caution,
- /obj/item/storage/bag/trash,
- /obj/item/device/lightreplacer,
- /obj/item/reagent_containers/spray/cleaner,
- /obj/item/reagent_containers/glass/rag,
- /obj/item/grenade/chem_grenade/cleaner,
- /obj/item/grenade/chem_grenade/cleaner,
- /obj/item/grenade/chem_grenade/cleaner,
- /obj/structure/mopbucket)
- cost = 1000
- crate_name = "Janitorial supplies"
- group = "Supply"
-
-/datum/supply_pack/boxes
- name = "Empty boxes"
- contains = list(/obj/item/storage/box,
- /obj/item/storage/box,
- /obj/item/storage/box,
- /obj/item/storage/box,
- /obj/item/storage/box,
- /obj/item/storage/box,
- /obj/item/storage/box,
- /obj/item/storage/box,
- /obj/item/storage/box,
- /obj/item/storage/box)
- cost = 800
- crate_name = "Empty box crate"
- group = "Supply"
-
-//----------------------------------------------
-//-----------------R.I.G------------------------
-//----------------------------------------------
-
-/datum/supply_pack/eva
- name = "EVA Suit Control Module Crate"
- contains = list(/obj/item/rig/eva)
- cost = 600
- crate_name = "EVA Suit Control Module Crate"
- group = "Resource Integration Gear"
-
-/datum/supply_pack/hazard
- name = "Hazard Hardsuit Control Module Crate"
- contains = list(/obj/item/rig/hazard)
- cost = 1100
- crate_name = "Hazard Hardsuit Control Module Crate"
- group = "Resource Integration Gear"
-
-/datum/supply_pack/industrial
- name = "Industrial Hardsuit Control Module Crate"
- contains = list(/obj/item/rig/industrial)
- cost = 2000
- crate_name = "Industrial Hardsuit Control Module Crate"
- group = "Resource Integration Gear"
-
-/datum/supply_pack/flash
- name = "Mounted Flash Module Crate"
- contains = list(/obj/item/rig_module/device/flash)
- cost = 300
- crate_name = "Mouned Flash Module Crate"
- group = "Resource Integration Gear"
-
-/datum/supply_pack/egun
- name = "Mounted Energy Gun Module Crate"
- contains = list(/obj/item/rig_module/mounted/egun)
- cost = 2100
- crate_name = "Mouned Energy Gun Module Crate"
- group = "Resource Integration Gear"
-
-/datum/supply_pack/taser
- name = "Mounted Taser Gun Module Crate"
- contains = list(/obj/item/rig_module/mounted/taser)
- cost = 900
- crate_name = "Mouned Taser Gun Module Crate"
- group = "Resource Integration Gear"
-
-/datum/supply_pack/drill
- name = "Hardsuit Mounted Drill Crate"
- contains = list(/obj/item/rig_module/device/drill)
- cost = 600
- crate_name = "Hardsuit Mounted Drill Crate"
- group = "Resource Integration Gear"
-
-/datum/supply_pack/orescanner
- name = "Hardsuit Mounted Ore Scanner Crate"
- contains = list(/obj/item/rig_module/device/orescanner)
- cost = 300
- crate_name = "Hardsuit Mounted Ore Scanner Crate"
- group = "Resource Integration Gear"
-
-/datum/supply_pack/healthscanner
- name = "Hardsuit Mounted Health Scanner Crate"
- contains = list(/obj/item/rig_module/device/healthscanner)
- cost = 300
- crate_name = "Hardsuit Mounted Health Scanner Crate"
- group = "Resource Integration Gear"
-
-/datum/supply_pack/maneuverjet
- name = "Hardsuit Maneuvering Jet Crate"
- contains = list(/obj/item/rig_module/maneuvering_jets)
- cost = 1200
- crate_name = "Hardsuit Maneuvering Jet Crate"
- group = "Resource Integration Gear"
-
-/datum/supply_pack/storage
- name = "Internal Hardsuit Storage Compartment Crate"
- contains = list(/obj/item/rig_module/storage)
- cost = 1200
- crate_name = "Internal Hardsuit Storage Compartment Crate"
- group = "Resource Integration Gear"
-
-/datum/supply_pack/meson
- name = "Hardsut Meson Scanner Crate"
- contains = list(/obj/item/rig_module/vision/meson)
- cost = 300
- crate_name = "Hardsut Meson Scanner Crate"
- group = "Resource Integration Gear"
-
-/datum/supply_pack/medhud
- name = "Hardsuit Medical Hud Crate"
- contains = list(/obj/item/rig_module/vision/medhud)
- cost = 300
- crate_name = "Hardsuit Medical Hud Crate"
- group = "Resource Integration Gear"
-
-/datum/supply_pack/sechud
- name = "Hardsuit Security Hud Crate"
- contains = list(/obj/item/rig_module/vision/sechud)
- cost = 300
- crate_name = "Hardsuit Security Hud Crate"
- group = "Resource Integration Gear"
-
-/datum/supply_pack/nvgrig
- name = "Hardsuit Night vision Interface Crate"
- contains = list(/obj/item/rig_module/vision/nvg)
- cost = 1800
- crate_name = "Hardsuit Night vision Interface Crate"
- group = "Resource Integration Gear"
-//----------------------------------------------
-//--------------MISCELLANEOUS-------------------
-//----------------------------------------------
-
-/datum/supply_pack/formal_wear
- contains = list(/obj/item/clothing/head/bowler,
- /obj/item/clothing/head/that,
- /obj/item/clothing/under/suit_jacket,
- /obj/item/clothing/under/suit_jacket/red,
- /obj/item/clothing/shoes/color/black,
- /obj/item/clothing/shoes/color/black,
- /obj/item/clothing/shoes/leather,
- /obj/item/clothing/suit/wcoat)
- name = "Formalwear closet"
- cost = 500
- containertype = /obj/structure/closet
- crate_name = "Formalwear for the best occasions."
- group = "Miscellaneous"
-
-/datum/supply_pack/eftpos
- contains = list(/obj/item/device/eftpos)
- name = "EFTPOS scanner"
- cost = 400
- crate_name = "EFTPOS crate"
- group = "Miscellaneous"
-
-/datum/supply_pack/discs
- contains = list(/obj/item/computer_hardware/hard_drive/portable/design,
- /obj/item/computer_hardware/hard_drive/portable/design,
- /obj/item/computer_hardware/hard_drive/portable/design,
- /obj/item/computer_hardware/hard_drive/portable/design,
- /obj/item/computer_hardware/hard_drive/portable/design,
- /obj/item/computer_hardware/hard_drive/portable/design)
- name = "Empty Design Disk Crate"
- cost = 1000
- crate_name ="Empty disks crate"
- group = "Miscellaneous"
-
-//----------------------------------------------
-//-----------------RANDOMISED-------------------
-//----------------------------------------------
-
-/datum/supply_pack/randomised
- name = "Collectable Hats Crate!"
- cost = 20000
- var/num_contained = 4 //number of items picked to be contained in a randomised crate
- contains = list(/obj/item/clothing/head/collectable/chef,
- /obj/item/clothing/head/collectable/paper,
- /obj/item/clothing/head/collectable/tophat,
- /obj/item/clothing/head/collectable/captain,
- /obj/item/clothing/head/collectable/beret,
- /obj/item/clothing/head/collectable/welding,
- /obj/item/clothing/head/collectable/flatcap,
- /obj/item/clothing/head/collectable/pirate,
- /obj/item/clothing/head/collectable/kitty,
- /obj/item/clothing/head/collectable/rabbitears,
- /obj/item/clothing/head/collectable/wizard,
- /obj/item/clothing/head/collectable/hardhat,
- /obj/item/clothing/head/collectable/thunderdome,
- /obj/item/clothing/head/collectable/swat,
- /obj/item/clothing/head/collectable/slime,
- /obj/item/clothing/head/collectable/police,
- /obj/item/clothing/head/collectable/slime,
- /obj/item/clothing/head/collectable/xenom,
- /obj/item/clothing/head/collectable/petehat)
- crate_name = "Collectable hats crate! Brought to you by Bass.inc!"
- group = "Miscellaneous"
-
-/datum/supply_pack/randomised/fill(obj/structure/closet/crate/C)
- var/list/L = contains.Copy()
- var/item
- if(num_contained <= L.len)
- for(var/i in 1 to num_contained)
- item = pick_n_take(L)
- new item(C)
- else
- for(var/i in 1 to num_contained)
- item = pick(L)
- new item(C)
-
-/datum/supply_pack/randomised/contraband
- num_contained = 5
- contains = list(/obj/item/seeds/bloodtomatoseed,
- /obj/item/storage/pill_bottle/zoom,
- /obj/item/seeds/kudzuseed,
- /obj/item/storage/pill_bottle/happy,
- /obj/item/contraband/poster,
- /obj/item/reagent_containers/food/drinks/bottle/pwine)
- name = "Contraband crate"
- cost = 3000
- containertype = /obj/structure/closet/crate
- crate_name = "Unlabeled crate"
- contraband = TRUE
- group = "Operations"
-
-/datum/supply_pack/randomised/pizza
- num_contained = 5
- contains = list(/obj/item/pizzabox/margherita,
- /obj/item/pizzabox/mushroom,
- /obj/item/pizzabox/meat,
- /obj/item/pizzabox/vegetable)
- name = "Surprise pack of five pizzas"
- cost = 2000
- containertype = /obj/structure/closet/crate/freezer
- crate_name = "Pizza crate"
- group = "Hospitality"
-
-/datum/supply_pack/randomised/costume
- num_contained = 2
- contains = list(/obj/item/clothing/suit/pirate,
- /obj/item/clothing/suit/judgerobe,
- /obj/item/clothing/suit/wcoat,
- /obj/item/clothing/suit/nun,
- /obj/item/clothing/under/rank/fo_suit,
- /obj/item/clothing/suit/bio_suit/plaguedoctorsuit,
- /obj/item/clothing/under/schoolgirl,
- /obj/item/clothing/under/owl,
- /obj/item/clothing/under/waiter,
- /obj/item/clothing/under/gladiator,
- /obj/item/clothing/under/soviet,
- /obj/item/clothing/under/bride_white,
- /obj/item/clothing/suit/chef,
- /obj/item/clothing/under/kilt)
- name = "Costumes crate"
- cost = 300
- containertype = /obj/structure/closet/crate/secure
- crate_name = "Actor Costumes"
- access = access_theatre
- group = "Miscellaneous"
-
-/datum/supply_pack/randomised/guns
- num_contained = 4
- contains = list(/obj/spawner/gun/cheap,
- /obj/spawner/gun/cheap,
- /obj/spawner/gun/cheap,
- /obj/spawner/gun/cheap)
- name = "Surplus Weaponry"
- cost = 2500
- crate_name = "Surplus Weapons Crate"
- containertype = /obj/structure/closet/crate/secure/weapon
- group = "Security"
-
-/datum/supply_pack/randomised/ammo
- num_contained = 8
- contains = list(/obj/spawner/ammo/low_cost,
- /obj/spawner/ammo/low_cost,
- /obj/spawner/ammo/low_cost,
- /obj/spawner/ammo/low_cost,
- /obj/spawner/ammo/low_cost,
- /obj/spawner/ammo/low_cost,
- /obj/spawner/ammo/low_cost,
- /obj/spawner/ammo/low_cost,
- )
- name = "Surplus Ammo"
- cost = 1200
- crate_name = "Surplus Ammo Crate"
- containertype = /obj/structure/closet/crate/secure/weapon
- group = "Security"
-
-/datum/supply_pack/randomised/pouches
- num_contained = 5
- contains = list(/obj/spawner/pouch,
- /obj/spawner/pouch,
- /obj/spawner/pouch,
- /obj/spawner/pouch,
- /obj/spawner/pouch)
- name = "Surplus Storage Pouches"
- cost = 1500
- crate_name = "Surplus Pouches Crate"
- containertype = /obj/structure/closet/crate
- group = "Operations"
-
-
-/datum/supply_pack/randomised/holsters
- num_contained = 4
- contains = list(/obj/spawner/cloth/holster,
- /obj/spawner/cloth/holster,
- /obj/spawner/cloth/holster,
- /obj/spawner/cloth/holster)
- name = "Surplus Unform Holsters"
- cost = 800
- crate_name = "Surplus Uniform Holsters Crate"
- containertype = /obj/structure/closet/crate
- group = "Operations"
-
-/datum/supply_pack/randomised/voidsuit
- num_contained = 1
- contains = list(/obj/spawner/voidsuit,
- /obj/spawner/voidsuit/damaged)
- name = "Surplus Voidsuit"
- cost = 1000
- crate_name = "Surplus Voidsuit Crate"
- containertype = /obj/structure/closet/crate
- group = "Operations"
-
-/datum/supply_pack/randomised/rig
- num_contained = 1
- contains = list(/obj/spawner/rig,
- /obj/spawner/rig/damaged)
- name = "Surplus Rig Suit"
- cost = 2000
- crate_name = "Surplus Rig Crate"
- containertype = /obj/structure/closet/crate
- group = "Operations"
-
-/datum/supply_pack/randomised/rigmods
- num_contained = 2
- contains = list(/obj/spawner/rig_module,
- /obj/spawner/rig_module)
- name = "Surplus Rig Modules"
- cost = 1500
- crate_name = "Surplus Rig Modules"
- containertype = /obj/structure/closet/crate
- group = "Operations"
-
-/datum/supply_pack/randomised/cartons
- num_contained = 2
- contains = list(/obj/item/storage/fancy/cigcartons,
- /obj/item/storage/fancy/cigcartons/dromedaryco,
- /obj/item/storage/fancy/cigcartons/killthroat,
- /obj/item/storage/fancy/cigcartons/homeless)
- name = "Cigarettes Cartons"
- cost = 1250
- crate_name = "Cigarettes Cartons Crate"
- containertype = /obj/structure/closet/crate
- group = "Supply"
-
-
-/datum/supply_pack/boombox
- contains = list(/obj/item/media/boombox)
- name = "Boombox delivery"
- cost = 1000
- crate_name = "SN4-Z 2N3Z CRATE"
- containertype = /obj/structure/closet/crate
- group = "Miscellaneous"
diff --git a/code/modules/client/preference_setup/general/03_flavor.dm b/code/modules/client/preference_setup/general/03_flavor.dm
index f41d31b5ce..0e7a3bdb5c 100644
--- a/code/modules/client/preference_setup/general/03_flavor.dm
+++ b/code/modules/client/preference_setup/general/03_flavor.dm
@@ -36,7 +36,7 @@
/datum/category_item/player_setup_item/physical/flavor/OnTopic(var/href,var/list/href_list, var/mob/user)
if(href_list["flavor_text"] && href_list["flavor_text"] == "open")
- var/msg = sanitize(input(usr,"Give a general description of your character. This will be shown regardless of clothing, and may include OOC notes and preferences.","Flavor Text", pref.flavor_text, "message"), extra = 0)
+ var/msg = sanitize(input(usr,"Give a general description of your character. This will be shown regardless of clothing, and may include OOC notes and preferences.","Flavor Text", pref.flavor_text), extra = 0)
if(CanUseTopic(user))
if(msg)
pref.flavor_text = msg
@@ -45,12 +45,13 @@
else if(href_list["flavour_text_robot"])
switch(href_list["flavour_text_robot"])
if("open")
+ EMPTY_BLOCK_GUARD
if("Default")
- var/msg = sanitize(input(usr,"Set the default flavour text for your robot. It will be used for any module without individual setting.","Flavour Text",html_decode(pref.flavour_texts_robot["Default"]), "message"), extra = 0)
+ var/msg = sanitize(input(usr,"Set the default flavour text for your robot. It will be used for any module without individual setting.","Flavour Text",html_decode(pref.flavour_texts_robot["Default"])), extra = 0)
if(CanUseTopic(user))
pref.flavour_texts_robot[href_list["flavour_text_robot"]] = msg
else
- var/msg = sanitize(input(usr,"Set the flavour text for your robot with [href_list["flavour_text_robot"]] module. If you leave this empty, default flavour text will be used for this module.","Flavour Text",html_decode(pref.flavour_texts_robot[href_list["flavour_text_robot"]]), "message"), extra = 0)
+ var/msg = sanitize(input(usr,"Set the flavour text for your robot with [href_list["flavour_text_robot"]] module. If you leave this empty, default flavour text will be used for this module.","Flavour Text",html_decode(pref.flavour_texts_robot[href_list["flavour_text_robot"]])), extra = 0)
if(CanUseTopic(user))
pref.flavour_texts_robot[href_list["flavour_text_robot"]] = msg
SetFlavourTextRobot(user)
diff --git a/code/modules/clothing/accessories/badges.dm b/code/modules/clothing/accessories/badges.dm
index a651eabaa4..040fbe8b23 100644
--- a/code/modules/clothing/accessories/badges.dm
+++ b/code/modules/clothing/accessories/badges.dm
@@ -5,20 +5,21 @@
*/
/obj/item/clothing/accessory/badge
- name = "faded Inspector's badge"
- desc = "A NanoTrasen badge, made from gold and set on false leather."
+ name = "faded Detective's badge"
+ desc = "An ancient badge of the NanoTrasen Detective Agency, made of gold and set on false leather."
icon_state = "badge"
item_state = "marshalbadge"
slot_flags = SLOT_BELT | SLOT_ACCESSORY_BUFFER
price_tag = 200
var/stored_name
- var/badge_string = "Ironhammer Security"
+ var/badge_string = "NanoTrasen Detective Agency"
/obj/item/clothing/accessory/badge/old
- name = "faded badge"
- desc = "A faded badge, backed with leather. It bears the emblem of the NanoTrasen Security division."
+ name = "faded security badge"
+ desc = "An ancient badge of the NanoTrasen Security Division, made of silver and set on false black leather."
icon_state = "badge_round"
+ badge_string = "Nanotrasen Security Division"
/obj/item/clothing/accessory/badge/proc/set_name(var/new_name)
stored_name = new_name
@@ -48,6 +49,7 @@
icon_state = "holobadge"
item_state = "holobadge"
var/emagged //Emagging removes Sec check.
+ badge_string = "Ironhammer Security"
/obj/item/clothing/accessory/badge/holo/cord
icon_state = "holobadge-cord"
@@ -116,6 +118,7 @@
icon_state = "goldbadge"
item_state = "goldbadge"
slot_flags = SLOT_ACCESSORY_BUFFER
+ badge_string = "Ironhammer Officer Corps"
spawn_blacklisted = TRUE
/obj/item/clothing/accessory/badge/inspector
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 6ce0986c53..3aa95180cc 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -115,12 +115,18 @@
spawn_blacklisted = TRUE
/obj/item/clothing/head/beret/artist
- name = "feathered beret"
+ name = "red feathered beret"
desc = "Fit for artists, frenchmen, and eccentric military officers across the cosmos."
icon_state = "beret_artist"
item_state = "beret_artist"
spawn_frequency = 0
+/obj/item/clothing/head/beret/artist/lime
+ name = "lime feathered beret"
+ desc = "A lime colored artist's beret, smells of citrus and pomp."
+ icon_state = "beret_artist_lime"
+ item_state = "beret_artist_lime"
+
//Moebius
/obj/item/clothing/head/beret/moebius
name = "Moebius beret"
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index ea422902c5..ed6bc3bf73 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -94,7 +94,7 @@
/obj/item/clothing/head/soft/synd
name = "ancient syndicate cap"
- initial name = "ancient syndicate cap"
+ initial_name = "ancient syndicate cap"
desc = "A corporate war style field cap. Popular among patriots and veterans nowadays."
icon_state = "syndsoft"
diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
index b886870db9..df9dd553b3 100644
--- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
@@ -55,7 +55,7 @@
switch(to_remove)
if("cell")
if(cell)
- to_chat(user, "You detatch \the [cell] from \the [src]'s battery mount.")
+ to_chat(user, "You detach \the [cell] from \the [src]'s battery mount.")
for(var/obj/item/rig_module/module in installed_modules)
module.deactivate()
user.put_in_hands(cell)
diff --git a/code/modules/clothing/spacesuits/rig/rig_modules.dm b/code/modules/clothing/spacesuits/rig/rig_modules.dm
index 780cf6e6f3..80c0726415 100644
--- a/code/modules/clothing/spacesuits/rig/rig_modules.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_modules.dm
@@ -59,7 +59,7 @@
mod.holder = null
if (user)
- to_chat(user, "You detatch \the [mod] from \the [src].")
+ to_chat(user, "You detach \the [mod] from \the [src].")
mod.uninstalled(src, user)
if (delete)
diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm
index 6170419e65..2770fd7473 100644
--- a/code/modules/clothing/spacesuits/void/void.dm
+++ b/code/modules/clothing/spacesuits/void/void.dm
@@ -242,7 +242,7 @@
tank.forceMove(get_turf(src))
src.tank = null
else if(choice == boots)
- to_chat(user, "You detatch \the [boots] from \the [src]'s boot mounts.")
+ to_chat(user, "You detach \the [boots] from \the [src]'s boot mounts.")
boots.forceMove(get_turf(src))
src.boots = null
else
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 9d34e309f3..a0b5cbab47 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -64,14 +64,48 @@
/obj/item/armor_component/plate/leather
)
-/obj/item/clothing/suit/armor/vest/full/security
+
+//This has specifically been bodged so that I can give the flak vest toggle-able buttons -VaNdU Jr
+/obj/item/clothing/suit/armor/vest/toggle/full
name = "full security armor"
desc = "A tactical armor vest, but with shoulderpads and knee pads included to cover all parts of the body. Not designed for serious operations."
icon_state = "armor_security_fullbody"
+ icon_open = "armor_security_fullbody_open"
+ icon_closed = "armor_security_fullbody"
+ blood_overlay_type = "armor"
+ slowdown = 0.1
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS // kneepads and shoulderpads, so it covers arms and legs
+ matter = list(
+ MATERIAL_STEEL = 10, // contains a lil bit more steel because of arm+leg prot
+ MATERIAL_PLASTEEL = 1
+ )
+ slowdown = LIGHT_SLOWDOWN
+ style_coverage = COVERS_TORSO|COVERS_UPPER_ARMS|COVERS_UPPER_LEGS
-/obj/item/clothing/suit/armor/vest/security
+/obj/item/clothing/suit/armor/vest/toggle
name = "security armor"
icon_state = "armor_security"
+ var/icon_open = "armor_security_open"
+ var/icon_closed = "armor_security"
+
+/obj/item/clothing/suit/armor/vest/toggle/verb/toggle()
+ set name = "Toggle Vest Buttons"
+ set category = "Object"
+ set src in usr
+ if(!usr.canmove || usr.stat || usr.restrained())
+ return
+
+ if(icon_state == icon_open) //Will check whether icon state is currently set to the "open" or "closed" state and switch it around with a message to the user
+ icon_state = icon_closed
+ to_chat(usr, "You button up the vest.")
+ else if(icon_state == icon_closed)
+ icon_state = icon_open
+ to_chat(usr, "You unbutton the vest.")
+ else //in case some goofy admin switches icon states around without switching the icon_open or icon_closed
+ to_chat(usr, "You attempt to button-up the velcro on your [src], before promptly realising how silly you are.")
+ return
+ update_wear_icon() //so our overlays update
+
/obj/item/clothing/suit/armor/vest/detective
name = "armor"
@@ -510,6 +544,11 @@
icon_state = "riot"
item_state = "swat_suit"
flags_inv = NONE
+ matter = list(
+ MATERIAL_STEEL = 10,
+ MATERIAL_PLASTIC = 8,
+ MATERIAL_PLASTEEL = 3
+ )
armor = list(
ARMOR_BLUNT = 10,
ARMOR_BULLET = 0,
diff --git a/code/modules/clothing/suits/neotheology.dm b/code/modules/clothing/suits/neotheology.dm
index f2efe5f9f0..88eae15838 100644
--- a/code/modules/clothing/suits/neotheology.dm
+++ b/code/modules/clothing/suits/neotheology.dm
@@ -125,3 +125,43 @@
)
unacidable = TRUE
spawn_blacklisted = TRUE
+
+//The following are being implemented as fashion options, but are intended for functional mechanics with NT "Rituals" rework. They are intentionally nonviable for anything but cosmetic use.
+/obj/item/clothing/head/robe/ritual_robe
+ name = "ritual robe hood"
+ icon_state = "nt_ritualrobe_hood"
+ item_state = "nt_ritualrobe_hood"
+ desc = "A hood to cover one's features while chanting hymns or holy sacrements."
+ permeability_coefficient = 0.01
+ armor = list(ARMOR_BLUNT = 5, ARMOR_SLASH = 2, ARMOR_POINTY = 2, ARMOR_BULLET = 2, ARMOR_ENERGY = 5, ARMOR_BOMB = 10, ARMOR_BIO = 10, ARMOR_RAD = 10, ARMOR_CHEM = 10)
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|BLOCKHAIR|HIDEFACE
+ body_parts_covered = HEAD|FACE|EYES|EARS
+ item_flags = FLEXIBLEMATERIAL
+ siemens_coefficient = 0.9
+ style = STYLE_HIGH //Spooky = cool = stylish
+ spawn_blacklisted = TRUE
+
+/obj/item/clothing/suit/storage/toggle/robe/ritual_robe
+ name = "Ritual robe"
+ desc = "A robe to cover one's features while chanting hymns or holy sacrements. Has a couple pockets for trinkets."
+ hood = /obj/item/clothing/head/robe/ritual_robe
+ icon_state = "nt_robe"
+ icon_up = "nt_robe"
+ icon_down = "nt_robe_down"
+ action_button_name = "Toggle Hood"
+ permeability_coefficient = 0.01
+ armor = list(
+ melee = 2,
+ bullet = 2,
+ energy = 5,
+ bomb = 0,
+ bio = 100,
+ rad = 0
+ )
+ flags_inv = HIDEJUMPSUIT|HIDETAIL|HIDESHOES
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
+ item_flags = COVER_PREVENT_MANIPULATION|DRAG_AND_DROP_UNEQUIP
+ siemens_coefficient = 0.9
+ style = STYLE_HIGH //Spooky = cool = stylish
+ spawn_blacklisted = TRUE
+ matter = list(MATERIAL_BIOMATTER = 50)
diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm
index fa6c26e3fa..a51788f801 100644
--- a/code/modules/clothing/suits/storage.dm
+++ b/code/modules/clothing/suits/storage.dm
@@ -57,6 +57,105 @@
return
update_wear_icon() //so our overlays update
+//Outerwear with a hoodie, used to put it up or down, like the Ritual Robe, but not a voidsuit. Adopted much from voidsuit.
+/obj/item/clothing/suit/storage/toggle/robe
+ bad_type = /obj/item/clothing/suit/storage/toggle/robe
+ var/obj/item/clothing/head/robe/hood //Deployable Hood, if any.
+ var/icon_up
+ var/icon_down
+
+/obj/item/clothing/suit/storage/toggle/robe/Initialize()
+ if(hood && ispath(hood))
+ hood = new hood(src)
+
+/obj/item/clothing/suit/storage/toggle/robe/ui_action_click(mob/living/user, action_name)
+ if(..())
+ return TRUE
+ toggle_hood()
+
+/obj/item/clothing/suit/storage/toggle/robe/clean_blood()
+ //So that you dont have to detach the components to clean them, also since you can't detach the helmet
+ if(hood) hood.clean_blood()
+
+ return ..()
+
+/obj/item/clothing/suit/storage/toggle/robe/decontaminate()
+ if(hood) hood.decontaminate()
+
+ return ..()
+
+/obj/item/clothing/suit/storage/toggle/robe/make_young()
+ ..()
+ if(hood) hood.make_young()
+
+/obj/item/clothing/suit/storage/toggle/robe/equipped(mob/M)
+ ..()
+
+ if(is_held())
+ lower_hood()
+
+ var/mob/living/carbon/human/H = M
+
+ if(!istype(H)) return
+
+ if(H.wear_suit != src)
+ return
+
+ if(hood)
+ toggle_hood()
+
+/obj/item/clothing/suit/storage/toggle/robe/dropped()
+ ..()
+ lower_hood()
+
+/obj/item/clothing/suit/storage/toggle/robe/proc/lower_hood()
+ var/mob/living/carbon/human/H
+
+ if(hood)
+ hood.canremove = 1
+ H = hood.loc
+ if(istype(H))
+ if(hood && H.head == hood)
+ H.drop_from_inventory(hood)
+ hood.forceMove(src)
+ icon_state = icon_down
+ if(hood.overslot)
+ hood.remove_overslot_contents(H)
+
+/obj/item/clothing/suit/storage/toggle/robe/verb/toggle_hood()
+ set name = "Toggle Hood"
+ set category = "Object"
+ set src in usr
+
+ if(!isliving(loc))
+ return
+
+ if(!hood)
+ to_chat(usr, "There is no hood attached.")
+ return
+
+ var/mob/living/carbon/human/H = usr
+
+ if(!istype(H)) return
+ if(H.stat) return
+ if(H.wear_suit != src) return
+
+ if(H.head == hood)
+ to_chat(H, SPAN_NOTICE("You lower your hood."))
+ hood.canremove = 1
+ H.drop_from_inventory(hood)
+ hood.forceMove(src)
+ icon_state = icon_down
+ playsound(src.loc, "rustle", 75, 1)
+ else
+ if(H.head)
+ to_chat(H, SPAN_DANGER("You cannot raise your hood while wearing \the [H.head]."))
+ return
+ if(H.equip_to_slot_if_possible(hood, slot_head))
+ hood.canremove = 0
+ to_chat(H, "You raise your hood, obscuring your face.")
+ icon_state = icon_up
+ playsound(src.loc, "rustle", 75, 1)
/obj/item/clothing/suit/storage/vest/merc/New()
..()
diff --git a/code/modules/dungeons/procedural/jp_dungeon_gen.dm b/code/modules/dungeons/procedural/jp_dungeon_gen.dm
index 00a3dc2fb8..2e19023e78 100644
--- a/code/modules/dungeons/procedural/jp_dungeon_gen.dm
+++ b/code/modules/dungeons/procedural/jp_dungeon_gen.dm
@@ -853,7 +853,7 @@
out_numPaths++
if(long) out_numLongPaths++
end = start
- return retPath(end, previous, pathWidth, start, end)
+ return retPath(previous, pathWidth, start, end)
next-=borders
for(var/turf/t in next)
@@ -903,9 +903,10 @@
if(!check_tick_in)
check_tick_in = 3
CHECK_TICK
- return retPath(end, previous, pathWidth, start, end)
+ return retPath(previous, pathWidth, start, end)
-/obj/procedural/jp_DungeonGenerator/proc/retPath(var/list/end, var/list/previous, var/pathWidth, var/turf/start, var/turf/end)
+
+/obj/procedural/jp_DungeonGenerator/proc/retPath(var/list/previous, var/pathWidth, var/turf/start, var/turf/end)
var/list/ret = list()
ret += GetSquare(end, pathWidth)
var/turf/last = end
diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm
index 55fd89f14c..7df3bb3d58 100644
--- a/code/modules/economy/ATM.dm
+++ b/code/modules/economy/ATM.dm
@@ -35,7 +35,7 @@ log transactions
/obj/machinery/atm/Initialize()
. = ..()
- machine_id = "[station_name()] RT #[num_financial_terminals++]"
+ machine_id = "[station_name] RT #[num_financial_terminals++]"
spark_system = new /datum/effect/effect/system/spark_spread
spark_system.set_up(5, 0, src)
spark_system.attach(src)
diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm
index 79cebeacfa..32cf49ad6f 100644
--- a/code/modules/economy/Accounts_DB.dm
+++ b/code/modules/economy/Accounts_DB.dm
@@ -30,13 +30,13 @@
proc/accounting_letterhead(report_name)
return {"
[report_name]
- [station_name()] Accounting Report
+ [station_name] Accounting Report
Generated By: [held_card.registered_name], [held_card.assignment]
"}
/obj/machinery/account_database/New()
- machine_id = "[station_name()] Acc. DB #[num_financial_terminals++]"
+ machine_id = "[station_name] Acc. DB #[num_financial_terminals++]"
..()
/obj/machinery/account_database/attackby(obj/O, mob/user)
diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm
index 3954196ada..82ba78d787 100644
--- a/code/modules/economy/EFTPOS.dm
+++ b/code/modules/economy/EFTPOS.dm
@@ -15,7 +15,7 @@
/obj/item/device/eftpos/New()
..()
- machine_id = "[station_name()] EFTPOS #[num_financial_terminals++]"
+ machine_id = "[station_name] EFTPOS #[num_financial_terminals++]"
access_code = rand(1111,111111)
spawn(0)
print_reference()
diff --git a/code/modules/economy/cash_register.dm b/code/modules/economy/cash_register.dm
index 88b1bba0c0..d280a8ce09 100644
--- a/code/modules/economy/cash_register.dm
+++ b/code/modules/economy/cash_register.dm
@@ -28,7 +28,7 @@
// Claim machine ID
/obj/machinery/cash_register/New()
. = ..()
- machine_id = "[station_name()] RETAIL #[num_financial_terminals++]"
+ machine_id = "[station_name] RETAIL #[num_financial_terminals++]"
cash_stored = rand(10, 70)*10
transaction_devices += src // Global reference list to be properly set up by /proc/setup_economy()
diff --git a/code/modules/games/boardgame.dm b/code/modules/games/boardgame.dm
index 6f94fdf80d..d550f4e26d 100644
--- a/code/modules/games/boardgame.dm
+++ b/code/modules/games/boardgame.dm
@@ -14,7 +14,7 @@
var i
for(i = 0; i < 12; i++)
new /obj/item/checker(src.loc)
- new /obj/item/checker/red(src.loc)
+ new /obj/item/checker/white(src.loc)
/obj/item/board/examine(mob/user, var/distance = -1)
if(in_range(user,src))
@@ -74,39 +74,39 @@ obj/item/board/attackby(obj/item/I as obj, mob/user as mob)
user.unset_machine()
return
- var/dat = ""
- dat += ""
+ var/list/dat = list({"
+
+ "})
var i, stagger
stagger = 0 //so we can have the checkerboard effect
for(i=0, i<64, i++)
if(i%8 == 0)
dat += ""
stagger = !stagger
- dat += ""
+ dat += " | "
+ dat += " | "
- if(!isobserver(user))
- dat += ""
+ dat += " | "
+ dat += " style='background-image:url([I.icon_state].png)'>"
else
- dat += " "
+ dat+= ">"
if(!isobserver(user))
- dat += ""
+ dat += ""
dat += " | "
- dat += "
"
+ dat += "
"
if(selected >= 0 && !isobserver(user))
dat += "
Remove Selected Piece"
- user << browse(dat,"window=boardgame;size=500x500")
+ user << browse(jointext(dat, null),"window=boardgame;size=250x250")
onclose(usr, "boardgame")
/obj/item/board/Topic(href, href_list)
@@ -174,6 +174,16 @@ obj/item/board/attackby(obj/item/I as obj, mob/user as mob)
icon_state = "checker_black"
volumeClass = ITEM_SIZE_TINY
-/obj/item/checker/red
- name = "red checker"
- icon_state = "checker_red"
+/obj/item/checker/queen
+ name = "black checker queen"
+ desc = "Two black checkers stacked to form a queen. This one seems to have been glued together..."
+ icon_state = "checker_black_queen"
+
+/obj/item/checker/white
+ name = "white checker"
+ icon_state = "checker_white"
+
+/obj/item/checker/white/queen
+ name = "white checker queen"
+ desc = "Two white checkers stacked to form a queen. This one seems to have been glued together..."
+ icon_state = "checker_white_queen"
diff --git a/code/modules/genetics/stationary_scanner.dm b/code/modules/genetics/stationary_scanner.dm
index 128b064d92..bd33f704b2 100644
--- a/code/modules/genetics/stationary_scanner.dm
+++ b/code/modules/genetics/stationary_scanner.dm
@@ -41,7 +41,7 @@
/obj/machinery/cryo_slab/verb/move_inside()
set src in view(1)
set category = "Object"
- set name = "Enter [src]"
+ name = "Enter [name]"
if(usr.incapacitated() || !ishuman(usr))
return
diff --git a/code/modules/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm
index 99e09782d0..49890e1772 100644
--- a/code/modules/ghosttrap/trap.dm
+++ b/code/modules/ghosttrap/trap.dm
@@ -126,7 +126,7 @@ GLOBAL_LIST_EMPTY(ghost_trap_users)
// Fluff!
/datum/ghosttrap/proc/welcome_candidate(var/mob/target)
- to_chat(target, "You are a positronic brain, brought into existence on [station_name()].")
+ to_chat(target, "You are a positronic brain, brought into existence on [station_name].")
to_chat(target, "As a synthetic intelligence, you answer to all crewmembers, as well as the AI.")
to_chat(target, "Remember, the purpose of your existence is to serve the crew and the ship. Above all else, do no harm.")
to_chat(target, "Use say [target.get_language_prefix()]b to speak to other artificial intelligences.")
diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm
index 3b73829b41..bb67d5f6a4 100644
--- a/code/modules/hydroponics/seed.dm
+++ b/code/modules/hydroponics/seed.dm
@@ -237,7 +237,7 @@
create_spores(origin_turf)
- var/flood_dist = min(10,max(1,get_trait(TRAIT_POTENCY)/15))
+ var/flood_dist = min(10,max(1,get_trait(TRAIT_POTENCY)/50))
var/list/open_turfs = list()
var/list/closed_turfs = list()
var/list/valid_turfs = list()
diff --git a/code/modules/maps/dmm_suite.dm b/code/modules/maps/dmm_suite.dm
index c263072f99..e14438eaca 100644
--- a/code/modules/maps/dmm_suite.dm
+++ b/code/modules/maps/dmm_suite.dm
@@ -1,6 +1,6 @@
var/global/dmm_suite/maploader = new
-dmm_suite{
+dmm_suite
/*
dmm_suite version 1.0
@@ -53,21 +53,16 @@ dmm_suite{
*/
- verb/load_map(var/dmm_file as file, var/z_offset as num)
+ proc/load_map(var/dmm_file as file, var/z_offset as num)
// dmm_file: A .dmm file to load (Required).
// z_offset: A number representing the z-level on which to start loading the map (Optional).
-
- verb/write_map(var/turf/t1 as turf, var/turf/t2 as turf, var/flags as num){
+ proc/write_map(var/turf/t1 as turf, var/turf/t2 as turf, var/flags as num)
// t1: A turf representing one corner of a three dimensional grid (Required).
// t2: Another turf representing the other corner of the same grid (Required).
// flags: Any, or a combination, of several bit flags (Optional, see documentation).
- }
-
// save_map is included as a legacy proc. Use write_map instead.
- verb/save_map(var/turf/t1 as turf, var/turf/t2 as turf, var/map_name as text, var/flags as num){
+ proc/save_map(var/turf/t1 as turf, var/turf/t2 as turf, var/map_name as text, var/flags as num)
// t1: A turf representing one corner of a three dimensional grid (Required).
// t2: Another turf representing the other corner of the same grid (Required).
// map_name: A valid name for the map to be saved, such as "castle" (Required).
// flags: Any, or a combination, of several bit flags (Optional, see documentation).
- }
- }
\ No newline at end of file
diff --git a/code/modules/maps/writer.dm b/code/modules/maps/writer.dm
deleted file mode 100644
index 2dde1e8c9f..0000000000
--- a/code/modules/maps/writer.dm
+++ /dev/null
@@ -1,174 +0,0 @@
-#define DMM_IGNORE_AREAS 1
-#define DMM_IGNORE_TURFS 2
-#define DMM_IGNORE_OBJS 4
-#define DMM_IGNORE_NPCS 8
-#define DMM_IGNORE_PLAYERS 16
-#define DMM_IGNORE_MOBS 24
-dmm_suite{
- var{
- quote = "\""
- list/letter_digits = 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",
- "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"
- )
- }
- save_map(var/turf/t1 as turf, var/turf/t2 as turf, var/map_name as text, var/flags as num){
- //Check for illegal characters in file name... in a cheap way.
- if(!((ckeyEx(map_name)==map_name) && ckeyEx(map_name))){
- CRASH("Invalid text supplied to proc save_map, invalid characters or empty string.")
- }
- //Check for valid turfs.
- if(!isturf(t1) || !isturf(t2)){
- CRASH("Invalid arguments supplied to proc save_map, arguments were not turfs.")
- }
- var/file_text = write_map(t1,t2,flags)
- if(fexists("[map_name].dmm")){
- fdel("[map_name].dmm")
- }
- var/saved_map = file("[map_name].dmm")
- saved_map << file_text
- return saved_map
- }
- write_map(var/turf/t1 as turf, var/turf/t2 as turf, var/flags as num){
- //Check for valid turfs.
- if(!isturf(t1) || !isturf(t2)){
- CRASH("Invalid arguments supplied to proc write_map, arguments were not turfs.")
- }
- var/turf/nw = locate(min(t1.x,t2.x),max(t1.y,t2.y),min(t1.z,t2.z))
- var/turf/se = locate(max(t1.x,t2.x),min(t1.y,t2.y),max(t1.z,t2.z))
- var/list/templates[0]
- var/template_buffer = {""}
- var/dmm_text = {""}
- for(var/pos_z=nw.z;pos_z<=se.z;pos_z++){
- for(var/pos_y=nw.y;pos_y>=se.y;pos_y--){
- for(var/pos_x=nw.x;pos_x<=se.x;pos_x++){
- var/turf/test_turf = locate(pos_x,pos_y,pos_z)
- var/test_template = make_template(test_turf, flags)
- var/template_number = templates.Find(test_template)
- if(!template_number){
- templates.Add(test_template)
- template_number = templates.len
- }
- template_buffer += "[template_number],"
- }
- template_buffer += ";"
- }
- template_buffer += "."
- }
- var/key_length = round/*floor*/(log(letter_digits.len,templates.len-1)+1)
- var/list/keys[templates.len]
- for(var/key_pos=1;key_pos<=templates.len;key_pos++){
- keys[key_pos] = get_model_key(key_pos,key_length)
- dmm_text += {""[keys[key_pos]]" = ([templates[key_pos]])\n"}
- }
- var/z_level = 0
- for(var/z_pos=1;;z_pos=findtext(template_buffer,".",z_pos)+1){
- if(z_pos>=length(template_buffer)){break}
- if(z_level){dmm_text+={"\n"}}
- dmm_text += {"\n(1,1,[++z_level]) = {"\n"}
- var/z_block = copytext(template_buffer,z_pos,findtext(template_buffer,".",z_pos))
- for(var/y_pos=1;;y_pos=findtext(z_block,";",y_pos)+1){
- if(y_pos>=length(z_block)){break}
- var/y_block = copytext(z_block,y_pos,findtext(z_block,";",y_pos))
- for(var/x_pos=1;;x_pos=findtext(y_block,",",x_pos)+1){
- if(x_pos>=length(y_block)){break}
- var/x_block = copytext(y_block,x_pos,findtext(y_block,",",x_pos))
- var/key_number = text2num(x_block)
- var/temp_key = keys[key_number]
- dmm_text += temp_key
- sleep(-1)
- }
- dmm_text += {"\n"}
- sleep(-1)
- }
- dmm_text += {"\"}"}
- sleep(-1)
- }
- return dmm_text
- }
- proc{
- make_template(var/turf/model as turf, var/flags as num){
- var/template = ""
- var/obj_template = ""
- var/mob_template = ""
- var/turf_template = ""
- if(!(flags & DMM_IGNORE_TURFS)){
- turf_template = "[model.type][check_attributes(model)],"
- } else{ turf_template = "[world.turf],"}
- var/area_template = ""
- if(!(flags & DMM_IGNORE_OBJS)){
- for(var/obj/O in model.contents){
- obj_template += "[O.type][check_attributes(O)],"
- }
- }
- for(var/mob/M in model.contents){
- if(M.client){
- if(!(flags & DMM_IGNORE_PLAYERS)){
- mob_template += "[M.type][check_attributes(M)],"
- }
- }
- else{
- if(!(flags & DMM_IGNORE_NPCS)){
- mob_template += "[M.type][check_attributes(M)],"
- }
- }
- }
- if(!(flags & DMM_IGNORE_AREAS)){
- var/area/m_area = model.loc
- area_template = "[m_area.type][check_attributes(m_area)]"
- } else{ area_template = "[world.area]"}
- template = "[obj_template][mob_template][turf_template][area_template]"
- return template
- }
- check_attributes(var/atom/A){
- var/attributes_text = {"{"}
- for(var/V in A.vars){
- sleep(-1)
- if((!issaved(A.vars[V])) || (A.vars[V]==initial(A.vars[V]))){continue}
- if(istext(A.vars[V])){
- attributes_text += {"[V] = "[A.vars[V]]""}
- }
- else if(isnum(A.vars[V])||ispath(A.vars[V])){
- attributes_text += {"[V] = [A.vars[V]]"}
- }
- else if(isicon(A.vars[V])||isfile(A.vars[V])){
- attributes_text += {"[V] = '[A.vars[V]]'"}
- }
- else{
- continue
- }
- if(attributes_text != {"{"}){
- attributes_text+={"; "}
- }
- }
- if(attributes_text=={"{"}){
- return
- }
- if(copytext(attributes_text, length(attributes_text)-1, 0) == {"; "}){
- attributes_text = copytext(attributes_text, 1, length(attributes_text)-1)
- }
- attributes_text += {"}"}
- return attributes_text
- }
- get_model_key(var/which as num, var/key_length as num){
- var/key = ""
- var/working_digit = which-1
- for(var/digit_pos=key_length;digit_pos>=1;digit_pos--){
- var/place_value = round/*floor*/(working_digit/(letter_digits.len**(digit_pos-1)))
- working_digit-=place_value*(letter_digits.len**(digit_pos-1))
- key = "[key][letter_digits[place_value+1]]"
- }
- return key
- }
- }
- }
\ No newline at end of file
diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm
index 37fbff65ba..62766998b1 100644
--- a/code/modules/materials/material_sheets.dm
+++ b/code/modules/materials/material_sheets.dm
@@ -298,7 +298,7 @@
rand_min = 3
rand_max = 30
spawn_tags = SPAWN_TAG_MATERIAL_RESOURCES_BULDING
- rarity_value = 18
+ rarity_value = 10
/obj/item/stack/material/plasteel
name = "plasteel"
@@ -312,7 +312,7 @@
rand_min = 3
rand_max = 20
spawn_tags = SPAWN_TAG_MATERIAL_BUILDING
- rarity_value = 10
+ rarity_value = 18
/obj/item/stack/material/plasteel/full
amount = 120
@@ -372,8 +372,8 @@
/obj/item/stack/material/glass/random
rand_min = 3
rand_max = 30
- spawn_tags = SPAWN_TAG_MATERIAL_RESOURCES_BULDING
- rarity_value = 22.5
+ spawn_tags = SPAWN_TAG_MATERIAL_BUILDING
+ rarity_value = 12.5
/obj/item/stack/material/glass/full
amount = 120
diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm
index 3fd4ee67b1..e7f1885650 100644
--- a/code/modules/materials/materials.dm
+++ b/code/modules/materials/materials.dm
@@ -108,6 +108,7 @@ var/list/name_to_material
var/radioactivity // Radiation var. Used in wall and object processing to irradiate surroundings.
var/ignition_point // K, point at which the material catches on fire.
var/melting_point = 1800 // K, walls will take damage if they're next to a fire hotter than this
+ var/heat_resistance = 1 // divisor, walls resist thermite and welding based on this
var/integrity = 150 // General-use HP value for products.
var/opacity = 1 // Is the material transparent? 0.5< makes transparent walls/doors.
var/conductive = 1 // Objects with this var add CONDUCTS to flags on spawn.
diff --git a/code/modules/mechs/components/armour.dm b/code/modules/mechs/components/armour.dm
index 5f0f2e56d6..64cddb1efd 100644
--- a/code/modules/mechs/components/armour.dm
+++ b/code/modules/mechs/components/armour.dm
@@ -7,7 +7,7 @@
/obj/item/robot_parts/robot_component/armour/exosuit
name = "exosuit armor plating"
- armor = list(ARMOR_BLUNT = 20, ARMOR_BULLET = 8, ARMOR_ENERGY = 2, ARMOR_BOMB =100, ARMOR_BIO =100, ARMOR_RAD =0)
+ armor = list(ARMOR_BLUNT = 20, ARMOR_BULLET = 8, ARMOR_ENERGY = 2, ARMOR_BOMB =100, ARMOR_BIO =100, ARMOR_RAD = 0)
origin_tech = list(TECH_MATERIAL = 1)
matter = list(MATERIAL_STEEL = 7)
spawn_tags = SPAWN_TAG_MECH_QUIPMENT
@@ -23,7 +23,7 @@
/obj/item/robot_parts/robot_component/armour/exosuit/plain
name = "standard exosuit plating"
desc = "A sturdy hunk of steel and plasteel plating, offers decent protection from physical harm and environmental hazards whilst being cheap to produce."
- armor = list(melee = 24, bullet = 10, energy = 9, bomb = 125, bio = 100, rad = 100)
+ armor = list(ARMOR_BLUNT = 24, ARMOR_BULLET = 10, ARMOR_ENERGY = 9, ARMOR_BOMB = 125 , ARMOR_BIO = 100, ARMOR_RAD = 100)
origin_tech = list(TECH_MATERIAL = 3)
matter = list(MATERIAL_STEEL = 15, MATERIAL_PLASTEEL = 10) //Plasteel for the shielding
spawn_blacklisted = FALSE
@@ -32,7 +32,7 @@
/obj/item/robot_parts/robot_component/armour/exosuit/ablative
name = "ablative exosuit armor plating"
desc = "This plating is built to shrug off laser impacts and block electromagnetic pulses, but is rather vulnerable to brute trauma."
- armor = list(melee = 16, bullet = 6, energy = 38, bomb = 50, bio = 100, rad = 50)
+ armor = list(ARMOR_BLUNT = 16, ARMOR_BULLET = 10, ARMOR_ENERGY = 38, ARMOR_BOMB = 125 , ARMOR_BIO = 100, ARMOR_RAD = 100)
origin_tech = list(TECH_MATERIAL = 3)
matter = list(MATERIAL_STEEL = 15, MATERIAL_PLASMA = 5)
spawn_blacklisted = FALSE
@@ -41,7 +41,7 @@
/obj/item/robot_parts/robot_component/armour/exosuit/combat
name = "heavy combat exosuit plating"
desc = "Plating designed to deflect incoming attacks and explosions."
- armor = list(melee = 32, bullet = 24, energy = 16, bomb = 300, bio = 100, rad = 50) // 32 melee. That's 10 damage from a STOCK circular saw.
+ armor = list(ARMOR_BLUNT = 32, ARMOR_BULLET = 20, ARMOR_ENERGY = 20, ARMOR_BOMB = 125 , ARMOR_BIO = 100, ARMOR_RAD = 100)
origin_tech = list(TECH_MATERIAL = 5)
matter = list(MATERIAL_STEEL = 20, MATERIAL_DIAMOND = 5, MATERIAL_URANIUM = 5)
spawn_blacklisted = FALSE
diff --git a/code/modules/mechs/mech_movement.dm b/code/modules/mechs/mech_movement.dm
index 51b9019d93..6f09e6b6c3 100644
--- a/code/modules/mechs/mech_movement.dm
+++ b/code/modules/mechs/mech_movement.dm
@@ -174,7 +174,6 @@
return MOVEMENT_HANDLED
else
mob.inertia_dir = 0 //If not then we can reset inertia and move
- else
/datum/movement_handler/mob/space/exosuit/MayMove(var/mob/mover, var/is_external)
if((mover != host) && is_external)
diff --git a/code/modules/cargo/supplyshuttle.dm b/code/modules/mining/plasticflaps.dm
similarity index 87%
rename from code/modules/cargo/supplyshuttle.dm
rename to code/modules/mining/plasticflaps.dm
index 4103265b6b..7dda367f8f 100644
--- a/code/modules/cargo/supplyshuttle.dm
+++ b/code/modules/mining/plasticflaps.dm
@@ -1,16 +1,3 @@
-
-/area/supply/station
- name = "supply shuttle"
- icon_state = "shuttle3"
- requires_power = 0
-
-/area/supply/dock
- name = "supply shuttle"
- icon_state = "shuttle3"
- requires_power = 0
-
-//SUPPLY PACKS MOVED TO /code/modules/cargo/packs.dm
-
/obj/structure/plasticflaps //HOW DO YOU CALL THOSE THINGS ANYWAY
name = "\improper plastic flaps"
desc = "Completely impassable - or are they?"
@@ -19,7 +6,6 @@
density = FALSE
anchored = TRUE
layer = 4
-
/*
/obj/structure/plasticflaps/CanAStarPass(obj/item/card/id/ID, to_dir, caller)
if(istype(caller, /obj/machinery/bot/mulebot))
diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm
index 5f8362e550..5cd8a9d146 100644
--- a/code/modules/mob/living/carbon/brain/brain_item.dm
+++ b/code/modules/mob/living/carbon/brain/brain_item.dm
@@ -37,7 +37,7 @@
brainmob = null
. = ..()
-/obj/item/organ/internal/vital/brain/take_damage(amount, damage_type = BRUTE, wounding_multiplier = 1, silent = FALSE, sharp = FALSE, edge = FALSE)
+/obj/item/organ/internal/vital/brain/take_damage(amount, damage_type = BRUTE, wounding_multiplier = 1, sharp = FALSE, edge = FALSE, silent = FALSE)
if(!damage_type || status & ORGAN_DEAD)
return
@@ -48,6 +48,52 @@
health = 0
..(wound_damage, damage_type, wounding_multiplier, sharp, edge, silent)
+/obj/item/organ/internal/vital/brain/get_possible_wounds(damage_type, sharp, edge)
+ var/list/possible_wounds = list()
+
+ // Determine possible wounds based on nature and damage type
+ var/is_robotic = BP_IS_ROBOTIC(src)
+ var/is_organic = BP_IS_ORGANIC(src) || BP_IS_ASSISTED(src)
+
+ switch(damage_type)
+ if(BRUTE)
+ if(!edge)
+ if(sharp) // dont even fucking ask whats the difference between this and eyes get_possible_wounds. I dont know, I wont tell you.
+ if(is_organic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/organic/brain_sharp))
+ if(is_robotic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/robotic/brain_sharp))
+ else
+ if(is_organic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/organic/brain_blunt))
+ if(is_robotic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/robotic/brain_blunt))
+ else
+ if(is_organic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/organic/brain_edge))
+ if(is_robotic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/robotic/brain_edge))
+ if(BURN)
+ if(is_organic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/organic/brain_burn))
+ if(is_robotic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/robotic/brain_emp_burn))
+ if(TOX)
+ if(is_organic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/organic/poisoning))
+ //if(is_robotic)
+ // LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/robotic/poisoning))
+ if(CLONE)
+ if(is_organic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/organic/radiation))
+ if(PSY)
+ if(is_organic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/organic/sanity))
+ if(is_robotic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/robotic/sanity))
+
+ return possible_wounds
+
/// Brain blood oxygenation is handled via oxyloss
/obj/item/organ/internal/vital/brain/handle_blood()
if(BP_IS_ROBOTIC(src) || !owner)
@@ -92,7 +138,7 @@
if(!(owner.status_flags & REBUILDING_ORGANS))
var/mob/living/simple_animal/borer/borer = owner.get_brain_worms()
if(borer)
- borer.detatch() //Should remove borer if the brain is removed - RR
+ borer.detach() //Should remove borer if the brain is removed - RR
var/obj/item/organ/internal/carrion/core/C = owner.random_organ_by_process(BP_SPCORE)
if(C)
diff --git a/code/modules/mob/living/carbon/carbon_powers.dm b/code/modules/mob/living/carbon/carbon_powers.dm
index 98f82fc347..b23ac93576 100644
--- a/code/modules/mob/living/carbon/carbon_powers.dm
+++ b/code/modules/mob/living/carbon/carbon_powers.dm
@@ -1,3 +1,5 @@
+
+//FILE: Borer gets powers from this one once he Assumes Control
//Brain slug proc for voluntary removal of control.
/mob/living/carbon/proc/release_control()
@@ -10,7 +12,7 @@
if(B && B.host_brain)
to_chat(src, "\red You withdraw your probosci, releasing control of [B.host_brain]")
- B.detatch()
+ B.detach()
verbs |= /mob/living/carbon/human/proc/commune
verbs |= /mob/living/carbon/human/proc/psychic_whisper
@@ -49,21 +51,25 @@
set desc = "Spawn several young."
var/mob/living/simple_animal/borer/B = get_brain_worms()
-
+ var/reproduce_cost = (round(B.max_chemicals_inhost * 0.75))
if(!B)
return
- if(B.chemicals >= 100)
+ if(B.chemicals >= reproduce_cost)
to_chat(src, "\red Your host twitches and quivers as you rapidly excrete a larva from your sluglike body.")
visible_message("\red [src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!")
- B.chemicals -= 100
+ B.chemicals -= reproduce_cost
B.has_reproduced = 1
- B.borer_add_exp(10)
+ if(istype(B.host, /mob/living/carbon/human/) && !B.host.isMonkey())// this is a mess but host's var grabs "[human_name] (mob/living/carbon/human/)"
+ B.borer_add_exp(25)
+ else
+ to_chat(src, SPAN_WARNING("You do not have anything to learn from this host. Find a human!"))
+
new /obj/effect/decal/cleanable/vomit(get_turf(src))
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
new /mob/living/simple_animal/borer(get_turf(src))
else
- to_chat(src, "You do not have enough chemicals stored to reproduce.")
+ to_chat(src, "You do not have enough chemicals stored to reproduce. (You need [reproduce_cost]).")
return
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index f84f887f39..91af89c102 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -400,7 +400,6 @@
if (M)
message = "points to [M]."
- else
m_type = 1
if ("raise")
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index f76b65f059..6227fe86dc 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1408,21 +1408,32 @@ var/list/rank_prefix = list(\
reset_view(A)
/mob/living/carbon/human/proc/resuscitate()
+
var/obj/item/organ/internal/vital/heart_organ = random_organ_by_process(OP_HEART)
var/obj/item/organ/internal/vital/brain_organ = random_organ_by_process(BP_BRAIN)
- if(!is_asystole() && !(heart_organ && brain_organ) || (heart_organ.is_broken() || brain_organ.is_broken()))
+ if((!heart_organ || heart_organ.is_broken()) && (!brain_organ || brain_organ.is_broken()))
+ resuscitate_notify(1)
+ return 0
+
+ if(!heart_organ || heart_organ.is_broken())
+ resuscitate_notify(2)
+ return 0
+
+ if(!brain_organ || brain_organ.is_broken())
+ resuscitate_notify(3)
return 0
if(world.time >= (timeofdeath + NECROZTIME))
+ resuscitate_notify(4)
return 0
var/oxyLoss = getOxyLoss()
if(oxyLoss > 20)
setOxyLoss(20)
- if(health <= (HEALTH_THRESHOLD_DEAD - oxyLoss))
- visible_message(SPAN_WARNING("\The [src] twitches a bit, but their body is too damaged to sustain life!"))
+ if(getBruteLoss() + getFireLoss() >= abs(HEALTH_THRESHOLD_DEAD))
+ resuscitate_notify(5)
timeofdeath = 0
return 0
@@ -1444,6 +1455,34 @@ var/list/rank_prefix = list(\
break
return 1
+/mob/living/carbon/human/proc/resuscitate_notify(type)
+ visible_message(SPAN_WARNING("\The [src] twitches and twists intensely!"))
+ for(var/mob/O in viewers(world.view, src.loc))
+ if(O == src)
+ continue
+ if(!Adjacent(O))
+ continue
+ var/bio_stat = STAT_LEVEL_NONE
+ if(O.stats)
+ bio_stat = O.stats.getStat(STAT_BIO)
+ if(isghost(O))
+ bio_stat = STAT_LEVEL_GODLIKE
+
+ if(bio_stat >= STAT_LEVEL_BASIC && prob(clamp((bio_stat / STAT_LEVEL_EXPERT) * 100, 0, 100)))
+ switch(type)
+ if(1) //brain and heart fail
+ to_chat(O, "You can identify that [src]'s circulatory and central neural systems are failing, preventing them from resurrection.")
+ if(2) //heart fail
+ to_chat(O, "You can identify that [src]'s circulatory system is unable to restart in this state.")
+ if(3) //brain fail
+ to_chat(O, "You can identify that [src]'s central neural system is too damaged to be resurrected.")
+ if(4) //corpse is too old
+ to_chat(O, "You see that rotting process in [src]'s body already gone too far. This is nothing but a corpse now.")
+ if(5) //too much damage
+ to_chat(O, "[src]'s body is too damaged to sustain life.")
+ else
+ to_chat(O, "You're too unskilled to understand what's happening...")
+
/mob/living/carbon/human/proc/generate_dna()
if(!b_type)
b_type = pick(GLOB.blood_types)
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index c1887b6f86..6e132993ef 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -320,7 +320,7 @@ This function restores all organs.
zone = BP_HEAD
return organs_by_name[zone]
-/mob/living/carbon/human/apply_damage(damage = 0, damagetype = BRUTE, def_zone, armor_divisor = 1, wounding_multiplier = 1, sharp = FALSE, edge = FALSE, obj/used_weapon, armor_divisor)
+/mob/living/carbon/human/apply_damage(damage = 0, damagetype = BRUTE, def_zone, armor_divisor = 1, wounding_multiplier = 1, sharp = FALSE, edge = FALSE, obj/used_weapon)
//visible_message("Hit debug. [damage] | [damagetype] | [def_zone] | [blocked] | [sharp] | [used_weapon]")
//Handle other types of damage
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index cf05e64b34..d49f92af2e 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -34,6 +34,10 @@ meteor_act
var/obj/item/material/shard/shrapnel/SP = new()
SP.name = (P.name != "shrapnel")? "[P.name] shrapnel" : "shrapnel"
SP.desc = "[SP.desc] It looks like it was fired from [P.shot_from]."
+ SP.loc = organ
+ if(length(P.matter))
+ SP.material = P.matter[1]
+ SP.amount = P.matter[SP.material] // amount no longer randomized
SP.forceMove(organ)
organ.embed(SP)
else if(check_absorb <= (P.getAllDamType(BRUTE)/3))
diff --git a/code/modules/mob/living/carbon/superior_animal/giant_spider/types/nurse.dm b/code/modules/mob/living/carbon/superior_animal/giant_spider/types/nurse.dm
index 0d3fea1334..1eb4608562 100644
--- a/code/modules/mob/living/carbon/superior_animal/giant_spider/types/nurse.dm
+++ b/code/modules/mob/living/carbon/superior_animal/giant_spider/types/nurse.dm
@@ -169,7 +169,6 @@
for(var/obj/O in targetTurf)
if (O.anchored)
continue
- if (istype(O, /obj/item))
else if (istype(O, /obj/structure) || istype(O, /obj/machinery))
large_cocoon = 1
else
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index a3ee660c1c..8caa11f856 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -51,8 +51,6 @@ armorType defines the armorType that will block all the damTypes that it has ass
var/list/atom/damageBlockers = list()
/// Retrieve all relevanta damage blockers , its why we give them the dmgtypes list
damageBlockers = getDamageBlockers(armorToDam, armorDiv, woundMult, defZone)
-
- for(var/atom in damageBlockers)
/// We are going to order the list to be traversed from right to left , right representing the outermost layers and left the innermost
/// List for insertion-sort. Upper objects are going to be last , lower ones are going to be first when blocking
var/list/blockersTemp = list(
@@ -63,11 +61,11 @@ armorType defines the armorType that will block all the damTypes that it has ass
/obj/item/organ/external,
/obj/item/clothing,
/obj/item/armor_component,
- /obj/item/robot_parts/robot_component/armour,
+ /obj/item/robot_parts/robot_component/armour
)
var/list/atom/newBlockers = list()
- for(var/i = length(blockersTemp); i > 1; i--)
+ for(var/i=length(blockersTemp), i > 1, i--)
var/path = blockersTemp[i]
for(var/atom/blocker in damageBlockers)
if(istype(blocker, path))
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 9ed8e8fb6c..d59f0dfa1c 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -76,7 +76,6 @@
/mob/living/silicon/pai/New(var/obj/item/device/paicard)
src.forceMove(paicard)
card = paicard
- sradio = new(src)
if(card)
if(!card.radio)
card.radio = new /obj/item/device/radio(src.card)
diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm
index 0b52274ac2..7855c6da1a 100644
--- a/code/modules/mob/living/silicon/pai/software_modules.dm
+++ b/code/modules/mob/living/silicon/pai/software_modules.dm
@@ -394,45 +394,3 @@
is_active(mob/living/silicon/pai/user)
return user.translator_on
-/datum/pai_software/signaller
- name = "Remote Signaller"
- ram_cost = 5
- id = "signaller"
- toggle = 0
-
- on_ui_interact(mob/living/silicon/pai/user, datum/nanoui/ui=null, force_open=1)
- var/data[0]
-
- data["frequency"] = format_frequency(user.sradio.frequency)
- data["code"] = user.sradio.code
-
- ui = SSnano.try_update_ui(user, user, id, ui, data, force_open)
- if(!ui)
- // Don't copy-paste this unless you're making a pAI software module!
- ui = new(user, user, id, "pai_signaller.tmpl", "Signaller", 320, 150)
- ui.set_initial_data(data)
- ui.open()
-
- Topic(href, href_list)
- var/mob/living/silicon/pai/P = usr
- if(!istype(P)) return
-
- if(href_list["send"])
- P.sradio.send_signal("ACTIVATE")
- for(var/mob/O in hearers(1, P.loc))
- O.show_message("\icon[P] *beep* *beep*", 3, "*beep* *beep*", 2)
- return 1
-
- else if(href_list["freq"])
- var/new_frequency = (P.sradio.frequency + text2num(href_list["freq"]))
- if(new_frequency < PUBLIC_LOW_FREQ || new_frequency > PUBLIC_HIGH_FREQ)
- new_frequency = sanitize_frequency(new_frequency)
- P.sradio.set_frequency(new_frequency)
- return 1
-
- else if(href_list["code"])
- P.sradio.code += text2num(href_list["code"])
- P.sradio.code = round(P.sradio.code)
- P.sradio.code = min(100, P.sradio.code)
- P.sradio.code = max(1, P.sradio.code)
- return 1
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
index 074c438d56..764d7fc276 100755
--- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
@@ -122,6 +122,7 @@
if(wood)
wood.add_charge(4000)
else if(istype(W,/obj/item/pipe))
+ EMPTY_BLOCK_GUARD
// This allows drones and engiborgs to clear pipe assemblies from floors.
else
continue
diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm
index f8a4fe2acf..765887067c 100644
--- a/code/modules/mob/living/simple_animal/borer/borer.dm
+++ b/code/modules/mob/living/simple_animal/borer/borer.dm
@@ -29,6 +29,9 @@
pass_flags = PASSTABLE
universal_understand = 1
faction = "borers"
+ can_pull_size = ITEM_SIZE_TINY
+ can_pull_mobs = MOB_PULL_NONE
+ density = FALSE
var/borer_level = 0
var/borer_exp = 0
@@ -43,6 +46,7 @@
var/docile = FALSE // Sugar can stop borers from acting.
var/has_reproduced
var/roundstart
+ var/invisibility_cost = 5
// Abilities borer can use when outside the host
var/list/abilities_standalone = list(
@@ -87,7 +91,7 @@
var/obj/item/organ/external/head = H.get_organ(BP_HEAD)
head.implants.Remove(src) // This should be safe.
if(controlling)
- detatch()
+ detach()
return ..()
/mob/living/simple_animal/borer/Login()
@@ -150,9 +154,11 @@
chemicals++
/mob/living/simple_animal/borer/proc/process_invisibility()
- if(invisibility == TRUE)
- chemicals -= 1
- if(chemicals <= 2)
+ if(invisibility)
+ chemicals -= invisibility_cost
+ if(chemicals <= max_chemicals/2 && (max_chemicals/2) - invisibility_cost <= chemicals)
+ to_chat(src, to_chat(src, "\red Your invisibility will run out soon!"))
+ if(chemicals <= invisibility_cost + 1)
invisible() // Disable invisibility
chemicals = 0
@@ -160,7 +166,7 @@
to_chat(host, SPAN_DANGER("You feel your control over your host suddenly stop."))
update_abilities()
spawn(1)
- detatch()
+ detach()
/mob/living/simple_animal/borer/proc/process_host()
if(host && !stat)
@@ -217,7 +223,7 @@
stat("Host health", host.stat == DEAD ? "Deceased" : host.health)
stat("Host brain damage", host.getBrainLoss())
-/mob/living/simple_animal/borer/proc/detatch()
+/mob/living/simple_animal/borer/proc/detach()
if(!host || !controlling) return
@@ -357,7 +363,7 @@
alpha = 255
invisibility = 0
if(controlling || host)
- detatch()
+ detach()
leave_host()
/mob/living/simple_animal/borer/update_sight()
diff --git a/code/modules/mob/living/simple_animal/borer/borer_captive.dm b/code/modules/mob/living/simple_animal/borer/borer_captive.dm
index d3936b3b4f..c2a7b02487 100644
--- a/code/modules/mob/living/simple_animal/borer/borer_captive.dm
+++ b/code/modules/mob/living/simple_animal/borer/borer_captive.dm
@@ -59,16 +59,16 @@
var/mob/living/simple_animal/borer/B = src.loc
var/mob/living/captive_brain/H = src
- to_chat(H, SPAN_DANGER("You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)."))
+ to_chat(H, SPAN_DANGER("You begin doggedly resisting the parasite's control (this will take approximately thirty seconds)."))
to_chat(B.host, SPAN_DANGER("You feel the captive mind of [src] begin to resist your control."))
- spawn(rand(200,250)+B.host.brainloss)
+ spawn(rand(25 SECONDS, 30 SECONDS)+B.host.brainloss)
if(!B || !B.controlling) return
B.host.adjustBrainLoss(rand(0.1,0.5))
to_chat(H, SPAN_DANGER("With an immense exertion of will, you regain control of your body!"))
to_chat(B.host, SPAN_DANGER("You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you."))
- B.detatch()
+ B.detach()
verbs |= /mob/living/carbon/human/proc/commune
verbs |= /mob/living/carbon/human/proc/psychic_whisper
verbs |= /mob/living/carbon/proc/spawn_larvae
diff --git a/code/modules/mob/living/simple_animal/borer/borer_powers.dm b/code/modules/mob/living/simple_animal/borer/borer_powers.dm
index 59a6af5ff3..6b79b78e9d 100644
--- a/code/modules/mob/living/simple_animal/borer/borer_powers.dm
+++ b/code/modules/mob/living/simple_animal/borer/borer_powers.dm
@@ -30,7 +30,7 @@
to_chat(host, SPAN_DANGER("As though waking from a dream, you shake off the insidious mind control of the brain worm. Your thoughts are your own again."))
to_chat(host, SPAN_DANGER("Something slimy wiggles out of your ear and plops to the ground!"))
- detatch()
+ detach()
leave_host()
/mob/living/simple_animal/borer/proc/infest()
@@ -56,10 +56,13 @@
var/mob/living/carbon/M = input(src,"Who do you wish to infest?") in null|choices
- // non-humanoids disabled due to not working.
+ //non-humanoids disabled due to not working.
if(!M || !Adjacent(M) || !iscarbon(M))
return
+ if((ishuman(M) && !M.isMonkey()) && (!M.mind || !M.client))
+ to_chat(src, SPAN_WARNING("Host's body is in a state of hibernation, you are afraid to be crushed when they roll over in their sleep!"))
+ return
if(M.has_brain_worms())
to_chat(src, SPAN_WARNING("You cannot infest someone who is already infested!"))
return
@@ -234,8 +237,8 @@
if(stat)
return
- if(world.time - used_dominate < 150)
- to_chat(src, SPAN_WARNING("You cannot use that ability again so soon."))
+ if(world.time - used_dominate < 1 MINUTE) // a one minutes cooldown.
+ to_chat(src, "\red You cannot use that ability again so soon. It will be ready in [(1 MINUTE - (world.time - used_dominate))/ (1 SECOND)] seconds.")
return
if(is_ventcrawling)
@@ -259,8 +262,8 @@
var/mob/living/carbon/M = input(src,"Who do you wish to dominate?") in null|choices
- if(world.time - used_dominate < 150)
- to_chat(src, SPAN_WARNING("You cannot use that ability again so soon."))
+ if(world.time - used_dominate < 1 MINUTE)
+ to_chat(src, "\red You cannot use that ability again so soon. It will be ready in [(1 MINUTE - (world.time - used_dominate))/ (1 SECOND)] seconds.")
return
if(!M || !Adjacent(M)) return
@@ -275,6 +278,9 @@
to_chat(src, "You cannot paralyze someone who is already infested!")
return
+ if(invisibility)
+ invisible() //removes invisibility on using paralyze
+ to_chat(src, SPAN_NOTICE("You become visible again."))
to_chat(src, SPAN_WARNING("You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread."))
to_chat(M, SPAN_DANGER("You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing."))
var/duration = 10 + (borer_level*2)
@@ -304,9 +310,9 @@
to_chat(src, SPAN_WARNING("You can't control a dead host."))
return
- to_chat(src, SPAN_NOTICE("You begin delicately adjusting your connection to the host brain..."))
+ to_chat(src, SPAN_NOTICE("You begin delicately adjusting your connection to the host brain. This will take some time..."))
- spawn(100+(host.brainloss*5))
+ spawn(30 SECONDS + (host.brainloss * 5))
if(!host || !src || controlling)
return
@@ -534,8 +540,8 @@
if(stat)
return
- if(world.time - used_dominate < 150)
- to_chat(src, "\red You cannot use that ability again so soon.")
+ if(world.time - used_dominate < 1 MINUTE)
+ to_chat(src, "\red You cannot use that ability again so soon. It will be ready in [(1 MINUTE - (world.time - used_dominate))/ (1 SECOND)] seconds.")
return
if(host)
@@ -581,23 +587,30 @@
if(stat)
return
+ if(docile)
+ to_chat(src, SPAN_DANGER("You are feeling far too docile to do that."))
+ return
+
if(!host)
to_chat(src, "\red You cannot do this without a host.")
return
-
- if(chemicals >= 100)
+ var/reproduce_cost = (round(max_chemicals_inhost * 0.75)) // literally max chems but 75% of it
+ if(chemicals >= reproduce_cost)
to_chat(host, "\red Your host twitches and quivers as you rapidly excrete a larva from your sluglike body.")
visible_message("\red [host.name] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!")
- chemicals -= 100
has_reproduced = TRUE
- borer_add_exp(10)
+ chemicals -= reproduce_cost
+ if(istype(host, /mob/living/carbon/human/) && !host.isMonkey())
+ borer_add_exp(25)
+ else
+ to_chat(src, SPAN_WARNING("You do not have anything to learn from this host. Find a human!"))
new /obj/effect/decal/cleanable/vomit(get_turf(host))
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
new /mob/living/simple_animal/borer(get_turf(host))
else
- to_chat(src, SPAN_NOTICE("You do not have enough chemicals stored to reproduce."))
+ to_chat(src, SPAN_NOTICE("You do not have enough chemicals stored to reproduce. (You need [reproduce_cost])."))
return
/mob/living/simple_animal/borer/proc/commune()
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index ab65d71785..d77b10dfb4 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -181,6 +181,7 @@
qdel(src)
var/const/MAX_CHICKENS = 50
+#define MEDIUM_CHICKENS 10
var/global/chicken_count = 0
/mob/living/simple_animal/chicken
@@ -247,8 +248,8 @@ var/global/chicken_count = 0
var/obj/item/reagent_containers/food/snacks/egg/E = new(get_turf(src))
E.pixel_x = rand(-6,6)
E.pixel_y = rand(-6,6)
- if(chicken_count < MAX_CHICKENS && prob(10))
- START_PROCESSING(SSobj, E)
+ if(chicken_count < MEDIUM_CHICKENS || prob(clamp((100/MAX_CHICKENS)*(MAX_CHICKENS-chicken_count), 0, 100)))
+ START_PROCESSING(SSobj, E) // chicken threshold, then chicken ratio, then number of chickens to create
/obj/item/reagent_containers/food/snacks/egg/var/amount_grown = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index 9646b25e9f..30491058f2 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -79,6 +79,8 @@
var/action = pick( list( "growls at [target_mob].", "stares angrily at [target_mob].", "prepares to attack [target_mob]!", "closely watches [target_mob]." ) )
if(action)
visible_emote(action)
+ if(prob(33))
+ playsound(src, 'sound/voice/bear_growl.ogg', 100, 1)
if(!found_mob)
stance_step--
@@ -90,6 +92,8 @@
if(HOSTILE_STANCE_ATTACKING)
if(stance_step >= 20) //attacks for 20 ticks, then it gets tired and needs to rest
visible_emote("is worn out and needs to rest.")
+ if(prob(33))
+ playsound(src, 'sound/voice/bear_aww.ogg', 100, 1)
stance = HOSTILE_STANCE_TIRED
stance_step = 0
walk(src, 0) //This stops the bear's walking
@@ -126,6 +130,11 @@
if(!Adjacent(target_mob))
return
visible_emote(list("slashes at [target_mob]!", "bites [target_mob]!"))
+ if(prob(66))
+ if(prob(50))
+ playsound(src, 'sound/voice/bear_roar.ogg', 100, 1)
+ else
+ playsound(src, 'sound/voice/bear_growl.ogg', 100, 1)
var/damage = rand(20,30)
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 1d645d7bfd..b82ca64699 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -88,7 +88,6 @@
new_slime = new /mob/living/carbon/slime(loc)
if(adult)
new_slime.is_adult = 1
- else
new_slime.key = key
to_chat(new_slime, "You are now a slime. Skreee!")
diff --git a/code/modules/modular_computers/NTNet/NTNet.dm b/code/modules/modular_computers/NTNet/NTNet.dm
index 756d2d3f1a..9846593a23 100644
--- a/code/modules/modular_computers/NTNet/NTNet.dm
+++ b/code/modules/modular_computers/NTNet/NTNet.dm
@@ -195,7 +195,7 @@ var/global/datum/ntnet/ntnet_global = new()
add_log("Configuration Updated. Wireless network firewall now [setting_communication ? "allows" : "disallows"] instant messaging and similar communication services.")
if(NTNET_SYSTEMCONTROL)
setting_systemcontrol = !setting_systemcontrol
- add_log("Configuration Updated. Wireless network firewall now [setting_systemcontrol ? "allows" : "disallows"] remote control of [station_name()]'s systems.")
+ add_log("Configuration Updated. Wireless network firewall now [setting_systemcontrol ? "allows" : "disallows"] remote control of [station_name]'s systems.")
/datum/ntnet/proc/find_email_by_login(var/login)
for(var/datum/computer_file/data/email_account/A in ntnet_global.email_accounts)
diff --git a/code/modules/modular_computers/computers/subtypes/preset_pda.dm b/code/modules/modular_computers/computers/subtypes/preset_pda.dm
index 26f8ebe1cc..d238c6bce6 100644
--- a/code/modules/modular_computers/computers/subtypes/preset_pda.dm
+++ b/code/modules/modular_computers/computers/subtypes/preset_pda.dm
@@ -132,6 +132,17 @@
/obj/item/modular_computer/pda/club_worker
icon_state = "pda-club"
+/obj/item/modular_computer/pda/artist
+ icon_state = "pda-clown"
+
+/obj/item/modular_computer/pda/artist/Crossed(AM as mob|obj) //Clown PDA is slippery.
+ if (isliving(AM))
+ var/mob/living/M = AM
+ if((locate(/obj/structure/multiz/stairs) in get_turf(loc)) || (locate(/obj/structure/multiz/ladder) in get_turf(loc)))
+ visible_message(SPAN_DANGER("\The [M] carefully avoids stepping down on \the [src]."))
+ return
+ M.slip("the PDA",8)
+
/obj/item/modular_computer/pda/club_worker/install_default_programs()
..()
hard_drive.store_file(new /datum/computer_file/program/drink_catalog())
diff --git a/code/modules/modular_computers/file_system/programs/command/card.dm b/code/modules/modular_computers/file_system/programs/command/card.dm
index 0a50b530af..52be8cd91a 100644
--- a/code/modules/modular_computers/file_system/programs/command/card.dm
+++ b/code/modules/modular_computers/file_system/programs/command/card.dm
@@ -28,7 +28,7 @@
var/list/data = host.initial_data()
data["src"] = "\ref[src]"
- data["station_name"] = station_name()
+ data["station_name"] = station_name
data["manifest"] = html_crew_manifest()
data["assignments"] = show_assignments
if(program && program.computer)
diff --git a/code/modules/modular_computers/file_system/programs/command/comm.dm b/code/modules/modular_computers/file_system/programs/command/comm.dm
index 9be2856ebc..35cfb4db24 100644
--- a/code/modules/modular_computers/file_system/programs/command/comm.dm
+++ b/code/modules/modular_computers/file_system/programs/command/comm.dm
@@ -136,7 +136,7 @@
if(announcment_cooldown)
to_chat(usr, "Please allow at least one minute to pass between announcements")
return TRUE
- var/input = input(usr, "Please write a message to announce to the [station_name()].", "Priority Announcement") as null|text
+ var/input = input(usr, "Please write a message to announce to the [station_name].", "Priority Announcement") as null|text
if(!input || !can_still_topic())
return 1
if(GLOB.in_character_filter.len) //I don't want to read announcements about sending people to brazil.
diff --git a/code/modules/modular_computers/hardware/printer.dm b/code/modules/modular_computers/hardware/printer.dm
index 50f1e6d4a3..46a7fcfce0 100644
--- a/code/modules/modular_computers/hardware/printer.dm
+++ b/code/modules/modular_computers/hardware/printer.dm
@@ -61,4 +61,3 @@
else //if at least two items remain, just update the bundle icon
B.update_icon()
to_chat(user, "You add [num_of_pages_added] papers from \the [W] into \the [src].")
- return
diff --git a/code/modules/multiz/structures.dm b/code/modules/multiz/structures.dm
index 98b6197fdf..5d536e1932 100644
--- a/code/modules/multiz/structures.dm
+++ b/code/modules/multiz/structures.dm
@@ -9,6 +9,8 @@
anchored = TRUE
icon = 'icons/obj/stairs.dmi'
bad_type = /obj/structure/multiz
+ health = 5000
+ maxHealth = 5000
var/istop = TRUE
var/obj/structure/multiz/target
var/obj/structure/multiz/targeted_by
diff --git a/code/modules/organs/external/dismemberment.dm b/code/modules/organs/external/dismemberment.dm
index 00bf83228a..18a564545d 100644
--- a/code/modules/organs/external/dismemberment.dm
+++ b/code/modules/organs/external/dismemberment.dm
@@ -54,8 +54,7 @@
dir = 2
switch(disintegrate)
- if(DROPLIMB_EDGE, DROPLIMB_EDGE_BURN)
- compile_icon()
+ if(DROPLIMB_EDGE, DROPLIMB_EDGE_BURN) //TODO: IF head cut off, borer actions "stay" in body, camera will be on cut off head, will not be able to be detach. Too Bad!
add_blood(victim)
var/matrix/M = matrix()
M.Turn(rand(180))
@@ -71,6 +70,7 @@
for(var/obj/item/organ/I in internal_organs)
I.removed()
I.forceMove(get_turf(src))
+ I.status |= ORGAN_CUT_AWAY
for(var/obj/item/I in src)
if(I.volumeClass > ITEM_SIZE_SMALL)
@@ -89,7 +89,15 @@
I.removed()
I.forceMove(get_turf(src))
I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
+ I.status |= ORGAN_CUT_AWAY
+ for(var/mob/living/I in src) // check for mobs inside you... yeah
+ if(istype(I, /mob/living/simple_animal/borer/))
+ var/mob/living/simple_animal/borer/B = I
+ B.detach()
+ B.leave_host()
+ I.forceMove(get_turf(src))
+ I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
for(var/obj/item/I in src)
if(I.volumeClass <= ITEM_SIZE_SMALL)
qdel(I)
diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm
index 19a9d27dc9..77987c8377 100644
--- a/code/modules/organs/internal/_internal.dm
+++ b/code/modules/organs/internal/_internal.dm
@@ -29,12 +29,22 @@
RegisterSignal(src, COMSIG_IORGAN_ADD_WOUND, PROC_REF(add_wound))
RegisterSignal(src, COMSIG_IORGAN_REMOVE_WOUND, PROC_REF(remove_wound))
RegisterSignal(src, COMSIG_IORGAN_REFRESH_SELF, PROC_REF(refresh_upgrades))
+ spawn(10)
+ PostInit()
+
+/obj/item/organ/internal/proc/PostInit()
+ if(!get_limb())
+ status |= ORGAN_CUT_AWAY
/obj/item/organ/internal/Process()
refresh_damage() // Death check is in the parent proc
..()
handle_blood()
+/obj/item/organ/internal/die()
+ ..()
+ handle_organ_eff()
+
/obj/item/organ/internal/Destroy()
QDEL_LIST(item_upgrades)
for(var/comp in GetComponents(/datum/component/internal_wound))
@@ -85,7 +95,10 @@
for(var/process in organ_efficiency)
if(!islist(owner.internal_organs_by_efficiency[process]))
owner.internal_organs_by_efficiency[process] = list()
- owner.internal_organs_by_efficiency[process] += src
+ if(is_usable())
+ owner.internal_organs_by_efficiency[process] |= src
+ else
+ owner.internal_organs_by_efficiency[process] -= src
for(var/proc_path in owner_verbs)
verbs |= proc_path
@@ -93,6 +106,13 @@
if(GetComponent(/datum/component/internal_wound/organic/parenchyma))
owner.mutation_index++
+/obj/item/organ/internal/proc/handle_organ_eff()
+ for(var/process in organ_efficiency)
+ if(is_usable())
+ owner.internal_organs_by_efficiency[process] |= src
+ else
+ owner.internal_organs_by_efficiency[process] -= src
+
/obj/item/organ/internal/proc/get_process_efficiency(process_define)
var/organ_eff = organ_efficiency[process_define]
return organ_eff - (organ_eff * (damage / max_damage))
diff --git a/code/modules/organs/internal/carrion.dm b/code/modules/organs/internal/carrion.dm
index 590a6cda07..2798d04a58 100644
--- a/code/modules/organs/internal/carrion.dm
+++ b/code/modules/organs/internal/carrion.dm
@@ -61,7 +61,7 @@
/obj/item/organ/internal/carrion/core/proc/carrion_transform,
/obj/item/organ/internal/carrion/core/proc/EvolutionMenu,
/obj/item/organ/internal/carrion/core/proc/carrion_fakedeath,
- /obj/item/organ/internal/carrion/core/proc/detatch,
+ /obj/item/organ/internal/carrion/core/proc/detach,
/obj/item/organ/internal/carrion/core/proc/make_spider,
/obj/item/organ/internal/carrion/core/proc/spider_menu
)
@@ -213,9 +213,9 @@
EvolutionMenu()
..()
-/obj/item/organ/internal/carrion/core/proc/detatch()
+/obj/item/organ/internal/carrion/core/proc/detach()
set category = "Carrion"
- set name = "Detatch"
+ set name = "Detach"
if(owner.status_flags & FAKEDEATH)
to_chat(owner, SPAN_WARNING("We are regenerating our body!"))
diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm
index 261a523ae7..d01904a6ee 100644
--- a/code/modules/organs/internal/eyes.dm
+++ b/code/modules/organs/internal/eyes.dm
@@ -39,7 +39,7 @@
return
eyes_color = owner.eyes_color
-/obj/item/organ/internal/eyes/take_damage(amount, damage_type = BRUTE, wounding_multiplier = 1, sharp = FALSE, edge = FALSE, silent = FALSE)
+/obj/item/organ/internal/eyes/take_damage(amount, damage_type = BRUTE, wounding_multiplier = 1, silent = FALSE, sharp = FALSE, edge = FALSE)
var/oldbroken = is_broken()
..()
if(is_broken() && !oldbroken && owner && !owner.stat)
@@ -51,6 +51,52 @@
else
return colourmatrix
+/obj/item/organ/internal/eyes/get_possible_wounds(damage_type, sharp, edge)
+ var/list/possible_wounds = list()
+
+ // Determine possible wounds based on nature and damage type
+ var/is_robotic = BP_IS_ROBOTIC(src)
+ var/is_organic = BP_IS_ORGANIC(src) || BP_IS_ASSISTED(src)
+
+ switch(damage_type)
+ if(BRUTE)
+ if(!edge)
+ if(sharp)
+ if(is_organic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/organic/eyes_sharp))
+ if(is_robotic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/robotic/eyes_sharp))
+ else
+ if(is_organic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/organic/eyes_blunt))
+ if(is_robotic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/robotic/eyes_blunt))
+ else
+ if(is_organic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/organic/eyes_edge))
+ if(is_robotic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/robotic/eyes_edge))
+ if(BURN)
+ if(is_organic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/organic/eyes_burn))
+ if(is_robotic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/robotic/eyes_emp_burn))
+ if(TOX)
+ if(is_organic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/organic/eyes_poisoning))
+ //if(is_robotic)
+ // LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/robotic/eyes_build_up))
+ if(CLONE)
+ if(is_organic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/organic/radiation))
+ if(PSY)
+ if(is_organic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/organic/sanity))
+ if(is_robotic)
+ LAZYADD(possible_wounds, subtypesof(/datum/component/internal_wound/robotic/sanity))
+
+ return possible_wounds
+
//Subtypes
/obj/item/organ/internal/eyes/oneeye
icon_state = "eye_l"
diff --git a/code/modules/organs/internal/internal_wounds/_internal_wound.dm b/code/modules/organs/internal/internal_wounds/_internal_wound.dm
index 0c4b7a6655..e323dedf45 100644
--- a/code/modules/organs/internal/internal_wounds/_internal_wound.dm
+++ b/code/modules/organs/internal/internal_wounds/_internal_wound.dm
@@ -181,6 +181,9 @@
is_treated = TRUE
else
is_treated = S.use(charges_needed)
+ else if(istype(I)) // check for using items without stacks
+ is_treated = TRUE
+ qdel(I)
if(is_treated)
if(free_use)
to_chat(user, SPAN_NOTICE("You have managed to waste less [I.name]."))
@@ -236,7 +239,7 @@
if(!islist(H.internal_organs_by_efficiency[process]))
H.internal_organs_by_efficiency[process] = list()
H.internal_organs_by_efficiency[process] |= O
-
+
if(organ_efficiency_multiplier)
for(var/organ in O.organ_efficiency)
O.organ_efficiency[organ] = round(O.organ_efficiency[organ] * (1 + organ_efficiency_multiplier), 1)
diff --git a/code/modules/organs/internal/internal_wounds/brain.dm b/code/modules/organs/internal/internal_wounds/brain.dm
new file mode 100644
index 0000000000..c7d4250aed
--- /dev/null
+++ b/code/modules/organs/internal/internal_wounds/brain.dm
@@ -0,0 +1,236 @@
+
+// Blunt
+/datum/component/internal_wound/organic/brain_blunt
+ treatments_item = list(/obj/item/stack/medical/advanced/bruise_pack = 2)
+ treatments_tool = list(QUALITY_CLAMPING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_BRAINHEAL = 1)
+ severity = 0
+ severity_max = 5
+ hal_damage = IWOUND_MEDIUM_DAMAGE
+ characteristic_flag = IWOUND_HALLUCINATE
+/datum/component/internal_wound/organic/brain_blunt/contusion
+ name = "brain contusion"
+
+/datum/component/internal_wound/organic/brain_blunt/diffuse
+ name = "diffuse axonal injury"
+
+/datum/component/internal_wound/organic/brain_blunt/torn
+ name = "torn nerve fibers"
+
+// Sharp
+/datum/component/internal_wound/organic/brain_sharp
+ treatments_item = list(/obj/item/stack/medical/advanced/bruise_pack = 2)
+ treatments_tool = list(QUALITY_CAUTERIZING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_BRAINHEAL = 1)
+ severity = 0
+ severity_max = 5
+ next_wound = /datum/component/internal_wound/organic/swelling
+ hal_damage = IWOUND_INSIGNIFICANT_DAMAGE
+ characteristic_flag = IWOUND_HALLUCINATE
+
+/datum/component/internal_wound/organic/brain_sharp/punctured
+ name = "punctured brain tissue"
+
+/datum/component/internal_wound/organic/brain_sharp/lobe
+ name = "gored brain lobe"
+ treatments_tool = list(QUALITY_CLAMPING = FAILCHANCE_HARD)
+
+/datum/component/internal_wound/organic/brain_sharp/penetrating
+ name = "penetrating brain injury"
+ treatments_item = list(/obj/item/stack/medical/advanced/bruise_pack = 4)
+ treatments_tool = list(QUALITY_LASER_CUTTING = FAILCHANCE_HARD)
+ scar = list(/datum/component/internal_wound/organic/penetrating2) // stage 2
+
+/datum/component/internal_wound/organic/penetrating2 // stage 2
+ name = "accessible penetrating brain injury"
+ treatments_item = list(/obj/item/stack/medical/advanced/bruise_pack = 2)
+ treatments_tool = list(QUALITY_CAUTERIZING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_BRAINHEAL = 1)
+ severity = 0
+ severity_max = 5
+ next_wound = /datum/component/internal_wound/organic/swelling
+ hal_damage = IWOUND_INSIGNIFICANT_DAMAGE
+ characteristic_flag = IWOUND_HALLUCINATE
+
+
+// /datum/component/internal_wound/organic/brain_sharp/gore
+// name = "gored frontal lobe" //-- is that the bite of 87????????????????????????
+
+// Edge
+/datum/component/internal_wound/organic/brain_edge
+ treatments_item = list(/obj/item/stack/medical/advanced/bruise_pack = 2)
+ treatments_tool = list(QUALITY_CAUTERIZING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_BRAINHEAL = 1)
+ severity = 0
+ severity_max = 5
+ next_wound = /datum/component/internal_wound/organic/swelling
+ hal_damage = IWOUND_INSIGNIFICANT_DAMAGE
+ characteristic_flag = IWOUND_HALLUCINATE
+
+/datum/component/internal_wound/organic/brain_edge/laceration
+ name = "brain laceration"
+
+/datum/component/internal_wound/organic/brain_edge/slice
+ name = "sliced brain tissue"
+
+/datum/component/internal_wound/organic/brain_edge/rip
+ name = "ripped brain fibers"
+ treatments_item = list(/obj/item/stack/medical/advanced/bruise_pack = 4)
+ treatments_tool = list(QUALITY_CLAMPING = FAILCHANCE_HARD)
+ scar = list(/datum/component/internal_wound/organic/rip2)
+
+/datum/component/internal_wound/organic/rip2
+ name = "tighted ripped brain fibers"
+ treatments_item = list(/obj/item/stack/medical/advanced/bruise_pack = 2)
+ treatments_tool = list(QUALITY_CAUTERIZING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_BRAINHEAL = 1)
+ severity = 0
+ severity_max = 5
+ next_wound = /datum/component/internal_wound/organic/swelling
+ hal_damage = IWOUND_INSIGNIFICANT_DAMAGE
+ characteristic_flag = IWOUND_HALLUCINATE
+
+/*
+/datum/component/internal_wound/organic/edge/tear
+ name = "torn tissue"
+
+/datum/component/internal_wound/organic/edge/cut
+ name = "leaking cut"
+*/
+
+// Burn
+/datum/component/internal_wound/organic/brain_burn
+ treatments_item = list(/obj/item/stack/medical/advanced/ointment = 2)
+ treatments_tool = list(QUALITY_CUTTING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_BRAINHEAL = 1)
+ scar = /datum/component/internal_wound/organic/necrosis_start
+ severity = 0
+ severity_max = 5
+ next_wound = /datum/component/internal_wound/organic/infection
+ hal_damage = IWOUND_MEDIUM_DAMAGE
+ characteristic_flag = IWOUND_HALLUCINATE
+
+/datum/component/internal_wound/organic/brain_burn/brain_matter
+ name = "burnt brain matter"
+/datum/component/internal_wound/organic/brain_burn/cooked
+ name = "well-cooked brain"
+ treatments_item = list(/obj/item/stack/medical/advanced/ointment = 4)
+/datum/component/internal_wound/organic/brain_burn/incinerate
+ name = "incinerated brain fibers"
+
+//---------------------------------------------------------------------------------------------
+//----------------------------------------PROSTHETICS------------------------------------------
+//---------------------------------------------------------------------------------------------
+
+// Blunt
+/datum/component/internal_wound/robotic/brain_blunt
+ treatments_item = list(/obj/item/stack/nanopaste = 1)
+ treatments_tool = list(QUALITY_HAMMERING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_MECH_REPAIR = 0.55) // repair nanites + 3 metals OR repair nanite OD + a metal
+ severity = 0
+ severity_max = 5
+ hal_damage = IWOUND_INSIGNIFICANT_DAMAGE
+ characteristic_flag = IWOUND_HALLUCINATE
+
+/datum/component/internal_wound/robotic/brain_blunt/malfunction
+ name = "damaged neural processor"
+ treatments_tool = list(QUALITY_CAUTERIZING = FAILCHANCE_HARD)
+/datum/component/internal_wound/robotic/brain_blunt/voxel
+ name = "voxel matrix deformation"
+ treatments_tool = list(QUALITY_LASER_CUTTING = FAILCHANCE_HARD)
+/datum/component/internal_wound/robotic/brain_blunt/loose
+ name = "loose calculation coupling"
+ treatments_tool = list(QUALITY_HAMMERING = FAILCHANCE_HARD)
+
+
+/*
+/datum/component/internal_wound/robotic/blunt/bent
+ name = "bent structure"
+
+/datum/component/internal_wound/robotic/blunt/crack
+ name = "cracked frame"
+*/
+
+// Sharp
+/datum/component/internal_wound/robotic/brain_sharp
+ treatments_item = list(/obj/item/stack/nanopaste = 1)
+ treatments_tool = list(QUALITY_CAUTERIZING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_MECH_REPAIR = 0.85)
+ severity = 0
+ severity_max = 5
+ hal_damage = IWOUND_INSIGNIFICANT_DAMAGE
+ characteristic_flag = IWOUND_HALLUCINATE
+
+/datum/component/internal_wound/robotic/brain_sharp/puncture
+ name = "punctured structure"
+
+/datum/component/internal_wound/robotic/brain_sharp/shell
+ name = "wrecked brain shell"
+ treatments_tool = list(QUALITY_WELDING = FAILCHANCE_HARD)
+
+/datum/component/internal_wound/robotic/brain_sharp/nand1
+ name = "broken NAND circuit loop"
+ treatments_tool = list(QUALITY_CAUTERIZING = FAILCHANCE_HARD)
+ scar = /datum/component/internal_wound/robotic/nand2
+
+/datum/component/internal_wound/robotic/nand2
+ name = "broken NAND circuit loop"
+ treatments_tool = list(QUALITY_PULSING = FAILCHANCE_HARD)
+
+// Edge
+/datum/component/internal_wound/robotic/brain_edge
+ treatments_item = list(/obj/item/stack/cable_coil = 5, /obj/item/stack/nanopaste = 1)
+ treatments_tool = list(QUALITY_CAUTERIZING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_MECH_REPAIR = 0.85)
+ severity = 0
+ severity_max = 5
+ hal_damage = IWOUND_INSIGNIFICANT_DAMAGE
+ characteristic_flag = IWOUND_HALLUCINATE
+
+/datum/component/internal_wound/robotic/brain_edge/trimmed
+ name = "trimmed down VRAM"
+ treatments_tool = list(QUALITY_WELDING = FAILCHANCE_HARD)
+
+/datum/component/internal_wound/robotic/brain_edge/disheveled
+ name = "cut fiber-optic cord"
+ treatments_tool = list(QUALITY_BOLT_TURNING = FAILCHANCE_HARD)
+
+/datum/component/internal_wound/robotic/brain_edge/shred1
+ name = "scrapped bracing"
+ treatments_tool = list(QUALITY_PRYING = FAILCHANCE_HARD)
+ scar = /datum/component/internal_wound/robotic/shred2
+
+/datum/component/internal_wound/robotic/shred2
+ name = "scrapped bracing"
+ treatments_tool = list(QUALITY_WELDING = FAILCHANCE_HARD)
+
+/*
+/datum/component/internal_wound/robotic/edge/short
+ name = "electrical short"
+
+/datum/component/internal_wound/robotic/edge/arc
+ name = "arcing"
+*/
+
+// EMP/burn wounds
+/datum/component/internal_wound/robotic/brain_emp_burn
+ treatments_item = list(/obj/item/stack/cable_coil = 5, /obj/item/stack/nanopaste = 1)
+ treatments_tool = list(QUALITY_CAUTERIZING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_MECH_REPAIR = 0.95) // repair nanite OD + all metals
+ severity = 0
+ severity_max = 5
+ next_wound = /datum/component/internal_wound/robotic/overheat
+ hal_damage = IWOUND_INSIGNIFICANT_DAMAGE
+ characteristic_flag = IWOUND_HALLUCINATE
+
+/datum/component/internal_wound/robotic/brain_emp_burn/elec_malfunction
+ name = "electrical malfunction"
+ treatments_tool = list(QUALITY_PULSING = FAILCHANCE_HARD)
+
+/datum/component/internal_wound/robotic/brain_emp_burn/cognitive_disorder
+ name = "cognitive circuit disorder"
+ treatments_tool = list(QUALITY_CAUTERIZE = FAILCHANCE_HARD)
+
+/datum/component/internal_wound/robotic/brain_emp_burn/upturned
+ name = "upturned memory stack"
+ treatments_tool = list(QUALITY_PRYING = FAILCHANCE_HARD) // gotta put it the way it was!
diff --git a/code/modules/organs/internal/internal_wounds/eyes.dm b/code/modules/organs/internal/internal_wounds/eyes.dm
new file mode 100644
index 0000000000..78da8a5633
--- /dev/null
+++ b/code/modules/organs/internal/internal_wounds/eyes.dm
@@ -0,0 +1,246 @@
+// Blunt
+/datum/component/internal_wound/organic/eyes_blunt
+ treatments_item = list(/obj/item/stack/medical/advanced/bruise_pack = 2)
+ treatments_tool = list(QUALITY_CLAMPING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_EYEHEAL = 1)
+ severity = 0
+ severity_max = 3 // with 3 health it takes around 3 wounds to kill eyes
+ hal_damage = IWOUND_MEDIUM_DAMAGE
+ diagnosis_difficulty = STAT_LEVEL_EXPERT
+
+/datum/component/internal_wound/organic/eyes_blunt/dissection
+ name = "retinal dissection"
+
+/datum/component/internal_wound/organic/eyes_blunt/erosion //PAINFUL
+ name = "corneal erosion"
+ hal_damage = IWOUND_HEAVY_DAMAGE
+
+/datum/component/internal_wound/organic/eyes_blunt/iris //iris hehehehe
+ name = "iris tears"
+
+// Sharp
+
+/datum/component/internal_wound/organic/eyes_sharp
+ treatments_item = list(/obj/item/stack/medical/advanced/bruise_pack = 2)
+ treatments_tool = list(QUALITY_LASER_CUTTING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_EYEHEAL = 1)
+ severity = 0
+ severity_max = 3
+ hal_damage = IWOUND_MEDIUM_DAMAGE
+ diagnosis_difficulty = STAT_LEVEL_EXPERT
+
+/datum/component/internal_wound/organic/eyes_sharp/cataract
+ name = "traumatic cataract"
+
+/datum/component/internal_wound/organic/eyes_sharp/perforation
+ name = "superonasal perforation"
+
+/datum/component/internal_wound/organic/eyes_sharp/matter
+ name = "foreign matter"
+ treatments_tool = list(QUALITY_CLAMPING = FAILCHANCE_HARD)
+
+// Edge
+/datum/component/internal_wound/organic/eyes_edge
+ treatments_item = list(/obj/item/stack/medical/advanced/bruise_pack = 2)
+ treatments_tool = list(QUALITY_CAUTERIZING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_EYEHEAL = 1)
+ severity = 0
+ severity_max = 3
+ hal_damage = IWOUND_MEDIUM_DAMAGE
+ diagnosis_difficulty = STAT_LEVEL_EXPERT
+
+/datum/component/internal_wound/organic/eyes_edge/laceration
+ name = "globe laceration"
+
+/datum/component/internal_wound/organic/eyes_edge/retina
+ name = "cut retina"
+
+/datum/component/internal_wound/organic/eyes_edge/slice
+ name = "sliced vascular layer"
+
+// Burn
+
+/datum/component/internal_wound/organic/eyes_burn
+ treatments_item = list(/obj/item/stack/medical/advanced/ointment = 2)
+ treatments_tool = list(QUALITY_LASER_CUTTING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_EYEHEAL = 1)
+ scar = /datum/component/internal_wound/organic/necrosis_start
+ severity = 0
+ severity_max = 3
+ next_wound = /datum/component/internal_wound/organic/infection
+ hal_damage = IWOUND_MEDIUM_DAMAGE
+ diagnosis_difficulty = STAT_LEVEL_EXPERT
+
+/datum/component/internal_wound/organic/eyes_burn/burnt
+ name = "burnt external fibrous layer"
+
+/datum/component/internal_wound/organic/eyes_burn/char
+ name = "charred sclera"
+
+/datum/component/internal_wound/organic/eyes_burn/scorch
+ name = "scorched deep tissue"
+ treatments_tool = list(QUALITY_RETRACTING = FAILCHANCE_HARD)
+ scar = /datum/component/internal_wound/organic/eyes_deep_burn
+
+/datum/component/internal_wound/organic/eyes_deep_burn/stage2 //stage 2
+ name = "scorched deep tissue"
+ treatments_item = list(/obj/item/stack/medical/advanced/ointment = 2)
+ treatments_chem = list(CE_EYEHEAL = 1)
+ severity = 3 //starting at max damage because stage 2
+ severity_max = 3
+ hal_damage = IWOUND_HEAVY_DAMAGE
+ diagnosis_difficulty = STAT_LEVEL_EXPERT
+
+// Tox (toxins)
+/datum/component/internal_wound/organic/eyes_poisoning
+ treatments_item = list(/obj/item/stack/medical/advanced/bruise_pack = 1)
+ treatments_tool = list(QUALITY_CUTTING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_ANTITOX = 2)
+ severity = 0
+ severity_max = 3
+ hal_damage = IWOUND_LIGHT_DAMAGE
+ diagnosis_difficulty = STAT_LEVEL_EXPERT
+
+/// Cheap hack, but prevents unbalanced toxins from killing someone immediately
+/datum/component/internal_wound/organic/eyes_poisoning/InheritComponent()
+ if(prob(5))
+ progress()
+
+/datum/component/internal_wound/organic/eyes_poisoning/pustule
+ name = "vitreous pustule"
+ specific_organ_size_multiplier = 0.20
+
+/datum/component/internal_wound/organic/eyes_poisoning/intoxication
+ name = "sclera intoxication"
+ blood_req_multiplier = 0.25
+ nutriment_req_multiplier = 0.25
+ oxygen_req_multiplier = 0.25
+
+/datum/component/internal_wound/organic/eyes_poisoning/accumulation
+ name = "lens foreign accumulation"
+ hal_damage = IWOUND_MEDIUM_DAMAGE
+
+/// Robotic
+
+// Blunt
+/datum/component/internal_wound/robotic/eyes_blunt
+ treatments_item = list(/obj/item/stack/nanopaste = 1)
+ treatments_tool = list(QUALITY_SCREW_DRIVING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_MECH_REPAIR = 0.55) // repair nanites + 3 metals OR repair nanite OD + a metal
+ severity = 0
+ severity_max = 3
+ hal_damage = IWOUND_INSIGNIFICANT_DAMAGE
+ diagnosis_difficulty = STAT_LEVEL_EXPERT
+
+/datum/component/internal_wound/robotic/eyes_blunt/lense
+ name = "misplaced lense"
+ treatments_tool = list(QUALITY_CLAMPING = FAILCHANCE_HARD)
+
+/datum/component/internal_wound/robotic/eyes_blunt/jam
+ name = "jammed mechanics"
+
+/datum/component/internal_wound/robotic/eyes_blunt/matrix
+ name = "disconnected matrix"
+ organ_efficiency_multiplier = -1 // can't see anything because of loose wire
+
+// Sharp
+
+/datum/component/internal_wound/robotic/eyes_sharp
+ treatments_item = list(/obj/item/stack/nanopaste = 2)
+ treatments_tool = list()
+ treatments_chem = list(CE_MECH_REPAIR = 0.85) // repair nanites + 6 metals OR repair nanite OD + 7 metals
+ severity = 0
+ severity_max = 3
+ hal_damage = IWOUND_INSIGNIFICANT_DAMAGE
+ diagnosis_difficulty = STAT_LEVEL_EXPERT
+
+/datum/component/internal_wound/robotic/eyes_sharp/prism
+ name = "fractured prism"
+ treatments_tool = list(QUALITY_ADHESIVE = FAILCHANCE_HARD)
+
+/datum/component/internal_wound/robotic/eyes_sharp/shatter
+ name = "shattered thin-film transistor"
+ treatments_chem = list(CE_MECH_REPAIR = 0.20)
+
+/datum/component/internal_wound/robotic/eyes_sharp/failure
+ name = "mechanical matrix failure"
+ treatments_item = list(/obj/item/stock_parts/scanning_module = 1, /obj/item/stack/nanopaste = 2)
+
+// Edge
+/datum/component/internal_wound/robotic/eyes_edge
+ treatments_item = list(/obj/item/stack/nanopaste = 1)
+ treatments_tool = list(QUALITY_CAUTERIZING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_MECH_REPAIR = 0.85)
+ severity = 0
+ severity_max = 3
+ hal_damage = IWOUND_INSIGNIFICANT_DAMAGE
+ diagnosis_difficulty = STAT_LEVEL_EXPERT
+
+/datum/component/internal_wound/robotic/eyes_edge/ocular
+ name = "scratched ocular"
+
+/datum/component/internal_wound/robotic/eyes_edge/focuser
+ name = "torn focuser"
+
+/datum/component/internal_wound/robotic/eyes_edge/slice
+ name = "sliced open optical cord"
+ treatments_item = list(/obj/item/stack/cable_coil = 5)
+
+// EMP/burn wounds
+
+/datum/component/internal_wound/robotic/eyes_emp_burn
+ treatments_item = list(/obj/item/stack/cable_coil = 5)
+ treatments_tool = list(QUALITY_WIRE_CUTTING = FAILCHANCE_HARD)
+ treatments_chem = list(CE_MECH_REPAIR = 0.95) // repair nanite OD + all metals
+ severity = 0
+ severity_max = 3
+ next_wound = /datum/component/internal_wound/robotic/eyes_overheat
+ hal_damage = IWOUND_INSIGNIFICANT_DAMAGE
+ diagnosis_difficulty = STAT_LEVEL_EXPERT
+
+/datum/component/internal_wound/robotic/eyes_emp_burn/pixels
+ name = "burnt matrix pixels"
+ treatments_item = list(/obj/item/stack/nanopaste = 1)
+ treatments_tool = list(QUALITY_PULSING = FAILCHANCE_HARD)
+
+/datum/component/internal_wound/robotic/eyes_emp_burn/inverse
+ name = "inversed movement axis"
+ treatments_tool = list(QUALITY_SCREW_DRIVING = FAILCHANCE_HARD)
+/datum/component/internal_wound/robotic/eyes_emp_burn/carbonized
+ name = "mangled wiring"
+
+/datum/component/internal_wound/robotic/eyes_overheat
+ treatments_item = list(/obj/item/stack/cable_coil = 10, /obj/item/stack/nanopaste = 2)
+ treatments_chem = list(CE_MECH_STABLE = 0.5) // coolant or refrigerant
+ severity = 0
+ severity_max = IORGAN_MAX_HEALTH
+ hal_damage = IWOUND_INSIGNIFICANT_DAMAGE
+ diagnosis_difficulty = STAT_LEVEL_EXPERT
+
+/datum/component/internal_wound/robotic/eyes_overheat/standard
+ name = "overheating link"
+
+/datum/component/internal_wound/robotic/eyes_overheat/alt
+ name = "thermal blackout"
+ organ_efficiency_multiplier = -1
+
+// Tox - UNUSED
+/datum/component/internal_wound/robotic/eyes_build_up
+ treatments_tool = list(QUALITY_CLAMPING = FAILCHANCE_HARD) // Clear any clog wtih a thin tool
+ treatments_chem = list(CE_MECH_ACID = 1) // sulphiric acid
+ severity = 0
+ severity_max = 3
+ next_wound = /datum/component/internal_wound/robotic/corrosion
+ hal_damage = IWOUND_INSIGNIFICANT_DAMAGE
+ diagnosis_difficulty = STAT_LEVEL_EXPERT
+
+/datum/component/internal_wound/robotic/eyes_build_up/breach
+ name = "breached bioisolation"
+ treatments_tool = list(QUALITY_ADHESIVE = FAILCHANCE_HARD)
+ treatments_item = list(/obj/item/stack/nanopaste = 1)
+ treatments_chem = list(CE_MECH_REPAIR = 0.30)
+
+/datum/component/internal_wound/robotic/eyes_build_up/clog
+ name = "clogged circuitry"
+ severity_max = 5
+ hal_damage = IWOUND_MEDIUM_DAMAGE
diff --git a/code/modules/organs/internal/internal_wounds/organic.dm b/code/modules/organs/internal/internal_wounds/organic.dm
index 8993c85129..d9189fc337 100644
--- a/code/modules/organs/internal/internal_wounds/organic.dm
+++ b/code/modules/organs/internal/internal_wounds/organic.dm
@@ -138,7 +138,7 @@
treatments_tool = list(QUALITY_CUTTING = FAILCHANCE_NORMAL)
treatments_chem = list(CE_ANTITOX = 2)
severity = 0
- severity_max = 3
+ severity_max = 4
hal_damage = IWOUND_LIGHT_DAMAGE
/// Cheap hack, but prevents unbalanced toxins from killing someone immediately
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 8a0a77d396..5c524de1a7 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -34,8 +34,6 @@
var/list/ico[0] //Icons and
var/list/offset_x[0] //offsets stored for later
var/list/offset_y[0] //usage by the photocopier
- var/rigged = 0
- var/spam_flag = 0
var/crumpled = FALSE
var/const/deffont = "Verdana"
@@ -115,12 +113,6 @@
crumpled = TRUE
return
user.examinate(src)
- if(rigged && (Holiday == "April Fool's Day"))
- if (spam_flag == 0)
- spam_flag = 1
- playsound(loc, 'sound/items/bikehorn.ogg', 50, 1)
- spawn(20)
- spam_flag = 0
/obj/item/paper/attack_ai(var/mob/living/silicon/ai/user)
show_content(user)
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index a0bbc2148e..4361b43711 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -58,11 +58,6 @@
else
if(response == "Regular")
P = new /obj/item/paper
- if(Holiday == "April Fool's Day")
- if(prob(30))
- P.info = "HONK HONK HONK HONK HONK HONK HONK
HOOOOOOOOOOOOOOOOOOOOOONK
APRIL FOOLS"
- P.rigged = 1
- P.updateinfolinks()
else if (response == "Carbon-Copy")
P = new /obj/item/paper/carbon
diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm
index 75ecf28de3..0824dd1183 100644
--- a/code/modules/paperwork/stamps.dm
+++ b/code/modules/paperwork/stamps.dm
@@ -47,6 +47,14 @@
name = "guild merchant's stamp"
icon_state = "stamp-qm"
+/obj/item/stamp/nt
+ name = "neotheology preacher's stamp"
+ icon_state = "stamp-nt"
+
+/obj/item/stamp/lus
+ name = "luscent official's stamp"
+ icon_state = "stamp-lus"
+
// Syndicate stamp to forge documents.
/obj/item/stamp/chameleon/attack_self(mob/user as mob)
diff --git a/code/modules/power/batteryrack.dm b/code/modules/power/batteryrack.dm
index 53f4d5875f..0cb5153a90 100644
--- a/code/modules/power/batteryrack.dm
+++ b/code/modules/power/batteryrack.dm
@@ -12,7 +12,6 @@
output_level = 0
input_level_max = 0
output_level_max = 0
- icon_state = "mpsu_closed"
circuit = /obj/item/electronics/circuitboard/batteryrack
var/cells_amount = 0
var/capacitors_amount = 0
@@ -50,7 +49,7 @@
input.forceMove(get_turf(user))
user.put_in_active_hand(input)
-/obj/machinery/power/smes/batteryrack/Topic(href, href_list)
+/obj/machinery/power/smes/batteryrack/Topic(href, href_list)// May be better to strip this completely as it currently is, force a reconstruction for cell removal.
/// For any UI related fuckery to NanoUI/Tgui
. = ..()
if(QDELETED(src))
@@ -74,6 +73,8 @@
component_parts.Remove(battery)
battery.forceMove(get_turf(target))
target.put_in_active_hand(battery)
+ RefreshParts()
+ update_icon()
/obj/machinery/power/smes/batteryrack/Initialize(mapload, d)
. = ..()
@@ -137,13 +138,7 @@
if (charge < (capacity / 100) || capacity == 0)
if (!output_attempt && !input_attempt)
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
- var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc)
- M.state = 2
- M.icon_state = "box_1"
- for(var/obj/I in component_parts)
- I.forceMove(get_turf(src))
- qdel(src)
- return 1
+ dismantle()
else
to_chat(user, SPAN_WARNING("Turn off the [src] before dismantling it."))
else
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index ddcac201df..41d9e6c882 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -41,7 +41,7 @@
anchored = FALSE
light_range = 4
- price_tag = 10000
+ price_tag = 20000
var/gasefficency = 0.25
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm
index 7cc2fecc8a..2b0f985aef 100755
--- a/code/modules/projectiles/ammunition.dm
+++ b/code/modules/projectiles/ammunition.dm
@@ -59,65 +59,27 @@
/// special case where is the location is specified as a ammo_Casing , it will clone all relevant vars
/obj/item/ammo_casing/New(loc, ...)
- . = ..()
if(istype(loc, /obj/item/ammo_casing))
var/obj/item/ammo_casing/C = loc
- name = C.name
- desc = C.desc
- caliber = C.caliber
- projectile_type = C.projectile_type
- icon_state = C.icon_state
- spent_icon = C.spent_icon
- maxamount = C.maxamount
- if(ispath(projectile_type) && C.BB)
- BB = new projectile_type(src)
-
- sprite_use_small = C.sprite_use_small
- sprite_max_rotate = C.sprite_max_rotate
- sprite_scale = C.sprite_scale
- sprite_update_spawn = C.sprite_update_spawn
-
- if(sprite_update_spawn)
- var/matrix/rotation_matrix = matrix()
- rotation_matrix.Turn(round(45 * rand(0, sprite_max_rotate) / 2))
- if(sprite_use_small)
- transform = rotation_matrix * sprite_scale
- else
- transform = rotation_matrix
-
- is_caseless = C.is_caseless //How did someone forget this before!?!?!?
- shell_color = C.shell_color
+ src.amount = 1 // otherwise duplicating the type will make Type/Prespawned start with too large an amount
+ if(!C.BB)
+ projectile_type = FALSE // this prevents spent projectiles resetting their status- this is safe because it typechecks for path, and this is not path
C.update_icon()
update_icon()
+ . = ..()
/obj/item/ammo_casing/attack_hand(mob/user)
if((src.amount > 1) && (src == user.get_inactive_hand()))
src.amount -= 1
- var/obj/item/ammo_casing/new_casing = new /obj/item/ammo_casing(src)
+ var/obj/item/ammo_casing/new_casing = new src.type(src)
new_casing.forceMove(get_turf(user))
user.put_in_active_hand(new_casing)
else
return ..()
/obj/item/ammo_casing/attackby(obj/item/I, mob/user)
- if(I.get_tool_type(usr, list(QUALITY_SCREW_DRIVING, QUALITY_CUTTING), src))
- if(!BB)
- to_chat(user, SPAN_NOTICE("There is no bullet in the casing to inscribe anything into."))
- return
-
- var/tmp_label = ""
- var/label_text = sanitizeSafe(input(user, "Inscribe some text into \the [initial(BB.name)]","Inscription",tmp_label), MAX_NAME_LEN)
- if(length(label_text) > 20)
- to_chat(user, SPAN_WARNING("The inscription can be at most 20 characters long."))
- else if(!label_text)
- to_chat(user, SPAN_NOTICE("You scratch the inscription off of [initial(BB)]."))
- BB.name = initial(BB.name)
- else
- to_chat(user, SPAN_NOTICE("You inscribe \"[label_text]\" into \the [initial(BB.name)]."))
- BB.name = "[initial(BB.name)] (\"[label_text]\")"
- return TRUE
- else if(istype(I, /obj/item/ammo_casing))
+ if(istype(I, /obj/item/ammo_casing))
var/obj/item/ammo_casing/merging_casing = I
if(isturf(src.loc))
if(merging_casing.amount == merging_casing.maxamount)
@@ -133,11 +95,7 @@
return FALSE
if(!user && noMessage == FALSE)
error("Passed no user to mergeCasing() when output messages is active.")
- if(src.caliber != AC.caliber)
- if(!noMessage)
- to_chat(user, SPAN_WARNING("Ammo are different calibers."))
- return FALSE
- if(src.projectile_type != AC.projectile_type)
+ if(src.type != AC.type)
if(!noMessage)
to_chat(user, SPAN_WARNING("Ammo are different types."))
return FALSE
@@ -196,6 +154,16 @@
/obj/item/ammo_casing/get_item_cost(export)
. = round(..() * amount)
+ if(BB)
+ . *= 2 // being loaded increases the value by 100%
+
+/obj/item/ammo_casing/get_matter()
+ . = matter?.Copy() // return starts at default matter
+ if(isnull(.)) // if the casing is matterless, handling is pointless.
+ return
+ else if(amount > 1) // if there is only one, there is no need to multiply
+ for(var/mattertype in .)
+ .[mattertype] *= amount // multiply matter appropriately
//An item that holds casings and can be used to put them inside guns
/obj/item/ammo_magazine
@@ -353,7 +321,7 @@
if(C.amount > 1)
C.amount -= 1
- var/obj/item/ammo_casing/inserted_casing = new /obj/item/ammo_casing(C)
+ var/obj/item/ammo_casing/inserted_casing = new C.type(C)
stored_ammo.Insert(1, inserted_casing)
else
if(ismob(C.loc))
diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm
index 04df517593..6370bd5045 100644
--- a/code/modules/projectiles/ammunition/boxes.dm
+++ b/code/modules/projectiles/ammunition/boxes.dm
@@ -42,7 +42,7 @@
/obj/item/ammo_magazine/ammobox/pistol
name = "ammunition packet (.35 Auto)"
icon_state = "pistol"
- matter = list(MATERIAL_STEEL = 10, MATERIAL_CARDBOARD = 1)
+ matter = list(MATERIAL_CARDBOARD = 1) // the autofill increases the cost depending on the contents
caliber = CAL_PISTOL
ammo_type = /obj/item/ammo_casing/pistol
max_ammo = 70
@@ -69,7 +69,7 @@
/obj/item/ammo_magazine/ammobox/magnum
name = "ammunition packet (.40 Magnum)"
icon_state = "magnum"
- matter = list(MATERIAL_STEEL = 10, MATERIAL_CARDBOARD = 1)
+ matter = list(MATERIAL_CARDBOARD = 1)
caliber = CAL_MAGNUM
ammo_type = /obj/item/ammo_casing/magnum
max_ammo = 50
@@ -108,7 +108,7 @@
/obj/item/ammo_magazine/ammobox/srifle_small
name = "ammunition packet (.20 Rifle)"
icon_state = "srifle"
- matter = list(MATERIAL_STEEL = 10, MATERIAL_CARDBOARD = 1)
+ matter = list(MATERIAL_CARDBOARD = 1)
caliber = CAL_SRIFLE
ammo_type = /obj/item/ammo_casing/srifle
max_ammo = 50
@@ -149,7 +149,7 @@
/obj/item/ammo_magazine/ammobox/clrifle_small
name = "ammunition packet (.25 Caseless Rifle)"
icon_state = "clrifle"
- matter = list(MATERIAL_STEEL = 10, MATERIAL_CARDBOARD = 1)
+ matter = list(MATERIAL_CARDBOARD = 1)
caliber = CAL_CLRIFLE
ammo_type = /obj/item/ammo_casing/clrifle
max_ammo = 60
@@ -187,7 +187,7 @@
/obj/item/ammo_magazine/ammobox/lrifle_small
name = "ammunition packet (.30 Rifle)"
icon_state = "lrifle"
- matter = list(MATERIAL_STEEL = 10, MATERIAL_CARDBOARD = 1)
+ matter = list(MATERIAL_CARDBOARD = 1)
caliber = CAL_LRIFLE
ammo_type = /obj/item/ammo_casing/lrifle
max_ammo = 60
diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm
index 08b1a14db9..04d546ec4e 100644
--- a/code/modules/projectiles/ammunition/bullets.dm
+++ b/code/modules/projectiles/ammunition/bullets.dm
@@ -12,6 +12,7 @@
sprite_update_spawn = TRUE
sprite_max_rotate = 32
sprite_scale = 0.5
+ matter = list(MATERIAL_STEEL = 0.05)
/obj/item/ammo_casing/pistol/hv
desc = "A .35 Auto high-velocity bullet casing."
@@ -62,6 +63,7 @@
sprite_update_spawn = TRUE
sprite_max_rotate = 32
sprite_scale = 0.5
+ matter = list(MATERIAL_STEEL = 0.15)
/obj/item/ammo_casing/magnum/practice
desc = "A .40 Magnum practice bullet casing."
@@ -112,6 +114,7 @@
sprite_update_spawn = TRUE
sprite_max_rotate = 32
sprite_scale = 0.5
+ matter = list(MATERIAL_STEEL = 0.1)
/obj/item/ammo_casing/srifle/practice
desc = "A .20 Rifle practice bullet casing."
@@ -157,7 +160,7 @@
shell_color = "l"
caliber = CAL_CLRIFLE
projectile_type = /obj/item/projectile/bullet/clrifle
- is_caseless = TRUE
+ is_caseless = TRUE // as it is caseless, the casing costs nothing.
maxamount = 10
commonLore = "Caseless ammunitions were invented during the Syndicate-NT era.They were employed by both sides for operations requiring complete stealth."
@@ -217,6 +220,7 @@
sprite_update_spawn = TRUE
sprite_max_rotate = 32
sprite_scale = 0.5
+ matter = list(MATERIAL_STEEL = 0.15)
/obj/item/ammo_casing/lrifle/practice
desc = "A .30 rifle practice bullet casing."
@@ -262,7 +266,7 @@
spent_icon = "atmr-spent"
caliber = CAL_ANTIM
projectile_type = /obj/item/projectile/bullet/antim
- matter = list(MATERIAL_PLASTEEL = 2)
+ matter = list(MATERIAL_PLASTEEL = 1)
maxamount = 5
sprite_update_spawn = TRUE
@@ -278,7 +282,7 @@
icon_state = "atmr-emp"
spent_icon = "atmr-emp-spent"
projectile_type = /obj/item/projectile/bullet/antim/emp
- matter = list(MATERIAL_STEEL = 1, MATERIAL_IRON = 1, MATERIAL_URANIUM = 1)
+ // bullet contains the iron and uranium
/obj/item/ammo_casing/antim/emp/prespawned
amount = 5
@@ -289,7 +293,7 @@
icon_state = "atmr-DU"
spent_icon = "atmr-DU-spent"
projectile_type = /obj/item/projectile/bullet/antim/uranium
- matter = list(MATERIAL_STEEL = 1, MATERIAL_URANIUM = 1)
+ // bullet contains the uranium
/obj/item/ammo_casing/antim/uranium/prespawned
amount = 5
@@ -300,7 +304,6 @@
icon_state = "atmr-HE"
spent_icon = "atmr-HE-spent"
projectile_type = /obj/item/projectile/bullet/antim/breach
- matter = list(MATERIAL_PLASTEEL = 1, MATERIAL_URANIUM = 1)
/obj/item/ammo_casing/antim/breach/prespawned
amount = 5
@@ -327,7 +330,7 @@
shell_color = "hv"
caliber = CAL_SHOTGUN
projectile_type = /obj/item/projectile/bullet/shotgun
- matter = list(MATERIAL_STEEL = 1)
+ matter = list(MATERIAL_STEEL = 0.5)
maxamount = 5
price_tag = 1
@@ -359,7 +362,6 @@
spent_icon = "s-shell_r-spent"
shell_color = "r"
projectile_type = /obj/item/projectile/bullet/shotgun/beanbag
- matter = list(MATERIAL_STEEL = 1)
/obj/item/ammo_casing/shotgun/beanbag/prespawned
amount = 5
@@ -371,7 +373,6 @@
spent_icon = "s-shell_rs-spent"
shell_color = "scrap_r"
projectile_type = /obj/item/projectile/bullet/shotgun/beanbag/scrap
- matter = list(MATERIAL_STEEL = 1)
/obj/item/ammo_casing/shotgun/beanbag/scrap/prespawned
amount = 5
@@ -383,7 +384,6 @@
spent_icon = "s-shell_l-spent"
shell_color = "l"
projectile_type = /obj/item/projectile/bullet/pellet/shotgun
- matter = list(MATERIAL_STEEL = 1)
/obj/item/ammo_casing/shotgun/pellet/prespawned
amount = 5
@@ -406,7 +406,6 @@
spent_icon = "s-shell_b-spent"
shell_color = "b"
projectile_type = /obj/item/projectile/bullet/blank
- matter = list(MATERIAL_STEEL = 1)
/obj/item/ammo_casing/shotgun/blank/prespawned
amount = 5
@@ -418,7 +417,6 @@
spent_icon = "s-shell_p-spent"
shell_color = "p"
projectile_type = /obj/item/projectile/bullet/shotgun/practice
- matter = list(MATERIAL_STEEL = 1)
/obj/item/ammo_casing/shotgun/practice/prespawned
amount = 5
@@ -431,7 +429,8 @@
spent_icon = "s-shell_f-spent"
shell_color = "f"
projectile_type = /obj/item/projectile/energy/flash/flare
- matter = list(MATERIAL_STEEL = 1, MATERIAL_SILVER = 0.5)
+ matter = list(MATERIAL_STEEL = 0.5)// silver is inside projectile
+
/obj/item/ammo_casing/shotgun/flash/prespawned
amount = 5
@@ -443,7 +442,7 @@
spent_icon = "s-shell_i-spent"
shell_color = "i"
projectile_type = /obj/item/projectile/bullet/shotgun/incendiary
- matter = list(MATERIAL_STEEL = 1, MATERIAL_PLASMA = 0.5)
+ matter = list(MATERIAL_STEEL = 0.5) // plasma cost is inside projectile
/obj/item/ammo_casing/shotgun/incendiary/prespawned
amount = 5
@@ -530,7 +529,7 @@
description_info = "Relying purely on explosive power, HE shells provide the biggest boom on the best budget."
icon_state = "rocketshell"
projectile_type = /obj/item/projectile/bullet/rocket
- matter = list(MATERIAL_STEEL = 3, MATERIAL_PLASTEEL = 3, MATERIAL_PLASMA = 2)
+
caliber = CAL_ROCKET
maxamount = 1
reload_delay = 15
@@ -542,7 +541,6 @@
desc = "An old improvised rocket shell for the RPG-7 launcher. Has a tubular shape."
icon_state = "old_rocketshell"
projectile_type = /obj/item/projectile/bullet/rocket/scrap
- matter = list(MATERIAL_STEEL = 2, MATERIAL_PLASMA = 2)
/obj/item/ammo_casing/rocket/hesh
name = "PG-7V2 HESH grenade"
@@ -594,7 +592,7 @@
icon_state = "f-shell"
spent_icon = "f-shell-spent"
projectile_type = /obj/item/projectile/bullet/flare
- matter = list(MATERIAL_PLASTIC = 1, MATERIAL_PLASMA = 1)
+ matter = list(MATERIAL_PLASTIC = 0.5) // plasma cost is inside projectile, which does not embed.
matter_reagents = list("phosphorus" = 3)
rarity_value = 8
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index 9465c22a43..c249168b06 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -166,7 +166,7 @@
mag_type = MAGAZINE
mag_well = MAG_WELL_RIFLE
caliber = CAL_SRIFLE
- matter = list(MATERIAL_STEEL = 6)
+ matter = list(MATERIAL_STEEL = 4)
ammo_type = /obj/item/ammo_casing/srifle
max_ammo = 25
ammo_states = list(25)
@@ -203,7 +203,7 @@
mag_type = MAGAZINE
mag_well = MAG_WELL_RIFLE_L
caliber = CAL_SRIFLE
- matter = list(MATERIAL_STEEL = 9)
+ matter = list(MATERIAL_STEEL = 6)
ammo_type = /obj/item/ammo_casing/srifle
max_ammo = 35
ammo_states = list(35)
@@ -236,7 +236,7 @@
mag_type = MAGAZINE
mag_well = MAG_WELL_RIFLE_D
caliber = CAL_SRIFLE
- matter = list(MATERIAL_STEEL = 18)
+ matter = list(MATERIAL_STEEL = 9)
ammo_type = /obj/item/ammo_casing/srifle
max_ammo = 60
ammo_states = list(60)
@@ -313,7 +313,7 @@
mag_type = MAGAZINE
mag_well = MAG_WELL_BOX
caliber = CAL_CLRIFLE
- matter = list(MATERIAL_STEEL = 16)
+ matter = list(MATERIAL_STEEL = 8)
ammo_type = /obj/item/ammo_casing/clrifle
max_ammo = 80
volumeClass = ITEM_SIZE_NORMAL
@@ -326,7 +326,7 @@
mag_type = MAGAZINE
mag_well = MAG_WELL_PISTOL
ammo_type = /obj/item/ammo_casing/clrifle
- matter = list(MATERIAL_STEEL = 4)
+ matter = list(MATERIAL_STEEL = 2)
caliber = CAL_CLRIFLE
max_ammo = 10
ammo_states = list(2, 4, 6, 8, 10)
@@ -351,7 +351,7 @@
mag_type = MAGAZINE
mag_well = MAG_WELL_RIFLE
caliber = CAL_LRIFLE
- matter = list(MATERIAL_STEEL = 5)
+ matter = list(MATERIAL_STEEL = 4)
ammo_type = /obj/item/ammo_casing/lrifle
max_ammo = 30
ammo_states = list(30)
@@ -380,7 +380,7 @@
mag_type = MAGAZINE
mag_well = MAG_WELL_BOX
caliber = CAL_LRIFLE
- matter = list(MATERIAL_STEEL = 16)
+ matter = list(MATERIAL_STEEL = 8)
ammo_type = /obj/item/ammo_casing/lrifle
max_ammo = 80
volumeClass = ITEM_SIZE_NORMAL
@@ -395,7 +395,7 @@
mag_type = MAGAZINE
mag_well = MAG_WELL_RIFLE_D
caliber = CAL_LRIFLE
- matter = list(MATERIAL_STEEL = 10)
+ matter = list(MATERIAL_STEEL = 6)
ammo_type = /obj/item/ammo_casing/lrifle
max_ammo = 45
ammo_states = list(45)
@@ -437,7 +437,7 @@
mag_type = MAGAZINE
mag_well = MAG_WELL_PAN
caliber = CAL_LRIFLE
- matter = list(MATERIAL_STEEL = 20)
+ matter = list(MATERIAL_STEEL = 10)
ammo_type = /obj/item/ammo_casing/lrifle
max_ammo = 96
volumeClass = ITEM_SIZE_NORMAL
@@ -454,7 +454,7 @@
icon = 'icons/obj/ammo_speed.dmi'
icon_state = "slpistol_base"
caliber = CAL_PISTOL
- matter = list(MATERIAL_STEEL = 3)
+ matter = list(MATERIAL_STEEL = 1)
ammo_type = /obj/item/ammo_casing/pistol
max_ammo = 6
rarity_value = 6.66
@@ -494,7 +494,7 @@
icon_state = "slmagnum_base"
caliber = CAL_MAGNUM
ammo_type = /obj/item/ammo_casing/magnum
- matter = list(MATERIAL_STEEL = 3)
+ matter = list(MATERIAL_STEEL = 1)
max_ammo = 6
spawn_tags = SPAWN_TAG_AMMO_IH
rarity_value = 5
@@ -536,7 +536,7 @@
icon_state = "lrifle"
modular_sprites = FALSE
caliber = CAL_LRIFLE
- matter = list(MATERIAL_STEEL = 3)
+ matter = list(MATERIAL_STEEL = 1)
ammo_type = /obj/item/ammo_casing/lrifle
max_ammo = 5
volumeClass = ITEM_SIZE_TINY
@@ -558,7 +558,7 @@
icon = 'icons/obj/ammo_speed.dmi'
icon_state = "stripper_base"
caliber = CAL_SRIFLE
- matter = list(MATERIAL_STEEL = 3)
+ matter = list(MATERIAL_STEEL = 1)
ammo_type = /obj/item/ammo_casing/srifle
max_ammo = 6
volumeClass = ITEM_SIZE_TINY
@@ -594,7 +594,7 @@
icon = 'icons/obj/ammo_speed.dmi'
icon_state = "slsrifle_base"
caliber = CAL_SRIFLE
- matter = list(MATERIAL_STEEL = 3)
+ matter = list(MATERIAL_STEEL = 1)
ammo_type = /obj/item/ammo_casing/srifle
max_ammo = 8
volumeClass = ITEM_SIZE_TINY
@@ -628,7 +628,7 @@
icon = 'icons/obj/ammo_speed.dmi'
icon_state = "clrifle_base"
caliber = CAL_CLRIFLE
- matter = list(MATERIAL_STEEL = 3)
+ matter = list(MATERIAL_STEEL = 1)
ammo_type = /obj/item/ammo_casing/clrifle
max_ammo = 5
volumeClass = ITEM_SIZE_TINY
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 6734ec6a13..169ee8b4e2 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -251,7 +251,6 @@
else
item_state_slots[slot_l_hand_str] = "lefthand" + state
item_state_slots[slot_r_hand_str] = "righthand" + state
- state = initial(state)
var/carry_state = inversed_carry
if(back && !carry_state)
@@ -271,7 +270,7 @@
item_state_slots[slot_r_hand_str] = "righthand" + wielded_item_state
else
item_state_slots[slot_l_hand_str] = "lefthand"
- item_state_slots[slot_r_hand_str] = "righthand"
+ item_state_slots[slot_r_hand_str] = "righthand"
else//Otherwise we can just pull from the generic left and right hand icons.
if(wielded_icon)
item_state_slots[slot_l_hand_str] = wielded_item_state
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 6b048d1740..b602251787 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -105,7 +105,7 @@
for(var/obj/item/ammo_casing/temp_casing in chambered.loc)
if(temp_casing == chambered)
continue
- if((temp_casing.desc == chambered.desc) && !temp_casing.BB)
+ if((temp_casing.type == chambered.type) && !temp_casing.BB)
var/temp_amount = temp_casing.amount + chambered.amount
if(temp_amount > chambered.maxamount)
temp_casing.amount -= (chambered.maxamount - chambered.amount)
@@ -217,7 +217,7 @@
if(C.amount > 1)
C.amount -= 1
- var/obj/item/ammo_casing/inserted_casing = new /obj/item/ammo_casing(C) //Couldn't make it seperate, so it must be cloned
+ var/obj/item/ammo_casing/inserted_casing = new C.type(C) //Couldn't make it seperate, so it must be cloned
loaded.Insert(1, inserted_casing)
else
user.remove_from_mob(C)
diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm
index 450620456a..b3ec78da8b 100644
--- a/code/modules/projectiles/guns/projectile/dartgun.dm
+++ b/code/modules/projectiles/guns/projectile/dartgun.dm
@@ -11,6 +11,7 @@
kill_count = 15 //shorter range
muzzle_type = null
var/reagent_amount = 15
+ matter = list(MATERIAL_GLASS = 0.2)
/obj/item/projectile/bullet/chemdart/New()
create_reagents(reagent_amount)
@@ -27,10 +28,9 @@
desc = "A small hardened, hollow dart."
icon_state = "dart"
caliber = CAL_DART
+ is_caseless = TRUE
projectile_type = /obj/item/projectile/bullet/chemdart
-/obj/item/ammo_casing/chemdart/expend()
- qdel(src)
/obj/item/ammo_magazine/chemdart
name = "dart cartridge"
diff --git a/code/modules/projectiles/guns/projectile/modular.dm b/code/modules/projectiles/guns/projectile/modular.dm
index 8e48576b17..2456d3196f 100644
--- a/code/modules/projectiles/guns/projectile/modular.dm
+++ b/code/modules/projectiles/guns/projectile/modular.dm
@@ -143,7 +143,6 @@
else
item_state_slots[slot_l_hand_str] = "lefthand" + state
item_state_slots[slot_r_hand_str] = "righthand" + state
- state = initial(state)
var/carry_state = inversed_carry
if(back && !carry_state)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index d2b9aecc97..6e2dd353de 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -281,7 +281,6 @@ GLOBAL_LIST(projectileDamageConstants)
setup_trajectory(curloc, targloc, x_offset, y_offset, angle_offset) //plot the initial trajectory
Process()
- START_PROCESSING(SSprojectiles, src)
return FALSE
@@ -530,9 +529,13 @@ GLOBAL_LIST(projectileDamageConstants)
else
passthrough = (A.bullet_act(src, def_zone) == PROJECTILE_CONTINUE) //backwards compatibility
if(isturf(A))
- for(var/obj/O in A)
+ if(QDELETED(src)) // we don't want bombs to explode once for every time bullet_act is called
+ on_impact(A)
+ invisibility = 101
+ return TRUE // see that next line? it can overload the server.
+ for(var/obj/O in A) // if src's bullet act spawns more objs, the list will increase,
if(O.density)
- O.bullet_act(src)
+ O.bullet_act(src) // causing exponential growth due to the spawned obj spawning itself
for(var/mob/living/M in A)
attack_mob(M)
@@ -731,6 +734,17 @@ GLOBAL_LIST(projectileDamageConstants)
return damageTotal > 0 ? (damageLeft / damageTotal) :0
+/obj/item/projectile/get_matter()
+ . = matter?.Copy()
+ if(isnull(.)) // empty bullets have no need for matter handling
+ return
+ if(istype(loc, /obj/item/ammo_casing)) // if this is part of a stack
+ var/obj/item/ammo_casing/case = loc
+ if(case.amount > 1) // if there is only one, there is no need to multiply
+ for(var/mattertype in .)
+ .[mattertype] *= case.amount
+
+
//"Tracing" projectile
/obj/item/projectile/test //Used to see if you can hit them.
invisibility = 101 //Nope! Can't see me!
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 4b433a3c36..4c6ab0fa92 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -96,6 +96,12 @@
var/spread_step = 10 //higher means the pellets spread more across body parts with distance
var/pellet_to_knockback_ratio = 0
wounding_mult = WOUNDING_SMALL
+ matter = list(MATERIAL_STEEL = 0.4)
+
+/obj/item/projectile/bullet/pellet/launch_from_gun(atom/target, mob/user, obj/item/gun/launcher, target_zone, x_offset=0, y_offset=0, angle_offset)
+ for(var/entry in matter) // this allows for the projectile in the casing having the correct matter
+ matter[entry] /= pellets // yet disallows for pellet shrapnel created on impact multiplying the matter count
+ . = ..()
/obj/item/projectile/bullet/pellet/Bumped()
. = ..()
diff --git a/code/modules/projectiles/projectile/bullettypes.dm b/code/modules/projectiles/projectile/bullettypes.dm
index 42d1868a64..e1e7cb66e7 100644
--- a/code/modules/projectiles/projectile/bullettypes.dm
+++ b/code/modules/projectiles/projectile/bullettypes.dm
@@ -26,6 +26,7 @@ There are important things regarding this file:
can_ricochet = TRUE
penetrating = 2
recoil = 3
+ matter = list(MATERIAL_STEEL = 0.05)
/obj/item/projectile/bullet/pistol/hv
armor_divisor = 1.3
@@ -42,6 +43,7 @@ There are important things regarding this file:
embed = FALSE
sharp = FALSE
can_ricochet = FALSE
+ matter = list(MATERIAL_STEEL = 0.01)
/obj/item/projectile/bullet/pistol/rubber
icon_state = "rubber"
@@ -54,6 +56,7 @@ There are important things regarding this file:
)
embed = FALSE
sharp = FALSE
+ matter = list(MATERIAL_PLASTIC = 0.05)
/obj/item/projectile/bullet/pistol/scrap
armor_divisor = 0.8
@@ -73,6 +76,7 @@ There are important things regarding this file:
armor_divisor = 1
penetrating = 2
can_ricochet = TRUE
+ matter = list(MATERIAL_STEEL = 0.1)
recoil = 3.6
/obj/item/projectile/bullet/srifle/nomuzzle
@@ -89,6 +93,7 @@ There are important things regarding this file:
embed = FALSE
sharp = FALSE
can_ricochet = FALSE
+ matter = list(MATERIAL_STEEL = 0.02)
/obj/item/projectile/bullet/srifle/hv
armor_divisor = 1.4
@@ -106,6 +111,9 @@ There are important things regarding this file:
embed = FALSE
sharp = FALSE
+ matter = list(MATERIAL_PLASTIC = 0.1)
+
+
/obj/item/projectile/bullet/srifle/scrap
armor_divisor = 0.7
recoil = 5
@@ -122,6 +130,8 @@ There are important things regarding this file:
armor_divisor = 1
penetrating = 2
can_ricochet = FALSE //to reduce collateral damage and FF, since IH use it in their primary firearm
+
+ matter = list(MATERIAL_STEEL = 0.2) // as the casing costs nothing, the bullet costs twice as much.
recoil = 2.8
step_delay = 0.9
@@ -136,6 +146,7 @@ There are important things regarding this file:
embed = FALSE
sharp = FALSE
can_ricochet = FALSE
+ matter = list(MATERIAL_STEEL = 0.02)
/obj/item/projectile/bullet/clrifle/hv
armor_divisor = 1.4
@@ -155,6 +166,9 @@ There are important things regarding this file:
sharp = FALSE
can_ricochet = TRUE
+ matter = list(MATERIAL_PLASTIC = 0.2)
+
+
/obj/item/projectile/bullet/clrifle/scrap
armor_divisor = 0.8
recoil = 4.5
@@ -170,6 +184,8 @@ There are important things regarding this file:
)
penetrating = 2
can_ricochet = TRUE
+ matter = list(MATERIAL_STEEL = 0.15)
+
recoil = 5
/obj/item/projectile/bullet/lrifle/practice
@@ -183,6 +199,7 @@ There are important things regarding this file:
embed = FALSE
sharp = FALSE
can_ricochet = FALSE
+ matter = list(MATERIAL_STEEL = 0.03)
/obj/item/projectile/bullet/lrifle/hv
armor_divisor = 1.3
@@ -200,6 +217,8 @@ There are important things regarding this file:
embed = FALSE
sharp = FALSE
+ matter = list(MATERIAL_PLASTIC = 0.15)
+
/obj/item/projectile/bullet/lrifle/scrap
armor_divisor = 0.7
recoil = 7
@@ -215,6 +234,9 @@ There are important things regarding this file:
armor_divisor = 1
can_ricochet = TRUE
penetrating = 2
+
+ wounding_mult = WOUNDING_WIDE
+ matter = list(MATERIAL_STEEL = 0.1)
recoil = 8
step_delay = 1.1
@@ -229,6 +251,7 @@ There are important things regarding this file:
embed = FALSE
sharp = FALSE
can_ricochet = FALSE
+ matter = list(MATERIAL_STEEL = 0.02)
/obj/item/projectile/bullet/magnum/hv
armor_divisor = 1.3
@@ -246,6 +269,8 @@ There are important things regarding this file:
embed = FALSE
sharp = FALSE
+ matter = list(MATERIAL_PLASTIC = 0.1)
+
/obj/item/projectile/bullet/magnum/scrap
armor_divisor = 0.8
recoil = 9
@@ -262,6 +287,12 @@ There are important things regarding this file:
penetrating = 2
step_delay = 0.8
recoil = 15 // Good luck shooting these from a revolver
+ matter = list(MATERIAL_PLASTEEL = 1)
+
+/obj/item/projectile/bullet/antim/emp
+ damage_types = list(BRUTE = 16)
+ armor_divisor = 2
+ matter = list(MATERIAL_STEEL = 1, MATERIAL_IRON = 1, MATERIAL_URANIUM = 1)
/obj/item/projectile/bullet/antim/emp
damage_types = list(
@@ -274,6 +305,8 @@ There are important things regarding this file:
/obj/item/projectile/bullet/antim/emp/on_hit(atom/target, blocked = FALSE)
. = ..()
empulse(target, 0, 0)
+ matter [MATERIAL_IRON] = 0
+ matter [MATERIAL_URANIUM] = 0
/obj/item/projectile/bullet/antim/uranium
damage_types = list(
@@ -283,6 +316,7 @@ There are important things regarding this file:
)
armor_divisor = 5
irradiate = 200
+ matter = list(MATERIAL_PLASTEEL = 1, MATERIAL_URANIUM = 1)
/obj/item/projectile/bullet/antim/breach
damage_types = list(
@@ -296,6 +330,7 @@ There are important things regarding this file:
nocap_structures = TRUE
var/hasBreached = 2
kill_count = 30
+ matter = list(MATERIAL_PLASTEEL = 2)
/obj/item/projectile/bullet/antim/breach/proc/get_tiles_passed(var/distance)
var/tiles_passed = distance
@@ -317,6 +352,7 @@ There are important things regarding this file:
/obj/item/projectile/bullet/antim/scrap
+ matter = list(MATERIAL_STEEL = 1) // cheap bullets don't contain plasteel
armor_divisor = 1
recoil = 20
@@ -332,6 +368,7 @@ There are important things regarding this file:
armor_divisor = 1
knockback = 1
step_delay = 1
+ matter = list(MATERIAL_STEEL = 0.5)
recoil = 9
/obj/item/projectile/bullet/shotgun/scrap
@@ -384,8 +421,10 @@ There are important things regarding this file:
knockback = 0
var/fire_stacks = 4
+ matter = list(MATERIAL_STEEL = 0.5, MATERIAL_PLASMA = 0.5)
/obj/item/projectile/bullet/shotgun/incendiary/on_hit(atom/target, blocked = FALSE)
+ matter[MATERIAL_PLASMA] = 0
. = ..()
if(iscarbon(target))
var/mob/living/carbon/M = target
@@ -408,6 +447,7 @@ There are important things regarding this file:
spread_step = 10
pellet_to_knockback_ratio = 2
recoil = 5
+ matter = list(MATERIAL_STEEL = 0.6)
/obj/item/projectile/bullet/pellet/shotgun/Initialize()
. = ..()
@@ -450,6 +490,8 @@ There are important things regarding this file:
armor_divisor = 1
embed = FALSE
can_ricochet = TRUE
+
+ matter = list(MATERIAL_STEEL = 1)
/// extreme recoil from firing flash forged bolts
recoil = 25
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index df6b508fec..0c4ab4f77d 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -55,6 +55,7 @@
brightness = 9 //similar to a flare
light_duration = 200
recoil = 8 // Shot from shotguns
+ matter = list(MATERIAL_STEEL = 0.5, MATERIAL_SILVER = 0.5)
/obj/item/projectile/energy/electrode
name = "electrode"
diff --git a/code/modules/projectiles/projectile/projectilegrenades.dm b/code/modules/projectiles/projectile/projectilegrenades.dm
index bd16ab4eb5..06becb32ab 100644
--- a/code/modules/projectiles/projectile/projectilegrenades.dm
+++ b/code/modules/projectiles/projectile/projectilegrenades.dm
@@ -25,7 +25,8 @@
grenade_effect(target)
/obj/item/projectile/bullet/grenade/proc/grenade_effect(target)
- return
+ qdel(src) // DO NOT ALLOW SRC TO SURVIVE THIS
+ SHOULD_CALL_PARENT(TRUE)
/obj/item/projectile/bullet/grenade/blast
name = "blast shell"
@@ -34,6 +35,7 @@
/obj/item/projectile/bullet/grenade/blast/grenade_effect(target)
explosion(get_turf(target), explosion_power, explosion_falloff)
+ . = ..()
/obj/item/projectile/bullet/grenade/heatwave
name = "heatwave shell"
@@ -44,7 +46,8 @@
var/fire_stacks = TRUE
/obj/item/projectile/bullet/grenade/heatwave/grenade_effect(target)
- heatwave(target, heavy_range, weak_range, heat_damage, fire_stacks, penetration)
+ heatwave(target, heavy_range, weak_range, heat_damage, fire_stacks, penetration)
+ . = ..()
/obj/item/projectile/bullet/grenade/frag
name = "frag shell"
@@ -87,6 +90,7 @@
/obj/item/projectile/bullet/grenade/emp/grenade_effect(target)
empulse(target, heavy_emp_range, light_emp_range)
+ . = ..()
/obj/item/projectile/bullet/grenade/emp/low_yield
heavy_emp_range = 4
@@ -101,6 +105,7 @@
/obj/item/projectile/bullet/grenade/handgrenade/grenade_effect(target)
var/obj/item/grenade/G = new hand_gren(src)
G.prime()
+ . = ..()
/obj/item/projectile/bullet/grenade/handgrenade/teargas // Because why not
name = "cs shell"
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index cf60fb832c..18f83ca050 100755
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -24,9 +24,11 @@
sharp = TRUE
edge = TRUE
recoil = 3
+ matter = list(MATERIAL_STEEL = 1, MATERIAL_PLASMA = 1)
/obj/item/projectile/bullet/gyro/on_hit(atom/target)
explosion(get_turf(target), 100, 50)
+ matter [MATERIAL_PLASMA] = 0
return TRUE
/obj/item/projectile/bullet/rocket
@@ -44,6 +46,7 @@
var/explosion_falloff = 75
sharp = FALSE
edge = FALSE
+ matter = list(MATERIAL_STEEL = 3, MATERIAL_PLASTEEL = 3, MATERIAL_PLASMA = 2) // as it is caseless, the 'bullet' holds the entire cost.
/obj/item/projectile/bullet/rocket/launch(atom/target, target_zone, x_offset, y_offset, angle_offset, proj_sound, user_recoil)
set_light(2.5, 0.5, "#dddd00")
@@ -51,6 +54,7 @@
/obj/item/projectile/bullet/rocket/on_hit(atom/target)
detonate(target)
+ matter [MATERIAL_PLASMA] = 0
set_light(0)
return TRUE
@@ -68,6 +72,7 @@
explosion_power = 200
explosion_falloff = 75
+ matter = list(MATERIAL_STEEL = 2, MATERIAL_PLASMA = 2) // as it is caseless, the 'bullet' holds the entire cost.
/obj/item/projectile/bullet/rocket/hesh
name = "high-explosive squash head rocket"
@@ -298,8 +303,9 @@
knockback = FALSE
can_ricochet = FALSE
sharp = FALSE
- embed = FALSE
+ embed = FALSE // plasma is not directly destroyed as projectile does not survive impact
recoil = 4
+ matter = list(MATERIAL_PLASTIC = 0.5, MATERIAL_PLASMA = 1)
/obj/item/projectile/bullet/flare/on_hit(atom/target, blocked = FALSE)
. = ..()
diff --git a/code/modules/reagents/bonsai.dm b/code/modules/reagents/bonsai.dm
index fc1ede2e47..9905cac0ff 100644
--- a/code/modules/reagents/bonsai.dm
+++ b/code/modules/reagents/bonsai.dm
@@ -9,10 +9,10 @@
name = "Laurelin bonsai"
desc = "A small tree, gifted to the club by a previous patron. It subsists off of numerous alcohols, and produces fruits and vegetables in return."
- commonLore = "Known as a anomaly in biology. The club refused to allow Moebius Technology to study it."
-
- icon = 'icons/obj/plants.dmi'
- icon_state = "plant-21" //Placeholder until we can get a proper sprite for them.
+ icon = 'icons/obj/bonsai.dmi'
+ icon_state = "bonsai_1"
+ layer = ABOVE_OBJ_LAYER
+ volumeClass = ITEM_SIZE_NORMAL
volume = 100 //Average bottle volume
reagent_flags = OPENCONTAINER
@@ -28,6 +28,8 @@
..()
GLOB.all_faction_items[src] = GLOB.department_civilian
START_PROCESSING(SSobj, src)
+ icon_state = "bonsai_[rand(1, 4)]"
+//make the bonsai a random color each round
/obj/item/reagent_containers/bonsai/Destroy()
STOP_PROCESSING(SSobj, src)
@@ -57,3 +59,5 @@
"potato",
"rice")]
S.harvest(get_turf(src),0,0,1)
+ flick(icon_state+"_animation", src)
+ playsound(loc, 'sound/effects/ding2.ogg', 50, 1, -1)
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index 9be22ce1ec..78b2807d9f 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -669,6 +669,7 @@
center_of_mass = list("x"=16, "y"=13)
preloaded_reagents = list("egg" = 3)
price_tag = 5
+ description_info = "Can have a flashlight used on it to determine if there is a chick inside."
/obj/item/reagent_containers/food/snacks/egg/afterattack(obj/O as obj, mob/user as mob, proximity)
if(istype(O,/obj/machinery/microwave))
@@ -700,7 +701,32 @@
to_chat(user, SPAN_NOTICE("You color \the [src] [clr]"))
icon_state = "egg-[clr]"
else
- ..()
+ var/valid = FALSE
+ if (istype(W, /obj/item/device/lighting))
+ var/obj/item/device/lighting/light = W
+ if(!light.on)
+ to_chat(usr, SPAN_WARNING("[W] needs to be turned on to reveal the egg's insides."))
+ return
+ valid = TRUE
+
+ else if (istype(W, /obj/item/flame))
+ var/obj/item/flame/fire = W
+ if(!fire.lit)
+ to_chat(usr, SPAN_WARNING("[W] needs to be aflame to reveal the egg's insides."))
+ return
+ valid = TRUE
+ if(valid)
+ switch(amount_grown)
+ if(0 to 10)
+ to_chat(usr, SPAN_NOTICE("[src] appears to be a normal egg."))
+ if(10 to 50)
+ to_chat(usr, SPAN_NOTICE("[src] contains a spidery red mass."))
+ if(50 to 90)
+ to_chat(usr, SPAN_NOTICE("[src] contains a partially-grown chick."))
+ if(90 to 100)
+ to_chat(usr, SPAN_NOTICE("[src] contains a partially-grown chick.\nYou hear a faint tapping emanating from \the [src]."))
+ else
+ ..()
/obj/item/reagent_containers/food/snacks/egg/blue
icon_state = "egg-blue"
@@ -2491,7 +2517,7 @@
icon_state = "[initial(icon_state)]_hot"
/obj/item/reagent_containers/food/snacks/mre/proc/openmre(mob/user)
- icon_state = initial(icon_state) += "_open"
+ icon_state = "[initial(icon_state)]_open"
desc = "A plethora of steaming beans mixed with meat, ready for consumption."
open = TRUE
reagent_flags |= REFILLABLE
@@ -2547,7 +2573,7 @@
/obj/item/reagent_containers/food/snacks/proc/open(mob/user)
open = TRUE
- icon_state = initial(icon_state) += "_open"
+ icon_state = "[initial(icon_state)]_open"
update_icon()
/obj/item/reagent_containers/food/snacks/attack_self(mob/user)
diff --git a/code/modules/reagents/reagents/medicine.dm b/code/modules/reagents/reagents/medicine.dm
index 0f89bf6f14..b92a13a9c9 100644
--- a/code/modules/reagents/reagents/medicine.dm
+++ b/code/modules/reagents/reagents/medicine.dm
@@ -346,8 +346,12 @@
scannable = 1
/datum/reagent/medicine/alkysine/affect_blood(mob/living/carbon/M, alien, effect_multiplier)
- M.adjustBrainLoss(-(3 + (M.getBrainLoss() * 0.05)) * effect_multiplier)
- M.add_chemical_effect(CE_PAINKILLER, 10)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/internal/vital/brain/B = H.internal_organs_by_efficiency[BP_BRAIN]
+ if(!BP_IS_ROBOTIC(B) && prob(75))
+ M.add_chemical_effect(CE_PAINKILLER, 10)
+ M.add_chemical_effect(CE_BRAINHEAL, 1)
/datum/reagent/medicine/imidazoline
name = "Imidazoline"
@@ -367,8 +371,8 @@
var/obj/item/organ/internal/E = H.random_organ_by_process(OP_EYES)
if(E && istype(E))
var/list/current_wounds = E.GetComponents(/datum/component/internal_wound)
- if(LAZYLEN(current_wounds) && prob(10))
- SEND_SIGNAL_OLD(E, COMSIG_IORGAN_REMOVE_WOUND, pick(current_wounds))
+ if(LAZYLEN(current_wounds) && prob(75))
+ M.add_chemical_effect(CE_EYEHEAL, 1)
/datum/reagent/medicine/imidazoline/overdose(mob/living/carbon/M, alien)
. = ..()
@@ -395,7 +399,9 @@
for(var/obj/item/organ/I in organs_sans_brain_and_bones)
var/list/current_wounds = I.GetComponents(/datum/component/internal_wound)
if(LAZYLEN(current_wounds) && !BP_IS_ROBOTIC(I) && prob(75)) //Peridaxon heals only non-robotic organs
- SEND_SIGNAL_OLD(I, COMSIG_IORGAN_REMOVE_WOUND, pick(current_wounds))
+ M.add_chemical_effect(CE_ONCOCIDAL, 1)
+ M.add_chemical_effect(CE_BLOODCLOT, 1)
+ M.add_chemical_effect(CE_ANTITOX, 2)
/datum/reagent/medicine/peridaxon/overdose(mob/living/carbon/M, alien)
. = ..()
diff --git a/code/modules/reagents/reagents/nanites.dm b/code/modules/reagents/reagents/nanites.dm
index 01cd621ed7..ccafad0358 100644
--- a/code/modules/reagents/reagents/nanites.dm
+++ b/code/modules/reagents/reagents/nanites.dm
@@ -163,15 +163,15 @@
description = "Microscopic construction robots programmed to heal body cells."
/datum/reagent/nanites/nanosymbiotes/will_occur(mob/living/carbon/M, alien, var/location)
- if(..() && (M.getBruteLoss() || M.getFireLoss() || M.getToxLoss() || M.getCloneLoss() || M.getBrainLoss()))
+ if(..() && (M.getBruteLoss() || M.getFireLoss() || M.getOxyLoss()))
return TRUE
/datum/reagent/nanites/nanosymbiotes/affect_blood(mob/living/carbon/M, alien, effect_multiplier)
if(..())
- M.heal_organ_damage(1 * effect_multiplier, 1 * effect_multiplier, 3 * effect_multiplier, 3 * effect_multiplier)
- M.add_chemical_effect(CE_TOXIN, -((1 + (M.chem_effects[CE_TOXIN] * 0.03)) * effect_multiplier))
- M.adjustOxyLoss(-(1 + (M.getOxyLoss() * 0.03)) * effect_multiplier)
- M.adjustBrainLoss(-(1 + (M.getBrainLoss() * 0.03)) * effect_multiplier)
+ M.add_chemical_effect(CE_ONCOCIDAL, 1)
+ M.adjustOxyLoss(-(1 + (M.getOxyLoss() * 0.03)) * effect_multiplier)
+ M.adjustFireLoss(-(1 + (M.getFireLoss() * 0.03)) * effect_multiplier)
+ M.adjustBruteLoss(-(1 + (M.getBruteLoss() * 0.03)) * effect_multiplier)
/datum/reagent/nanites/oxyrush
name = "Oxyrush"
@@ -196,17 +196,17 @@
if(..() && ishuman(M))
var/mob/living/carbon/human/H = M
for(var/obj/item/organ/organ in H.organs) //Grab the organ holding the implant.
- if(organ.damage > 0 && !BP_IS_ROBOTIC(organ))
+ if(organ.status & ORGAN_WOUNDED && !BP_IS_ROBOTIC(organ))
return TRUE
/datum/reagent/nanites/trauma_control_system/affect_blood(mob/living/carbon/M, alien, effect_multiplier)
- if(..() && ishuman(M))
- var/mob/living/carbon/human/H = M
- for(var/obj/item/organ/organ in H.organs) //Grab the organ holding the implant.
- if (istype(organ, /obj/item/organ/external) && organ.damage > 0 && !BP_IS_ROBOTIC(organ))
- organ.heal_damage((2 + organ.damage * 0.03)* effect_multiplier, (2 + organ.damage * 0.03)* effect_multiplier)
- else if (istype(organ, /obj/item/organ/internal) && organ.damage > 0 && !BP_IS_ROBOTIC(organ))
- organ.heal_damage((2 + organ.damage * 0.03)* effect_multiplier)
+ if(..())
+ M.add_chemical_effect(CE_ONCOCIDAL, 1)
+ M.add_chemical_effect(CE_BLOODCLOT, 1)
+ M.add_chemical_effect(CE_ANTITOX, 2)
+ M.add_chemical_effect(CE_STABLE, 1)
+ M.add_chemical_effect(CE_BRAINHEAL, 1)
+ M.add_chemical_effect(CE_EYEHEAL, 1)
/datum/reagent/nanites/purgers
name = "Purgers"
diff --git a/code/modules/reagents/reagents/other.dm b/code/modules/reagents/reagents/other.dm
index d4244a4881..4b1008be40 100644
--- a/code/modules/reagents/reagents/other.dm
+++ b/code/modules/reagents/reagents/other.dm
@@ -194,7 +194,7 @@
if(volume >= 5)
if(istype(T, /turf/simulated/wall))
var/turf/simulated/wall/W = T
- W.thermite = 1
+ W.thermite = TRUE
W.overlays += image('icons/effects/effects.dmi',icon_state = "#673910")
remove_self(5)
return TRUE
@@ -492,15 +492,20 @@
/datum/reagent/resuscitator/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- var/obj/item/organ/internal/vital/heart/heart = H.random_organ_by_process(OP_HEART)
- if(BP_IS_ROBOTIC(heart)) // neither it should work on robotic hearts, chemistry and stuf
- return
- if(heart)
- heart.damage += 0.5
+ var/obj/item/organ/internal/vital/heart = H.random_organ_by_process(OP_HEART)
+ if(heart) //Check for existence of the heart BEFORE checking for robotic heart, otherwise function WILL return null
+ if(BP_IS_ROBOTIC(heart)) // neither it should work on robotic hearts, chemistry and stuff
+ return
+ heart.take_damage(64, TOX)
if(prob(30))
to_chat(H, SPAN_DANGER("Your heart feels like it's going to tear itself out of you!"))
- if(H.stat == DEAD)
- H.resuscitate()
+ if(H.stat == DEAD)
+ H.resuscitate()
+ remove_self(60)
+ else
+ if(H.stat == DEAD)
+ H.resuscitate() //it will fail and give explanations why
+ remove_self(60)
/datum/reagent/resuscitator/overdose(mob/living/carbon/M, alien)
. = ..()
diff --git a/code/modules/reagents/reagents/toxins.dm b/code/modules/reagents/reagents/toxins.dm
index 2341cf5527..10b360b7b8 100644
--- a/code/modules/reagents/reagents/toxins.dm
+++ b/code/modules/reagents/reagents/toxins.dm
@@ -128,12 +128,25 @@
reagent_state = LIQUID
color = "#CF3600"
strength = 2
- metabolism = REM * 2
+ metabolism = REM/4 //0.05 Cyanide lasts within one day but duh...
/datum/reagent/toxin/cyanide/affect_blood(mob/living/carbon/M, alien, effect_multiplier)
..()
- M.adjustOxyLoss(2 * effect_multiplier)
- M.AdjustSleeping(1)
+ if(!ishuman(M))
+ return
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/internal/vital/heart/S = H.random_organ_by_process(OP_HEART)
+ var/obj/item/organ/internal/vital/lungs/O = H.random_organ_by_process(OP_LUNGS)
+ if(prob(20))
+ M.hallucination(50 * effect_multiplier, 50 * effect_multiplier)
+ M.AdjustSleeping(20)
+ if(istype(O)) //STAGE 1: CRUSH LUNGS
+ create_overdose_wound(O, M, /datum/component/internal_wound/organic/heavy_poisoning, "accumulation")
+ M.adjustOxyLoss(5)
+ if(istype(S) && (!istype(O) || (O.status & ORGAN_DEAD))) //STAGE 2: NO LUNGS? FUCK YOUR HEART
+ create_overdose_wound(S, M, /datum/component/internal_wound/organic/heavy_poisoning, "accumulation")
+ M.adjustHalLoss(20)
+ M.vomit()
/datum/reagent/toxin/potassium_chloride
name = "Potassium Chloride"
diff --git a/code/modules/reagents/recipes.dm b/code/modules/reagents/recipes.dm
index fd357119f0..487d9eeea7 100644
--- a/code/modules/reagents/recipes.dm
+++ b/code/modules/reagents/recipes.dm
@@ -1907,7 +1907,7 @@
/datum/chemical_reaction/nanosymbiotes
result = "nanosymbiotes"
- required_reagents = list("nanites" = 1, "peridaxon" = 1)
+ required_reagents = list("nanites" = 1, "bicaridine" = 1)
result_amount = 1
/datum/chemical_reaction/oxyrush
@@ -1917,7 +1917,7 @@
/datum/chemical_reaction/trauma_control_system
result = "trauma_control_system"
- required_reagents = list("nanites" = 1, "bicaridine" = 1)
+ required_reagents = list("nanites" = 1, "peridaxon" = 1)
result_amount = 1
/datum/chemical_reaction/nanopurgers
diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm
index 63ca207116..326415b67d 100644
--- a/code/modules/research/message_server.dm
+++ b/code/modules/research/message_server.dm
@@ -1,6 +1,3 @@
-#define MESSAGE_SERVER_SPAM_REJECT 1
-#define MESSAGE_SERVER_DEFAULT_SPAM_LIMIT 10
-
var/global/list/obj/machinery/message_server/message_servers = list()
/datum/data_pda_msg
@@ -57,21 +54,15 @@ var/global/list/obj/machinery/message_server/message_servers = list()
idle_power_usage = 10
active_power_usage = 100
- var/list/datum/data_pda_msg/pda_msgs = list()
var/list/datum/data_rc_msg/rc_msgs = list()
var/active = 1
var/decryptkey = "password"
- //Spam filtering stuff
- var/list/spamfilter = list("You have won", "your prize", "male enhancement", "shitcurity", \
- "are happy to inform you", "account number", "enter your PIN")
- //Messages having theese tokens will be rejected by server. Case sensitive
- var/spamfilter_limit = MESSAGE_SERVER_DEFAULT_SPAM_LIMIT //Maximal amount of tokens
/obj/machinery/message_server/New()
message_servers += src
decryptkey = GenerateKey()
- send_pda_message("System Administrator", "system", "This is an automated message. The messaging system is functioning correctly.")
+ send_rc_message("System Administrator", "system", "This is an automated message. The messaging system is functioning correctly.")
..()
return
@@ -97,14 +88,6 @@ var/global/list/obj/machinery/message_server/message_servers = list()
update_icon()
return
-/obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "")
- var/result
- for (var/token in spamfilter)
- if (findtextEx(message,token))
- message = "[message]" //Rejected messages will be indicated by red color.
- result = token //Token caused rejection (if there are multiple, last will be chosen>.
- pda_msgs += new/datum/data_pda_msg(recipient,sender,message)
- return result
/obj/machinery/message_server/proc/send_rc_message(var/recipient = "",var/sender = "",var/message = "",var/stamp = "", var/id_auth = "", var/priority = 1)
rc_msgs += new/datum/data_rc_msg(recipient,sender,message,stamp,id_auth)
@@ -116,7 +99,7 @@ var/global/list/obj/machinery/message_server/message_servers = list()
for (var/obj/machinery/requests_console/Console in allConsoles)
if (ckey(Console.department) == ckey(recipient))
if(Console.inoperable())
- Console.message_log += "Message lost due to console failure.
Please contact [station_name()] system adminsitrator or AI for technical assistance.
"
+ Console.message_log += "Message lost due to console failure.
Please contact [station_name] system adminsitrator or AI for technical assistance.
"
continue
if(Console.newmessagepriority < priority)
Console.newmessagepriority = priority
@@ -143,15 +126,6 @@ var/global/list/obj/machinery/message_server/message_servers = list()
return
-/obj/machinery/message_server/attackby(obj/item/O as obj, mob/living/user as mob)
- if (active && !(stat & (BROKEN|NOPOWER)) && (spamfilter_limit < MESSAGE_SERVER_DEFAULT_SPAM_LIMIT*2) && \
- istype(O,/obj/item/electronics/circuitboard/message_monitor))
- spamfilter_limit += round(MESSAGE_SERVER_DEFAULT_SPAM_LIMIT / 2)
- user.drop_item()
- qdel(O)
- to_chat(user, "You install additional memory and processors into message server. Its filtering capabilities been enhanced.")
- else
- ..(O, user)
/obj/machinery/message_server/update_icon()
if((stat & (BROKEN|NOPOWER)))
diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm
index 4db1877532..0c665bdd5c 100644
--- a/code/modules/research/rdmachines.dm
+++ b/code/modules/research/rdmachines.dm
@@ -35,7 +35,7 @@
/obj/machinery/autolathe/rnd/protolathe
name = "protolathe"
- desc = "A machine used for construction of advanced prototypes. Operated from an R\&D console."
+ desc = "A machine used for construction of advanced prototypes. Operated from an R&D console."
icon_state = "protolathe"
circuit = /obj/item/electronics/circuitboard/protolathe
@@ -45,7 +45,7 @@
/obj/machinery/autolathe/rnd/imprinter
name = "circuit imprinter"
- desc = "A machine used for printing advanced circuit boards. Operated from an R\&D console."
+ desc = "A machine used for printing advanced circuit boards. Operated from an R&D console."
icon_state = "imprinter"
circuit = /obj/item/electronics/circuitboard/circuit_imprinter
diff --git a/code/modules/sanity_grain/sanity_grain.dm b/code/modules/sanity_grain/sanity_grain.dm
index d1b8700d62..133714d438 100644
--- a/code/modules/sanity_grain/sanity_grain.dm
+++ b/code/modules/sanity_grain/sanity_grain.dm
@@ -29,7 +29,14 @@
PERK_HOLY_LIGHT, // Aura
)
+ // Suppressital clears the mind
+ if(S.getPerk(PERK_NJOY))
+ grain.icon_state = ""
+ return
+
var/state = "[rand(1, 9)] "
+
+ //Some perks reduce the amount of grain even at low sanity. This is either because the character is used to bad conditions, or faith clears their mind.
for(var/perk in S.perks ? light_grain_perks : list())
if(S.getPerk(perk))
switch(new_level)
diff --git a/code/modules/scrap/oldificator.dm b/code/modules/scrap/oldificator.dm
index 896fd325d9..0b2d54fd6c 100644
--- a/code/modules/scrap/oldificator.dm
+++ b/code/modules/scrap/oldificator.dm
@@ -80,6 +80,7 @@
GET_COMPONENT(oldified, /datum/component/oldficator)
if(oldified)
return FALSE
+ pre_old(low_quality_oldification)
AddComponent(/datum/component/oldficator)
light_color = color
if(!low_quality_oldification)
@@ -177,6 +178,15 @@
reagents.remove_reagent(R.id,rand(0, R.volume),TRUE)
reagents.add_reagent("mold", rand(0, actual_volume - reagents.total_volume))
+//makes old cigarettes rank
+/obj/item/clothing/mask/smokable/cigarette/make_old(low_quality_oldification)
+ .=..()
+ if(. && (!low_quality_oldification))
+ var/actual_volume = reagents.total_volume
+ for(var/datum/reagent/R in reagents.reagent_list)
+ reagents.remove_reagent(R.id,rand(0, R.volume),TRUE)
+ reagents.add_reagent("mold", rand(0, actual_volume - reagents.total_volume))
+
//Old chemical bottles also hide their reagents
/obj/item/reagent_containers/glass/bottle/make_old(low_quality_oldification)
.=..()
@@ -423,3 +433,28 @@
if(SEND_SIGNAL_OLD(trash_mod, COMSIG_IATTACK, src, null))
break
QDEL_NULL(trash_mod)
+
+/obj/item/ammo_casing/make_old(low_quality_oldification)
+ if(!low_quality_oldification)// reducing the materials otherwise is infeasible due to BYOND's
+ if(prob(90)) // incapability of restoring the initial value of a list typed var
+ return // so 10% of the time we just delete the bullet
+ if(is_caseless)
+ if(istype(loc, /obj/item/ammo_magazine)) // delete lingering reference
+ var/obj/item/ammo_magazine/holder = loc
+ holder.stored_ammo.Remove(src)
+ qdel(src)
+ else
+ qdel(src)
+ else
+ expend()
+
+/obj/item/projectile/make_old(low_quality_oldification)
+ return // why would the bullet being old change anything?
+
+/obj/proc/pre_old() // defined for compatibility
+ return
+
+/obj/item/ammo_magazine/pre_old(low_quality_oldification = FALSE) // this is needed to allow casings
+ if(!low_quality_oldification) // contained to self-delete
+ for(var/obj/item/ammo_casing/casing in stored_ammo)
+ casing.make_old() // this doesn't technically oldify anything, so can be done here
diff --git a/code/modules/scrap/scrap.dm b/code/modules/scrap/scrap.dm
index fe79126877..a27f70ae09 100644
--- a/code/modules/scrap/scrap.dm
+++ b/code/modules/scrap/scrap.dm
@@ -414,6 +414,7 @@ GLOBAL_LIST_EMPTY(scrap_base_cache)
SPAWN_BOOZE,
SPAWN_JUNK, SPAWN_CLEANABLE,
SPAWN_MATERIAL_JUNK,
+ SPAWN_CIGARETTE_MAINTS,
SPAWN_PART_ARMOR = 0.1
)
diff --git a/code/modules/shuttles/_defines.dm b/code/modules/shuttles/_defines.dm
index 6eff66372f..18bb533a18 100644
--- a/code/modules/shuttles/_defines.dm
+++ b/code/modules/shuttles/_defines.dm
@@ -1,4 +1,3 @@
#define SHUTTLE_FLAGS_NONE 0
#define SHUTTLE_FLAGS_PROCESS 1
-#define SHUTTLE_FLAGS_SUPPLY 2
#define SHUTTLE_FLAGS_ALL (~SHUTTLE_FLAGS_NONE)
diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm
index 05637fe54e..096d714927 100644
--- a/code/modules/shuttles/shuttle.dm
+++ b/code/modules/shuttles/shuttle.dm
@@ -48,18 +48,12 @@
SSshuttle.shuttles[src.name] = src
if(flags & SHUTTLE_FLAGS_PROCESS)
SSshuttle.process_shuttles += src
- if(flags & SHUTTLE_FLAGS_SUPPLY)
- if(SSsupply.shuttle)
- CRASH("A supply shuttle is already defined.")
- SSsupply.shuttle = src
/datum/shuttle/Destroy()
current_location = null
SSshuttle.shuttles -= src.name
SSshuttle.process_shuttles -= src
- if(SSsupply.shuttle == src)
- SSsupply.shuttle = null
. = ..()
diff --git a/code/modules/shuttles/shuttle_supply.dm b/code/modules/shuttles/shuttle_supply.dm
deleted file mode 100644
index 7b4e72d21e..0000000000
--- a/code/modules/shuttles/shuttle_supply.dm
+++ /dev/null
@@ -1,77 +0,0 @@
-/datum/shuttle/autodock/ferry/supply
- var/away_location = 1 //the location to hide at while pretending to be in-transit
- var/late_chance = 80
- var/max_late_time = (30 SECONDS)
- flags = SHUTTLE_FLAGS_PROCESS|SHUTTLE_FLAGS_SUPPLY
- category = /datum/shuttle/autodock/ferry/supply
-
-/datum/shuttle/autodock/ferry/supply/short_jump(area/destination)
- if(moving_status != SHUTTLE_IDLE)
- return
-
- if(isnull(location))
- return
-
- //it would be cool to play a sound here
- moving_status = SHUTTLE_WARMUP
- spawn(warmup_time*10)
- if (moving_status == SHUTTLE_IDLE)
- return //someone cancelled the launch
-
- if (at_station() && forbidden_atoms_check())
- //cancel the launch because of forbidden atoms. announce over supply channel?
- moving_status = SHUTTLE_IDLE
- return
-
- if (!at_station()) //at centcom
- SSsupply.buy()
-
- //We pretend it's a long_jump by making the shuttle stay at centcom for the "in-transit" period.
- var/obj/effect/shuttle_landmark/away_waypoint = get_location_waypoint(away_location)
- moving_status = SHUTTLE_INTRANSIT
-
- //If we are at the away_landmark then we are just pretending to move, otherwise actually do the move
- if (next_location == away_waypoint)
- attempt_move(away_waypoint)
-
- //wait ETA here.
- arrive_time = world.time + SSsupply.movetime
- while (world.time <= arrive_time)
- sleep(5)
-
- if (next_location != away_waypoint)
- //late
- if (prob(late_chance))
- sleep(rand(0,max_late_time))
-
- attempt_move(destination)
-
- moving_status = SHUTTLE_IDLE
-
- if (!at_station()) //at centcom
- SSsupply.sell()
-
-// returns 1 if the supply shuttle should be prevented from moving because it contains forbidden atoms
-/datum/shuttle/autodock/ferry/supply/proc/forbidden_atoms_check()
- if (!at_station())
- return 0 //if badmins want to send forbidden atoms on the supply shuttle from centcom we don't care
-
- for(var/area/A in shuttle_area)
- if(SSsupply.forbidden_atoms_check(A))
- return 1
-
-/datum/shuttle/autodock/ferry/supply/proc/at_station()
- return (!location)
-
-//returns 1 if the shuttle is idle and we can still mess with the cargo shopping list
-/datum/shuttle/autodock/ferry/supply/proc/idle()
- return (moving_status == SHUTTLE_IDLE)
-
-//returns the ETA in minutes
-/datum/shuttle/autodock/ferry/supply/proc/eta_minutes()
- var/ticksleft = arrive_time - world.time
- return max(0, round(ticksleft/600,1))
-
-/datum/shuttle/autodock/ferry/supply/proc/eta_seconds()
- var/ticksleft = arrive_time - world.time
- return max(0, round(ticksleft/10,1))
diff --git a/code/modules/surgery/internal.dm b/code/modules/surgery/internal.dm
index 3a59ae8701..ffe19f6eee 100644
--- a/code/modules/surgery/internal.dm
+++ b/code/modules/surgery/internal.dm
@@ -52,13 +52,13 @@
SPAN_WARNING("[user]'s gripper slips, hitting [organ.get_surgery_name()] with \the [tool]!"),
SPAN_WARNING("Your gripper slips, hitting [organ.get_surgery_name()] with \the [tool]!")
)
- organ.take_damage(5, 0)
+ organ.take_damage(5, BRUTE, 0)
else
user.visible_message(
SPAN_WARNING("[user]'s hand slips, hitting [organ.get_surgery_name()] with \the [tool]!"),
SPAN_WARNING("Your hand slips, hitting [organ.get_surgery_name()] with \the [tool]!")
)
- organ.take_damage(5, 0)
+ organ.take_damage(5, BRUTE, 0)
/datum/surgery_step/insert_item/robotic
required_stat = STAT_MEC
diff --git a/code/modules/surgery/mods.dm b/code/modules/surgery/mods.dm
index 8fbaa81abc..c4f7a4eda7 100644
--- a/code/modules/surgery/mods.dm
+++ b/code/modules/surgery/mods.dm
@@ -37,7 +37,7 @@
SPAN_WARNING("[user]'s hand slips, damaging [organ.get_surgery_name()] with \the [mod]!"),
SPAN_WARNING("Your hand slips, damaging [organ.get_surgery_name()] with \the [mod]!")
)
- organ.take_damage(5, 0)
+ organ.take_damage(rand(24, 32), BRUTE, edge = TRUE)
/datum/surgery_step/remove_mod
required_tool_quality = QUALITY_LASER_CUTTING
@@ -61,7 +61,7 @@
SPAN_WARNING("[user]'s hand slips, damaging [organ.get_surgery_name()] with \the [tool]!"),
SPAN_WARNING("Your hand slips, damaging [organ.get_surgery_name()] with \the [tool]!")
)
- organ.take_damage(5, 0)
+ organ.take_damage(rand(24, 32), BRUTE, sharp = TRUE)
/datum/surgery_step/examine
required_tool_quality = null
diff --git a/code/modules/surgery/organic.dm b/code/modules/surgery/organic.dm
index d029d7f1c4..53d4645e88 100644
--- a/code/modules/surgery/organic.dm
+++ b/code/modules/surgery/organic.dm
@@ -29,7 +29,7 @@
organ.open = 1
organ.setBleeding()
- organ.take_damage(1, 0, sharp=TRUE, edge=TRUE)
+ organ.take_damage(1, BRUTE, sharp=TRUE, edge=TRUE)
if(required_tool_quality == QUALITY_LASER_CUTTING)
organ.clamp_wounds()
@@ -41,7 +41,7 @@
SPAN_WARNING("[user]'s hand slips, slicing open [organ.get_surgery_name()] in the wrong place with \the [tool]!"),
SPAN_WARNING("Your hand slips, slicing open [organ.get_surgery_name()] in the wrong place with \the [tool]!")
)
- organ.take_damage(10, 0, sharp=TRUE, edge=TRUE)
+ organ.take_damage(10, BRUTE, sharp=TRUE, edge=TRUE)
/datum/surgery_step/cut_open/laser
@@ -112,7 +112,7 @@
SPAN_WARNING("[user]'s hand slips, leaving a small burn on [organ.get_surgery_name()] with \the [tool]!"),
SPAN_WARNING("Your hand slips, leaving a small burn on [organ.get_surgery_name()] with \the [tool]!")
)
- organ.take_damage(0, 3)
+ organ.take_damage(5, BURN)
@@ -142,6 +142,7 @@
)
organ.status &= ~ORGAN_CUT_AWAY
+ organ.handle_organ_eff() //organ is attached. Refreshing eff. list
organ.insert(organ.get_limb())
/datum/surgery_step/attach_organ/fail_step(mob/living/user, obj/item/organ/internal/organ, obj/item/stack/tool)
@@ -149,7 +150,7 @@
SPAN_WARNING("[user]'s hand slips, damaging [organ.get_surgery_name()] with \the [tool]!"),
SPAN_WARNING("Your hand slips, damaging [organ.get_surgery_name()] with \the [tool]!")
)
- organ.take_damage(5, 0)
+ organ.take_damage(16, BRUTE)
@@ -178,13 +179,14 @@
SPAN_NOTICE("You separate [organ.get_surgery_name()] with \the [tool].")
)
organ.status |= ORGAN_CUT_AWAY
+ organ.handle_organ_eff() //detach of organ. Refreshing eff. list
/datum/surgery_step/detach_organ/fail_step(mob/living/user, obj/item/organ/internal/organ, obj/item/stack/tool)
user.visible_message(
SPAN_WARNING("[user]'s hand slips, damaging [organ.get_surgery_name()] with \the [tool]!"),
SPAN_WARNING("Your hand slips, damaging [organ.get_surgery_name()] with \the [tool]!")
)
- organ.take_damage(5, 0)
+ organ.take_damage(16, BRUTE)
/datum/surgery_step/break_bone
target_organ_type = /obj/item/organ/internal/bone
@@ -216,7 +218,7 @@
SPAN_WARNING("[user]'s hand slips, scraping [organ.get_surgery_name()] with \the [tool]!"),
SPAN_WARNING("Your hand slips, scraping [organ.get_surgery_name()] with \the [tool]!")
)
- organ.take_damage(5, 0)
+ organ.take_damage(8, BRUTE, sharp = TRUE)
/datum/surgery_step/mend_bone
target_organ_type = /obj/item/organ/internal
@@ -255,7 +257,7 @@
SPAN_WARNING("[user]'s hand slips, scraping [organ.get_surgery_name()] with \the [tool]!"),
SPAN_WARNING("Your hand slips, scraping [organ.get_surgery_name()] with \the [tool]!")
)
- organ.take_damage(5, 0)
+ organ.take_damage(8, BRUTE)
/datum/surgery_step/replace_bone
target_organ_type = /obj/item/organ/internal
@@ -310,6 +312,10 @@
organ.owner_custom_pain("The pain in your [organ.name] is living hell!", 1)
/datum/surgery_step/remove_item/end_step(mob/living/user, obj/item/organ/external/organ, obj/item/tool, atom/movable/target)
+ if(istype(target, /mob/living/simple_animal/borer))
+ var/mob/living/simple_animal/borer/B = target
+ B.detach()
+ B.leave_host()
user.visible_message(
SPAN_NOTICE("[user] extracts something out of [organ.get_surgery_name()] with \the [tool]."),
SPAN_NOTICE("You extract [target] out of [organ.get_surgery_name()] with \the [tool].")
@@ -355,7 +361,7 @@
SPAN_WARNING("[user]'s hand slips, sawing through the bone in [organ.get_surgery_name()] with \the [tool]!"),
SPAN_WARNING("Your hand slips, sawing through the bone in [organ.get_surgery_name()] with \the [tool]!")
)
- organ.take_damage(30, 0, sharp=TRUE, edge=TRUE)
+ organ.take_damage(128, BRUTE, sharp=TRUE, edge=TRUE)
organ.fracture()
diff --git a/code/modules/surgery/organic_damage.dm b/code/modules/surgery/organic_damage.dm
index 061e75e6b8..6e798e98e5 100644
--- a/code/modules/surgery/organic_damage.dm
+++ b/code/modules/surgery/organic_damage.dm
@@ -167,7 +167,7 @@
to_chat(user, SPAN_WARNING("You need an advanced trauma kit to complete this step."))
/datum/surgery_step/fix_brute/proc/get_tool_name(obj/item/stack/tool)
- var/tool_name = "\the regenerative membrane"
+ var/tool_name = "the regenerative membrane"
return tool_name
/datum/surgery_step/fix_brute/can_use(mob/living/user, obj/item/organ/external/organ, obj/item/tool)
@@ -213,7 +213,7 @@
to_chat(user, SPAN_WARNING("You need an advanced burn kit to complete this step."))
/datum/surgery_step/fix_burn/proc/get_tool_name(obj/item/stack/tool)
- var/tool_name = "\the regenerative membrane"
+ var/tool_name = "the regenerative membrane"
return tool_name
/datum/surgery_step/fix_burn/can_use(mob/living/user, obj/item/organ/external/organ, obj/item/tool)
@@ -239,7 +239,7 @@
SPAN_NOTICE("You finish treating damage to [organ.get_surgery_name()] with \the [tool].")
)
organ.heal_damage(0, 25, TRUE)
- else
+ else
to_chat(user, SPAN_NOTICE("\The [tool] is used up."))
/datum/surgery_step/fix_burn/fail_step(mob/living/user, obj/item/organ/external/organ, obj/item/tool)
diff --git a/code/modules/surgery/robotic.dm b/code/modules/surgery/robotic.dm
index 88c2d50ac6..75d55353d2 100644
--- a/code/modules/surgery/robotic.dm
+++ b/code/modules/surgery/robotic.dm
@@ -67,8 +67,10 @@
)
if(organ.status & ORGAN_CUT_AWAY)
organ.status &= ~ORGAN_CUT_AWAY
+ organ.handle_organ_eff()
else
organ.status |= ORGAN_CUT_AWAY
+ organ.handle_organ_eff()
/datum/surgery_step/robotic/connect_organ/fail_step(mob/living/user, obj/item/organ/internal/organ, obj/item/stack/tool)
user.visible_message(
@@ -94,6 +96,10 @@
)
/datum/surgery_step/robotic/remove_item/end_step(mob/living/user, obj/item/organ/external/organ, obj/item/tool, atom/movable/target)
+ if(istype(target, /mob/living/simple_animal/borer)) // the fact that you wrench out a borer like a bolt is fucking stupid and funny
+ var/mob/living/simple_animal/borer/B = target
+ B.detach()
+ B.leave_host()
user.visible_message(
SPAN_NOTICE("[user] extracts something out of [organ.get_surgery_name()] with \the [tool]."),
SPAN_NOTICE("You extract [target] out of [organ.get_surgery_name()] with \the [tool].")
diff --git a/code/modules/tips_and_tricks/roles.dm b/code/modules/tips_and_tricks/roles.dm
index 380674ce0f..b3370616f2 100644
--- a/code/modules/tips_and_tricks/roles.dm
+++ b/code/modules/tips_and_tricks/roles.dm
@@ -42,3 +42,8 @@
/tipsAndTricks/roles/carrionsurgery
roles_list = list(/datum/antagonist/carrion)
tipText = "As a carrion, you have greatly increased control over your body - if you want to perform self-surgery, you can do it standing up."
+
+/tipsAndTricks/roles/borerLang
+ roles_list = list(/datum/antagonist/borer)
+ tipText = "As a borer, reading a host's mind will teach you the languages they know. For every language you learn you get more experience."
+
diff --git a/code/modules/trade/datums/trade_stations_presets/1-common/hellcat.dm b/code/modules/trade/datums/trade_stations_presets/1-common/hellcat.dm
index e5ef2395e9..fbc77f7501 100644
--- a/code/modules/trade/datums/trade_stations_presets/1-common/hellcat.dm
+++ b/code/modules/trade/datums/trade_stations_presets/1-common/hellcat.dm
@@ -72,8 +72,8 @@
"Armor" = list(
/obj/item/clothing/suit/armor/heavy/riot,
/obj/item/clothing/head/armor/faceshield/riot,
- /obj/item/clothing/suit/armor/vest/security,
- /obj/item/clothing/suit/armor/vest/full/security,
+ /obj/item/clothing/suit/armor/vest/toggle,
+ /obj/item/clothing/suit/armor/vest/toggle/full,
/obj/item/clothing/head/armor/helmet,
/obj/item/clothing/suit/armor/bulletproof,
/obj/item/clothing/suit/armor/bulletproof/full,
diff --git a/code/modules/unit_tests/map_tests.dm b/code/modules/unit_tests/map_tests.dm
index 5cf3829b4e..891880ebab 100644
--- a/code/modules/unit_tests/map_tests.dm
+++ b/code/modules/unit_tests/map_tests.dm
@@ -6,8 +6,7 @@
/datum/unit_test/area_contents/Run()
var/static/list/exempt_areas = typesof(
/area/space, /area/skipjack_station,
- /area/shuttle, /area/holodeck,
- /area/supply/station, /area/outpost/pulsar)
+ /area/shuttle, /area/holodeck, /area/outpost/pulsar)
var/static/list/exempt_from_atmos = typesof(
/area/eris/maintenance, /area/eris/storage,
diff --git a/code/modules/unit_tests/zas_tests.dm b/code/modules/unit_tests/zas_tests.dm
index 11bc7a750f..2de0b8ef2b 100644
--- a/code/modules/unit_tests/zas_tests.dm
+++ b/code/modules/unit_tests/zas_tests.dm
@@ -15,7 +15,6 @@
/datum/unit_test/zas_area_test/Run()
var/list/normal_test = list(
- /area/supply/dock,
/area/shuttle/escape/centcom,
/area/turret_protected/ai,
/area/shuttle/mining/station,
diff --git a/dependencies.sh b/dependencies.sh
index f9b448e0f8..df23abad0e 100644
--- a/dependencies.sh
+++ b/dependencies.sh
@@ -4,8 +4,8 @@
#Final authority on what's required to fully build the project
# byond version
-export BYOND_MAJOR=514
-export BYOND_MINOR=1568
+export BYOND_MAJOR=515
+export BYOND_MINOR=1634
#rust_g git tag
export RUST_G_VERSION=1.0.1
@@ -15,7 +15,7 @@ export NODE_VERSION=14
export NODE_VERSION_PRECISE=14.16.1
# SpacemanDMM git tag
-export SPACEMAN_DMM_VERSION=suite-1.7.1
+export SPACEMAN_DMM_VERSION=suite-1.8
# Extools git tag
export EXTOOLS_VERSION=v0.0.7
diff --git a/icons/effects/wall_graffiti.dmi b/icons/effects/wall_graffiti.dmi
index ef9353e1cd..d6ec3a2a5e 100644
Binary files a/icons/effects/wall_graffiti.dmi and b/icons/effects/wall_graffiti.dmi differ
diff --git a/icons/inventory/accessory/icon.dmi b/icons/inventory/accessory/icon.dmi
index e1b41243f0..4595c36d14 100644
Binary files a/icons/inventory/accessory/icon.dmi and b/icons/inventory/accessory/icon.dmi differ
diff --git a/icons/inventory/accessory/mob.dmi b/icons/inventory/accessory/mob.dmi
index d9ab0ca838..1d8c2324b5 100644
Binary files a/icons/inventory/accessory/mob.dmi and b/icons/inventory/accessory/mob.dmi differ
diff --git a/icons/inventory/face/icon.dmi b/icons/inventory/face/icon.dmi
index ad1923b295..07d3c51338 100644
Binary files a/icons/inventory/face/icon.dmi and b/icons/inventory/face/icon.dmi differ
diff --git a/icons/inventory/face/mob.dmi b/icons/inventory/face/mob.dmi
index 34c38c5ea6..ebf73c114f 100644
Binary files a/icons/inventory/face/mob.dmi and b/icons/inventory/face/mob.dmi differ
diff --git a/icons/inventory/feet/icon.dmi b/icons/inventory/feet/icon.dmi
index 362a5c9ed9..a6c7f66f3b 100644
Binary files a/icons/inventory/feet/icon.dmi and b/icons/inventory/feet/icon.dmi differ
diff --git a/icons/inventory/feet/mob.dmi b/icons/inventory/feet/mob.dmi
index fd52246b15..efa7f14787 100644
Binary files a/icons/inventory/feet/mob.dmi and b/icons/inventory/feet/mob.dmi differ
diff --git a/icons/inventory/head/icon.dmi b/icons/inventory/head/icon.dmi
index 86da3ead90..a97d44a4cd 100644
Binary files a/icons/inventory/head/icon.dmi and b/icons/inventory/head/icon.dmi differ
diff --git a/icons/inventory/head/mob.dmi b/icons/inventory/head/mob.dmi
index 5f9c8546e7..b2697fba8f 100644
Binary files a/icons/inventory/head/mob.dmi and b/icons/inventory/head/mob.dmi differ
diff --git a/icons/inventory/suit/icon.dmi b/icons/inventory/suit/icon.dmi
index 11d463fbf0..0a49cf8303 100644
Binary files a/icons/inventory/suit/icon.dmi and b/icons/inventory/suit/icon.dmi differ
diff --git a/icons/inventory/suit/mob.dmi b/icons/inventory/suit/mob.dmi
index 05a7ddb712..262b94c913 100644
Binary files a/icons/inventory/suit/mob.dmi and b/icons/inventory/suit/mob.dmi differ
diff --git a/icons/inventory/suit/mob_fem.dmi b/icons/inventory/suit/mob_fem.dmi
index 33a6c16bdd..1812c3971a 100644
Binary files a/icons/inventory/suit/mob_fem.dmi and b/icons/inventory/suit/mob_fem.dmi differ
diff --git a/icons/obj/bonsai.dmi b/icons/obj/bonsai.dmi
new file mode 100644
index 0000000000..2c86c32b1c
Binary files /dev/null and b/icons/obj/bonsai.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index bf69a8086d..91448131a3 100755
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/candle.dmi b/icons/obj/candle.dmi
index c4e6ee917e..d2ea065a33 100644
Binary files a/icons/obj/candle.dmi and b/icons/obj/candle.dmi differ
diff --git a/icons/obj/cigarettes.dmi b/icons/obj/cigarettes.dmi
index a96bc4af87..43a3de2f46 100755
Binary files a/icons/obj/cigarettes.dmi and b/icons/obj/cigarettes.dmi differ
diff --git a/icons/obj/curtain.dmi b/icons/obj/curtain.dmi
index 69b7de1dc0..d8db66d3df 100644
Binary files a/icons/obj/curtain.dmi and b/icons/obj/curtain.dmi differ
diff --git a/icons/obj/cyberplants.dmi b/icons/obj/cyberplants.dmi
index 4490859fbf..a5f02f54d0 100644
Binary files a/icons/obj/cyberplants.dmi and b/icons/obj/cyberplants.dmi differ
diff --git a/icons/obj/guns/projectile/carabine.dmi b/icons/obj/guns/projectile/carabine.dmi
index 269b9dda18..fbfd7a9524 100644
Binary files a/icons/obj/guns/projectile/carabine.dmi and b/icons/obj/guns/projectile/carabine.dmi differ
diff --git a/icons/obj/hud_full.dmi b/icons/obj/hud_full.dmi
index 9ae0bd0634..322172ea35 100644
Binary files a/icons/obj/hud_full.dmi and b/icons/obj/hud_full.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index ae0ef484fd..ac771156e0 100755
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi
index 7034052dd8..a1406831db 100644
Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ
diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi
index 86eaa4edd9..a45f29ce25 100644
Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ
diff --git a/icons/obj/machines/autolathe.dmi b/icons/obj/machines/autolathe.dmi
index 6d9bbffebe..3e611ee98b 100644
Binary files a/icons/obj/machines/autolathe.dmi and b/icons/obj/machines/autolathe.dmi differ
diff --git a/icons/obj/machines/mining_turret.dmi b/icons/obj/machines/mining_turret.dmi
index 37e572336f..6c5345765a 100644
Binary files a/icons/obj/machines/mining_turret.dmi and b/icons/obj/machines/mining_turret.dmi differ
diff --git a/icons/obj/machines/research.dmi b/icons/obj/machines/research.dmi
index 4d025a51e7..36228514af 100644
Binary files a/icons/obj/machines/research.dmi and b/icons/obj/machines/research.dmi differ
diff --git a/icons/obj/modular_pda.dmi b/icons/obj/modular_pda.dmi
index b7ee4f1d74..1ec1cee08f 100644
Binary files a/icons/obj/modular_pda.dmi and b/icons/obj/modular_pda.dmi differ
diff --git a/icons/obj/pieces.dmi b/icons/obj/pieces.dmi
index de3a197b8c..c15fe5e5c1 100644
Binary files a/icons/obj/pieces.dmi and b/icons/obj/pieces.dmi differ
diff --git a/icons/obj/plants.dmi b/icons/obj/plants.dmi
index d3f8e0eff7..fe08417818 100644
Binary files a/icons/obj/plants.dmi and b/icons/obj/plants.dmi differ
diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi
index dfb046620d..d6e68ae7a8 100644
Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index b3a08220c2..8a61a3bb9d 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/maps/CEVEris/_CEV_Eris.dmm b/maps/CEVEris/_CEV_Eris.dmm
index 14ca1988f9..0082a4b63d 100644
--- a/maps/CEVEris/_CEV_Eris.dmm
+++ b/maps/CEVEris/_CEV_Eris.dmm
@@ -13203,6 +13203,9 @@
/obj/spawner/pack/tech_loot/low_chance,
/obj/spawner/gun_parts/low_chance,
/obj/spawner/gun_parts/low_chance,
+/obj/effect/decal/cleanable/graffiti{
+ pixel_y = 33
+ },
/turf/simulated/floor/tiled/steel,
/area/eris/maintenance/section2deck4central)
"aGH" = (
@@ -29461,6 +29464,9 @@
/obj/structure/table/rack/shelf,
/obj/spawner/pouch,
/obj/spawner/pouch,
+/obj/effect/decal/cleanable/graffiti/graffiti_onestar{
+ pixel_y = 32
+ },
/turf/simulated/floor/tiled/techmaint_panels,
/area/eris/maintenance/section3deck1central)
"bsl" = (
@@ -33666,6 +33672,9 @@
/area/eris/security/lobby)
"bCC" = (
/obj/spawner/pack/machine,
+/obj/effect/decal/cleanable/graffiti/graffiti_techno{
+ pixel_y = 35
+ },
/turf/simulated/floor/tiled/steel/gray_perforated,
/area/eris/maintenance/section4deck4port)
"bCD" = (
@@ -70877,6 +70886,10 @@
dir = 4;
pixel_y = 8
},
+/obj/effect/decal/cleanable/graffiti{
+ pixel_x = -30;
+ pixel_y = 5
+ },
/turf/simulated/floor/tiled/techmaint,
/area/eris/maintenance/section1deck1central)
"dpk" = (
@@ -73990,6 +74003,9 @@
/obj/effect/decal/cleanable/dirt,
/obj/spawner/firstaid/low_chance,
/obj/spawner/firstaid/low_chance,
+/obj/effect/decal/cleanable/graffiti/graffiti_excelsior{
+ pixel_y = 33
+ },
/turf/simulated/floor/tiled/dark/panels,
/area/eris/maintenance/oldbridge)
"dwO" = (
@@ -74635,9 +74651,6 @@
/obj/machinery/light{
dir = 8
},
-/obj/machinery/status_display/supply_display{
- pixel_x = -32
- },
/turf/simulated/floor/carpet/bcarpet,
/area/eris/command/meeting_room)
"dyF" = (
@@ -83537,6 +83550,10 @@
/obj/spawner/pack/machine,
/obj/spawner/pack/tech_loot/low_chance,
/obj/spawner/pack/tech_loot/low_chance,
+/obj/effect/decal/cleanable/graffiti/graffiti_techno{
+ pixel_x = -25;
+ pixel_y = 5
+ },
/turf/simulated/floor/tiled/techmaint,
/area/eris/maintenance/section4deck1central)
"dVp" = (
@@ -87158,6 +87175,9 @@
dir = 1
},
/obj/landmark/storyevent/hidden_vent_antag,
+/obj/effect/decal/cleanable/graffiti{
+ pixel_y = 35
+ },
/turf/simulated/floor/tiled/dark/panels,
/area/eris/maintenance/oldbridge)
"eeq" = (
@@ -92595,6 +92615,7 @@
/obj/item/device/synthesized_instrument/guitar/multi,
/obj/item/device/synthesized_instrument/guitar,
/obj/item/device/synthesized_instrument/synthesizer,
+/obj/item/toy/plushie/fumo/bocchi,
/turf/simulated/floor/wood,
/area/eris/crew_quarters/clownoffice)
"erF" = (
@@ -99649,6 +99670,12 @@
"fFd" = (
/turf/simulated/floor/tiled/steel/monofloor,
/area/eris/quartermaster/hangarsupply)
+"fGN" = (
+/obj/effect/decal/cleanable/graffiti/graffiti_moebius{
+ pixel_y = 32
+ },
+/turf/simulated/floor/tiled/white/brown_platform,
+/area/eris/maintenance/section3deck1central)
"fHj" = (
/obj/effect/shuttle_landmark/pirate/deck3_cargo,
/turf/space,
@@ -99907,6 +99934,20 @@
},
/turf/simulated/floor/tiled/steel/bar_dance,
/area/holodeck/alphadeck)
+"gkk" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/effect/decal/cleanable/graffiti/graffiti_skull{
+ pixel_y = 35
+ },
+/turf/simulated/floor/plating/under,
+/area/eris/maintenance/section3deck2port)
"gkN" = (
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 1
@@ -100381,6 +100422,14 @@
},
/turf/simulated/floor/tiled/techmaint,
/area/eris/maintenance/section3deck1central)
+"hlo" = (
+/obj/structure/bed/chair,
+/obj/landmark/join/start/assistant,
+/obj/effect/decal/cleanable/graffiti/graffiti_doodle{
+ pixel_y = 35
+ },
+/turf/simulated/floor/tiled/steel/brown_perforated,
+/area/eris/maintenance/section3deck3starboard)
"hlV" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/structure/cable/green{
@@ -100520,6 +100569,12 @@
},
/turf/simulated/floor/carpet/bcarpet,
/area/eris/neotheology/office)
+"hzF" = (
+/obj/effect/decal/cleanable/graffiti{
+ pixel_y = 33
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/eris/maintenance/section3deck1central)
"hAw" = (
/obj/spawner/scrap/sparse/low_chance,
/turf/simulated/floor/plating/under,
@@ -101184,6 +101239,12 @@
},
/turf/simulated/floor/tiled/steel,
/area/eris/quartermaster/storage)
+"iVj" = (
+/obj/effect/decal/cleanable/graffiti/graffiti_heart{
+ pixel_y = 32
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/eris/maintenance/section3deck1central)
"iVN" = (
/obj/structure/closet/coffin,
/obj/machinery/light/small{
@@ -101230,6 +101291,20 @@
/obj/effect/shuttle_landmark/merc/engine,
/turf/space,
/area/space)
+"iXN" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/effect/decal/cleanable/graffiti/graffiti_doodle{
+ pixel_y = 35
+ },
+/turf/simulated/floor/plating/under,
+/area/eris/maintenance/section1deck4central)
"iXO" = (
/obj/structure/flora/ausbushes/stalkybush,
/turf/simulated/floor/grass,
@@ -101783,6 +101858,13 @@
},
/turf/simulated/floor/tiled/steel,
/area/eris/hallway/side/section3starboard)
+"kdj" = (
+/obj/structure/reagent_dispensers/fueltank/huge,
+/obj/effect/decal/cleanable/graffiti/graffiti_clown{
+ pixel_y = 35
+ },
+/turf/simulated/floor/tiled/techmaint_panels,
+/area/eris/maintenance/fueltankstorage)
"keu" = (
/turf/simulated/floor/tiled/white/golden,
/area/eris/neotheology/altar)
@@ -102369,6 +102451,7 @@
dir = 8
},
/obj/item/reagent_containers/food/drinks/mug/gold,
+/obj/item/stamp/nt,
/turf/simulated/floor/carpet/bcarpet,
/area/eris/neotheology/office)
"lCK" = (
@@ -102694,6 +102777,12 @@
},
/turf/simulated/floor/tiled/steel/techfloor,
/area/eris/engineering/foyer)
+"mro" = (
+/obj/effect/decal/cleanable/graffiti/graffiti_ancapno{
+ pixel_y = 35
+ },
+/turf/simulated/floor/plating/under,
+/area/eris/maintenance/section3deck2starboard)
"mrW" = (
/obj/structure/catwalk,
/turf/simulated/floor/plating/under,
@@ -102718,6 +102807,12 @@
},
/turf/simulated/floor/tiled/steel,
/area/eris/crew_quarters/kitchen)
+"mwt" = (
+/obj/effect/decal/cleanable/graffiti/graffiti_skull{
+ pixel_y = 33
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/eris/maintenance/section3deck2starboard)
"mxw" = (
/obj/structure/cable/green{
d1 = 2;
@@ -103090,27 +103185,7 @@
/turf/simulated/floor/tiled/techmaint,
/area/eris/maintenance/section4deck3port)
"nnj" = (
-/obj/structure/closet/wardrobe/color/pink,
-/obj/item/bikehorn,
-/obj/item/bikehorn,
-/obj/item/bikehorn,
-/obj/item/bikehorn,
-/obj/item/bikehorn,
-/obj/item/bikehorn,
-/obj/item/bikehorn,
-/obj/item/bikehorn,
-/obj/item/bikehorn,
-/obj/item/bikehorn,
-/obj/item/reagent_containers/spray/waterflower,
-/obj/item/reagent_containers/spray/waterflower,
-/obj/item/storage/fancy/crayons,
-/obj/item/storage/fancy/crayons,
-/obj/item/device/pda/clown,
-/obj/item/device/pda/clown,
-/obj/item/clothing/mask/gas/plaguedoctor,
-/obj/item/clothing/mask/gas/plaguedoctor,
-/obj/item/clothing/glasses/monocle,
-/obj/item/clothing/glasses/monocle,
+/obj/structure/closet/wardrobe/color/pink/artist,
/turf/simulated/floor/wood,
/area/eris/crew_quarters/clownoffice)
"npf" = (
@@ -103240,6 +103315,13 @@
},
/turf/simulated/floor/tiled/white,
/area/eris/medical/medbreak)
+"nJC" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/effect/decal/cleanable/graffiti/graffiti_onestar{
+ pixel_y = -25
+ },
+/turf/simulated/floor/plating/under,
+/area/eris/maintenance/section1deck1central)
"nJR" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -103437,6 +103519,13 @@
},
/turf/simulated/floor/tiled/white/golden,
/area/eris/neotheology/bioprinter)
+"ouh" = (
+/obj/structure/bed/padded,
+/obj/effect/decal/cleanable/graffiti/graffiti_skull{
+ pixel_y = 35
+ },
+/turf/simulated/floor/tiled/steel/brown_perforated,
+/area/eris/maintenance/section3deck3starboard)
"oup" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 9
@@ -103837,6 +103926,12 @@
"pbI" = (
/turf/simulated/floor/wood,
/area/eris/medical/psych)
+"pcf" = (
+/obj/effect/decal/cleanable/graffiti/graffiti_ironhammer{
+ pixel_y = 33
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/eris/maintenance/section1deck5central)
"pcs" = (
/obj/structure/table/standard,
/turf/simulated/floor/tiled/white,
@@ -103924,6 +104019,12 @@
},
/turf/simulated/floor/tiled/steel/bar_dance,
/area/holodeck/alphadeck)
+"pti" = (
+/obj/effect/decal/cleanable/graffiti/graffiti_excelsior{
+ pixel_y = -22
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/eris/maintenance/section4deck1central)
"ptn" = (
/obj/structure/cable/green{
d1 = 4;
@@ -104555,6 +104656,14 @@
/obj/structure/flora/ausbushes/brflowers,
/turf/simulated/floor/grass,
/area/eris/neotheology/chapelritualroom)
+"qNr" = (
+/obj/spawner/junk/low_chance,
+/obj/effect/decal/cleanable/graffiti/graffiti_clown{
+ pixel_x = -30;
+ pixel_y = 5
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/eris/maintenance/section3deck3port)
"qOs" = (
/obj/structure/lattice,
/obj/effect/window_lwall_spawn/smartspawn,
@@ -104740,6 +104849,16 @@
/obj/structure/closet/secure_closet/personal,
/turf/simulated/floor/tiled/white/brown_perforated,
/area/eris/crew_quarters/fitness)
+"rpd" = (
+/obj/machinery/conveyor/north{
+ id = "minetocargo"
+ },
+/obj/effect/decal/cleanable/graffiti/graffiti_ancapyes{
+ pixel_x = 25;
+ pixel_y = 5
+ },
+/turf/simulated/floor/plating/under,
+/area/eris/quartermaster/storage)
"rqg" = (
/obj/structure/closet/secure_closet/personal,
/obj/item/device/radio/intercom{
@@ -104953,6 +105072,12 @@
},
/turf/simulated/floor/plating,
/area/eris/crew_quarters/kitchen)
+"rTm" = (
+/obj/effect/decal/cleanable/graffiti/graffiti_kot{
+ pixel_y = 35
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/eris/maintenance/section1deck2central)
"rTs" = (
/turf/simulated/wall/r_wall,
/area/eris/crew_quarters/clubmanager)
@@ -104967,6 +105092,13 @@
},
/turf/simulated/floor/tiled/dark/golden,
/area/eris/neotheology/funeral)
+"rVy" = (
+/obj/effect/decal/cleanable/graffiti/graffiti_moebius{
+ pixel_x = 30;
+ pixel_y = 2
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/eris/maintenance/section2deck1port)
"rVB" = (
/obj/machinery/shower,
/obj/structure/curtain/open/shower,
@@ -105215,6 +105347,18 @@
/obj/spawner/tool_upgrade/low_chance,
/turf/simulated/floor/tiled/steel/techfloor_grid,
/area/eris/engineering/breakroom)
+"svW" = (
+/obj/structure/table/rack,
+/obj/item/device/lighting/glowstick/flare,
+/obj/item/device/lighting/glowstick/flare,
+/obj/spawner/pack/tech_loot,
+/obj/spawner/pack/tech_loot,
+/obj/spawner/lowkeyrandom/low_chance,
+/obj/effect/decal/cleanable/graffiti{
+ pixel_y = 35
+ },
+/turf/simulated/floor/tiled/techmaint_panels,
+/area/eris/hallway/main/section2)
"sxh" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
@@ -105440,6 +105584,12 @@
},
/turf/simulated/floor/tiled/dark/golden,
/area/eris/neotheology/funeral)
+"sRL" = (
+/obj/effect/decal/cleanable/graffiti{
+ pixel_y = 35
+ },
+/turf/simulated/floor/hull,
+/area/space)
"sUy" = (
/obj/structure/table/rack,
/obj/item/stack/cable_coil,
@@ -105608,8 +105758,8 @@
/obj/structure/table/woodentable,
/obj/item/gun/projectile/shotgun/doublebarrel,
/obj/item/reagent_containers/bonsai{
- pixel_x = 8;
- pixel_y = 16
+ pixel_x = 0;
+ pixel_y = 0
},
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 1
@@ -105673,6 +105823,13 @@
/obj/spawner/lowkeyrandom/low_chance,
/turf/simulated/floor/tiled/techmaint,
/area/eris/maintenance/section2deck1port)
+"ttu" = (
+/obj/spawner/material/ore/low_chance,
+/obj/effect/decal/cleanable/graffiti/graffiti_aster{
+ pixel_y = 33
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/eris/maintenance/section3deck4starboard)
"tuO" = (
/obj/structure/cable/green{
d1 = 4;
@@ -105837,6 +105994,26 @@
/obj/machinery/atmospherics/unary/vent_pump/on,
/turf/simulated/floor/tiled/steel,
/area/eris/quartermaster/hangarsupply)
+"tQD" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/effect/decal/cleanable/graffiti/graffiti_neotheo{
+ pixel_y = 35
+ },
+/turf/simulated/floor/plating/under,
+/area/eris/maintenance/section3deck5starboard)
"tQV" = (
/obj/spawner/junk/low_chance,
/turf/simulated/floor/plating/under,
@@ -106357,6 +106534,13 @@
"uYj" = (
/turf/simulated/wall/r_wall,
/area/eris/neotheology/bioprinter)
+"uYl" = (
+/obj/effect/decal/cleanable/graffiti/graffiti_carrion{
+ pixel_x = 25;
+ pixel_y = 5
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/eris/maintenance/section3deck1central)
"uZh" = (
/obj/structure/lattice,
/turf/simulated/open,
@@ -106617,6 +106801,12 @@
},
/turf/simulated/floor/tiled/steel,
/area/eris/quartermaster/hangarsupply)
+"vyY" = (
+/obj/effect/decal/cleanable/graffiti/graffiti_carrion{
+ pixel_y = 32
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/eris/maintenance/section3deck2starboard)
"vAE" = (
/turf/simulated/wall/r_wall,
/area/eris/crew_quarters/clownoffice)
@@ -106807,6 +106997,12 @@
/obj/structure/railing,
/turf/simulated/floor/plating/under,
/area/eris/maintenance/section3deck5port)
+"vTK" = (
+/obj/effect/decal/cleanable/graffiti/graffiti_heart{
+ pixel_y = 35
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/eris/maintenance/oldtele)
"vXK" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -107350,6 +107546,12 @@
"xld" = (
/turf/simulated/floor/tiled/steel/gray_platform,
/area/eris/engineering/engine_room)
+"xnE" = (
+/obj/effect/decal/cleanable/graffiti/graffiti_moebius{
+ pixel_y = 33
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/eris/maintenance/section2deck2starboard)
"xoj" = (
/obj/machinery/computer/jtb_console,
/turf/simulated/floor/tiled/dark/gray_perforated,
@@ -107388,6 +107590,23 @@
},
/turf/simulated/floor/wood,
/area/eris/medical/psych)
+"xue" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/graffiti/graffiti_ironhammer{
+ pixel_y = 35
+ },
+/turf/simulated/floor/plating/under,
+/area/eris/maintenance/section1deck4central)
"xuA" = (
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 8
@@ -107412,12 +107631,6 @@
},
/turf/simulated/floor/tiled/white/brown_platform,
/area/eris/medical/medbay/organs)
-"xwS" = (
-/obj/machinery/status_display/supply_display{
- pixel_x = -32
- },
-/turf/simulated/floor/tiled/steel,
-/area/eris/quartermaster/hangarsupply)
"xxi" = (
/obj/machinery/door/firedoor,
/obj/effect/window_lwall_spawn/smartspawn,
@@ -107460,6 +107673,13 @@
/obj/item/reagent_containers/food/drinks/flask/barflask,
/turf/simulated/floor/carpet/sblucarpet,
/area/eris/crew_quarters/clubmanager)
+"xAv" = (
+/obj/spawner/scrap,
+/obj/effect/decal/cleanable/graffiti/graffiti_ancapyes{
+ pixel_y = 33
+ },
+/turf/simulated/floor/tiled/steel/techfloor_grid,
+/area/eris/maintenance/section3deck4starboard)
"xAA" = (
/obj/structure/bed/psych,
/turf/simulated/floor/carpet,
@@ -121449,7 +121669,7 @@ aaa
aaa
acR
aqW
-arE
+kdj
asC
asX
asV
@@ -128348,7 +128568,7 @@ pVr
apn
bRh
arI
-bRN
+tQD
apn
aad
aad
@@ -130964,7 +131184,7 @@ ato
ato
ato
ato
-xwS
+ato
ato
fFd
atx
@@ -131315,7 +131535,7 @@ afs
afP
agE
dAp
-dzn
+pcf
dzi
dzi
dzi
@@ -165657,7 +165877,7 @@ beE
beE
beE
afs
-aVp
+iXN
aWc
csS
aXl
@@ -166469,7 +166689,7 @@ aVE
aWf
aWz
csS
-aYS
+xue
baa
cvH
csS
@@ -172995,7 +173215,7 @@ clH
clH
clH
clH
-clH
+rpd
clH
cgO
aaa
@@ -174819,7 +175039,7 @@ bVX
dtF
dtF
dtG
-dtF
+xAv
dtF
bVX
aaa
@@ -176824,7 +177044,7 @@ cqR
cqR
cqR
bVX
-dgh
+ttu
dgh
dgh
dgh
@@ -201264,7 +201484,7 @@ cxu
dRP
dSH
cAf
-ccz
+qNr
esO
duu
abF
@@ -216410,7 +216630,7 @@ dvd
dFG
dFG
dvd
-ewa
+hlo
dSb
ewg
dUi
@@ -217228,7 +217448,7 @@ dSi
dGQ
dOr
dvd
-dYC
+ouh
dUc
dRt
dZk
@@ -241288,7 +241508,7 @@ uiz
dKH
dKH
dNB
-abF
+sRL
abF
abF
abF
@@ -241453,7 +241673,7 @@ abF
dqI
dqI
dqI
-dZV
+gkk
edk
dqI
aaa
@@ -248947,7 +249167,7 @@ xOd
xOd
xOd
chY
-dqP
+mwt
dqP
dlI
dqI
@@ -249527,7 +249747,7 @@ dsG
dti
dth
bZc
-cSw
+svW
cPA
dmo
dmo
@@ -249913,7 +250133,7 @@ aaa
abF
abF
bdN
-beg
+xnE
cHT
beg
cPf
@@ -250106,7 +250326,7 @@ diJ
diJ
dek
dek
-bKI
+rTm
bPg
bPe
aaa
@@ -251079,7 +251299,7 @@ aaa
aaa
aaa
csc
-ctZ
+vTK
csc
aaa
aaa
@@ -252787,7 +253007,7 @@ azz
eqS
drm
ayQ
-dqP
+vyY
erd
ere
ere
@@ -253185,7 +253405,7 @@ efB
edX
eus
ebN
-ayD
+mro
ayQ
eBZ
eqT
@@ -281898,7 +282118,7 @@ aaa
ekU
elK
elP
-eho
+pti
ehk
ehk
ehk
@@ -284692,7 +284912,7 @@ aLZ
boS
eqI
boS
-cNH
+hzF
btZ
aCh
boS
@@ -285252,7 +285472,7 @@ dFh
dFh
dFh
dFh
-dFh
+nJC
dHe
dIG
doD
@@ -288703,7 +288923,7 @@ amc
amc
aof
amc
-amc
+rVy
amQ
efd
efY
@@ -288726,7 +288946,7 @@ aRx
aYk
bdz
boS
-cNH
+iVj
ezN
ezY
eAe
@@ -296417,7 +296637,7 @@ aQV
bvO
cNH
boS
-boF
+fGN
boF
boS
boS
@@ -297214,7 +297434,7 @@ blt
dXi
bov
cNH
-cNH
+uYl
cNH
cNH
cNH
diff --git a/maps/CEVEris/centcomm.dmm b/maps/CEVEris/centcomm.dmm
index 74b4fcd7a4..161b7dbfee 100644
--- a/maps/CEVEris/centcomm.dmm
+++ b/maps/CEVEris/centcomm.dmm
@@ -87,26 +87,9 @@
},
/turf/simulated/floor/tiled/dark/gray_platform,
/area/centcom/evac)
-"aF" = (
-/turf/unsimulated/wall,
-/area/centcom/suppy)
"aI" = (
/turf/simulated/floor/holofloor/tiled/dark,
/area/holodeck/source/industrial)
-"aO" = (
-/turf/unsimulated/floor{
- icon_state = "plating";
- name = "plating"
- },
-/area/centcom/suppy)
-"aP" = (
-/turf/unsimulated/wall{
- desc = "That looks like it doesn't open easily.";
- icon = 'icons/obj/doors/rapid_pdoor.dmi';
- icon_state = "pdoor1";
- name = "Shuttle Bay Blast Door"
- },
-/area/centcom/suppy)
"aR" = (
/obj/structure/table/bar_special,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
@@ -162,277 +145,21 @@
/obj/effect/floor_decal/industrial/danger,
/turf/simulated/floor/holofloor/reinforced,
/area/space)
-"bd" = (
-/obj/structure/shuttle_part/cargo{
- icon_state = "cargoshwall8"
- },
-/turf/space,
-/area/supply/dock)
-"be" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall7"
- },
-/area/supply/dock)
-"bf" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall6"
- },
-/area/supply/dock)
-"bg" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall5"
- },
-/area/supply/dock)
-"bh" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall4"
- },
-/area/supply/dock)
-"bi" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall3"
- },
-/area/supply/dock)
-"bj" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall2"
- },
-/area/supply/dock)
-"bk" = (
-/turf/simulated/shuttle/wall/cargo,
-/area/supply/dock)
"bt" = (
/obj/structure/railing/holorailing/grey,
/turf/simulated/open/holonofloor,
/area/holodeck/source/wireframe)
-"bv" = (
-/obj/structure/shuttle_part/cargo{
- icon_state = "cargoshwall9"
- },
-/turf/space,
-/area/supply/dock)
-"bw" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall10"
- },
-/area/supply/dock)
-"bx" = (
-/obj/machinery/light{
- dir = 8;
- icon_state = "tube1";
- pixel_y = 0
- },
-/turf/simulated/shuttle/floor{
- icon_state = "cargofloor1";
- name = "Cargo Transport Shuttle (A5)"
- },
-/area/supply/dock)
-"by" = (
-/turf/simulated/shuttle/floor{
- icon_state = "cargofloor1";
- name = "Cargo Transport Shuttle (A5)"
- },
-/area/supply/dock)
-"bz" = (
-/obj/machinery/embedded_controller/radio/simple_docking_controller{
- frequency = 1380;
- id_tag = "supply_shuttle";
- pixel_x = 0;
- pixel_y = 25;
- req_one_access = list(13,31);
- tag_door = "supply_shuttle_hatch"
- },
-/turf/simulated/shuttle/floor{
- icon_state = "cargofloor1";
- name = "Cargo Transport Shuttle (A5)"
- },
-/area/supply/dock)
-"bA" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall11"
- },
-/area/supply/dock)
"bI" = (
/obj/structure/cryofeed,
/turf/simulated/floor/tiled/dark/gray_platform,
/area/centcom/evac)
-"bJ" = (
-/obj/structure/shuttle_part/cargo{
- icon_state = "cargoshwall12"
- },
-/turf/space,
-/area/supply/dock)
-"bK" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall13"
- },
-/area/supply/dock)
-"bL" = (
-/obj/machinery/conveyor/east{
- id = "QMLoad"
- },
-/turf/simulated/shuttle/floor{
- icon_state = "cargofloor1";
- name = "Cargo Transport Shuttle (A5)"
- },
-/area/supply/dock)
-"bM" = (
-/obj/machinery/door/airlock/maintenance{
- frequency = 1380;
- icon_state = "door_locked";
- id_tag = "supply_shuttle_hatch";
- locked = 1;
- name = "Shuttle Hatch";
- req_access = list(13)
- },
-/obj/machinery/conveyor/east{
- id = "QMLoad"
- },
-/turf/simulated/shuttle/floor{
- icon_state = "cargofloor1";
- name = "Cargo Transport Shuttle (A5)"
- },
-/area/supply/dock)
-"bT" = (
-/obj/structure/shuttle_part/cargo{
- icon_state = "cargoshwall14"
- },
-/turf/space,
-/area/supply/dock)
-"bU" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall15"
- },
-/area/supply/dock)
-"bV" = (
-/turf/simulated/shuttle/floor{
- icon_state = "cargofloor3";
- name = "Cargo Transport Shuttle (A5)"
- },
-/area/supply/dock)
-"bW" = (
-/obj/machinery/door/airlock/maintenance{
- frequency = 1380;
- icon_state = "door_locked";
- id_tag = "supply_shuttle_hatch";
- locked = 1;
- name = "Shuttle Hatch";
- req_access = list(13)
- },
-/turf/simulated/shuttle/floor{
- icon_state = "cargofloor1";
- name = "Cargo Transport Shuttle (A5)"
- },
-/area/supply/dock)
-"cd" = (
-/obj/structure/shuttle_part/cargo{
- icon_state = "cargoshwall16"
- },
-/turf/space,
-/area/supply/dock)
-"ce" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall17"
- },
-/area/supply/dock)
-"cf" = (
-/obj/effect/shuttle_landmark/supply/centcom,
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall18"
- },
-/area/supply/dock)
"cg" = (
/turf/simulated/floor/tiled/dark/gray_perforated,
/area/holodeck/source/industrial_arena)
-"ck" = (
-/obj/structure/shuttle_part/cargo{
- icon_state = "cargoshwall19"
- },
-/turf/space,
-/area/supply/dock)
-"cl" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall20"
- },
-/area/supply/dock)
"cq" = (
/obj/machinery/cryopod,
/turf/simulated/floor/tiled/dark/gray_platform,
/area/centcom/evac)
-"cs" = (
-/obj/structure/shuttle_part/cargo{
- icon_state = "cargoshwall21"
- },
-/turf/space,
-/area/supply/dock)
-"ct" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall22"
- },
-/area/supply/dock)
-"cu" = (
-/obj/machinery/light{
- dir = 8
- },
-/turf/simulated/shuttle/floor{
- icon_state = "cargofloor1";
- name = "Cargo Transport Shuttle (A5)"
- },
-/area/supply/dock)
-"cv" = (
-/turf/simulated/shuttle/floor{
- icon_state = "cargofloor5";
- name = "Cargo Transport Shuttle (A5)"
- },
-/area/supply/dock)
-"cw" = (
-/obj/machinery/conveyor/west{
- id = "QMLoad2"
- },
-/turf/simulated/shuttle/floor{
- icon_state = "cargofloor1";
- name = "Cargo Transport Shuttle (A5)"
- },
-/area/supply/dock)
-"cx" = (
-/obj/machinery/door/airlock/maintenance{
- frequency = 1380;
- icon_state = "door_locked";
- id_tag = "supply_shuttle_hatch";
- locked = 1;
- name = "Shuttle Hatch";
- req_access = list(13)
- },
-/obj/machinery/conveyor/west{
- id = "QMLoad2"
- },
-/turf/simulated/shuttle/floor{
- icon_state = "cargofloor1";
- name = "Cargo Transport Shuttle (A5)"
- },
-/area/supply/dock)
-"cA" = (
-/obj/structure/shuttle_part/cargo{
- icon_state = "cargoshwall23"
- },
-/turf/space,
-/area/supply/dock)
-"cB" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall24"
- },
-/area/supply/dock)
-"cC" = (
-/turf/simulated/shuttle/floor{
- icon_state = "cargofloor6";
- name = "Cargo Transport Shuttle (A5)"
- },
-/area/supply/dock)
-"cD" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall25"
- },
-/area/supply/dock)
"cE" = (
/obj/structure/railing/holorailing,
/turf/simulated/floor/holofloor/tiled/dark,
@@ -466,47 +193,6 @@
"cN" = (
/turf/simulated/floor/tiled/dark/golden,
/area/centcom/evac)
-"cW" = (
-/obj/structure/shuttle_part/cargo{
- icon_state = "cargoshwall26"
- },
-/turf/space,
-/area/supply/dock)
-"cX" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall27"
- },
-/area/supply/dock)
-"cY" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall28"
- },
-/area/supply/dock)
-"cZ" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall29"
- },
-/area/supply/dock)
-"da" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall30"
- },
-/area/supply/dock)
-"db" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall31"
- },
-/area/supply/dock)
-"dc" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall32"
- },
-/area/supply/dock)
-"dd" = (
-/turf/simulated/shuttle/wall/cargo{
- icon_state = "cargoshwall33"
- },
-/area/supply/dock)
"dj" = (
/obj/machinery/light{
dir = 1
@@ -538,54 +224,6 @@
/obj/structure/bed/chair/wood,
/turf/simulated/floor/tiled/dark/gray_platform,
/area/centcom/evac)
-"dq" = (
-/obj/structure/shuttle_part/cargo{
- icon_state = "cargoshwall34"
- },
-/turf/space,
-/area/supply/dock)
-"dr" = (
-/obj/structure/shuttle_part/cargo{
- icon_state = "cargoshwall35"
- },
-/turf/space,
-/area/supply/dock)
-"ds" = (
-/obj/structure/shuttle_part/cargo{
- icon_state = "cargoshwall36"
- },
-/turf/space,
-/area/supply/dock)
-"dt" = (
-/obj/structure/shuttle_part/cargo{
- icon_state = "cargoshwall37"
- },
-/turf/space,
-/area/supply/dock)
-"du" = (
-/obj/structure/shuttle_part/cargo{
- icon_state = "cargoshwall38"
- },
-/turf/space,
-/area/supply/dock)
-"dv" = (
-/obj/structure/shuttle_part/cargo{
- icon_state = "cargoshwall39"
- },
-/turf/space,
-/area/supply/dock)
-"dw" = (
-/obj/structure/shuttle_part/cargo{
- icon_state = "cargoshwall40"
- },
-/turf/space,
-/area/supply/dock)
-"dx" = (
-/obj/structure/shuttle_part/cargo{
- icon_state = "cargoshwall41"
- },
-/turf/space,
-/area/supply/dock)
"dz" = (
/obj/structure/lattice,
/turf/simulated/open/holonofloor,
@@ -2719,7 +2357,7 @@
/obj/machinery/door/blast/regular{
density = 0;
icon_state = "pdoor0";
- id = "smindicate";
+ id = "serbianmerc";
name = "Outer Airlock";
opacity = 0
},
@@ -2760,7 +2398,7 @@
/obj/structure/table/standard,
/obj/machinery/computer/pod/old/syndicate{
dir = 4;
- id = "smindicate"
+ id = "serbianmerc"
},
/obj/machinery/door/window{
dir = 4;
@@ -6585,7 +6223,7 @@
/obj/machinery/door/blast/regular{
density = 0;
icon_state = "pdoor0";
- id = "smindicate";
+ id = "serbianmerc";
name = "Outer Airlock";
opacity = 0
},
@@ -6839,7 +6477,7 @@
/obj/machinery/vending/assist{
contraband = null;
name = "AntagCorpVend";
- products = list(/obj/item/device/assembly/prox_sensor=5,/obj/item/device/assembly/signaler=4,/obj/item/device/assembly/infra=4,/obj/item/device/assembly/prox_sensor=4,/obj/item/handcuffs=8,/obj/item/device/flash=4,/obj/item/cartridge/signal=4,/obj/item/clothing/glasses/sunglasses=4)
+ products = list(/obj/item/device/assembly/prox_sensor=5,/obj/item/device/assembly/signaler=4,/obj/item/device/assembly/infra=4,/obj/item/device/assembly/prox_sensor=4,/obj/item/handcuffs=8,/obj/item/device/flash=4,/obj/item/clothing/glasses/sunglasses=4)
},
/obj/machinery/light{
dir = 4
@@ -25324,21 +24962,21 @@ aa
aa
aa
aa
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
-aF
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -25526,21 +25164,21 @@ aa
aa
aa
aa
-aF
-aO
-aO
-aO
-aO
-aO
-aO
-aO
-aO
-aO
-aO
-aO
-aO
-aO
-aF
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -25728,21 +25366,21 @@ aa
aa
aa
aa
-aF
-aO
-bd
-bv
-bJ
-bT
-cd
-ck
-cs
-cA
-cW
-dq
-aO
-aO
-aF
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -25930,21 +25568,21 @@ aa
aa
aa
aa
-aF
-aO
-be
-bw
-bK
-bU
-ce
-cl
-ct
-cB
-cX
-dr
-aO
-aO
-aF
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -26132,21 +25770,21 @@ aa
aa
aa
aa
-aF
-aO
-bf
-bx
-by
-by
-by
-by
-cu
-by
-cY
-ds
-aO
-aO
-aF
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -26334,21 +25972,21 @@ aa
aa
aa
aa
-aF
-aO
-bg
-by
-by
-by
-by
-by
-by
-by
-cZ
-dt
-aO
-aO
-aF
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -26536,21 +26174,21 @@ aa
aa
aa
aa
-aF
-aO
-bh
-bz
-by
-by
-by
-by
-cv
-cC
-da
-du
-aO
-aO
-aF
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -26738,21 +26376,21 @@ aa
aa
aa
aa
-aF
-aO
-bi
-by
-by
-by
-by
-by
-by
-by
-db
-dv
-aO
-aO
-aF
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -26940,21 +26578,21 @@ aa
aa
aa
aa
-aF
-aO
-bj
-by
-bL
-bV
-by
-bV
-cw
-by
-dc
-dw
-aO
-aO
-aF
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -27142,21 +26780,21 @@ aa
aa
aa
aa
-aF
-aO
-bk
-bA
-bM
-bW
-cf
-bW
-cx
-cD
-dd
-dx
-aO
-aO
-aF
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -27344,21 +26982,21 @@ aa
aa
aa
aa
-aF
-aO
-aO
-aO
-aO
-aO
-aO
-aO
-aO
-aO
-aO
-aO
-aO
-aO
-aF
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
@@ -27546,21 +27184,21 @@ aa
aa
aa
aa
-aF
-aP
-aP
-aP
-aP
-aP
-aP
-aP
-aP
-aP
-aP
-aP
-aP
-aP
-aF
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
+aa
aa
aa
aa
diff --git a/maps/CEVEris/shuttles-eris.dm b/maps/CEVEris/shuttles-eris.dm
index 181ad70a3e..4cb8904f2c 100644
--- a/maps/CEVEris/shuttles-eris.dm
+++ b/maps/CEVEris/shuttles-eris.dm
@@ -302,17 +302,6 @@
icon_state = "shuttle-red"
landmark_tag = "nav_merc_sec3east5"
-//Cargo shuttle
-
-/datum/shuttle/autodock/ferry/supply/drone
- name = "Supply Shuttle"
- location = 1
- warmup_time = 10
- shuttle_area = /area/supply/dock
- waypoint_offsite = "nav_cargo_start"
- waypoint_station = "nav_cargo_vessel"
- default_docking_controller = "supply_shuttle"
-
/obj/effect/shuttle_landmark/supply/centcom
name = "Centcom"
landmark_tag = "nav_cargo_start"
diff --git a/nano/templates/pda.tmpl b/nano/templates/pda.tmpl
index a0e7c28ff5..1210cbaabf 100644
--- a/nano/templates/pda.tmpl
+++ b/nano/templates/pda.tmpl
@@ -122,7 +122,6 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm
{{:helper.link('Security Records', 'gear', {'choice' : "45"}, null, 'fixedLeftWide')}}
- {{if data.cartridge.radio ==1}} {{:helper.link('Security Bot Access', 'gear', {'choice' : "46"}, null, 'fixedLeftWide')}} {{/if}}
@@ -135,7 +134,6 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm
{{:helper.link('Supply Records', 'gear', {'choice' : "47"}, null, 'fixedLeftWide')}}
- {{if data.cartridge.radio == 3}} {{:helper.link('Delivery Bot Control', 'gear', {'choice' : "48"}, null, 'fixedLeftWide')}} {{/if}}
@@ -155,8 +153,6 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm
{{if data.cartridge.access.access_janitor==1}}
{{:helper.link('Custodial Locator', 'gear', {'choice' : "49"}, null, 'fixedLeftWide')}}
{{/if}}
- {{if data.cartridge.radio == 2}}
- {{:helper.link('Signaler System', 'gear', {'choice' : "40"}, null, 'fixedLeftWide')}}
{{/if}}
{{if data.cartridge.access.access_reagent_scanner==1}}
{{:helper.link(data.scanmode == 3 ? 'Disable Reagent Scanner' : 'Enable Reagent Scanner', 'gear', {'choice' : "Reagent Scan"}, null, 'fixedLeftWider')}}
@@ -208,99 +204,6 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm
- {{else data.mode == 2}}
- SpaceMessenger V4.0.1
-
-
- Messenger Functions:
-
-
- {{:helper.link(data.message_silent==1 ? 'Ringer: Off' : 'Ringer: On', data.message_silent==1 ? 'volume-off' : 'volume-on', {'choice' : "Toggle Ringer"}, null, 'fixedLeftWide')}}
- {{:helper.link(data.toff==1 ? 'Messenger: Off' : 'Messenger: On',data.toff==1 ? 'close':'check', {'choice' : "Toggle Messenger"}, null, 'fixedLeftWide')}}
- {{:helper.link('Set Ringtone', 'comment', {'choice' : "Ringtone"}, null, 'fixedLeftWide')}}
- {{:helper.link('Delete all Conversations', 'trash', {'choice' : "Clear", 'option' : "All"}, null, 'fixedLeftWider')}}
-
-
- {{if data.toff == 0}}
-
- {{if data.cartridge}}
- {{if data.cartridge.charges}}
-
- {{:data.cartridge.charges}}
- {{if data.cartridge.access.access_detonate_pda}} detonation charges left. {{/if}}
- {{if data.cartridge.access.access_clown || data.cartridge.access.access_mime}} viral files left. {{/if}}
-
-
-
- {{/if}}
- {{/if}}
-
- {{if data.pda_count == 0}}
- No other PDAS located
- {{else}}
- Current Conversations
- {{for data.convopdas}}
-
- {{:helper.link(value.Name, 'circle-arrow-s', {'choice' : "Select Conversation", 'convo' : value.Reference } , null, value.fixedLeftWider)}}
- {{if data.cartridge}}
- {{if data.cartridge.access.access_detonate_pda && value.Detonate}}
- {{:helper.link('*Detonate*', 'radiation', {'choice' : "Detonate", 'target' : value.Reference}, null, 'fixedLeft')}}
- {{/if}}
- {{if data.cartridge.access.access_clown}}
- {{:helper.link('*Send Virus*', 'star', {'choice' : "Send Honk", 'target' : value.Reference}, null, 'fixedLeft')}}
- {{/if}}
- {{if data.cartridge.access.access_mime}}
- {{:helper.link('*Send Virus*', 'circle-arrow-s', {'choice' : "Send Silence", 'target' : value.Reference}, null, 'fixedLeft')}}
- {{/if}}
- {{/if}}
-
- {{/for}}
- Other PDAs
- {{for data.pdas}}
-
- {{:helper.link(value.Name, 'circle-arrow-s', {'choice' : "Message", 'target' : value.Reference}, null, value.fixedLeftWider)}}
- {{if data.cartridge}}
- {{if data.cartridge.access.access_detonate_pda && value.Detonate}} {{:helper.link('*Detonate*', 'radiation', {'choice' : "Detonate", 'target' : value.Reference}, null, 'fixedLeft')}} {{/if}}
- {{if data.cartridge.access.access_clown}} {{:helper.link('*Send Virus*', 'star', {'choice' : "Send Honk", 'target' : value.Reference}, null, 'fixedLeft')}} {{/if}}
- {{if data.cartridge.access.access_mime}} {{:helper.link('*Send Virus*', 'circle-arrow-s', {'choice' : "Send Silence", 'target' : value.Reference}, null, 'fixedLeft')}} {{/if}}
- {{/if}}
-
- {{/for}}
- {{/if}}
- {{/if}}
-
-
- {{else data.mode == 21}}
- SpaceMessenger V4.0.1
-
-
- Messenger Functions:
-
-
- {{:helper.link('Delete Conversation', 'trash', {'choice' : "Clear", 'option' : "Convo"}, null, 'fixedLeftWide')}}
-
-
-
-
- Conversation with: {{:data.convo_name}} ({{:data.convo_job}})
-
-
-
- {{for data.messages}}
- {{if data.active_conversation == value.target}}
- {{if value.sent==0}}
- Them: {{:value.message}}
- {{else}}
- You: {{:value.message}}
- {{/if}}
- {{/if}}
- {{/for}}
-
-
-
- {{:helper.link('Reply', 'comment', {'choice' : "Message", 'target': data.active_conversation}, null, 'fixedLeft')}}
-
-
{{else data.mode== 41}}
diff --git a/code/modules/paperwork/faxmachine.dm b/oldcode/faxmachine.dm
similarity index 100%
rename from code/modules/paperwork/faxmachine.dm
rename to oldcode/faxmachine.dm
diff --git a/sound/voice/bear_aww.ogg b/sound/voice/bear_aww.ogg
new file mode 100644
index 0000000000..67c7667f9b
Binary files /dev/null and b/sound/voice/bear_aww.ogg differ
diff --git a/sound/voice/bear_growl.ogg b/sound/voice/bear_growl.ogg
new file mode 100644
index 0000000000..9af246eacf
Binary files /dev/null and b/sound/voice/bear_growl.ogg differ
diff --git a/sound/voice/bear_roar.ogg b/sound/voice/bear_roar.ogg
new file mode 100644
index 0000000000..69306188ea
Binary files /dev/null and b/sound/voice/bear_roar.ogg differ
diff --git a/tools/ci/annotate_dm.py b/tools/ci/annotate_dm.py
new file mode 100644
index 0000000000..2fbe7375d9
--- /dev/null
+++ b/tools/ci/annotate_dm.py
@@ -0,0 +1,51 @@
+import sys
+import re
+import os.path as path
+
+# Usage: python3 annotate_dm.py [filename]
+# If filename is not provided, stdin is checked instead
+
+def red(text):
+ return "\033[31m" + str(text) + "\033[0m"
+
+def green(text):
+ return "\033[32m" + str(text) + "\033[0m"
+
+def yellow(text):
+ return "\033[33m" + str(text) + "\033[0m"
+
+def annotate(raw_output):
+ # Remove ANSI escape codes
+ raw_output = re.sub(r'(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]', '', raw_output)
+
+ print("::group::DreamChecker Output")
+ print(raw_output)
+ print("::endgroup::")
+
+ annotation_regex = r'(?P.*?), line (?P\d+), column (?P\d+):\s{1,2}(?Perror|warning): (?P.*)'
+ has_issues = False
+
+ print("DM Code Annotations:")
+ for annotation in re.finditer(annotation_regex, raw_output):
+ print(f"::{annotation['type']} file={annotation['filename']},line={annotation['line']},col={annotation['column']}::{annotation['message']}")
+ has_issues = True
+
+ if not has_issues:
+ print(green("No DM issues found"))
+
+def main():
+ if len(sys.argv) > 1:
+ if not path.exists(sys.argv[1]):
+ print(red(f"Error: Annotations file '{sys.argv[1]}' does not exist"))
+ sys.exit(1)
+ with open(sys.argv[1], 'r') as f:
+ annotate(f.read())
+ elif not sys.stdin.isatty():
+ annotate(sys.stdin.read())
+ else:
+ print(red("Error: No input provided"))
+ print("Usage: tools/ci/annotate_dm.sh [filename]")
+ sys.exit(1)
+
+if __name__ == '__main__':
+ main()
diff --git a/tools/ci/annotate_dm.sh b/tools/ci/annotate_dm.sh
new file mode 100644
index 0000000000..e387cdabff
--- /dev/null
+++ b/tools/ci/annotate_dm.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+set -euo pipefail
+tools/bootstrap/python tools/ci/annotate_dm.py "$@"
\ No newline at end of file
diff --git a/tools/ci/od_lints.dm b/tools/ci/od_lints.dm
new file mode 100644
index 0000000000..8be2279232
--- /dev/null
+++ b/tools/ci/od_lints.dm
@@ -0,0 +1,33 @@
+//1000-1999
+#pragma FileAlreadyIncluded error
+#pragma MissingIncludedFile error
+#pragma MisplacedDirective error
+#pragma UndefineMissingDirective error
+#pragma DefinedMissingParen error
+#pragma ErrorDirective error
+#pragma WarningDirective warning
+#pragma MiscapitalizedDirective error
+
+//2000-2999
+#pragma SoftReservedKeyword error
+#pragma DuplicateVariable error
+#pragma DuplicateProcDefinition error
+#pragma TooManyArguments error
+#pragma PointlessParentCall error
+#pragma PointlessBuiltinCall error
+#pragma SuspiciousMatrixCall error
+#pragma FallbackBuiltinArgument error
+#pragma MalformedRange error
+#pragma InvalidRange error
+#pragma InvalidSetStatement error
+#pragma InvalidOverride error
+#pragma DanglingVarType error
+#pragma MissingInterpolatedExpression error
+#pragma AmbiguousResourcePath error
+
+//3000-3999
+#pragma EmptyBlock error
+#pragma EmptyProc disabled
+#pragma UnsafeClientAccess disabled
+#pragma SuspiciousSwitchCase error
+#pragma AssignmentInConditional error
\ No newline at end of file
"
@@ -272,12 +219,6 @@
src.emag = 0
update_icon()
-/obj/machinery/computer/message_monitor/proc/ResetMessage()
- customsender = "System Administrator"
- customrecepient = null
- custommessage = "This is a test, please ignore."
- customjob = "Admin"
-
/obj/machinery/computer/message_monitor/Topic(href, href_list)
if(..())
return 1
@@ -313,22 +254,6 @@
else
message = noserver
- //View the logs - KEY REQUIRED
- if (href_list["view"])
- if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
- message = noserver
- else
- if(auth)
- src.screen = 1
-
- //Clears the logs - KEY REQUIRED
- if (href_list["clear"])
- if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
- message = noserver
- else
- if(auth)
- src.linkedServer.pda_msgs = list()
- message = SPAN_NOTICE("NOTICE: Logs cleared.")
//Clears the request console logs - KEY REQUIRED
if (href_list["clearr"])
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
@@ -367,15 +292,6 @@
spawn(100*length(src.linkedServer.decryptkey))
if(src && src.linkedServer && usr)
BruteForce(usr)
- //Delete the log.
- if (href_list["delete"])
- //Are they on the view logs screen?
- if(screen == 1)
- if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
- message = noserver
- else //if(istype(href_list["delete"], /datum/data_pda_msg))
- src.linkedServer.pda_msgs -= locate(href_list["delete"])
- message = SPAN_NOTICE("NOTICE: Log Deleted!")
//Delete the request console log.
if (href_list["deleter"])
//Are they on the view logs screen?
@@ -385,85 +301,6 @@
else //if(istype(href_list["delete"], /datum/data_pda_msg))
src.linkedServer.rc_msgs -= locate(href_list["deleter"])
message = SPAN_NOTICE("NOTICE: Log Deleted!")
- //Create a custom message
- if (href_list["msg"])
- if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
- message = noserver
- else
- if(auth)
- src.screen = 3
- //Fake messaging selection - KEY REQUIRED
- if (href_list["select"])
- if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
- message = noserver
- screen = 0
- else
- switch(href_list["select"])
-
- //Reset
- if("Reset")
- ResetMessage()
-
- //Select Your Name
- if("Sender")
- customsender = sanitize(input(usr, "Please enter the sender's name.") as text|null)
-
- //Select Receiver
- if("Recepient")
- //Get out list of viable PDAs
- var/list/obj/item/device/pda/sendPDAs = list()
- for(var/obj/item/device/pda/P in PDAs)
- if(!P.owner || P.toff || P.hidden) continue
- sendPDAs += P
- if(PDAs && PDAs.len > 0)
- customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sortNames(sendPDAs)
- else
- customrecepient = null
-
- //Enter custom job
- if("RecJob")
- customjob = sanitize(input(usr, "Please enter the sender's job.") as text|null)
-
- //Enter message
- if("Message")
- custommessage = input(usr, "Please enter your message.") as text|null
- custommessage = sanitize(custommessage)
-
- //Send message
- if("Send")
-
- if(isnull(customsender) || customsender == "")
- customsender = "UNKNOWN"
-
- if(isnull(customrecepient))
- message = SPAN_NOTICE("NOTICE: No recepient selected!")
- return src.attack_hand(usr)
-
- if(isnull(custommessage) || custommessage == "")
- message = SPAN_NOTICE("NOTICE: No message entered!")
- return src.attack_hand(usr)
-
- var/obj/item/device/pda/PDARec
- for (var/obj/item/device/pda/P in PDAs)
- if (!P.owner || P.toff || P.hidden) continue
- if(P.owner == customsender)
- PDARec = P
- //Sender isn't faking as someone who exists
- if(isnull(PDARec))
- src.linkedServer.send_pda_message("[customrecepient.owner]", "[customsender]","[custommessage]")
- customrecepient.new_message(customsender, customsender, customjob, custommessage)
- //Sender is faking as someone who exists
- else
-
- src.linkedServer.send_pda_message("[customrecepient.owner]", "[PDARec.owner]","[custommessage]")
- customrecepient.tnote.Add(list(list("sent" = 0, "owner" = "[PDARec.owner]", "job" = "[customjob]", "message" = "[custommessage]", "target" ="\ref[PDARec]")))
-
- if(!customrecepient.conversations.Find("\ref[PDARec]"))
- customrecepient.conversations.Add("\ref[PDARec]")
-
- customrecepient.new_message(PDARec, custommessage)
- //Finally..
- ResetMessage()
//Request Console Logs - KEY REQUIRED
if(href_list["viewr"])
@@ -475,25 +312,6 @@
//usr << href_list["select"]
- if(href_list["spam"])
- if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
- message = noserver
- else
- if(auth)
- src.screen = 5
-
- if(href_list["addtoken"])
- if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
- message = noserver
- else
- src.linkedServer.spamfilter += input(usr,"Enter text you want to be filtered out","Token creation") as text|null
-
- if(href_list["deltoken"])
- if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
- message = noserver
- else
- var/tokennum = text2num(href_list["deltoken"])
- src.linkedServer.spamfilter.Cut(tokennum,tokennum+1)
if (href_list["back"])
src.screen = 0
diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm
index 824b084d4b..ccc20593cb 100644
--- a/code/game/machinery/computer/pod.dm
+++ b/code/game/machinery/computer/pod.dm
@@ -19,7 +19,6 @@
for(var/obj/machinery/mass_driver/M in world)
if(M.id == id)
connected = M
- else
return
return
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 62cd2c4e95..e8380dbe66 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -206,7 +206,6 @@
dat += text("
", dat), "window=secure_rec;size=600x400")
@@ -599,7 +598,6 @@ What a mess.*/
for(var/datum/data/record/R in data_core.medical)
if ((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
qdel(R)
- else
qdel(active1)
if (active2)
qdel(active2)
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index a826c183cf..79395c8672 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -192,7 +192,7 @@ for reference:
name = "deployable barrier"
desc = "A deployable barrier. Swipe your ID card to lock/unlock it."
icon = 'icons/obj/objects.dmi'
- commonLore = "These models haven't changed a bit since 2431. The last known model used by NanoTransen before the collapse."
+ commonLore = "These models haven't changed a bit since 2431. The last known model used by nanotrasen before the collapse."
anchored = FALSE
density = TRUE
icon_state = "barrier0"
diff --git a/code/game/machinery/excelsior/ex_turret.dm b/code/game/machinery/excelsior/ex_turret.dm
index bfc7c09910..039cc44e94 100644
--- a/code/game/machinery/excelsior/ex_turret.dm
+++ b/code/game/machinery/excelsior/ex_turret.dm
@@ -4,7 +4,7 @@
/obj/machinery/porta_turret/excelsior
icon = 'icons/obj/machines/excelsior/turret.dmi'
- desc = "A fully automated anti infantry platform. Fires 7.62mm rounds"
+ desc = "A fully automated anti infantry platform. Fires .30 caliber rounds"
icon_state = "turret_legs"
density = TRUE
lethal = TRUE
diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm
index b15349e416..ad05026387 100644
--- a/code/game/machinery/status_display.dm
+++ b/code/game/machinery/status_display.dm
@@ -171,18 +171,6 @@
return ""
return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]"
-/obj/machinery/status_display/proc/get_supply_shuttle_timer()
- var/datum/shuttle/autodock/ferry/supply/shuttle = SSsupply.shuttle
- if (!shuttle)
- return "Error"
-
- if(shuttle.has_arrive_time())
- var/timeleft = round((shuttle.arrive_time - world.time) / 10,1)
- if(timeleft < 0)
- return "Late"
- return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]"
- return ""
-
/obj/machinery/status_display/proc/remove_display()
if(overlays.len)
overlays.Cut()
diff --git a/code/game/machinery/supply_display.dm b/code/game/machinery/supply_display.dm
deleted file mode 100644
index 26e3dcab62..0000000000
--- a/code/game/machinery/supply_display.dm
+++ /dev/null
@@ -1,34 +0,0 @@
-/obj/machinery/status_display/supply_display
- ignore_friendc = 1
-
-/obj/machinery/status_display/supply_display/update()
- if(!..() && mode == STATUS_DISPLAY_CUSTOM)
- message1 = "CARGO"
- message2 = ""
-
- var/datum/shuttle/autodock/ferry/supply/shuttle = SSsupply.shuttle
- if (!shuttle)
- message2 = "Error"
- else if(shuttle.has_arrive_time())
- message2 = get_supply_shuttle_timer()
- if(length(message2) > CHARS_PER_LINE)
- message2 = "Error"
- else if (shuttle.is_launching())
- if (shuttle.at_station())
- message2 = "Launch"
- else
- message2 = "ETA"
- else
- if(shuttle.at_station())
- message2 = "Docked"
- else
- message1 = ""
- update_display(message1, message2)
- return 1
- return 0
-
-/obj/machinery/status_display/supply_display/receive_signal/(datum/signal/signal)
- if(signal.data["command"] == "supply")
- mode = STATUS_DISPLAY_CUSTOM
- else
- ..(signal)
diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm
index b88d80d617..b13c2065d0 100644
--- a/code/game/objects/effects/decals/Cleanable/misc.dm
+++ b/code/game/objects/effects/decals/Cleanable/misc.dm
@@ -225,6 +225,9 @@
desc = "A graffiti of one star's eye."
icon_state = "onestar"
+/obj/effect/decal/cleanable/graffiti/graffiti_carrion
+ desc = "Consume the flesh."
+ icon_state = "carrion"
/obj/effect/decal/cleanable/graffiti/graffiti_doodle
desc = "A vagabond beaten by IH, this is mercenary brutality."
diff --git a/code/game/objects/effects/spawners/corpsespawner.dm b/code/game/objects/effects/spawners/corpsespawner.dm
index 2892806528..6f3a6f7e48 100644
--- a/code/game/objects/effects/spawners/corpsespawner.dm
+++ b/code/game/objects/effects/spawners/corpsespawner.dm
@@ -179,7 +179,7 @@
corpsesuit = list(
/obj/item/clothing/suit/armor/vest,
/obj/item/clothing/suit/armor/vest/warden,
- /obj/item/clothing/suit/armor/vest/security,
+ /obj/item/clothing/suit/armor/vest/toggle,
/obj/item/clothing/suit/armor/vest/detective,
/obj/item/clothing/suit/armor/platecarrier,
/obj/item/clothing/suit/armor/vest/handmade,
@@ -249,7 +249,7 @@
/obj/landmark/corpse/skeleton/fortress
name = "skeletal corpse"
- corpsesuit = list(/obj/item/clothing/suit/armor/vest, null, /obj/item/clothing/suit/armor/vest/security, null, /obj/item/clothing/suit/storage/vest)
+ corpsesuit = list(/obj/item/clothing/suit/armor/vest, null, /obj/item/clothing/suit/armor/vest/toggle, null, /obj/item/clothing/suit/storage/vest)
corpsehelmet = list(/obj/item/clothing/head/armor/helmet, null, /obj/item/clothing/head/armor/helmet/visor, null, /obj/item/clothing/head/armor/faceshield/riot)
/obj/landmark/corpse/one_star
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 877bb492a5..bd138a4b34 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -39,6 +39,7 @@ GLOBAL_LIST(melleDamagesCache)
var/extended_reach = FALSE //Wielded spears can hit alive things one tile further.
var/ready = FALSE //All weapons that are ITEM_SIZE_BULKY or bigger have double tact, meaning you have to click twice.
var/no_double_tact = FALSE //for when you, for some inconceivable reason, want a bulky item to not have double tact
+ var/no_swing = FALSE //for when you do not want an item to swing-attack
var/push_attack = FALSE //Hammers and spears can push the victim away on hit when you aim groin.
//Why are we using vars instead of defines or anything else?
//Because we need them to be shown in the tool info UI.
@@ -438,7 +439,8 @@ GLOBAL_LIST(melleDamagesCache)
SPAN_DANGER("You stab yourself in the eyes with [src]!") \
)
- eyes.damage += rand(3,4)
+ playsound(loc, 'sound/weapons/melee/lightstab.ogg', 50, 1, -1)
+ eyes.take_damage(rand(24, 32), BRUTE, 1, FALSE, TRUE, FALSE)
if(eyes.damage >= eyes.min_bruised_damage)
if(M.stat != DEAD)
if(BP_IS_ORGANIC(eyes) || BP_IS_ASSISTED(eyes)) //robot eyes bleeding might be a bit silly
diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm
index 6d4b600932..6c8f1dbec5 100644
--- a/code/game/objects/items/blueprints.dm
+++ b/code/game/objects/items/blueprints.dm
@@ -48,7 +48,7 @@
/obj/item/blueprints/interact()
var/area/A = get_area(usr)
var/text = {"