Update, May 2018

This commit is contained in:
Erki
2018-05-13 20:11:13 +03:00
committed by GitHub
251 changed files with 87175 additions and 78129 deletions
+9
View File
@@ -0,0 +1,9 @@
--
-- Combines the ss13_admin and ss13_player table
--
ALTER TABLE `ss13_cargo_items`
ADD COLUMN `created_by` VARCHAR(50) NULL DEFAULT NULL AFTER `order_by`,
ADD COLUMN `approved_by` VARCHAR(50) NULL DEFAULT NULL AFTER `created_by`,
ADD COLUMN `approved_at` DATETIME NULL DEFAULT NULL AFTER `created_at`;
UPDATE ss13_cargo_items SET approved_at = NOW()
+21
View File
@@ -0,0 +1,21 @@
--
-- Adds a new table to load the regulations ("laws") from
--
CREATE TABLE `ss13_law` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`law_id` VARCHAR(4) NOT NULL,
`name` VARCHAR(50) NOT NULL,
`description` VARCHAR(500) NOT NULL,
`min_fine` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`max_fine` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`min_brig_time` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`max_brig_time` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`severity` INT(10) UNSIGNED NULL DEFAULT '0',
`felony` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted_at` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `UNIQUE LAW` (`law_id`)
)
ENGINE=InnoDB;
@@ -0,0 +1,35 @@
--
-- Adds a new table to load news from
--
CREATE TABLE `ss13_news_channels` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`author` VARCHAR(50) NOT NULL,
`locked` TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
`is_admin_channel` TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
`announcement` VARCHAR(200) NOT NULL,
`created_by` VARCHAR(50) NOT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted_at` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB;
CREATE TABLE `ss13_news_stories` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`channel_id` INT(11) NOT NULL,
`author` VARCHAR(50) NOT NULL,
`body` TEXT NOT NULL,
`message_type` VARCHAR(50) NOT NULL DEFAULT 'Story',
`is_admin_message` TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
`time_stamp` DATETIME NULL DEFAULT NULL,
`created_by` VARCHAR(50) NOT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted_at` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `FK_ss13_news_stories_ss13_news_channels` (`channel_id`),
CONSTRAINT `FK_ss13_news_stories_ss13_news_channels` FOREIGN KEY (`channel_id`) REFERENCES `ss13_news_channels` (`id`)
)
ENGINE=InnoDB;
+7 -2
View File
@@ -170,6 +170,7 @@
#include "code\controllers\subsystems\machinery.dm"
#include "code\controllers\subsystems\mob.dm"
#include "code\controllers\subsystems\mob_ai.dm"
#include "code\controllers\subsystems\news.dm"
#include "code\controllers\subsystems\night_lighting.dm"
#include "code\controllers\subsystems\orbit.dm"
#include "code\controllers\subsystems\overlays.dm"
@@ -190,8 +191,8 @@
#include "code\controllers\subsystems\zcopy.dm"
#include "code\controllers\subsystems\initialization\atlas.dm"
#include "code\controllers\subsystems\initialization\atoms.dm"
#include "code\controllers\subsystems\initialization\holomap.dm"
#include "code\controllers\subsystems\initialization\map_finalization.dm"
#include "code\controllers\subsystems\initialization\minimap.dm"
#include "code\controllers\subsystems\initialization\misc_early.dm"
#include "code\controllers\subsystems\initialization\misc_late.dm"
#include "code\controllers\subsystems\initialization\xenoarch.dm"
@@ -370,7 +371,6 @@
#include "code\game\antagonist\antagonist_update.dm"
#include "code\game\antagonist\alien\borer.dm"
#include "code\game\antagonist\alien\xenomorph.dm"
#include "code\game\antagonist\outsider\actors.dm"
#include "code\game\antagonist\outsider\commando.dm"
#include "code\game\antagonist\outsider\deathsquad.dm"
#include "code\game\antagonist\outsider\ert.dm"
@@ -745,6 +745,7 @@
#include "code\game\objects\items\devices\megaphone.dm"
#include "code\game\objects\items\devices\modkit.dm"
#include "code\game\objects\items\devices\multitool.dm"
#include "code\game\objects\items\devices\oxycandle.dm"
#include "code\game\objects\items\devices\paicard.dm"
#include "code\game\objects\items\devices\pipe_painter.dm"
#include "code\game\objects\items\devices\powersink.dm"
@@ -1254,6 +1255,7 @@
#include "code\modules\clothing\under\color.dm"
#include "code\modules\clothing\under\miscellaneous.dm"
#include "code\modules\clothing\under\shorts.dm"
#include "code\modules\clothing\under\skirts.dm"
#include "code\modules\clothing\under\syndicate.dm"
#include "code\modules\clothing\under\accessories\accessory.dm"
#include "code\modules\clothing\under\accessories\armband.dm"
@@ -1266,6 +1268,7 @@
#include "code\modules\clothing\under\jobs\medsci.dm"
#include "code\modules\clothing\under\jobs\security.dm"
#include "code\modules\clothing\under\xenos\resomi.dm"
#include "code\modules\clothing\under\xenos\tajara.dm"
#include "code\modules\customitems\item_defines.dm"
#include "code\modules\customitems\item_spawning.dm"
#include "code\modules\detectivework\footprints.dm"
@@ -2058,6 +2061,8 @@
#include "code\modules\reagents\reagent_containers\food.dm"
#include "code\modules\reagents\reagent_containers\glass.dm"
#include "code\modules\reagents\reagent_containers\hypospray.dm"
#include "code\modules\reagents\reagent_containers\inhaler.dm"
#include "code\modules\reagents\reagent_containers\inhaler_advanced.dm"
#include "code\modules\reagents\reagent_containers\pill.dm"
#include "code\modules\reagents\reagent_containers\spray.dm"
#include "code\modules\reagents\reagent_containers\syringes.dm"
@@ -1,8 +1,6 @@
//node1, air1, network1 correspond to input
//node2, air2, network2 correspond to output
#define ADIABATIC_EXPONENT 0.667 //Actually adiabatic exponent - 1.
/obj/machinery/atmospherics/binary/circulator
name = "circulator"
desc = "A gas circulator turbine and heat exchanger."
@@ -1,5 +1,3 @@
#define ADIABATIC_EXPONENT 0.667 //Actually adiabatic exponent - 1.
/obj/machinery/atmospherics/pipeturbine
name = "turbine"
desc = "A gas turbine. Converting pressure into energy since 1884."
+5 -2
View File
@@ -3,13 +3,16 @@
#define PLANE_SPACE_DUST (PLANE_SPACE_PARALLAX + 1) // -96
#define PLANE_ABOVE_PARALLAX (PLANE_SPACE_BACKGROUND + 3) // -95
// Custom layer definitions, supplementing the default TURF_LAYER, MOB_LAYER, etc.
#define LOWER_ON_TURF_LAYER (TURF_LAYER + 0.05) // under the below
#define ON_TURF_LAYER (TURF_LAYER + 0.1) // sitting on the turf - should be preferred over direct use of TURF_LAYER
#define AO_LAYER (ON_TURF_LAYER + 0.1)
#define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6
#define UNDERDOOR 3.09 //Just barely under a closed door.
#define DOOR_CLOSED_LAYER 3.1 //Above most items if closed
#define BELOW_MOB_LAYER 3.7
#define ABOVE_MOB_LAYER 4.1
#define LIGHTING_LAYER 11
#define OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put
#define HUD_LAYER 20 //Above lighting, but below obfuscation. For in-game HUD effects (whereas SCREEN_LAYER is for abstract/OOC things like inventory slots)
#define OBFUSCATION_LAYER 21 //Where images covering the view for eyes are put
#define SCREEN_LAYER 22 //Mob HUD/effects layer
+1 -1
View File
@@ -1,4 +1,4 @@
#define Clamp(x, y, z) (x <= y ? y : (x >= z ? z : x))
#define Clamp(x, low, high) max(low, min(high, x))
#define CLAMP01(x) (Clamp(x, 0, 1))
#define span(class, text) ("<span class='[class]'>[text]</span>")
+2
View File
@@ -95,3 +95,5 @@
#define ATMOSTANK_CO2 25000 // CO2 and PH are not critically important for station, only for toxins and alternative coolants, no need to store a lot of those.
#define ATMOSTANK_PHORON 25000
#define ATMOSTANK_NITROUSOXIDE 10000 // N2O doesn't have a real useful use, i guess it's on station just to allow refilling of sec's riot control canisters?
#define ADIABATIC_EXPONENT 0.667 //Actually adiabatic exponent - 1.
+22
View File
@@ -39,3 +39,25 @@ var/list/tachycardics = list("coffee", "inaprovaline", "hyperzine", "nitroglyce
var/list/bradycardics = list("neurotoxin", "cryoxadone", "clonexadone", "space_drugs", "stoxin") // Decrease heart rate.
var/list/heartstopper = list("potassium_chlorophoride", "zombie_powder") // This stops the heart.
var/list/cheartstopper = list("potassium_chloride") // This stops the heart when overdose is met. -- c = conditional
//Alcohol
#define INTOX_BUZZED 0.01
#define INTOX_JUDGEIMP 0.03
#define INTOX_MUSCLEIMP 0.08
#define INTOX_REACTION 0.10
#define INTOX_VOMIT 0.12
#define INTOX_BALANCE 0.15
#define INTOX_BLACKOUT 0.20
#define INTOX_CONSCIOUS 0.30
#define INTOX_DEATH 0.45
//How many units of intoxication to remove per second
#define INTOX_FILTER_HEALTHY 0.015
#define INTOX_FILTER_BRUISED 0.010
#define INTOX_FILTER_DAMAGED 0.05
#define BASE_DIZZY 50 //Base dizziness from getting drunk.
#define DIZZY_ADD_SCALE 15 //Amount added for every 0.01 percent over the JUDGEIMP limit
#define BASE_VOMIT_CHANCE 10 //Base chance
#define VOMIT_CHANCE_SCALE 2.5 //Percent change added for every 0.01 percent over the VOMIT limit
+1 -2
View File
@@ -26,6 +26,7 @@
#define ANTAG_RANDSPAWN 0x100 // Potentially randomly spawns due to events.
#define ANTAG_VOTABLE 0x200 // Can be voted as an additional antagonist before roundstart.
#define ANTAG_SET_APPEARANCE 0x400 // Causes antagonists to use an appearance modifier on spawn.
#define ANTAG_RANDOM_EXCEPTED 0x800 // If a game mode randomly selects antag types, antag types with this flag should be excluded.
// Mode/antag template macros.
#define MODE_BORER "borer"
@@ -35,7 +36,6 @@
#define MODE_COMMANDO "commando"
#define MODE_DEATHSQUAD "deathsquad"
#define MODE_ERT "ert"
#define MODE_ACTOR "actor"
#define MODE_MERCENARY "mercenary"
#define MODE_NINJA "ninja"
#define MODE_RAIDER "raider"
@@ -46,7 +46,6 @@
#define MODE_MONKEY "monkey"
#define MODE_RENEGADE "renegade"
#define MODE_REVOLUTIONARY "revolutionary"
#define MODE_LOYALIST "loyalist"
#define MODE_MALFUNCTION "malf"
#define MODE_TRAITOR "traitor"
#define MODE_VAMPIRE "vampire"
+7
View File
@@ -16,6 +16,13 @@
// If defined, instant updates will be used whenever server load permits. Otherwise queued updates are always used.
#define USE_INTELLIGENT_LIGHTING_UPDATES
// If defined, lighting corners will 'bleed' luminosity to corners above them to simulate cross-Z lighting upwards. Downwards Z-lighting will continue to work with this disabled.
#define USE_CORNER_ZBLEED
#define TURF_IS_DYNAMICALLY_LIT(T) (isturf(T) && T:dynamic_lighting && T:loc:dynamic_lighting)
// mostly identical to above, but doesn't make sure T is valid first. Should only be used by lighting code.
#define TURF_IS_DYNAMICALLY_LIT_UNSAFE(T) (T:dynamic_lighting && T:loc:dynamic_lighting)
// If I were you I'd leave this alone.
#define LIGHTING_BASE_MATRIX \
list \
-1
View File
@@ -19,7 +19,6 @@
#define T20C 293.15 // 20.0 degrees celcius
#define TCMB 2.7 // -270.3 degrees celcius
#define CLAMP01(x) max(0, min(1, x))
#define QUANTIZE(variable) (round(variable,0.0001))
#define INFINITY 1.#INF
+11 -10
View File
@@ -250,16 +250,10 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
#define CAPTURE_MODE_ALL 1 //Admin camera mode
#define CAPTURE_MODE_PARTIAL 3 //Simular to regular mode, but does not do dummy check
//Sound effects toggles
#define ASFX_AMBIENCE 1
#define ASFX_FOOTSTEPS 2
#define ASFX_VOTE 4
//Cargo random stock vars
//These are used in randomstock.dm
//And also for generating random loot crates in crates.dm
#define TOTAL_STOCK 80//The total number of items we'll spawn in cargo stock
#define TOTAL_STOCK 100//The total number of items we'll spawn in cargo stock
#define STOCK_UNCOMMON_PROB 23
//The probability, as a percentage for each item, that we'll choose from the uncommon spawns list
@@ -270,7 +264,6 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
//If an item is not rare or uncommon, it will be chosen from the common spawns list.
//So the probability of a common item is 100 - (uncommon + rare)
#define STOCK_LARGE_PROB 75
//Large items are spawned on predetermined locations.
//For each large spawn marker, this is the chance that we will spawn there
@@ -278,8 +271,6 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
// Law settings
#define PERMABRIG_SENTENCE 90 // Measured in minutes
//#define PERMAPRISON_SENTENCE 60 // Measured in IC days
#define FELONY_LEVEL 2.0 // What is the minimum law severity that counts as a felony?
#define LAYER_TABLE 2.8
#define LAYER_UNDER_TABLE 2.79
@@ -456,3 +447,13 @@ Define for getting a bitfield of adjacent turfs that meet a condition.
#define MAX_SOUND_Z_TRAVERSAL 2
#define Z_ALL_TURFS(Z) block(locate(1, 1, Z), locate(world.maxx, world.maxy, Z))
// Z-controller stuff - see basic.dm to see why the fuck this is the way it is.
#define IS_VALID_ZINDEX(z) !((z) > world.maxz || z > 17 || z < 2)
#define HAS_ABOVE(z) (IS_VALID_ZINDEX(z) && z_levels & (1 << (z - 1)))
#define HAS_BELOW(z) (IS_VALID_ZINDEX(z) && z_levels & (1 << (z - 2)))
#define GET_ABOVE(A) (HAS_ABOVE(A:z) ? get_step(A, UP) : null)
#define GET_BELOW(A) (HAS_BELOW(A:z) ? get_step(A, DOWN) : null)
-2
View File
@@ -100,9 +100,7 @@
#define INV_R_HAND_DEF_ICON 'icons/mob/items/righthand.dmi'
#define INV_W_UNIFORM_DEF_ICON 'icons/mob/uniform.dmi'
#define INV_ACCESSORIES_DEF_ICON 'icons/mob/ties.dmi'
#define INV_SUIT_DEF_ICON 'icons/mob/ties.dmi'
#define INV_SUIT_DEF_ICON 'icons/mob/suit.dmi'
#define MAX_SUPPLIED_LAW_NUMBER 50
// NT's alignment towards the character
#define COMPANY_LOYAL "Loyal"
+1
View File
@@ -40,6 +40,7 @@
#define LANGUAGE_SIIK_TAJR "Siik'tajr"
#define LANGUAGE_SIGN_TAJARA "Nal'rasan"
#define LANGUAGE_YA_SSA "Ya'ssa"
#define LANGUAGE_DELVAHII "Delvahhi"
#define LANGUAGE_SKRELLIAN "Nral'Malic"
#define LANGUAGE_RESOMI "Resomi"
#define LANGUAGE_ROOTSONG "Rootsong"
+19 -16
View File
@@ -5,13 +5,13 @@
// will get logs that are one big line if the system is Linux and they are using notepad. This solves it by adding CR to every line ending
// in the logs. ascii character 13 = CR
#define SEVERITY_ALERT 1
#define SEVERITY_CRITICAL 2
#define SEVERITY_ERROR 3
#define SEVERITY_WARNING 4
#define SEVERITY_NOTICE 5
#define SEVERITY_INFO 6
#define SEVERITY_DEBUG 7
#define SEVERITY_ALERT 1 //Alert: action must be taken immediately
#define SEVERITY_CRITICAL 2 //Critical: critical conditions
#define SEVERITY_ERROR 3 //Error: error conditions
#define SEVERITY_WARNING 4 //Warning: warning conditions
#define SEVERITY_NOTICE 5 //Notice: normal but significant condition
#define SEVERITY_INFO 6 //Informational: informational messages
#define SEVERITY_DEBUG 7 //Debug: debug-level messages
/var/global/log_end = world.system_type == UNIX ? ascii2text(13) : ""
@@ -39,6 +39,9 @@
/proc/log_debug(text,level = SEVERITY_DEBUG)
if (config.log_debug)
game_log("DEBUG", text)
if (level == SEVERITY_ERROR) // Errors are always logged
error(text)
for(var/client/C in admins)
if(!C.prefs) //This is to avoid null.toggles runtime error while still initialyzing players preferences
@@ -51,7 +54,7 @@
if (config.log_game)
game_log("GAME", text)
send_gelf_log(
short_message = text,
short_message = text,
long_message = "[time_stamp()]: [text]",
level = level,
category = "GAME",
@@ -92,8 +95,8 @@
if (config.log_attack)
game_log("ATTACK", text)
send_gelf_log(
short_message = text,
long_message = "[time_stamp()]: [text]",
short_message = text,
long_message = "[time_stamp()]: [text]",
level = level,
category="ATTACK",
additional_data = list("_ckey" = html_encode(ckey), "_ckey_target" = html_encode(ckey_target))
@@ -108,7 +111,7 @@
if (config.log_pda)
game_log("PDA", text)
send_gelf_log(
short_message = text,
short_message = text,
long_message = "[time_stamp()]: [text]",
level = level,
category="PDA",
@@ -119,9 +122,9 @@
if (config.log_pda)
game_log("NTIRC", text)
send_gelf_log(
short_message = text,
long_message="[time_stamp()]: [text]",
level = level,
short_message = text,
long_message="[time_stamp()]: [text]",
level = level,
category = "NTIRC",
additional_data = list("_ckey" = html_encode(ckey), "_ntirc_conversation" = html_encode(conversation))
)
@@ -187,7 +190,7 @@
return english_list(comps, nothing_text="0", and_text="|", comma_text="|")
//more or less a logging utility
/proc/key_name(var/whom, var/include_link = null, var/include_name = 1, var/highlight_special = 0, var/datum/ticket/ticket = null)
/proc/key_name(var/whom, var/include_link = null, var/include_name = 1, var/highlight_special = 0, var/datum/ticket/ticket = null)
var/mob/M
var/client/C
var/key
@@ -217,7 +220,7 @@
if(key)
if(include_link && C)
. += "<a href='?priv_msg=\ref[C];ticket=\ref[ticket]'>"
. += "<a href='?priv_msg=\ref[C];ticket=\ref[ticket]'>"
if(C && C.holder && C.holder.fakekey && !include_name)
. += "Administrator"
+1
View File
@@ -259,6 +259,7 @@
LAZYCLEARLIST(parallax)
LAZYCLEARLIST(parallax_movable)
#undef GRID_WIDTH
#undef PARALLAX4_ICON_NUMBER
#undef PARALLAX3_ICON_NUMBER
#undef PARALLAX2_ICON_NUMBER
+2 -2
View File
@@ -603,7 +603,7 @@
SearchVar(floor_light_cache)
SearchVar(HOLOPAD_MODE)
SearchVar(navbeacons)
SearchVar(news_network)
SearchVar(SSnews)
SearchVar(allCasters)
SearchVar(bomb_set)
SearchVar(req_console_assistance)
@@ -829,7 +829,7 @@
SearchVar(lunchables_snacks_)
SearchVar(lunchables_drinks_)
SearchVar(lunchables_drink_reagents_)
SearchVar(lunchables_ethanol_reagents_)
SearchVar(lunchables_alcohol_reagents_)
SearchVar(message_servers)
SearchVar(blackbox)
SearchVar(responsive_carriers)
@@ -1,9 +1,9 @@
// Minimap generation system adapted from vorestation, adapted from /vg/.
// Seems to be much simpler/saner than /vg/'s implementation.
/var/datum/controller/subsystem/minimap/SSminimap
/var/datum/controller/subsystem/holomap/SSholomap
/datum/controller/subsystem/minimap
/datum/controller/subsystem/holomap
name = "Holomap"
flags = SS_NO_FIRE
init_order = SS_INIT_HOLOMAP
@@ -12,15 +12,15 @@
var/list/extra_minimaps = list()
var/list/station_holomaps = list()
/datum/controller/subsystem/minimap/New()
NEW_SS_GLOBAL(SSminimap)
/datum/controller/subsystem/holomap/New()
NEW_SS_GLOBAL(SSholomap)
/datum/controller/subsystem/minimap/Initialize()
/datum/controller/subsystem/holomap/Initialize()
holo_minimaps.len = world.maxz
for (var/z in 1 to world.maxz)
holo_minimaps[z] = generateHoloMinimap(z)
log_debug("SSminimap: [holo_minimaps.len] maps.")
log_debug("SSholomap: [holo_minimaps.len] maps.")
for (var/z in current_map.station_levels)
generateStationMinimap(z)
@@ -29,7 +29,7 @@
// Generates the "base" holomap for one z-level, showing only the physical structure of walls and paths.
/datum/controller/subsystem/minimap/proc/generateHoloMinimap(zlevel = 1)
/datum/controller/subsystem/holomap/proc/generateHoloMinimap(zlevel = 1)
// Save these values now to avoid a bazillion array lookups
var/offset_x = HOLOMAP_PIXEL_OFFSET_X(zlevel)
var/offset_y = HOLOMAP_PIXEL_OFFSET_Y(zlevel)
@@ -77,7 +77,7 @@
return canvas
/datum/controller/subsystem/minimap/proc/generateStationMinimap(zlevel)
/datum/controller/subsystem/holomap/proc/generateStationMinimap(zlevel)
// Save these values now to avoid a bazillion array lookups
var/offset_x = HOLOMAP_PIXEL_OFFSET_X(zlevel)
var/offset_y = HOLOMAP_PIXEL_OFFSET_Y(zlevel)
+67
View File
@@ -13,6 +13,12 @@
NEW_SS_GLOBAL(SSlaw)
/datum/controller/subsystem/law/Initialize(timeofday)
if(config.sql_enabled)
load_from_sql()
else
load_from_code()
/datum/controller/subsystem/law/proc/load_from_code()
for (var/L in subtypesof(/datum/law/low_severity))
low_severity += new L
@@ -23,3 +29,64 @@
high_severity += new L
laws = low_severity + med_severity + high_severity
/datum/controller/subsystem/law/proc/load_from_sql()
if(!establish_db_connection(dbcon))
log_debug("SSlaw: SQL ERROR - Failed to connect.")
return load_from_code()
var/DBQuery/law_query = dbcon.NewQuery("SELECT law_id, name, description, min_fine, max_fine, min_brig_time, max_brig_time, severity, felony FROM ss13_law WHERE deleted_at IS NULL ORDER BY law_id ASC")
law_query.Execute()
while(law_query.NextRow())
CHECK_TICK
try
var/datum/law/L = new
L.id = law_query.item[1]
L.name = law_query.item[2]
L.desc = law_query.item[3]
L.min_fine = text2num(law_query.item[4])
L.max_fine = text2num(law_query.item[5])
L.min_brig_time = text2num(law_query.item[6])
L.max_brig_time = text2num(law_query.item[7])
L.severity = text2num(law_query.item[8])
L.felony = text2num(law_query.item[9])
if(L.severity == 1)
low_severity += L
else if(L.severity == 2)
med_severity += L
else if(L.severity == 3)
high_severity += L
else
throw("Law with id: [L.id] deleted due to invalid severity: [L.severity]")
qdel(L)
catch(var/exception/el)
log_debug("SSlaw: Error when loading law: [el]")
laws = low_severity + med_severity + high_severity
if(!laws.len)
log_debug("SSlaw: No laws loaded. Loading from code and migrating to SQL")
load_from_code()
migrate_to_sql()
/datum/controller/subsystem/law/proc/migrate_to_sql()
for(var/datum/law/L in laws)
log_debug("SSlaw: Migrating law [L.id] to SQL")
var/DBQuery/law_update_query = dbcon.NewQuery({"
INSERT IGNORE INTO ss13_law
(law_id, name, description, min_fine, max_fine, min_brig_time, max_brig_time, severity, felony)
VALUES
(:law_id:, :name:, :desc:, :min_fine:, :max_fine:, :min_brig_time:, :max_brig_time:, :severity:, :felony:)
"})
law_update_query.Execute(list(
"law_id"=L.id,
"name"=L.name,
"desc"=L.desc,
"min_fine"=L.min_fine,
"max_fine"=L.max_fine,
"min_brig_time"=L.min_brig_time,
"max_brig_time"=L.max_brig_time,
"severity"=L.severity,
"felony"=L.felony
))
return
+163
View File
@@ -0,0 +1,163 @@
/var/datum/controller/subsystem/news/SSnews
/datum/controller/subsystem/news
name = "News"
flags = SS_NO_FIRE
var/list/datum/feed_channel/network_channels = list()
var/datum/feed_message/wanted_issue
/datum/controller/subsystem/news/Recover()
src.network_channels = SSnews.network_channels
src.wanted_issue = SSnews.wanted_issue
/datum/controller/subsystem/news/New()
NEW_SS_GLOBAL(SSnews)
/datum/controller/subsystem/news/Initialize(timeofday)
CreateFeedChannel("Station Announcements", "Automatic Announcement System", 1, 1, "New Station Announcement Available")
CreateFeedChannel("Tau Ceti Daily", "CentComm Minister of Information", 1, 1)
CreateFeedChannel("The Gibson Gazette", "Editor Carl Ritz", 1, 1)
if(config.sql_enabled)
load_from_sql()
..()
/datum/controller/subsystem/news/proc/load_from_sql()
if(!establish_db_connection(dbcon))
log_debug("SSnews: SQL ERROR - Failed to connect.")
return
var/DBQuery/channel_query = dbcon.NewQuery("SELECT id, name, author, locked, is_admin_channel, announcement FROM ss13_news_channels WHERE deleted_at IS NULL ORDER BY name ASC")
channel_query.Execute()
while(channel_query.NextRow())
CHECK_TICK
var/datum/feed_channel/channel = null
try
channel = CreateFeedChannel(
channel_query.item[2],
channel_query.item[3],
text2num(channel_query.item[4]),
text2num(channel_query.item[5]),
channel_query.item[6])
catch(var/exception/ec)
log_debug("SSnews: Error when loading channel: [ec]")
continue
var/DBQuery/news_query = dbcon.NewQuery("SELECT body, author, is_admin_message, message_type, time_stamp FROM ss13_news_stories WHERE deleted_at IS NULL AND channel_id = :channel_id: ORDER BY created_at DESC")
news_query.Execute(list("channel_id" = channel_query.item[1]))
while(news_query.NextRow())
CHECK_TICK
try
SubmitArticle(news_query.item[1], news_query.item[2], channel, null, text2num(news_query.item[3]), news_query.item[4], news_query.item[5])
catch(var/exception/en)
log_debug("SSnews: Error when loading news: [en]")
/datum/controller/subsystem/news/proc/GetFeedChannel(var/channel_name)
if(network_channels[channel_name])
return network_channels[channel_name]
return null
/datum/controller/subsystem/news/proc/CreateFeedChannel(var/channel_name, var/author, var/locked, var/adminChannel = 0, var/announcement_message)
var/datum/feed_channel/newChannel = new /datum/feed_channel
newChannel.channel_name = channel_name
newChannel.author = author
newChannel.locked = locked
newChannel.is_admin_channel = adminChannel
if(announcement_message)
newChannel.announcement = announcement_message
else
newChannel.announcement = "Breaking news from [channel_name]!"
network_channels[channel_name] = newChannel
return newChannel
/datum/controller/subsystem/news/proc/SubmitArticle(var/msg, var/author, var/datum/feed_channel/channel, var/obj/item/weapon/photo/photo, var/adminMessage = 0, var/message_type = "", var/time_stamp)
if(!channel)
log_debug("SSnews: Attempted to submit a article from [author] without a proper channel",SEVERITY_ERROR)
return
var/datum/feed_message/newMsg = new /datum/feed_message
newMsg.author = author
newMsg.body = msg
if(time_stamp)
newMsg.time_stamp = time_stamp
else
newMsg.time_stamp = "[worldtime2text()]"
newMsg.is_admin_message = adminMessage
if(message_type)
newMsg.message_type = message_type
if(photo)
newMsg.img = photo.img
newMsg.caption = photo.scribble
insert_message_in_channel(channel, newMsg) //Adding message to the network's appropriate feed_channel
/datum/controller/subsystem/news/proc/insert_message_in_channel(var/datum/feed_channel/FC, var/datum/feed_message/newMsg)
FC.messages += newMsg
newMsg.parent_channel = FC
FC.update()
alert_readers(FC.announcement)
/datum/controller/subsystem/news/proc/alert_readers(var/annoncement)
set waitfor = FALSE
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
NEWSCASTER.newsAlert(annoncement)
NEWSCASTER.update_icon()
var/list/receiving_pdas = new
for (var/obj/item/device/pda/P in PDAs)
if (!P.owner)
continue
if (P.toff)
continue
receiving_pdas += P
for(var/obj/item/device/pda/PDA in receiving_pdas)
PDA.new_news(annoncement)
/datum/feed_message
var/author =""
var/body =""
var/message_type ="Story"
var/datum/feed_channel/parent_channel
var/is_admin_message = 0
var/icon/img = null
var/icon/caption = ""
var/time_stamp = ""
var/backup_body = ""
var/backup_author = ""
var/icon/backup_img = null
var/icon/backup_caption = ""
/datum/feed_message/proc/clear()
src.author = ""
src.body = ""
src.caption = ""
src.img = null
src.time_stamp = ""
src.backup_body = ""
src.backup_author = ""
src.backup_caption = ""
src.backup_img = null
parent_channel.update()
/datum/feed_channel
var/channel_name=""
var/list/datum/feed_message/messages = list()
var/locked=0 //If public stories are accepted
var/author=""
var/backup_author=""
var/censored=0
var/is_admin_channel=0 //If it can be censored, ...
var/updated = 0
var/announcement = "" //The text that should be broadcasted when a new story is posted
/datum/feed_channel/proc/update()
updated = world.time
/datum/feed_channel/proc/clear()
src.channel_name = ""
src.messages = list()
src.locked = 0
src.author = ""
src.backup_author = ""
src.censored = 0
src.is_admin_channel = 0
src.announcement = ""
update()
+9 -9
View File
@@ -1,6 +1,6 @@
//Config stuff
#define SUPPLY_DOCKZ 2 //Z-level of the Dock.
#define SUPPLY_STATIONZ 1 //Z-level of the Station.
#define SUPPLY_DOCKZ 1 //Z-level of the Dock.
#define SUPPLY_STATIONZ 6 //Z-level of the Station.
#define SUPPLY_STATION_AREATYPE /area/supply/station //Type of the supply shuttle area for station
#define SUPPLY_DOCK_AREATYPE /area/supply/dock //Type of the supply shuttle area for dock
@@ -182,7 +182,7 @@ var/datum/controller/subsystem/cargo/SScargo
catch(var/exception/es)
log_debug("SScargo: Error when loading supplier: [es]")
//Load the items
var/DBQuery/item_query = dbcon.NewQuery("SELECT id, name, supplier, description, categories, price, items, access, container_type, groupable, item_mul FROM ss13_cargo_items WHERE deleted_at is NULL AND supplier IS NOT NULL ORDER BY order_by ASC, name ASC, supplier ASC")
var/DBQuery/item_query = dbcon.NewQuery("SELECT id, name, supplier, description, categories, price, items, access, container_type, groupable, item_mul FROM ss13_cargo_items WHERE deleted_at IS NULL AND approved_at IS NOT NULL AND supplier IS NOT NULL ORDER BY order_by ASC, name ASC, supplier ASC")
item_query.Execute()
while(item_query.NextRow())
CHECK_TICK
@@ -257,7 +257,7 @@ var/datum/controller/subsystem/cargo/SScargo
cargoconfig["items"][item]["access"],
cargoconfig["items"][item]["container_type"],
cargoconfig["items"][item]["groupable"],
cargoconfig["items"][item]["item_mul"])
cargoconfig["items"][item]["item_mul"])
catch(var/exception/ei)
log_debug("SScargo: Error when loading supplier: [ei]")
return 1
@@ -292,7 +292,7 @@ var/datum/controller/subsystem/cargo/SScargo
//Add a new item to the cargo subsystem, the categories and the items need to be a list and CAN NOT be passed as a json string.
//Decoding of the string MUST take place before
/datum/controller/subsystem/cargo/proc/add_item(var/id=null,var/name,var/supplier="nt",var/description,var/list/categories,var/price,var/list/items,var/access=0,var/container_type=CARGO_CONTAINER_CRATE,var/groupable=1,var/item_mul=1)
/datum/controller/subsystem/cargo/proc/add_item(var/id=null,var/name,var/supplier="nt",var/description,var/list/categories,var/price,var/list/items,var/access=0,var/container_type=CARGO_CONTAINER_CRATE,var/groupable=1,var/item_mul=1)
//TODO-CARGO: Maybe add the option to specify access as string instead of number
//If no item ID is supplied generate one ourselfs (use the next free id)
@@ -303,7 +303,7 @@ var/datum/controller/subsystem/cargo/SScargo
id = text2num(id)
if(id > last_item_id)
last_item_id = id
var/datum/cargo_item/ci = new()
try
ci.id = id
@@ -322,7 +322,7 @@ var/datum/controller/subsystem/cargo/SScargo
log_debug("SScargo: Error when loading item: [e]")
qdel(ci)
return
for(var/item in ci.items)
var/itempath = text2path(ci.items[item]["path"])
if(!ispath(itempath))
@@ -341,7 +341,7 @@ var/datum/controller/subsystem/cargo/SScargo
log_debug("SScargo: [ci.supplier] is not a valid supplier for item [ci.name].")
QDEL_NULL(ci)
return
//Setting the supplier
ci.supplier_datum = cs
@@ -362,7 +362,7 @@ var/datum/controller/subsystem/cargo/SScargo
cc.items.Add(ci)
else
log_debug("SScargo: Warning - Attempted to add [ci.name] item to category [category] that does not exist.")
return ci
/*
+6
View File
@@ -387,6 +387,12 @@ var/datum/controller/subsystem/ticker/SSticker
SSjobs.DivideOccupations() // Apparently important for new antagonist system to register specific job antags properly.
if(!src.mode.can_start())
var/list/voted_not_ready = list()
for(var/mob/abstract/new_player/player in player_list)
if((player.client)&&(!player.ready))
voted_not_ready += player.ckey
message_admins("The following players voted for [mode.name], but did not ready up: [jointext(voted_not_ready, ", ")]")
log_game("Ticker: Players voted for [mode.name], but did not ready up: [jointext(voted_not_ready, ", ")]")
world << "<B>Unable to start [mode.name].</B> Not enough players, [mode.required_players] players needed. Reverting to pre-game lobby."
current_state = GAME_STATE_PREGAME
mode.fail_setup()
+1
View File
@@ -259,6 +259,7 @@ var/datum/controller/subsystem/vote/SSvote
if("restart")
choices.Add("Restart Round","Continue Playing")
if("gamemode")
round_voters.Cut() //Delete the old list, since we are having a new gamemode vote
if(SSticker.current_state >= 2)
return 0
choices.Add(config.votable_modes)
+1 -1
View File
@@ -1,7 +1,7 @@
#define OPENTURF_MAX_PLANE -71
#define OPENTURF_CAP_PLANE -70 // The multiplier goes here so it'll be on top of every other overlay.
#define OPENTURF_MAX_DEPTH 10 // The maxiumum number of planes deep we'll go before we just dump everything on the same plane.
#define SHADOWER_DARKENING_FACTOR 0.4 // The multiplication factor for openturf shadower darkness. Lighting will be multiplied by this.
#define SHADOWER_DARKENING_FACTOR 0.85 // The multiplication factor for openturf shadower darkness. Lighting will be multiplied by this.
/var/datum/controller/subsystem/zcopy/SSzcopy
+1 -1
View File
@@ -47,7 +47,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
name = "Illegal weapons crate"
num_contained = 2
contains = list(/obj/item/weapon/gun/projectile/automatic/mini_uzi,
/obj/item/weapon/gun/projectile/boltaction,
/obj/item/weapon/gun/projectile/shotgun/pump/rifle,
/obj/item/weapon/gun/projectile/silenced,
/obj/item/weapon/gun/projectile/pirate,
/obj/item/weapon/gun/projectile/revolver/derringer,
+1
View File
@@ -128,6 +128,7 @@ They sell generic supplies and ask for generic supplies.
/obj/item/weapon/storage/pill_bottle = TRADER_SUBTYPES_ONLY,
/obj/item/weapon/reagent_containers/hypospray = TRADER_ALL,
/obj/item/device/healthanalyzer = TRADER_THIS_TYPE,
/obj/item/device/breath_analyzer = TRADER_THIS_TYPE,
/obj/item/stack/medical/bruise_pack = TRADER_THIS_TYPE,
/obj/item/stack/medical/ointment = TRADER_THIS_TYPE,
/obj/item/stack/medical/advanced = TRADER_SUBTYPES_ONLY,
+1
View File
@@ -223,6 +223,7 @@ Sells devices, odds and ends, and medical stuff
/obj/item/device/paicard = TRADER_THIS_TYPE,
/obj/item/device/pipe_painter = TRADER_THIS_TYPE,
/obj/item/device/healthanalyzer = TRADER_THIS_TYPE,
/obj/item/device/breath_analyzer = TRADER_THIS_TYPE,
/obj/item/device/analyzer = TRADER_ALL,
/obj/item/device/mass_spectrometer = TRADER_ALL,
/obj/item/device/reagent_scanner = TRADER_ALL,
+3 -3
View File
@@ -88,7 +88,7 @@
)
possible_trading_items = list(
/obj/item/weapon/gun/projectile/boltaction = TRADER_ALL,
/obj/item/weapon/gun/projectile/shotgun/pump/rifle = TRADER_ALL,
/obj/item/weapon/gun/projectile/dragunov = TRADER_THIS_TYPE,
/obj/item/weapon/gun/projectile/silenced = TRADER_THIS_TYPE,
/obj/item/weapon/gun/projectile/automatic/tommygun = TRADER_THIS_TYPE,
@@ -100,7 +100,7 @@
/obj/item/weapon/gun/projectile/pirate = TRADER_THIS_TYPE,
/obj/item/weapon/gun/projectile/contender = TRADER_THIS_TYPE,
/obj/item/weapon/gun/projectile/revolver/lemat = TRADER_THIS_TYPE,
/obj/item/weapon/gun/projectile/boltaction/vintage = TRADER_THIS_TYPE
/obj/item/weapon/gun/projectile/shotgun/pump/rifle/vintage = TRADER_THIS_TYPE
)
@@ -142,4 +142,4 @@
/obj/item/clothing/mask/gas/tactical = TRADER_THIS_TYPE,
/obj/item/weapon/shield/riot/tact = TRADER_THIS_TYPE,
/obj/item/weapon/storage/belt/security/tactical = TRADER_THIS_TYPE
)
)
+7 -4
View File
@@ -24,7 +24,10 @@
item_cost = 12
path = /obj/item/weapon/storage/firstaid/combat
/datum/uplink_item/item/medical/trisyndicotin
name = "Mind-freeing pills"
item_cost = 3
path = /obj/item/weapon/storage/pill_bottle/trisyndicotin
/datum/uplink_item/item/medical/stimulants
name = "Box of Combat Stimulants"
item_cost = 6
path = /obj/item/weapon/storage/box/syndie_kit/stimulants
+1 -1
View File
@@ -45,7 +45,7 @@ var/const/VENDING_WIRE_IDSCAN = 8
if(VENDING_WIRE_THROW)
V.shoot_inventory = !mended
if(VENDING_WIRE_CONTRABAND)
V.categories &= ~CAT_HIDDEN
V.categories &= ~CAT_HIDDEN
if(VENDING_WIRE_ELECTRIFY)
if(mended)
V.seconds_electrified = 0
+1 -1
View File
@@ -128,7 +128,7 @@ DBQuery/proc/Execute(var/list/argument_list = null, var/pass_not_found = 0, sql_
var/error = ErrorMsg()
if (error)
error("SQL Error: '[error]'")
log_debug("SQL Error: '[error]'",SEVERITY_ERROR)
// This is hacky and should probably be changed
if (error == "MySQL server has gone away")
log_game("MySQL connection drop detected, attempting to reconnect.")
+1 -17
View File
@@ -74,20 +74,4 @@
reception.telecomms_reception |= get_receiver_reception(receiver, signal)
reception.message = signal && signal.data["compression"] > 0 ? Gibberish(message, signal.data["compression"] + 50) : message
return reception
/proc/get_receptions(var/atom/sender, var/list/atom/receivers, var/do_sleep = 1)
var/datum/receptions/receptions = new
receptions.message_server = get_message_server()
var/datum/signal/signal
if(sender)
signal = sender.telecomms_process(do_sleep)
receptions.sender_reception = get_sender_reception(sender, signal)
for(var/atom/receiver in receivers)
if(!signal)
signal = receiver.telecomms_process()
receptions.receiver_reception[receiver] = get_receiver_reception(receiver, signal)
return receptions
return reception
-14
View File
@@ -14,20 +14,6 @@
- To skip equipping with appropriate gear, supply a positive third argument.
*/
// Antagonist datum flags.
#define ANTAG_OVERRIDE_JOB 1 // Assigned job is set to MODE when spawning.
#define ANTAG_OVERRIDE_MOB 2 // Mob is recreated from datum mob_type var when spawning.
#define ANTAG_CLEAR_EQUIPMENT 4 // All preexisting equipment is purged.
#define ANTAG_CHOOSE_NAME 8 // Antagonists are prompted to enter a name.
#define ANTAG_IMPLANT_IMMUNE 16 // Cannot be loyalty implanted.
#define ANTAG_SUSPICIOUS 32 // Shows up on roundstart report.
#define ANTAG_HAS_LEADER 64 // Generates a leader antagonist.
#define ANTAG_HAS_NUKE 128 // Will spawn a nuke at supplied location.
#define ANTAG_RANDSPAWN 256 // Potentially randomly spawns due to events.
#define ANTAG_VOTABLE 512 // Can be voted as an additional antagonist before roundstart.
#define ANTAG_SET_APPEARANCE 1024 // Causes antagonists to use an appearance modifier on spawn.
#define ANTAG_RANDOM_EXCEPTED 2048 // If a game mode randomly selects antag types, antag types with this flag should be excluded.
// Globals.
var/global/list/all_antag_types = list()
var/global/list/all_antag_spawnpoints = list()
-62
View File
@@ -1,62 +0,0 @@
var/datum/antagonist/actor/actor
/datum/antagonist/actor
id = MODE_ACTOR
bantype = "actor"
role_text = "NanoTrasen Actor"
role_text_plural = "NanoTrasen Actors"
welcome_text = "You've been hired to entertain people through the power of television!"
landmark_id = "ActorSpawn"
id_type = /obj/item/weapon/card/id/syndicate
flags = ANTAG_OVERRIDE_JOB | ANTAG_SET_APPEARANCE | ANTAG_CHOOSE_NAME
hard_cap = 7
hard_cap_round = 10
initial_spawn_req = 1
initial_spawn_target = 1
/datum/antagonist/actor/New()
..()
actor = src
/datum/antagonist/actor/greet(var/datum/mind/player)
if(!..())
return
player.current.show_message("You work for [current_map.company_name], tasked with the production and broadcasting of entertainment to all of its assets.")
player.current.show_message("Entertain the crew! Try not to disrupt them from their work too much and remind them how great [current_map.company_name] is!")
/datum/antagonist/actor/equip(var/mob/living/carbon/human/player)
player.equip_to_slot_or_del(new /obj/item/clothing/under/chameleon(src), slot_w_uniform)
player.equip_to_slot_or_del(new /obj/item/clothing/shoes/chameleon(src), slot_shoes)
player.equip_to_slot_or_del(new /obj/item/device/radio/headset/entertainment(src), slot_l_ear)
var/obj/item/weapon/card/id/centcom/ERT/C = new(player.loc)
C.assignment = "Actor"
player.set_id_info(C)
player.equip_to_slot_or_del(C,slot_wear_id)
return 1
/*
/client/verb/join_as_actor()
set category = "IC"
set name = "Join as Actor"
set desc = "Join as an Actor to entertain the crew through television!"
if(!MayRespawn(1))
return
var/choice = alert("Are you sure you'd like to join as an actor?", "Confirmation","Yes", "No")
if(choice != "Yes")
return
if(istype(usr,/mob/abstract/observer) || istype(usr,/mob/abstract/new_player))
if(actor.current_antagonists.len >= actor.hard_cap)
usr << "No more actors may spawn at the current time."
return
actor.create_default(usr)
return
usr << "You must be observing or be a new player to spawn as an actor."
*/
+1 -1
View File
@@ -6,7 +6,7 @@ var/datum/antagonist/deathsquad/mercenary/commandos
role_text = "Syndicate Commando"
role_text_plural = "Commandos"
welcome_text = "You are in the employ of a criminal syndicate hostile to corporate interests."
id_type = /obj/item/weapon/card/id/centcom/ERT
id_type = /obj/item/weapon/card/id/ert
hard_cap = 4
hard_cap_round = 8
+3 -3
View File
@@ -8,9 +8,9 @@ var/datum/antagonist/ert/ert
welcome_text = "As member of the Emergency Response Team, you answer only to your leader and CentComm officials."
leader_welcome_text = "As leader of the Emergency Response Team, you answer only to CentComm, and have authority to override the Captain where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the captain where possible, however."
landmark_id = "Response Team"
id_type = /obj/item/weapon/card/id/centcom/ERT
id_type = /obj/item/weapon/card/id/ert
flags = ANTAG_OVERRIDE_JOB | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER | ANTAG_CHOOSE_NAME | ANTAG_RANDOM_EXCEPTED
antaghud_indicator = "hudloyalist"
+2 -2
View File
@@ -91,7 +91,7 @@ var/datum/antagonist/raider/raiders
/obj/item/weapon/gun/projectile/shotgun/doublebarrel,
/obj/item/weapon/gun/projectile/shotgun/doublebarrel/pellet,
/obj/item/weapon/gun/projectile/shotgun/doublebarrel/sawn,
/obj/item/weapon/gun/projectile/boltaction,
/obj/item/weapon/gun/projectile/shotgun/pump/rifle,
/obj/item/weapon/gun/projectile/colt,
/obj/item/weapon/gun/projectile/sec,
/obj/item/weapon/gun/projectile/pistol,
@@ -103,7 +103,7 @@ var/datum/antagonist/raider/raiders
/obj/item/weapon/gun/projectile/contender,
/obj/item/weapon/gun/projectile/pirate,
/obj/item/weapon/gun/projectile/tanto,
/obj/item/weapon/gun/projectile/boltaction/vintage
/obj/item/weapon/gun/projectile/shotgun/pump/rifle/vintage
)
+10
View File
@@ -35,6 +35,16 @@ var/datum/antagonist/cultist/cult
faction = "cult"
restricted_species = list(
"Baseline Frame",
"Shell Frame",
"Hephaestus G1 Industrial Frame",
"Hephaestus G2 Industrial Frame",
"Xion Industrial Frame",
"Zeng-Hu Mobility Frame",
"Bishop Accessory Frame"
)
var/allow_narsie = 1
var/datum/mind/sacrifice_target
var/list/allwords = list("travel","self","see","hell","blood","join","tech","destroy", "other", "hide")
-1
View File
@@ -45,7 +45,6 @@ var/datum/antagonist/loyalists/loyalists
loyal_obj.explanation_text = "Protect [player.real_name], the [player.mind.assigned_role]."
global_objectives += loyal_obj
/datum/antagonist/loyalists/equip(var/mob/living/carbon/human/player)
if(!..())
+1 -1
View File
@@ -26,7 +26,7 @@ var/datum/antagonist/renegade/renegades
/obj/item/weapon/gun/projectile/deagle/camo,
/obj/item/weapon/gun/projectile/pistol,
/obj/item/weapon/gun/projectile/shotgun/doublebarrel/sawn,
/obj/item/weapon/gun/projectile/boltaction/obrez,
/obj/item/weapon/gun/projectile/shotgun/pump/rifle/obrez,
/obj/item/weapon/gun/projectile/automatic,
/obj/item/weapon/gun/projectile/automatic/c20r,
/obj/item/weapon/gun/projectile/automatic/tommygun,
-4
View File
@@ -58,10 +58,6 @@ var/global/list/datum/dna/gene/dna_genes[0]
// Used for genes that check for value rather than a binary on/off.
#define GENE_ALWAYS_ACTIVATE 1
// Skip checking if it's already active.
// Used for genes that check for value rather than a binary on/off.
#define GENE_ALWAYS_ACTIVATE 1
/datum/dna
// READ-ONLY, GETS OVERWRITTEN
// DO NOT FUCK WITH THESE OR BYOND WILL EAT YOUR FACE
+5
View File
@@ -133,6 +133,11 @@ var/list/sacrificed = list()
target.hallucination = min(target.hallucination, 500)
return 0
//If you dont have blood, blood magic doesnt work on you
if(target.is_mechanical())
attacker << "<span class='danger'>You sense that your powers can not effect them.</span>"
return 0
target.take_overall_damage(0, rand(5, 20)) // You dirty resister cannot handle the damage to your mind. Easily. - even cultists who accept right away should experience some effects
// Resist messages go!
if(initial_message) //don't do this stuff right away, only if they resist or hesitate.
@@ -213,7 +213,7 @@
to_chat(src, "<span class='warning'>Your powers are not capable of taking you that far.</span>")
return
if (!T.dynamic_lighting || T.get_lumcount() > 0.1)
if (T.get_lumcount() > 0.1)
// Too bright, cannot jump into.
to_chat(src, "<span class='warning'>The destination is too bright.</span>")
return
+6
View File
@@ -401,6 +401,12 @@
desc = "Detective Equipment"
region = ACCESS_REGION_SECURITY
/var/const/access_weapons = 69
/datum/access/access_weapons
id = access_weapons
desc = "Weaponry Permission"
region = ACCESS_REGION_SECURITY
/******************
* Central Command *
******************/
+4 -4
View File
@@ -77,13 +77,13 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
access = list(access_sec_doors, access_medical, access_engine, access_change_ids, access_eva, access_heads,
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction,
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics,
access_chapel_office, access_library, access_research, access_mining, access_mining_station,
access_hop, access_RC_announce, access_keycard_auth, access_gateway)
access_chapel_office, access_library, access_research, access_mining, access_mining_station, access_janitor,
access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_weapons)
minimal_access = list(access_sec_doors, access_medical, access_engine, access_change_ids, access_eva, access_heads,
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction,
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics,
access_chapel_office, access_library, access_research, access_mining, access_mining_station,
access_hop, access_RC_announce, access_keycard_auth, access_gateway)
access_chapel_office, access_library, access_research, access_mining, access_mining_station, access_janitor,
access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_weapons)
equip(var/mob/living/carbon/human/H)
+30
View File
@@ -186,6 +186,36 @@
H.species.equip_survival_gear(H,1)
return TRUE
//Not engineers, just the mop boys
/datum/job/janitor
title = "Janitor"
flag = JANITOR
department = "Civilian"
department_flag = CIVILIAN
faction = "Station"
total_positions = 2
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#dddddd"
access = list(access_janitor, access_maint_tunnels, access_engine, access_research, access_sec_doors, access_medical)
minimal_access = list(access_janitor, access_maint_tunnels, access_engine, access_research, access_sec_doors, access_medical)
bag_type = /obj/item/weapon/storage/backpack
satchel_type = /obj/item/weapon/storage/backpack/satchel_norm
duffel_type = /obj/item/weapon/storage/backpack/satchel
messenger_bag_type = /obj/item/weapon/storage/backpack/duffel
equip(var/mob/living/carbon/human/H)
if(!H)
return FALSE
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/janitor(H), slot_belt)
return TRUE
//More or less assistants
/datum/job/librarian
title = "Librarian"
+3 -31
View File
@@ -18,11 +18,11 @@
access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
access_heads, access_construction, access_sec_doors, access_research, access_medical, access_janitor,
access_heads, access_construction, access_sec_doors, access_research, access_medical,
access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload)
minimal_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
access_heads, access_construction, access_sec_doors, access_research, access_medical, access_janitor,
access_heads, access_construction, access_sec_doors, access_research, access_medical,
access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload)
minimal_player_age = 7
@@ -133,32 +133,4 @@
if(!H)
return FALSE
H.species.equip_survival_gear(H,1)
return TRUE
/datum/job/janitor
title = "Janitor"
flag = JANITOR
department = "Engineering"
department_flag = ENGSEC
faction = "Station"
total_positions = 2
spawn_positions = 2
supervisors = "the chief engineer"
selection_color = "#fff5cc"
access = list(access_janitor, access_maint_tunnels, access_engine, access_research, access_sec_doors, access_medical)
minimal_access = list(access_janitor, access_maint_tunnels, access_engine, access_research, access_sec_doors, access_medical)
bag_type = /obj/item/weapon/storage/backpack
satchel_type = /obj/item/weapon/storage/backpack/satchel_norm
duffel_type = /obj/item/weapon/storage/backpack/satchel
messenger_bag_type = /obj/item/weapon/storage/backpack/duffel
equip(var/mob/living/carbon/human/H)
if(!H)
return FALSE
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(H), slot_l_ear)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/janitor(H), slot_belt)
return TRUE
return TRUE
+10 -10
View File
@@ -16,12 +16,12 @@
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks,
access_detective)
access_detective, access_weapons)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks,
access_detective)
access_detective, access_weapons)
minimal_player_age = 14
bag_type = /obj/item/weapon/storage/backpack/security
@@ -62,8 +62,8 @@
supervisors = "the head of security"
selection_color = "#ffeeee"
economic_modifier = 5
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks)
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks, access_weapons)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks, access_weapons)
minimal_player_age = 7
bag_type = /obj/item/weapon/storage/backpack/security
@@ -107,8 +107,8 @@
supervisors = "the head of security"
selection_color = "#ffeeee"
economic_modifier = 5
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_detective)
minimal_access = list(access_security, access_sec_doors, access_morgue, access_maint_tunnels, access_detective)
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_detective, access_weapons)
minimal_access = list(access_security, access_sec_doors, access_morgue, access_maint_tunnels, access_detective, access_weapons)
minimal_player_age = 7
@@ -143,8 +143,8 @@
supervisors = "the head of security"
selection_color = "#ffeeee"
economic_modifier = 5
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels)
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels)
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_weapons)
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_weapons)
alt_titles = list("Crime Scene Investigator")
minimal_player_age = 3
@@ -185,8 +185,8 @@
selection_color = "#ffeeee"
// alt_titles = list("Junior Officer") //aurora already has security cadets
economic_modifier = 4
access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks)
access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks, access_weapons)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks, access_weapons)
minimal_player_age = 7
bag_type = /obj/item/weapon/storage/backpack/security
+11 -11
View File
@@ -14,7 +14,6 @@ var/const/CYBORG =(1<<9)
var/const/INTERN_SEC =(1<<10)
var/const/INTERN_ENG =(1<<11)
var/const/FORENSICS =(1<<12)
var/const/JANITOR =(1<<13)
var/const/MEDSCI =(1<<1)
@@ -39,16 +38,17 @@ var/const/HOP =(1<<0)
var/const/BARTENDER =(1<<1)
var/const/BOTANIST =(1<<2)
var/const/CHEF =(1<<3)
var/const/LIBRARIAN =(1<<4)
var/const/QUARTERMASTER =(1<<5)
var/const/CARGOTECH =(1<<6)
var/const/MINER =(1<<7)
var/const/LAWYER =(1<<8)
var/const/CHAPLAIN =(1<<9)
var/const/CLOWN =(1<<10)
var/const/MIME =(1<<11)
var/const/MERCHANT =(1<<12)
var/const/ASSISTANT =(1<<13)
var/const/JANITOR =(1<<4)
var/const/LIBRARIAN =(1<<5)
var/const/QUARTERMASTER =(1<<6)
var/const/CARGOTECH =(1<<7)
var/const/MINER =(1<<8)
var/const/LAWYER =(1<<9)
var/const/CHAPLAIN =(1<<10)
var/const/CLOWN =(1<<11)
var/const/MIME =(1<<12)
var/const/MERCHANT =(1<<13)
var/const/ASSISTANT =(1<<14)
var/list/assistant_occupations = list() //Leaving this on one line stops Travis complaining ~Scopes
+5 -46
View File
@@ -2,45 +2,8 @@
name = "random arcade"
desc = "random arcade machine"
icon_state = "arcade"
icon_screen = "invaders"
var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 11,
/obj/item/clothing/under/syndicate/tacticool = 5,
/obj/item/toy/sword = 22,
/obj/item/weapon/gun/projectile/revolver/capgun = 11,
/obj/item/toy/crossbow = 11,
/obj/item/weapon/storage/fancy/crayons = 11,
/obj/item/toy/spinningtoy = 11,
/obj/item/toy/prize/ripley = 1,
/obj/item/toy/prize/fireripley = 1,
/obj/item/toy/prize/deathripley = 1,
/obj/item/toy/prize/gygax = 1,
/obj/item/toy/prize/durand = 1,
/obj/item/toy/prize/honk = 1,
/obj/item/toy/prize/marauder = 1,
/obj/item/toy/prize/seraph = 1,
/obj/item/toy/prize/mauler = 1,
/obj/item/toy/prize/odysseus = 1,
/obj/item/toy/prize/phazon = 1,
/obj/item/toy/waterflower = 5,
/obj/random/action_figure = 11,
/obj/random/plushie = 44,
/obj/item/toy/cultsword = 5,
/obj/item/toy/syndicateballoon = 5,
/obj/item/toy/nanotrasenballoon = 5,
/obj/item/toy/katana = 11,
/obj/item/toy/bosunwhistle = 5,
/obj/item/weapon/storage/belt/champion = 11,
/obj/item/weapon/pen/invisible = 5,
/obj/item/weapon/grenade/fake = 1,
/obj/item/weapon/bikehorn = 11,
/obj/item/clothing/mask/fakemoustache = 11,
/obj/item/clothing/mask/gas/clown_hat = 11,
/obj/item/clothing/mask/gas/mime = 11,
/obj/item/weapon/gun/energy/wand/toy = 5,
/obj/item/device/binoculars = 11,
/obj/item/device/megaphone = 11
)
var/prize = /obj/random/arcade
/obj/machinery/computer/arcade/Initialize()
. = ..()
@@ -55,21 +18,18 @@
/obj/machinery/computer/arcade/proc/prizevend()
if(!contents.len)
var/prizeselect = pickweight(prizes)
new prizeselect(src.loc)
new prize(src.loc)
else
var/atom/movable/prize = pick(contents)
prize.loc = src.loc
var/atom/movable/chosen_prize = pick(contents)
chosen_prize.forceMove(src.loc)
/obj/machinery/computer/arcade/attack_ai(mob/user as mob)
return src.attack_hand(user)
/obj/machinery/computer/arcade/emp_act(severity)
if(stat & (NOPOWER|BROKEN))
..(severity)
return
var/empprize = null
var/num_of_prizes = 0
switch(severity)
if(1)
@@ -77,8 +37,7 @@
if(2)
num_of_prizes = rand(0,2)
for(num_of_prizes; num_of_prizes > 0; num_of_prizes--)
empprize = pickweight(prizes)
new empprize(src.loc)
new prize(src.loc)
..(severity)
+66 -45
View File
@@ -162,7 +162,7 @@
. += "<br><hr>"
. += "<center>"
. += "<a href='?src=\ref[src];button=render_guilty'>Render Guilty</a>"
// . += "<a href='?src=\ref[src];button=render_guilty_fine'>Render Guilty - Fine</a>"
. += "<a href='?src=\ref[src];button=render_guilty_fine'>Render Guilty - Fine</a>"
. += "</center>"
return .
@@ -368,8 +368,8 @@
. += "<tr>"
. += "<td><b>[L.name]</b></td>"
. += "<td><i>[L.desc]</i></td>"
. += "<td>[L.min_brig_time] - [L.max_brig_time] minutes</td>"
. += "<td>[L.min_fine]-[L.max_fine]cR</td>"
. += "<td>[L.get_brig_time_string()]</td>"
. += "<td>[L.get_fine_string()]</td>"
. += "<td><a href='?src=\ref[src];button=add_charge;law=\ref[L]'>Charge</a></td>"
. += "</tr>"
@@ -398,8 +398,8 @@
. += "<tr>"
. += "<td><b>[L.name]</b></td>"
. += "<td><i>[L.desc]</i></td>"
. += "<td>[L.min_brig_time] - [L.max_brig_time] minutes</td>"
. += "<td>[L.min_fine]-[L.max_fine]cR</td>"
. += "<td>[L.get_brig_time_string()]</td>"
. += "<td>[L.get_fine_string()]</td>"
. += "<td><a href='?src=\ref[src];button=add_charge;law=\ref[L]'>Charge</a></td>"
. += "</tr>"
@@ -427,7 +427,7 @@
. += "<tr>"
. += "<td><b>[L.name]</b></td>"
. += "<td><i>[L.desc]</i></td>"
. += "<td>[L.min_brig_time] - [L.max_brig_time] minutes</td>"
. += "<td>[L.get_brig_time_string()]</td>"
. += "<td><a href='?src=\ref[src];button=add_charge;law=\ref[L]'>Charge</a></td>"
. += "</tr>"
@@ -457,38 +457,66 @@
user << "<span class='alert'>[error]</span>"
return
incident.renderGuilty( user )
print_incident_overview(incident.renderGuilty(user, 0))
var/obj/item/weapon/card/id/card = incident.card.resolve()
if( incident.brig_sentence < PERMABRIG_SENTENCE)
ping( "\The [src] pings, \"[card] has been found guilty of their crimes!\"" )
ping( "\The [src] pings, \"[card.registered_name] has been found guilty of their crimes!\"" )
else
pingx3( "\The [src] pings, \"[card] has been found guilty of their crimes and earned a HuT Sentence\"" )
pingx3( "\The [src] pings, \"[card.registered_name] has been found guilty of their crimes and earned a HuT Sentence\"" )
incident = null
menu_screen = "main_menu"
// /obj/machinery/computer/sentencing/proc/render_guilty_fine( var/mob/living/user, var/obj/item/weapon/card/id/C )
// if( !incident )
// user << "<span class='alert'>There is no active case!</span>"
// return
//
// if( !istype( user ))
// return
//
// var/error = print_incident_report()
//
// if( error )
// user << "<span class='alert'>[error]</span>"
// return
//
// //TODO: Try to charge the criminal if not return and print error message
//
// incident.renderGuilty( user )
//
// ping( "\The [src] pings, \"[incident.card] has been fined for their crimes!\"" )
//
// incident = null
// menu_screen = "main_menu"
/obj/machinery/computer/sentencing/proc/render_guilty_fine( var/mob/living/user )
if(!incident)
user << "<span class='alert'>There is no active case!</span>"
return
if(!istype(user))
return
if(incident.fine <= 0)
buzz("\The [src] buzzes, \"No fine has been entered!\"")
return
//Lets check if there is a felony amongst the crimes
for(var/datum/law/L in incident.charges)
if(L.felony)
buzz("\The [src] buzzes, \"The crimes are too severe to apply a fine!\"")
if(!L.can_fine())
buzz("\The [src] buzzes, \"It is not possible to fine for [L.name]\"")
return
//Try to resole the security account first
var/datum/money_account/security_account = department_accounts["Security"]
if(!security_account)
buzz("\The [src] buzzes, \"Could not get security account!\"")
return
var/obj/item/weapon/card/id/card = incident.card.resolve()
//Let´s get the account of the suspect and verify they have enough money
var/datum/money_account/suspect_account = get_account(card.associated_account_number)
if(!suspect_account)
buzz("\The [src] buzzes, \"Could not get suspect account!\"")
return
if(suspect_account.money < incident.fine)
buzz("\The [src] buzzes, \"There is not enough money in the account to pay the fine!\"")
return
charge_to_account(suspect_account.account_number,security_account.owner_name,"Incident: [incident.UID]","Sentencing Console",-incident.fine)
charge_to_account(security_account.account_number,suspect_account.owner_name,"Incident: [incident.UID]Fine","Sentencing Console",incident.fine)
print_incident_overview(incident.renderGuilty(user,1))
ping("\The [src] pings, \"[card.registered_name] has been fined for their crimes!\"")
incident = null
menu_screen = "main_menu"
/obj/machinery/computer/sentencing/proc/print_incident_overview(var/text)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper
P.set_content_unsafe("Incident Summary",text)
print(P)
/obj/machinery/computer/sentencing/proc/print_incident_report( var/sentence = 1 )
var/error = incident.missingSentenceReq()
@@ -636,20 +664,13 @@
if( alert("No incident notes were added. Adding a short description of the incident is highly recommended. Do you still want to continue with the print?",,"Yes","No") == "No" )
return
render_guilty( usr )
// if( "render_guilty_fine")
// //Check for the notes
// if( !incident.notes )
// if( alert("No incident notes were added. Adding a short description of the incident is highly recommended. Do you still want to continue with the print?",,"Yes","No") == "No" )
// return
// //Get the ID Card
// var/obj/item/weapon/card/id/C = usr.get_active_hand()
// if( istype( C ))
// if( incident && C.mob )
// render_guilty_fine( usr, C)
// else
// usr << "<span class='alert'>\The [src] buzzes, \"ID card not tied to a NanoTrasen Employee!\"</span>"
// else
// usr << "<span class='alert'>\The [src] buzzes, \"The suspects ID is required to fine them\"</span>"
if( "render_guilty_fine" )
//Check for the notes
if( !incident.notes )
if( alert("No incident notes were added. Adding a short description of the incident is highly recommended. Do you still want to continue with the print?",,"Yes","No") == "No" )
return
//Get the ID Card
render_guilty_fine( usr )
add_fingerprint(usr)
updateUsrDialog()
+7
View File
@@ -296,6 +296,13 @@ Class Procs:
state(text, "blue")
playsound(src.loc, 'sound/machines/pingx3.ogg', 50, 0)
/obj/machinery/proc/buzz(text=null)
if (!text)
text = "\The [src] buzzes."
state(text, "blue")
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) //TODO: Check if that one is the correct sound
/obj/machinery/proc/shock(mob/user, prb)
if(inoperable())
return 0
+62 -169
View File
@@ -2,126 +2,8 @@
//################### NEWSCASTERS BE HERE! ####
//###-Agouri###################################
/datum/feed_message
var/author =""
var/body =""
var/message_type ="Story"
var/datum/feed_channel/parent_channel
var/is_admin_message = 0
var/icon/img = null
var/icon/caption = ""
var/time_stamp = ""
var/backup_body = ""
var/backup_author = ""
var/icon/backup_img = null
var/icon/backup_caption = ""
/datum/feed_channel
var/channel_name=""
var/list/datum/feed_message/messages = list()
var/locked=0
var/author=""
var/backup_author=""
var/censored=0
var/is_admin_channel=0
var/updated = 0
var/announcement = ""
/datum/feed_message/proc/clear()
src.author = ""
src.body = ""
src.caption = ""
src.img = null
src.time_stamp = ""
src.backup_body = ""
src.backup_author = ""
src.backup_caption = ""
src.backup_img = null
parent_channel.update()
/datum/feed_channel/proc/update()
updated = world.time
/datum/feed_channel/proc/clear()
src.channel_name = ""
src.messages = list()
src.locked = 0
src.author = ""
src.backup_author = ""
src.censored = 0
src.is_admin_channel = 0
src.announcement = ""
update()
/datum/feed_network
var/list/datum/feed_channel/network_channels = list()
var/datum/feed_message/wanted_issue
/datum/feed_network/New()
CreateFeedChannel("Station Announcements", "SS13", 1, 1, "New Station Announcement Available")
/datum/feed_network/proc/CreateFeedChannel(var/channel_name, var/author, var/locked, var/adminChannel = 0, var/announcement_message)
var/datum/feed_channel/newChannel = new /datum/feed_channel
newChannel.channel_name = channel_name
newChannel.author = author
newChannel.locked = locked
newChannel.is_admin_channel = adminChannel
if(announcement_message)
newChannel.announcement = announcement_message
else
newChannel.announcement = "Breaking news from [channel_name]!"
network_channels += newChannel
/datum/feed_network/proc/SubmitArticle(var/msg, var/author, var/channel_name, var/obj/item/weapon/photo/photo, var/adminMessage = 0, var/message_type = "")
var/datum/feed_message/newMsg = new /datum/feed_message
newMsg.author = author
newMsg.body = msg
newMsg.time_stamp = "[worldtime2text()]"
newMsg.is_admin_message = adminMessage
if(message_type)
newMsg.message_type = message_type
if(photo)
newMsg.img = photo.img
newMsg.caption = photo.scribble
for(var/datum/feed_channel/FC in network_channels)
if(FC.channel_name == channel_name)
insert_message_in_channel(FC, newMsg) //Adding message to the network's appropriate feed_channel
break
/datum/feed_network/proc/insert_message_in_channel(var/datum/feed_channel/FC, var/datum/feed_message/newMsg)
FC.messages += newMsg
newMsg.parent_channel = FC
FC.update()
alert_readers(FC.announcement)
/datum/feed_network/proc/alert_readers(var/annoncement)
// get_receptions sleeps further down the line, spawn of elsewhere
set waitfor = FALSE
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
NEWSCASTER.newsAlert(annoncement)
NEWSCASTER.update_icon()
var/list/receiving_pdas = new
for (var/obj/item/device/pda/P in PDAs)
if (!P.owner)
continue
if (P.toff)
continue
receiving_pdas += P
var/datum/receptions/receptions = get_receptions(null, receiving_pdas) // datums are not atoms, thus we have to assume the newscast network always has reception
for(var/obj/item/device/pda/PDA in receiving_pdas)
if(!(receptions.receiver_reception[PDA] & TELECOMMS_RECEPTION_RECEIVER))
continue
PDA.new_news(annoncement)
var/datum/feed_network/news_network = new /datum/feed_network //The global news-network, which is coincidentally a global list.
var/list/obj/machinery/newscaster/allCasters = list() //Global list that will contain reference to all newscasters in existence.
/obj/machinery/newscaster
name = "newscaster"
desc = "A standard newsfeed handler for use on commercial space stations. All the news you absolutely have no use for, in one place!"
@@ -194,7 +76,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
cut_overlays() //reset overlays
if(news_network.wanted_issue) //wanted icon state, there can be no overlays on it as it's a priority message
if(SSnews.wanted_issue) //wanted icon state, there can be no overlays on it as it's a priority message
icon_state = "newscaster_wanted"
return
@@ -262,7 +144,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
if(0)
dat += "Welcome to Newscasting Unit #[src.unit_no].<BR> Interface & News networks Operational."
dat += "<BR><FONT SIZE=1>Property of Nanotransen Inc</FONT>"
if(news_network.wanted_issue)
if(SSnews.wanted_issue)
dat+= "<HR><A href='?src=\ref[src];view_wanted=1'>Read Wanted Issue</A>"
dat+= "<HR><BR><A href='?src=\ref[src];create_channel=1'>Create Feed Channel</A>"
dat+= "<BR><A href='?src=\ref[src];view=1'>View Feed Channels</A>"
@@ -272,7 +154,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+= "<BR><BR><A href='?src=\ref[human_or_robot_user];mach_close=newscaster_main'>Exit</A>"
if(src.securityCaster)
var/wanted_already = 0
if(news_network.wanted_issue)
if(SSnews.wanted_issue)
wanted_already = 1
dat+="<HR><B>Feed Security functions:</B><BR>"
@@ -282,14 +164,15 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="<BR><HR>The newscaster recognises you as: <FONT COLOR='green'>[src.scanned_user]</FONT>"
if(1)
dat+= "Station Feed Channels<HR>"
if( isemptylist(news_network.network_channels) )
if( isemptylist(SSnews.network_channels) )
dat+="<I>No active channels found...</I>"
else
for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
if(CHANNEL.is_admin_channel)
dat+="<B><FONT style='BACKGROUND-COLOR: LightGreen '><A href='?src=\ref[src];show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A></FONT></B><BR>"
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
if(FC.is_admin_channel)
dat+="<B><FONT style='BACKGROUND-COLOR: LightGreen '><A href='?src=\ref[src];show_channel=\ref[FC]'>[FC.channel_name]</A></FONT></B><BR>"
else
dat+="<B><A href='?src=\ref[src];show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR></B>"
dat+="<B><A href='?src=\ref[src];show_channel=\ref[FC]'>[FC.channel_name]</A> [(FC.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR></B>"
dat+="<BR><HR><A href='?src=\ref[src];refresh=1'>Refresh</A>"
dat+="<BR><A href='?src=\ref[src];setScreen=[0]'>Back</A>"
if(2)
@@ -324,7 +207,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
if(7)
dat+="<B><FONT COLOR='maroon'>ERROR: Could not submit Feed Channel to Network.</B></FONT><HR><BR>"
var/list/existing_authors = list()
for(var/datum/feed_channel/FC in news_network.network_channels)
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
if(FC.author == "\[REDACTED\]")
existing_authors += FC.backup_author
else
@@ -334,7 +218,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
if(src.channel_name=="" || src.channel_name == "\[REDACTED\]")
dat+="<FONT COLOR='maroon'>Invalid channel name.</FONT><BR>"
var/check = 0
for(var/datum/feed_channel/FC in news_network.network_channels)
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
if(FC.channel_name == src.channel_name)
check = 1
break
@@ -344,10 +229,11 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="<FONT COLOR='maroon'>Channel author unverified.</FONT><BR>"
dat+="<BR><A href='?src=\ref[src];setScreen=[2]'>Return</A><BR>"
if(8)
var/total_num=length(news_network.network_channels)
var/total_num=length(SSnews.network_channels)
var/active_num=total_num
var/message_num=0
for(var/datum/feed_channel/FC in news_network.network_channels)
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
if(!FC.censored)
message_num += length(FC.messages) //Dont forget, datum/feed_channel's var messages is a list of datum/feed_message
else
@@ -383,22 +269,24 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="<FONT SIZE=1>NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.<BR>"
dat+="Keep in mind that users attempting to view a censored feed will instead see the \[REDACTED\] tag above it.</FONT>"
dat+="<HR>Select Feed channel to get Stories from:<BR>"
if(isemptylist(news_network.network_channels))
if(isemptylist(SSnews.network_channels))
dat+="<I>No feed channels found active...</I><BR>"
else
for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
dat+="<A href='?src=\ref[src];pick_censor_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
dat+="<A href='?src=\ref[src];pick_censor_channel=\ref[FC]'>[FC.channel_name]</A> [(FC.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
dat+="<BR><A href='?src=\ref[src];setScreen=[0]'>Cancel</A>"
if(11)
dat+="<B>[current_map.company_name] D-Notice Handler</B><HR>"
dat+="<FONT SIZE=1>A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station's"
dat+="morale, integrity or disciplinary behaviour. A D-Notice will render a channel unable to be updated by anyone, without deleting any feed"
dat+="stories it might contain at the time. You can lift a D-Notice if you have the required access at any time.</FONT><HR>"
if(isemptylist(news_network.network_channels))
if(isemptylist(SSnews.network_channels))
dat+="<I>No feed channels found active...</I><BR>"
else
for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
dat+="<A href='?src=\ref[src];pick_d_notice=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
dat+="<A href='?src=\ref[src];pick_d_notice=\ref[FC]'>[FC.channel_name]</A> [(FC.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
dat+="<BR><A href='?src=\ref[src];setScreen=[0]'>Back</A>"
if(12)
@@ -431,7 +319,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="<B>Wanted Issue Handler:</B>"
var/wanted_already = 0
var/end_param = 1
if(news_network.wanted_issue)
if(SSnews.wanted_issue)
wanted_already = 1
end_param = 2
@@ -442,7 +330,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="<A href='?src=\ref[src];set_wanted_desc=1'>Description</A>: [src.msg] <BR>"
dat+="<A href='?src=\ref[src];set_attachment=1'>Attach Photo</A>: [(src.photo_data ? "Photo Attached" : "No Photo")]</BR>"
if(wanted_already)
dat+="<B>Wanted Issue created by:</B><FONT COLOR='green'> [news_network.wanted_issue.backup_author]</FONT><BR>"
dat+="<B>Wanted Issue created by:</B><FONT COLOR='green'> [SSnews.wanted_issue.backup_author]</FONT><BR>"
else
dat+="<B>Wanted Issue will be created under prosecutor:</B><FONT COLOR='green'> [src.scanned_user]</FONT><BR>"
dat+="<BR><A href='?src=\ref[src];submit_wanted=[end_param]'>[(wanted_already) ? ("Edit Issue") : ("Submit")]</A>"
@@ -465,12 +353,12 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="<B>Wanted Issue successfully deleted from Circulation</B><BR>"
dat+="<BR><A href='?src=\ref[src];setScreen=[0]'>Return</A><BR>"
if(18)
dat+="<B><FONT COLOR ='maroon'>-- STATIONWIDE WANTED ISSUE --</B></FONT><BR><FONT SIZE=2>\[Submitted by: <FONT COLOR='green'>[news_network.wanted_issue.backup_author]</FONT>\]</FONT><HR>"
dat+="<B>Criminal</B>: [news_network.wanted_issue.author]<BR>"
dat+="<B>Description</B>: [news_network.wanted_issue.body]<BR>"
dat+="<B><FONT COLOR ='maroon'>-- STATIONWIDE WANTED ISSUE --</B></FONT><BR><FONT SIZE=2>\[Submitted by: <FONT COLOR='green'>[SSnews.wanted_issue.backup_author]</FONT>\]</FONT><HR>"
dat+="<B>Criminal</B>: [SSnews.wanted_issue.author]<BR>"
dat+="<B>Description</B>: [SSnews.wanted_issue.body]<BR>"
dat+="<B>Photo:</B>: "
if(news_network.wanted_issue.img)
usr << browse_rsc(news_network.wanted_issue.img, "tmp_photow.png")
if(SSnews.wanted_issue.img)
usr << browse_rsc(SSnews.wanted_issue.img, "tmp_photow.png")
dat+="<BR><img src='tmp_photow.png' width = '180'>"
else
dat+="None"
@@ -509,14 +397,16 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else if(href_list["submit_new_channel"])
//var/list/existing_channels = list() //OBSOLETE
var/list/existing_authors = list()
for(var/datum/feed_channel/FC in news_network.network_channels)
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
//existing_channels += FC.channel_name
if(FC.author == "\[REDACTED\]")
existing_authors += FC.backup_author
else
existing_authors +=FC.author
var/check = 0
for(var/datum/feed_channel/FC in news_network.network_channels)
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
if(FC.channel_name == src.channel_name)
check = 1
break
@@ -525,7 +415,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else
var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel")
if(choice=="Confirm")
news_network.CreateFeedChannel(src.channel_name, src.scanned_user, c_locked)
SSnews.CreateFeedChannel(src.channel_name, src.scanned_user, c_locked)
src.screen=5
src.updateUsrDialog()
//src.update_icon()
@@ -533,9 +423,10 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else if(href_list["set_channel_receiving"])
//var/list/datum/feed_channel/available_channels = list()
var/list/available_channels = list()
for(var/datum/feed_channel/F in news_network.network_channels)
if( (!F.locked || F.author == scanned_user) && !F.censored)
available_channels += F.channel_name
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
if( (!FC.locked || FC.author == scanned_user) && !FC.censored)
available_channels += FC.channel_name
src.channel_name = input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels
src.updateUsrDialog()
@@ -553,7 +444,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else
var/image = photo_data ? photo_data.photo : null
feedback_inc("newscaster_stories",1)
news_network.SubmitArticle(src.msg, src.scanned_user, src.channel_name, image, 0)
var/datum/feed_channel/ch = SSnews.GetFeedChannel(src.channel_name)
SSnews.SubmitArticle(src.msg, src.scanned_user, ch, image, 0)
src.screen=4
src.updateUsrDialog()
@@ -587,12 +479,12 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else if(href_list["menu_wanted"])
var/already_wanted = 0
if(news_network.wanted_issue)
if(SSnews.wanted_issue)
already_wanted = 1
if(already_wanted)
src.channel_name = news_network.wanted_issue.author
src.msg = news_network.wanted_issue.body
src.channel_name = SSnews.wanted_issue.author
src.msg = SSnews.wanted_issue.body
src.screen = 14
src.updateUsrDialog()
@@ -618,29 +510,29 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
WANTED.backup_author = src.scanned_user //I know, a bit wacky
if(photo_data)
WANTED.img = photo_data.photo.img
news_network.wanted_issue = WANTED
news_network.alert_readers()
SSnews.wanted_issue = WANTED
SSnews.alert_readers()
src.screen = 15
else
if(news_network.wanted_issue.is_admin_message)
if(SSnews.wanted_issue.is_admin_message)
alert("The wanted issue has been distributed by a [current_map.company_name] higherup. You cannot edit it.","Ok")
return
news_network.wanted_issue.author = src.channel_name
news_network.wanted_issue.body = src.msg
news_network.wanted_issue.backup_author = src.scanned_user
SSnews.wanted_issue.author = src.channel_name
SSnews.wanted_issue.body = src.msg
SSnews.wanted_issue.backup_author = src.scanned_user
if(photo_data)
news_network.wanted_issue.img = photo_data.photo.img
SSnews.wanted_issue.img = photo_data.photo.img
src.screen = 19
src.updateUsrDialog()
else if(href_list["cancel_wanted"])
if(news_network.wanted_issue.is_admin_message)
if(SSnews.wanted_issue.is_admin_message)
alert("The wanted issue has been distributed by a [current_map.company_name] higherup. You cannot take it down.","Ok")
return
var/choice = alert("Please confirm Wanted Issue removal","Network Security Handler","Confirm","Cancel")
if(choice=="Confirm")
news_network.wanted_issue = null
SSnews.wanted_issue = null
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
NEWSCASTER.update_icon()
src.screen=17
@@ -652,7 +544,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else if(href_list["censor_channel_author"])
var/datum/feed_channel/FC = locate(href_list["censor_channel_author"])
if(FC.is_admin_channel)
alert("This channel was created by a [current_map.company_name] Officer. You cannot censor it.","Ok")
alert("This channel was created by a [current_map.company_name] Officer or a external news agency. You cannot censor it.","Ok")
return
if(FC.author != "<B>\[REDACTED\]</B>")
FC.backup_author = FC.author
@@ -665,7 +557,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else if(href_list["censor_channel_story_author"])
var/datum/feed_message/MSG = locate(href_list["censor_channel_story_author"])
if(MSG.is_admin_message)
alert("This message was created by a [current_map.company_name] Officer. You cannot censor its author.","Ok")
alert("This message was created by a [current_map.company_name] Officer or a external news agency. You cannot censor its author.","Ok")
return
if(MSG.author != "<B>\[REDACTED\]</B>")
MSG.backup_author = MSG.author
@@ -678,7 +570,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else if(href_list["censor_channel_story_body"])
var/datum/feed_message/MSG = locate(href_list["censor_channel_story_body"])
if(MSG.is_admin_message)
alert("This channel was created by a [current_map.company_name] Officer. You cannot censor it.","Ok")
alert("This channel was created by a [current_map.company_name] Officer or a external news agency. You cannot censor it.","Ok")
return
if(MSG.body != "<B>\[REDACTED\]</B>")
MSG.backup_body = MSG.body
@@ -704,7 +596,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else if(href_list["toggle_d_notice"])
var/datum/feed_channel/FC = locate(href_list["toggle_d_notice"])
if(FC.is_admin_channel)
alert("This channel was created by a [current_map.company_name] Officer. You cannot place a D-Notice upon it.","Ok")
alert("This channel was created by a [current_map.company_name] Officer or a external news agency. You cannot place a D-Notice upon it.","Ok")
return
FC.censored = !FC.censored
FC.update()
@@ -978,10 +870,11 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob)
/obj/machinery/newscaster/proc/print_paper()
feedback_inc("newscaster_newspapers_printed",1)
var/obj/item/weapon/newspaper/NEWSPAPER = new /obj/item/weapon/newspaper
for(var/datum/feed_channel/FC in news_network.network_channels)
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
NEWSPAPER.news_content += FC
if(news_network.wanted_issue)
NEWSPAPER.important_message = news_network.wanted_issue
if(SSnews.wanted_issue)
NEWSPAPER.important_message = SSnews.wanted_issue
NEWSPAPER.loc = get_turf(src)
src.paper_remaining--
return
+90 -91
View File
@@ -208,101 +208,101 @@ Buildable meters
/obj/item/pipe/proc/update()
var/list/nlist = list(
"pipe",
"bent pipe",
"bent pipe",
"h/e pipe",
"bent h/e pipe",
"connector",
"manifold",
"junction",
"uvent",
"mvalve",
"pump",
"scrubber",
"insulated pipe",
"bent insulated pipe",
"gas filter",
"gas mixer",
"pressure regulator",
"high power pump",
"heat exchanger",
"t-valve",
"4-way manifold",
"pipe cap",
"manifold",
"junction",
"uvent",
"mvalve",
"pump",
"scrubber",
"insulated pipe",
"bent insulated pipe",
"gas filter",
"gas mixer",
"pressure regulator",
"high power pump",
"heat exchanger",
"t-valve",
"4-way manifold",
"pipe cap",
///// Z-Level stuff
"pipe up",
"pipe down",
"pipe up",
"pipe down",
///// Z-Level stuff
"gas filter m",
"gas mixer t",
"gas mixer m",
"omni mixer",
"omni filter",
"gas filter m",
"gas mixer t",
"gas mixer m",
"omni mixer",
"omni filter",
///// Supply and scrubbers pipes
"universal pipe adapter",
"supply pipe",
"bent supply pipe",
"scrubbers pipe",
"bent scrubbers pipe",
"supply manifold",
"scrubbers manifold",
"supply 4-way manifold",
"scrubbers 4-way manifold",
"supply pipe up",
"scrubbers pipe up",
"supply pipe down",
"scrubbers pipe down",
"supply pipe cap",
"scrubbers pipe cap",
"universal pipe adapter",
"supply pipe",
"bent supply pipe",
"scrubbers pipe",
"bent scrubbers pipe",
"supply manifold",
"scrubbers manifold",
"supply 4-way manifold",
"scrubbers 4-way manifold",
"supply pipe up",
"scrubbers pipe up",
"supply pipe down",
"scrubbers pipe down",
"supply pipe cap",
"scrubbers pipe cap",
"t-valve m"
)
name = nlist[pipe_type+1] + " fitting"
var/list/islist = list(
"simple",
"simple",
"he",
"he",
"connector",
"manifold",
"junction",
"uvent",
"mvalve",
"pump",
"scrubber",
"insulated",
"insulated",
"filter",
"mixer",
"passivegate",
"volumepump",
"heunary",
"mtvalve",
"manifold4w",
"cap",
var/list/islist = list(
"simple",
"simple",
"he",
"he",
"connector",
"manifold",
"junction",
"uvent",
"mvalve",
"pump",
"scrubber",
"insulated",
"insulated",
"filter",
"mixer",
"passivegate",
"volumepump",
"heunary",
"mtvalve",
"manifold4w",
"cap",
///// Z-Level stuff
"cap",
"cap",
"cap",
"cap",
///// Z-Level stuff
"m_filter",
"t_mixer",
"m_mixer",
"omni_mixer",
"omni_filter",
"m_filter",
"t_mixer",
"m_mixer",
"omni_mixer",
"omni_filter",
///// Supply and scrubbers pipes
"universal",
"simple",
"simple",
"simple",
"simple",
"manifold",
"manifold",
"manifold4w",
"manifold4w",
"cap",
"cap",
"cap",
"cap",
"cap",
"cap",
"universal",
"simple",
"simple",
"simple",
"simple",
"manifold",
"manifold",
"manifold4w",
"manifold4w",
"cap",
"cap",
"cap",
"cap",
"cap",
"cap",
"mtvalvem"
)
icon_state = islist[pipe_type + 1]
@@ -359,16 +359,16 @@ Buildable meters
var/acw = turn(dir, 90)
switch(pipe_type)
if( PIPE_SIMPLE_STRAIGHT,
if( PIPE_SIMPLE_STRAIGHT,
PIPE_INSULATED_STRAIGHT,
PIPE_HE_STRAIGHT,
PIPE_HE_STRAIGHT,
PIPE_JUNCTION ,
PIPE_PUMP ,
PIPE_VOLUME_PUMP ,
PIPE_PASSIVE_GATE ,
PIPE_MVALVE,
PIPE_SUPPLY_STRAIGHT,
PIPE_SCRUBBERS_STRAIGHT,
PIPE_MVALVE,
PIPE_SUPPLY_STRAIGHT,
PIPE_SCRUBBERS_STRAIGHT,
PIPE_UNIVERSAL
)
return dir|flip
@@ -457,7 +457,7 @@ Buildable meters
else
user << "<span class='warning'>You can not change this pipe!</span>"
return
else if(pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SIMPLE_BENT, PIPE_SCRUBBERS_STRAIGHT, PIPE_SCRUBBERS_BENT, PIPE_SUPPLY_BENT, PIPE_SUPPLY_STRAIGHT))
if(pipe_type in list(PIPE_SIMPLE_BENT, PIPE_SIMPLE_STRAIGHT))
if(PIPE_SIMPLE_BENT)
@@ -475,7 +475,7 @@ Buildable meters
else
pipe_type = PIPE_SIMPLE_STRAIGHT
update()
if (!isturf(src.loc))
return 1
if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE))
@@ -1234,7 +1234,6 @@ Buildable meters
#undef PIPE_GAS_MIXER
#undef PIPE_PASSIVE_GATE
#undef PIPE_VOLUME_PUMP
#undef PIPE_OUTLET_INJECT
#undef PIPE_MTVALVE
#undef PIPE_MTVALVEM
#undef PIPE_GAS_FILTER_M
+7 -6
View File
@@ -29,7 +29,7 @@
var/datum/station_holomap/holomap_datum
/obj/machinery/station_map/Destroy()
SSminimap.station_holomaps -= src
SSholomap.station_holomaps -= src
stopWatching()
QDEL_NULL(holomap_datum)
return ..()
@@ -38,12 +38,12 @@
. = ..()
holomap_datum = new()
original_zLevel = loc.z
SSminimap.station_holomaps += src
SSholomap.station_holomaps += src
flags |= ON_BORDER // Why? It doesn't help if its not density
bogus = FALSE
var/turf/T = get_turf(src)
original_zLevel = T.z
if(!("[HOLOMAP_EXTRA_STATIONMAP]_[original_zLevel]" in SSminimap.extra_minimaps))
if(!("[HOLOMAP_EXTRA_STATIONMAP]_[original_zLevel]" in SSholomap.extra_minimaps))
bogus = TRUE
holomap_datum.initialize_holomap_bogus()
update_icon()
@@ -51,11 +51,12 @@
holomap_datum.initialize_holomap(T, reinit = TRUE)
small_station_map = image(SSminimap.extra_minimaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[original_zLevel]"], dir = dir)
small_station_map = image(SSholomap.extra_minimaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[original_zLevel]"], dir = dir)
small_station_map.layer = LIGHTING_LAYER + 0.1
floor_markings = image('icons/obj/machines/stationmap.dmi', "decal_station_map")
floor_markings.dir = src.dir
floor_markings.layer = ON_TURF_LAYER
update_icon()
/obj/machinery/station_map/attack_hand(var/mob/user)
@@ -153,7 +154,7 @@
if(bogus)
holomap_datum.initialize_holomap_bogus()
else
small_station_map.icon = SSminimap.extra_minimaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[original_zLevel]"]
small_station_map.icon = SSholomap.extra_minimaps["[HOLOMAP_EXTRA_STATIONMAPSMALL]_[original_zLevel]"]
add_overlay(small_station_map)
holomap_datum.initialize_holomap(get_turf(src))
@@ -200,7 +201,7 @@
/datum/station_holomap/proc/initialize_holomap(turf/T, isAI = null, mob/user = null, reinit = FALSE)
if(!station_map || reinit)
station_map = image(SSminimap.extra_minimaps["[HOLOMAP_EXTRA_STATIONMAP]_[T.z]"])
station_map = image(SSholomap.extra_minimaps["[HOLOMAP_EXTRA_STATIONMAP]_[T.z]"])
if(!cursor || reinit)
cursor = image('icons/misc/holomap_markers.dmi', "you")
if(!legend || reinit)
+1 -2
View File
@@ -238,8 +238,7 @@
mode = STATUS_DISPLAY_TIME
update()
#undef CHARS_PER_LINE
#undef FOND_SIZE
#undef FONT_SIZE
#undef FONT_COLOR
#undef FONT_STYLE
#undef SCROLL_SPEED
+3 -2
View File
@@ -98,7 +98,8 @@
var/datum/wires/vending/wires = null
var/can_move = 1 //if you can wrench the machine out of place
var/vend_id = "generic"
var/vend_id = "generic" //Id of the refill cartridge that has to be used
var/restock_items = 0 //If items can be restocked into the vending machine
/obj/machinery/vending/Initialize()
. = ..()
@@ -270,7 +271,7 @@
else if(!is_borg_item(W))
for(var/datum/data/vending_product/R in product_records)
if(istype(W, R.product_path))
if(istype(W, R.product_path) && restock_items)
stock(R, user)
qdel(W)
return
+69 -94
View File
@@ -265,6 +265,7 @@
/obj/item/weapon/reagent_containers/syringe/antiviral = 4,
/obj/item/weapon/reagent_containers/syringe = 12,
/obj/item/device/healthanalyzer = 5,
/obj/item/device/breath_analyzer = 2,
/obj/item/weapon/reagent_containers/glass/beaker = 4,
/obj/item/weapon/reagent_containers/dropper = 2,
/obj/item/stack/medical/advanced/bruise_pack = 3,
@@ -308,7 +309,8 @@
/obj/item/stack/medical/bruise_pack = 2,
/obj/item/stack/medical/ointment = 2,
/obj/item/weapon/reagent_containers/hypospray/autoinjector = 4,
/obj/item/device/healthanalyzer = 1
/obj/item/device/healthanalyzer = 1,
/obj/item/device/breath_analyzer = 1
)
contraband = list(
/obj/item/weapon/reagent_containers/syringe/antitoxin = 4,
@@ -392,88 +394,91 @@
product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!"
icon_state = "seeds"
vend_id = "seeds"
products = list(
/obj/item/seeds/appleseed = 3,
/obj/item/seeds/bananaseed = 3,
/obj/item/seeds/berryseed = 3,
/obj/item/seeds/blueberryseed = 3,
/obj/item/seeds/cabbageseed = 3,
/obj/item/seeds/carrotseed = 3,
/obj/item/seeds/chantermycelium = 3,
/obj/item/seeds/cherryseed = 3,
/obj/item/seeds/chiliseed = 3,
/obj/item/seeds/cocoapodseed = 3,
/obj/item/seeds/cornseed = 3,
/obj/item/seeds/eggplantseed = 3,
/obj/item/seeds/grapeseed = 3,
/obj/item/seeds/grassseed = 3,
/obj/item/seeds/greengrapeseed = 3,
/obj/item/seeds/harebell = 3,
/obj/item/seeds/lemonseed = 3,
/obj/item/seeds/limeseed = 3,
/obj/item/seeds/mtearseed = 3,
/obj/item/seeds/orangeseed = 3,
/obj/item/seeds/peanutseed = 3,
/obj/item/seeds/plumpmycelium = 3,
/obj/item/seeds/poppyseed = 3,
/obj/item/seeds/potatoseed = 3,
/obj/item/seeds/pumpkinseed = 3,
/obj/item/seeds/replicapod = 3,
/obj/item/seeds/riceseed = 3,
/obj/item/seeds/shandseed = 3,
/obj/item/seeds/soyaseed = 3,
/obj/item/seeds/sugarcaneseed = 3,
/obj/item/seeds/sunflowerseed = 3,
/obj/item/seeds/tomatoseed = 3,
/obj/item/seeds/towermycelium = 3,
/obj/item/seeds/wheatseed = 3,
/obj/item/seeds/appleseed = 3,
/obj/item/seeds/poppyseed = 3,
/obj/item/seeds/sugarcaneseed = 3,
/obj/item/seeds/peanutseed = 3,
/obj/item/seeds/whitebeetseed = 3,
/obj/item/seeds/watermelonseed = 3,
/obj/item/seeds/limeseed = 3,
/obj/item/seeds/lemonseed = 3,
/obj/item/seeds/orangeseed = 3,
/obj/item/seeds/grassseed = 3,
/obj/item/seeds/cocoapodseed = 3,
/obj/item/seeds/plumpmycelium = 2,
/obj/item/seeds/cabbageseed = 3,
/obj/item/seeds/grapeseed = 3,
/obj/item/seeds/pumpkinseed = 3,
/obj/item/seeds/cherryseed = 3,
/obj/item/seeds/plastiseed = 3,
/obj/item/seeds/riceseed = 3
/obj/item/seeds/wheatseed = 3,
/obj/item/seeds/whitebeetseed = 3
)
contraband = list(
/obj/item/seeds/amanitamycelium = 2,
/obj/item/seeds/glowshroom = 2,
/obj/item/seeds/libertymycelium = 2,
/obj/item/seeds/mtearseed = 2,
/obj/item/seeds/nettleseed = 2,
/obj/item/seeds/reishimycelium = 2,
/obj/item/seeds/reishimycelium = 2,
/obj/item/seeds/shandseed = 2,
/obj/item/seeds/ambrosiavulgarisseed = 3
)
premium = list(
/obj/item/toy/waterflower = 1
/obj/item/seeds/amanitamycelium = 3,
/obj/item/seeds/ambrosiadeusseed = 3,
/obj/item/seeds/ambrosiavulgarisseed = 3,
/obj/item/seeds/glowshroom = 3,
/obj/item/seeds/libertymycelium = 3,
/obj/item/seeds/nettleseed = 3,
/obj/item/seeds/plastiseed = 3,
/obj/item/seeds/reishimycelium = 3
)
prices = list(
/obj/item/seeds/bananaseed = 30,
/obj/item/seeds/berryseed = 15,
/obj/item/seeds/carrotseed = 15,
/obj/item/seeds/chantermycelium = 5,
/obj/item/seeds/chiliseed = 10,
/obj/item/seeds/cornseed = 15,
/obj/item/seeds/eggplantseed = 10,
/obj/item/seeds/potatoseed = 10,
/obj/item/seeds/replicapod = 175,
/obj/item/seeds/soyaseed = 10,
/obj/item/seeds/sunflowerseed = 5,
/obj/item/seeds/tomatoseed = 15,
/obj/item/seeds/towermycelium = 5,
/obj/item/seeds/wheatseed = 5,
/obj/item/seeds/appleseed = 15,
/obj/item/seeds/poppyseed = 20,
/obj/item/seeds/sugarcaneseed = 12,
/obj/item/seeds/peanutseed = 25,
/obj/item/seeds/whitebeetseed = 20,
/obj/item/seeds/watermelonseed = 15,
/obj/item/seeds/limeseed = 15,
/obj/item/seeds/lemonseed = 15,
/obj/item/seeds/orangeseed = 15,
/obj/item/seeds/grassseed = 2,
/obj/item/seeds/cocoapodseed = 25,
/obj/item/seeds/plumpmycelium = 30,
/obj/item/seeds/cabbageseed = 15,
/obj/item/seeds/grapeseed = 15,
/obj/item/seeds/pumpkinseed = 25,
/obj/item/seeds/cherryseed = 25,
/obj/item/seeds/plastiseed = 25,
/obj/item/seeds/riceseed = 25
/obj/item/seeds/appleseed = 50,
/obj/item/seeds/bananaseed = 60,
/obj/item/seeds/berryseed = 40,
/obj/item/seeds/blueberryseed = 30,
/obj/item/seeds/cabbageseed = 40,
/obj/item/seeds/carrotseed = 20,
/obj/item/seeds/chantermycelium = 20,
/obj/item/seeds/cherryseed = 40,
/obj/item/seeds/chiliseed = 50,
/obj/item/seeds/cocoapodseed = 50,
/obj/item/seeds/cornseed = 30,
/obj/item/seeds/eggplantseed = 30,
/obj/item/seeds/grapeseed = 40,
/obj/item/seeds/grassseed = 40,
/obj/item/seeds/greengrapeseed = 40,
/obj/item/seeds/harebell = 10,
/obj/item/seeds/lemonseed = 40,
/obj/item/seeds/limeseed = 50,
/obj/item/seeds/mtearseed = 60,
/obj/item/seeds/orangeseed = 40,
/obj/item/seeds/peanutseed = 30,
/obj/item/seeds/plumpmycelium = 20,
/obj/item/seeds/poppyseed = 10,
/obj/item/seeds/potatoseed = 30,
/obj/item/seeds/pumpkinseed = 40,
/obj/item/seeds/replicapod = 200,
/obj/item/seeds/riceseed = 20,
/obj/item/seeds/shandseed = 60,
/obj/item/seeds/soyaseed = 40,
/obj/item/seeds/sugarcaneseed = 20,
/obj/item/seeds/sunflowerseed = 20,
/obj/item/seeds/tomatoseed = 30,
/obj/item/seeds/towermycelium = 20,
/obj/item/seeds/watermelonseed = 30,
/obj/item/seeds/wheatseed = 20,
/obj/item/seeds/whitebeetseed = 20
)
/**
@@ -721,36 +726,6 @@
)
//everything after the power cell had no amounts, I improvised. -Sayu
//FOR ACTORS GUILD - mainly props that cannot be spawned otherwise
/obj/machinery/vending/props
name = "prop dispenser"
desc = "All the props an actor could need. Probably."
icon_state = "Theater"
vend_id = "baygay"
products = list(
/obj/structure/flora/pottedplant = 2,
/obj/item/device/flashlight/lamp = 2,
/obj/item/device/flashlight/lamp/green = 2,
/obj/item/weapon/reagent_containers/food/drinks/jar = 1,
/obj/item/weapon/nullrod = 1,
/obj/item/toy/cultsword = 4,
/obj/item/toy/katana = 2,
/obj/item/weapon/phone = 3
)
//FOR ACTORS GUILD - Containers
/obj/machinery/vending/containers
name = "container dispenser"
desc = "A container that dispenses containers."
icon_state = "robotics"
vend_id = "baygay"
products = list(
/obj/structure/closet/crate/freezer = 2,
/obj/structure/closet = 3,
/obj/structure/closet/crate = 3
)
//RECURSION
/obj/machinery/vending/vendors
name = "Omni-Vendor"
+1 -1
View File
@@ -144,7 +144,7 @@
delete_me = 1
/obj/effect/landmark/costume/maid/New()
new /obj/item/clothing/under/blackskirt(src.loc)
new /obj/item/clothing/under/skirt/(src.loc)
var/CHOICE = pick( /obj/item/clothing/head/beret , /obj/item/clothing/head/rabbitears )
new CHOICE(src.loc)
new /obj/item/clothing/glasses/sunglasses/blindfold(src.loc)
+63 -79
View File
@@ -427,10 +427,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
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]
@@ -453,7 +449,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(P.icon_state == "pda-hos"||P.icon_state == "pda-warden"||P.icon_state == "pda-det"||P.icon_state == "pda-sec"||P.icon_state == "pda-s")
pdas.Add(list(list("Name" = "[P]", "Reference" = "\ref[P]", "Detonate" = "[P.detonate]", "inconvo" = "0")))
if(4) //eng
if(P.icon_state == "pda-ce"||P.icon_state == "pda-e"||P.icon_state == "pda-atmo"||P.icon_state == "pda-j")
if(P.icon_state == "pda-ce"||P.icon_state == "pda-e"||P.icon_state == "pda-atmo")
pdas.Add(list(list("Name" = "[P]", "Reference" = "\ref[P]", "Detonate" = "[P.detonate]", "inconvo" = "0")))
if(5) //sci
if(P.icon_state == "pda-rd"||P.icon_state == "pda-tox"||P.icon_state == "pda-v"||P.icon_state == "pda-robot")
@@ -462,7 +458,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(P.icon_state == "pda-hop"||P.icon_state == "pda-cargo"||P.icon_state == "pda-q"||P.icon_state == "pda-miner")
pdas.Add(list(list("Name" = "[P]", "Reference" = "\ref[P]", "Detonate" = "[P.detonate]", "inconvo" = "0")))
if(7) //service
if(P.icon_state == "pda-hop"||P.icon_state == "pda-bar"||P.icon_state == "pda-holy"||P.icon_state == "pda-lawyer"||P.icon_state == "pda-libb"||P.icon_state == "pda-hydro"||P.icon_state == "pda-chef")
if(P.icon_state == "pda-hop"||P.icon_state == "pda-bar"||P.icon_state == "pda-holy"||P.icon_state == "pda-lawyer"||P.icon_state == "pda-libb"||P.icon_state == "pda-hydro"||P.icon_state == "pda-chef"||P.icon_state == "pda-j")
pdas.Add(list(list("Name" = "[P]", "Reference" = "\ref[P]", "Detonate" = "[P.detonate]", "inconvo" = "0")))
if(8) //medical
if(P.icon_state == "pda-cmo"||P.icon_state == "pda-v"||P.icon_state == "pda-m"||P.icon_state == "pda-chem")
@@ -518,16 +514,13 @@ var/global/list/obj/item/device/pda/PDAs = list()
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)
feeds.Cut()
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
feeds[++feeds.len] = list("name" = FC.channel_name, "censored" = FC.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/datum/feed_channel/FC = SSnews.GetFeedChannel(active_feed["name"])
var/list/feed = feed_info[active_feed]
if(!feed)
@@ -538,7 +531,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
feed["updated"] = -1
feed_info[active_feed] = feed
if(FC.updated > feed["updated"] && has_reception)
if(FC.updated > feed["updated"])
feed["author"] = FC.author
feed["updated"] = FC.updated
feed["censored"] = FC.censored
@@ -910,65 +903,56 @@ var/global/list/obj/item/device/pda/PDAs = list()
/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/effect = pick("explosion", "burn", "emp", "smoke", "stun", "spark")
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)
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, 60)
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(weaken = 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(stun = 1, stutter = 1)
message += "Your [P] flashes with a blinding white light! You feel weaker."
if(i>=85) //Sparks
spark(P.loc, 2)
message += "Your [P] begins to spark violently!"
if(i>45 && i<65 && prob(50)) //Nothing happens
message += "Your [P] bleeps loudly."
j = prob(10)
switch(effect)
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("explosion")
P.explode()
message += "Your [P] suddenly explodes!"
if("burn")
if(M && isliving(M))
M.apply_damage( rand(30,60) , BURN)
message += "You feel a searing heat! Your [P] is burning!"
if("emp")
empulse(P.loc, 3, 6, 1)
if("smoke")
var/datum/effect/effect/system/smoke_spread/bad/S = new /datum/effect/effect/system/smoke_spread/bad
S.set_up(P, 10, 0, P.loc, 60)
S.attach(P.loc)
S.start()
playsound(P.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
message += "Large clouds of smoke billow forth from your [P]!"
if("stun")
if(M && isliving(M))
M.apply_effect(5, WEAKEN)
flick("flash", M.flash)
message += "Your [P] flashes with a blinding white light!"
if("spark")
spark(P.loc, 2)
message += "Your [P] begins to spark violently!"
if(message)
message += " "
if(effect == "explosion")
message += "Your [P] shatters in a thousand pieces!"
else
message += "\The [P] melts in a puddle of plastic."
if(M && isliving(M))
message = "<span class='warning'>[message]</span>"
M.show_message(message, 1)
to_chat(M, "<span class='warning'>[message]</span>")
qdel(P)
/obj/item/device/pda/proc/remove_id()
if (id)
@@ -1473,20 +1457,20 @@ var/global/list/obj/item/device/pda/PDAs = list()
icon = 'icons/obj/pda.dmi'
icon_state = "pdabox"
New()
..()
new /obj/item/device/pda(src)
new /obj/item/device/pda(src)
new /obj/item/device/pda(src)
new /obj/item/device/pda(src)
new /obj/item/weapon/cartridge/head(src)
/obj/item/weapon/storage/box/PDAs/fill()
..()
new /obj/item/device/pda(src)
new /obj/item/device/pda(src)
new /obj/item/device/pda(src)
new /obj/item/device/pda(src)
new /obj/item/weapon/cartridge/head(src)
var/newcart = pick( /obj/item/weapon/cartridge/engineering,
/obj/item/weapon/cartridge/security,
/obj/item/weapon/cartridge/medical,
/obj/item/weapon/cartridge/signal/science,
/obj/item/weapon/cartridge/quartermaster)
new newcart(src)
var/newcart = pick( /obj/item/weapon/cartridge/engineering,
/obj/item/weapon/cartridge/security,
/obj/item/weapon/cartridge/medical,
/obj/item/weapon/cartridge/signal/science,
/obj/item/weapon/cartridge/quartermaster)
new newcart(src)
// Pass along the pulse to atoms in contents, largely added so pAIs are vulnerable to EMP
/obj/item/device/pda/emp_act(severity)
@@ -0,0 +1,73 @@
/obj/item/device/oxycandle
name = "oxygen candle"
desc = "A steel tube with the words 'OXYGEN - PULL CORD TO IGNITE' stamped on the side. A small label warns against using the device underwater"
icon = 'icons/obj/device.dmi'
icon_state = "oxycandle"
item_state = "oxycandle"
w_class = ITEMSIZE_SMALL // Should fit into internal's box or maybe pocket
var/target_pressure = ONE_ATMOSPHERE
var/datum/gas_mixture/air_contents = null
var/volume = 5600 // One tile has 2500 volume of air, so two tiles plus a bit extra
var/on = FALSE
var/activation_sound = 'sound/items/flare.ogg'
light_color = LIGHT_COLOR_FLARE
uv_intensity = 50
var/brightness_on = 2 // Moderate bright.
light_power = 2
action_button_name = null
/obj/item/device/oxycandle/attack_self(mob/user)
if(!on)
user << "<span class='notice'>You pull the cord and [src] ignites.</span>"
light_range = brightness_on
on = TRUE
update_icon()
playsound(src.loc, activation_sound, 75, 1)
air_contents = new /datum/gas_mixture()
air_contents.volume = 200 //liters
air_contents.temperature = T20C
var/list/air_mix = list("oxygen" = O2STANDARD * (target_pressure * air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature),
"nitrogen" = N2STANDARD * (target_pressure * air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature))
air_contents.adjust_multi("oxygen", air_mix["oxygen"], "nitrogen", air_mix["nitrogen"])
START_PROCESSING(SSprocessing, src)
// Process of Oxygen candles releasing air. Makes 200 volume of oxygen and nitrogen mix
/obj/item/device/oxycandle/process()
if(!loc)
return
var/turf/pos = get_turf(src)
if(volume <= 0 || istype(pos, /turf/simulated/floor/beach/water) || istype(pos, /turf/unsimulated/beach/water))
STOP_PROCESSING(SSprocessing, src)
icon_state = "oxycandle_burnt"
item_state = icon_state
set_light(0)
update_held_icon()
name = "burnt oxygen candle"
desc += "This tube has exhausted its chemicals."
return
if(pos)
pos.hotspot_expose(1500, 5)
var/datum/gas_mixture/environment = loc.return_air()
var/pressure_delta = target_pressure - environment.return_pressure()
var/output_volume = environment.volume * environment.group_multiplier
var/air_temperature = air_contents.temperature? air_contents.temperature : environment.temperature
var/transfer_moles = pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
if (!removed) //Just in case
return
environment.merge(removed)
volume -= 200
var/list/air_mix = list("oxygen" = O2STANDARD * (target_pressure * air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature),
"nitrogen" = N2STANDARD * (target_pressure * air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature))
air_contents.adjust_multi("oxygen", air_mix["oxygen"], "nitrogen", air_mix["nitrogen"])
/obj/item/device/oxycandle/update_icon()
if(on)
icon_state = "oxycandle_on"
item_state = icon_state
set_light(brightness_on)
else
icon_state = "oxycandle"
item_state = icon_state
set_light(0)
update_held_icon()
@@ -226,13 +226,6 @@
item_state = "headset"
ks2type = /obj/item/device/encryptionkey/heads/hos
/obj/item/device/radio/headset/entertainment
name = "actor's radio headset"
desc = "specially made to make you sound less cheesy."
icon_state = "com_headset"
item_state = "headset"
ks2type = /obj/item/device/encryptionkey/entertainment
/obj/item/device/radio/headset/attackby(obj/item/weapon/W as obj, mob/user as mob)
// ..()
user.set_machine(src)
+92 -12
View File
@@ -4,6 +4,7 @@ HEALTH ANALYZER
GAS ANALYZER
MASS SPECTROMETER
REAGENT SCANNER
BREATH ANALYZER
*/
/obj/item/device/healthanalyzer
@@ -19,8 +20,7 @@ REAGENT SCANNER
throw_range = 10
matter = list(DEFAULT_WALL_MATERIAL = 200)
origin_tech = list(TECH_MAGNET = 1, TECH_BIO = 1)
var/mode = 1;
var/mode = 1
/obj/item/device/healthanalyzer/attack(mob/living/M as mob, mob/living/user as mob)
if ( ((CLUMSY in user.mutations) || (DUMB in user.mutations)) && prob(50))
@@ -112,15 +112,6 @@ REAGENT SCANNER
++unknown
if(unknown)
user << "<span class='warning'>Non-medical reagent[(unknown > 1)?"s":""] found in subject's stomach.</span>"
if(C.breathing && C.breathing.total_volume)
var/unknown = 0
for(var/datum/reagent/R in C.breathing.reagent_list)
if(R.scannable)
user << "<span class='notice'>[R.name] found in subject's respitory system.</span>"
else
++unknown
if(unknown)
user << "<span class='warning'>Non-medical reagent[(unknown > 1)?"s":""] found in subject's respitory system.</span>"
if(C.virus2.len)
for (var/ID in C.virus2)
if (ID in virusDB)
@@ -402,4 +393,93 @@ REAGENT SCANNER
var/value = get_value(target)
user.visible_message("\The [user] scans \the [target] with \the [src]")
user.show_message("Price estimation of \the [target]: [value ? value : "N/A"] Credits")
user.show_message("Price estimation of \the [target]: [value ? value : "N/A"] Credits")
/obj/item/device/breath_analyzer
name = "breath analyzer"
desc = "A hand-held breath analyzer that provides a robust amount of information about the subject's repository system."
icon_state = "breath_analyzer"
item_state = "analyzer"
w_class = 2.0
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 5
throw_speed = 4
throw_range = 20
matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 20)
origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
/obj/item/device/breath_analyzer/attack(mob/living/carbon/human/H as mob, mob/living/user as mob)
if (!istype(H))
to_chat(user,"<span class='warning'>You can't find a way to use the [src] on [H]!</span>")
return
if ( ((CLUMSY in user.mutations) || (DUMB in user.mutations)) && prob(20))
to_chat(user,"<span class='danger'>Your hand slips from clumsiness!</span>")
eyestab(H,user)
to_chat(user,"<span class='danger'>Alert: No breathing detected.</span>")
return
if (!user.IsAdvancedToolUser())
to_chat(user,"<span class='warning'>You don't have the dexterity to do this!</span>")
return
if(user == H && !H.can_eat(src))
return
else if(!H.can_force_feed(user, src))
return
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN)
user.do_attack_animation(H)
user.visible_message("<span class='notice'>[user] is trying to take a breath sample from [H].</span>","<span class='notice'>You gently insert the [src] into [H]'s mouth.</span>")
if (!LAZYLEN(src.other_DNA))
LAZYADD(src.other_DNA, H.dna.unique_enzymes)
src.other_DNA_type = "saliva"
if (!do_after(user, 2 SECONDS, act_target = H))
to_chat(user,"<span class='notice'>You and the target need to be standing still in order to take a breath sample.</span>")
return
user.visible_message("<span class='notice'>[user] takes a breath sample from [H].</span>","<span class='notice'>The [src] clicks as it finishes reading [H]'s breath sample.</span>")
to_chat(user,"<b>Breath Sample Results:</b>")
if(H.stat == DEAD || H.losebreath || !H.breathing)
to_chat(user,"<span class='danger'>Alert: No breathing detected.</span>")
return
to_chat(user,H.getOxyLoss() > 50 ? "<font color='blue'><b>Severe oxygen deprivation detected.</b></font>" : "Subject oxygen levels normal.")
var/obj/item/organ/L = H.internal_organs_by_name["lungs"]
if(istype(L))
to_chat(user,L.is_bruised() ? "<font color='red'><b>Ruptured lung detected.</b></font>" : "Subject lung health normal.")
else
to_chat(user,"<span class='warning'>Subject lung health unknown.</span>")
var/additional_string = "<font color='green'>\[NORMAL\]</font>"
var/bac = H.get_blood_alcohol()
switch(bac)
if(INTOX_JUDGEIMP to INTOX_MUSCLEIMP)
additional_string = "\[LIGHTLY INTOXICATED\]"
if(INTOX_MUSCLEIMP to INTOX_VOMIT)
additional_string = "\[MODERATELY INTOXICATED\]"
if(INTOX_VOMIT to INTOX_BALANCE)
additional_string = "<font color='red'>\[HEAVILY INTOXICATED\]</font>"
if(INTOX_BALANCE to INTOX_DEATH)
additional_string = "<font color='red'>\[ALCOHOL POISONING LIKELY\]</font>"
if(INTOX_DEATH to INFINITY)
additional_string = "<font color='red'>\[DEATH IMMINENT\]</font>"
to_chat(user,"<span class='normal'>Blood Alcohol Content: [round(bac,0.01)] <b>[additional_string]</b></span>")
if(H.breathing && H.breathing.total_volume)
var/unknown = 0
for(var/datum/reagent/R in H.breathing.reagent_list)
if(R.scannable)
to_chat(user,"<span class='notice'>[R.name] found in subject's respitory system.</span>")
else
++unknown
if(unknown)
to_chat(user,"<span class='warning'>Non-medical reagent[(unknown > 1)?"s":""] found in subject's respitory system.</span>")
+9 -1
View File
@@ -9,6 +9,7 @@
throw_range = 20
var/heal_brute = 0
var/heal_burn = 0
var/apply_sounds
/obj/item/stack/medical/attack(mob/living/M as mob, mob/user as mob)
if (!istype(M) || istype(M, /mob/living/silicon) || istype(M, /mob/living/simple_animal/spiderbot))
@@ -65,6 +66,7 @@
origin_tech = list(TECH_BIO = 1)
heal_brute = 4
icon_has_variants = TRUE
apply_sounds = list('sound/items/rip1.ogg','sound/items/rip2.ogg')
/obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
@@ -104,6 +106,7 @@
user.visible_message("<span class='notice'>\The [user] places a bandaid over \a [W.desc] on [M]'s [affecting.name].</span>", \
"<span class='notice'>You place a bandaid over \a [W.desc] on [M]'s [affecting.name].</span>" )
W.bandage()
playsound(src, pick(apply_sounds), 25)
used++
affecting.update_damages()
if(used == amount)
@@ -128,6 +131,7 @@
heal_burn = 4
origin_tech = list(TECH_BIO = 1)
icon_has_variants = TRUE
apply_sounds = list('sound/items/ointment.ogg')
/obj/item/stack/medical/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
@@ -145,6 +149,7 @@
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
user.visible_message("<span class='notice'>\The [user] starts salving wounds on [M]'s [affecting.name].</span>", \
"<span class='notice'>You start salving the wounds on [M]'s [affecting.name].</span>" )
playsound(src, pick(apply_sounds), 25)
if(!do_mob(user, M, 10))
user << "<span class='notice'>You must stand still to salve wounds.</span>"
return 1
@@ -166,6 +171,7 @@
icon_state = "traumakit"
heal_brute = 8
origin_tech = list(TECH_BIO = 1)
apply_sounds = list('sound/items/rip1.ogg','sound/items/rip2.ogg','sound/items/tape.ogg')
/obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
@@ -204,6 +210,7 @@
else
user.visible_message("<span class='notice'>\The [user] smears some bioglue over \a [W.desc] on [M]'s [affecting.name].</span>", \
"<span class='notice'>You smear some bioglue over \a [W.desc] on [M]'s [affecting.name].</span>" )
playsound(src, pick(apply_sounds), 25)
W.bandage()
W.disinfect()
W.heal_damage(heal_brute)
@@ -229,7 +236,7 @@
icon_state = "burnkit"
heal_burn = 8
origin_tech = list(TECH_BIO = 1)
apply_sounds = list('sound/items/ointment.ogg')
/obj/item/stack/medical/advanced/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
@@ -247,6 +254,7 @@
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
user.visible_message("<span class='notice'>\The [user] starts salving wounds on [M]'s [affecting.name].</span>", \
"<span class='notice'>You start salving the wounds on [M]'s [affecting.name].</span>" )
playsound(src, pick(apply_sounds), 25)
if(!do_mob(user, M, 10))
user << "<span class='notice'>You must stand still to salve wounds.</span>"
return 1
+7 -6
View File
@@ -349,18 +349,19 @@ var/const/NO_EMAG_ACT = -50
icon_state = "centcom"
registered_name = "Central Command"
assignment = "General"
New()
access = get_all_centcom_access()
..()
/obj/item/weapon/card/id/centcom/ERT
/obj/item/weapon/card/id/centcom/New()
access = get_all_centcom_access()
..()
/obj/item/weapon/card/id/ert
name = "\improper Emergency Response Team ID"
icon_state = "centcom"
assignment = "Emergency Response Team"
obj/item/weapon/card/id/centcom/ERT/New()
obj/item/weapon/card/id/ert/New()
access = get_all_station_access() + get_centcom_access("Emergency Response Team")
..()
access = get_all_accesses() + get_centcom_access("Emergency Response Team")
/obj/item/weapon/card/id/all_access
name = "\improper Administrator's spare ID"
@@ -184,7 +184,7 @@
invisibility = INVISIBILITY_MAXIMUM //Why am i doing this?
//To make sure all reagents can work
//correctly before deleting the grenade.
QDEL_IN(src, 50)
QDEL_IN(src, 50)
/obj/item/weapon/grenade/chem_grenade/large
name = "large chem grenade"
@@ -283,6 +283,7 @@
beakers += B1
beakers += B2
icon_state = initial(icon_state) +"_locked"
/obj/item/weapon/grenade/chem_grenade/cleaner
name = "cleaner grenade"
desc = "BLAM!-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas."
@@ -304,6 +305,28 @@
beakers += B2
icon_state = initial(icon_state) +"_locked"
/obj/item/weapon/grenade/chem_grenade/large/phoroncleaner
name = "large cardox grenade"
desc = "A large smoke grenade containing a heavy amount of cardox. Use in case of phoron leaks. Warning: Harmful to Vaurca health."
stage = 2
path = 1
Initialize()
. = ..()
var/obj/item/weapon/reagent_containers/glass/beaker/large/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src)
B1.reagents.add_reagent("water", 60)
B1.reagents.add_reagent("cardox", 60)
B2.reagents.add_reagent("surfactant", 60)
B2.reagents.add_reagent("cardox", 60)
detonator = new/obj/item/device/assembly_holder/timer_igniter(src)
beakers += B1
beakers += B2
icon_state = initial(icon_state) +"_locked"
/obj/item/weapon/grenade/chem_grenade/teargas
name = "tear gas grenade"
desc = "Concentrated Capsaicin. Contents under pressure. Use with caution."
@@ -1368,3 +1368,34 @@
</body>
</html>
"}
/obj/item/weapon/book/manual/brainwashing
name = "Disloyal to Loyal: The Legality of Brainwashing"
icon_state ="rulebook"
author = "Dr. Fredrick Richards"
title = "Disloyal to Loyal: The Legality of Brainwashing"
dat = {"<html>
<head>
<style>
h1 {font-size: 21px; margin: 15px 0px 5px;}
h2 {font-size: 15px; margin: 15px 0px 5px;}
li {margin: 2px 0px 2px 15px;}
ul {margin: 5px; padding: 0px;}
ol {margin: 5px; padding: 0px 15px;}
body {font-size: 13px; font-family: Verdana;}
</style>
</head>
<body>
<h1>Disloyal to Loyal: The Legality of Brainwashing</h1>
<h2>by Doctor Fredrick Richards with help from the NanoTrasen Legal Department</h2>
While it may be tempting as a Captain, Head of Security, or sometimes an officer to go around distributing anti-psychotics to maintain the peace, there are a few Corporate regulations and rules that must be kept in mind before even considering obtaining the medication.<BR><BR>
<h2>Pre-injection</h2>
Generally, anti-psychotic medications should only be given out to criminals who have been charged with crimes that typically have Hold until Transfer, Cyborgification, and Loyalty Implant sentences, however some exceptions may apply. It is important to note that when using medicine to rehabilitate a criminal, the criminal in question is now legally considered a medical patient. In Tau Ceti space, it is illegal to prescribe, consume, or force a patient to consume anti-psychotic medication as a non-medical professional. As such, a non-medical personnel who injects or feeds prisoners with anti-psychotics may be charged with Suspicious Conduct, Excessive Use of Force In Detainment, Mistreatment of Prisoners, Neglect of Duty, Assault, Exceeding Official Powers, Mistreatment of Prisoners, and/or Gross Negligence. A trained and licensed medical professional are legally required to perform an evaluation first, and must be the one to perform the injection.<BR><BR>
<h2>Post-injection</h2>
It is your duty as a member of the security department to oversee the health and well-being of prisoners and parolees. Those who have been giving anti-psychotic medication must be carefully monitored for their behaviour. Prisoners who skip doses, or overdose, are a threat to themselves and the people near them. If in the case of an overdose occurs, or a dose is missed, medical personnel should be contacted immediately and the situation dealt with appropriately. Failure to do so may result in Gross Negligence charges and potential demotion.
</body>
</html>
"}
@@ -83,6 +83,7 @@
icon_state = "medicalbelt"
item_state = "medical"
can_hold = list(
/obj/item/device/breath_analyzer,
/obj/item/device/healthanalyzer,
/obj/item/weapon/dnainjector,
/obj/item/weapon/reagent_containers/dropper,
@@ -764,6 +764,8 @@
W.damtype = "burn"
W.icon_state = "match_lit"
START_PROCESSING(SSprocessing, W)
playsound(src.loc, 'sound/items/match.ogg', 60, 1, -4)
user.visible_message("<span class='notice'>[user] strikes the match on the matchbox.</span>")
W.update_icon()
return
@@ -980,3 +982,27 @@
/obj/item/weapon/storage/box/stims/fill()
for(var/i in 1 to 4)
new /obj/item/weapon/reagent_containers/hypospray/autoinjector/stimpack(src)
/obj/item/weapon/storage/box/inhalers
name = "inhaler kit"
desc = "A box filled with several inhalers and empty inhaler cartridges."
icon_state = "box_inhalers"
/obj/item/weapon/storage/box/inhalers/fill()
for(var/i in 1 to 2)
new /obj/item/weapon/personal_inhaler(src)
for(var/i in 1 to 6)
new /obj/item/weapon/reagent_containers/personal_inhaler_cartridge(src)
/obj/item/weapon/storage/box/inhalers_large
name = "combat inhaler kit"
desc = "A box filled with a combat inhaler and several large empty inhaler cartridges."
icon_state = "box_inhalers"
/obj/item/weapon/storage/box/inhalers_large/fill()
new /obj/item/weapon/personal_inhaler/combat(src)
for(var/i in 1 to 6)
new /obj/item/weapon/reagent_containers/personal_inhaler_cartridge/large(src)
@@ -10,3 +10,4 @@
w_class = 4
max_w_class = 3
max_storage_space = 16
use_sound = 'sound/items/storage/briefcase.ogg'
@@ -295,3 +295,18 @@
/obj/item/weapon/storage/lockbox/vials/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
update_icon()
/obj/item/weapon/storage/fancy/chocolate_box
icon = 'icons/obj/chocolate.dmi'
icon_state = "chocolatebox"
icon_type = "chocolatebox"
name = "chocolate box"
storage_slots = 8
can_hold = list(
/obj/item/weapon/reagent_containers/food/snacks
)
/obj/item/weapon/storage/fancy/chocolate_box/fill()
for(var/i=1; i <= storage_slots; i++)
new /obj/item/weapon/reagent_containers/food/snacks/random(src)
@@ -25,16 +25,14 @@
fill()
..()
if (empty) return
icon_state = pick("ointment","firefirstaid")
new /obj/item/weapon/reagent_containers/pill/kelotane( src )
new /obj/item/weapon/reagent_containers/pill/kelotane( src )
new /obj/item/weapon/reagent_containers/pill/kelotane( src )
new /obj/item/stack/medical/ointment( src )
new /obj/item/stack/medical/ointment( src )
new /obj/item/device/healthanalyzer( src )
new /obj/item/weapon/reagent_containers/hypospray/autoinjector( src )
new /obj/item/stack/medical/ointment( src )
new /obj/item/stack/medical/ointment( src )
new /obj/item/weapon/reagent_containers/pill/kelotane( src )
new /obj/item/weapon/reagent_containers/pill/kelotane( src )
new /obj/item/weapon/reagent_containers/pill/kelotane( src ) //Replaced ointment with these since they actually work --Errorage
return
@@ -55,16 +53,14 @@
/obj/item/weapon/storage/firstaid/toxin
name = "toxin first aid"
desc = "Used to treat when you have a high amoutn of toxins in your body."
desc = "Used to treat when you have a high amount of toxins in your body."
icon_state = "antitoxin"
item_state = "firstaid-toxin"
fill()
..()
if (empty) return
icon_state = pick("antitoxin","antitoxfirstaid","antitoxfirstaid2","antitoxfirstaid3")
new /obj/item/weapon/reagent_containers/syringe/antitoxin( src )
new /obj/item/weapon/reagent_containers/syringe/antitoxin( src )
new /obj/item/weapon/reagent_containers/syringe/antitoxin( src )
@@ -75,21 +71,21 @@
return
/obj/item/weapon/storage/firstaid/o2
name = "oxygen deprivation first aid"
desc = "A box full of oxygen goodies."
name = "oxygen deprivation kit"
desc = "A box full of oxygen related goodies."
icon_state = "o2"
item_state = "firstaid-o2"
fill()
..()
if (empty) return
new /obj/item/weapon/reagent_containers/pill/dexalin( src )
new /obj/item/weapon/reagent_containers/pill/dexalin( src )
new /obj/item/weapon/reagent_containers/pill/dexalin( src )
new /obj/item/weapon/reagent_containers/pill/dexalin( src )
new /obj/item/weapon/reagent_containers/inhaler/dexalin( src )
new /obj/item/weapon/reagent_containers/inhaler/dexalin( src )
new /obj/item/weapon/reagent_containers/inhaler/dexalin( src )
new /obj/item/weapon/reagent_containers/inhaler/dexalin( src )
new /obj/item/weapon/reagent_containers/hypospray/autoinjector( src )
new /obj/item/weapon/reagent_containers/syringe/inaprovaline( src )
new /obj/item/device/healthanalyzer( src )
new /obj/item/weapon/reagent_containers/hypospray/autoinjector( src )
new /obj/item/device/breath_analyzer( src )
return
/obj/item/weapon/storage/firstaid/adv
@@ -124,7 +120,7 @@
new /obj/item/weapon/storage/pill_bottle/dexalin_plus(src)
new /obj/item/weapon/storage/pill_bottle/dylovene(src)
new /obj/item/weapon/storage/pill_bottle/tramadol(src)
new /obj/item/weapon/storage/pill_bottle/spaceacillin(src)
new /obj/item/weapon/reagent_containers/inhaler/hyperzine(src)
new /obj/item/stack/medical/splint(src)
return
@@ -133,6 +129,7 @@
desc = "Contains tools for surgery. Has precise foam fitting for safe transport."
icon_state = "purplefirstaid"
item_state = "firstaid-advanced"
use_sound = 'sound/items/storage/briefcase.ogg'
/obj/item/weapon/storage/firstaid/surgery/fill()
..()
@@ -147,7 +144,8 @@
new /obj/item/weapon/bonegel(src)
new /obj/item/weapon/FixOVein(src)
new /obj/item/stack/medical/advanced/bruise_pack(src)
new /obj/item/weapon/reagent_containers/inhaler/soporific(src)
new /obj/item/weapon/reagent_containers/inhaler/soporific(src)
make_exact_fit()
/obj/item/weapon/storage/firstaid/brute
@@ -179,7 +177,7 @@
can_hold = list(/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/dice,/obj/item/weapon/paper)
allow_quick_gather = 1
use_to_pickup = 1
use_sound = null
use_sound = 'sound/items/storage/pillbottle.ogg'
max_storage_space = 16
/obj/item/weapon/storage/pill_bottle/antitox
@@ -321,31 +319,3 @@
new /obj/item/weapon/reagent_containers/pill/escitalopram( src )
new /obj/item/weapon/reagent_containers/pill/escitalopram( src )
new /obj/item/weapon/reagent_containers/pill/escitalopram( src )
/obj/item/weapon/storage/pill_bottle/trisyndicotin
name = "bottle of Trisyndicotin pills"
desc = "Used to free one's mind from the oppression of NanoTrasen."
fill()
..()
new /obj/item/weapon/reagent_containers/pill/trisyndicotin( src )
new /obj/item/weapon/reagent_containers/pill/trisyndicotin( src )
new /obj/item/weapon/reagent_containers/pill/trisyndicotin( src )
new /obj/item/weapon/reagent_containers/pill/trisyndicotin( src )
new /obj/item/weapon/reagent_containers/pill/trisyndicotin( src )
new /obj/item/weapon/reagent_containers/pill/trisyndicotin( src )
new /obj/item/weapon/reagent_containers/pill/trisyndicotin( src )
/obj/item/weapon/storage/pill_bottle/hextrasenil
name = "bottle of Hextrasenil pills"
desc = "Pacification through medication."
fill()
..()
new /obj/item/weapon/reagent_containers/pill/hextrasenil( src )
new /obj/item/weapon/reagent_containers/pill/hextrasenil( src )
new /obj/item/weapon/reagent_containers/pill/hextrasenil( src )
new /obj/item/weapon/reagent_containers/pill/hextrasenil( src )
new /obj/item/weapon/reagent_containers/pill/hextrasenil( src )
new /obj/item/weapon/reagent_containers/pill/hextrasenil( src )
new /obj/item/weapon/reagent_containers/pill/hextrasenil( src )
@@ -81,7 +81,6 @@
new /obj/item/weapon/implantcase/loyalty(src)
new /obj/item/weapon/implanter/loyalty(src)
/obj/item/weapon/storage/lockbox/clusterbang
name = "lockbox of clusterbangs"
desc = "You have a bad feeling about opening this."
@@ -49,3 +49,15 @@
/obj/item/weapon/storage/box/donut/empty
startswith = 0
/obj/item/weapon/storage/box/pineapple
icon = 'icons/obj/storage.dmi'
icon_state = "pineapple_rings"
name = "can of pineapple rings"
var/startswith = 6
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/pineapple_ring)
/obj/item/weapon/storage/box/pineapple/fill()
for(var/i=1; i <= startswith; i++)
new /obj/item/weapon/reagent_containers/food/snacks/pineapple_ring(src)
update_icon()
@@ -26,6 +26,7 @@
w_class = 3
max_w_class = 2
max_storage_space = 14
use_sound = 'sound/items/storage/briefcase.ogg'
examine(mob/user)
if(..(user, 1))
@@ -139,7 +139,7 @@
/obj/item/weapon/storage/proc/open(mob/user as mob)
if (use_sound)
playsound(src.loc, src.use_sound, 50, 1, -5)
playsound(src.loc, src.use_sound, 50, 0, -5)
orient2hud(user)
if (user.s_active)
@@ -14,6 +14,7 @@
max_storage_space = 14 //enough to hold all starting contents
origin_tech = list(TECH_COMBAT = 1)
attack_verb = list("robusted")
use_sound = 'sound/items/storage/toolbox.ogg'
var/stunhit = 0
/obj/item/weapon/storage/toolbox/Initialize()
@@ -258,3 +258,14 @@
new /obj/item/weapon/spacecash/c1000(src)
new /obj/item/weapon/spacecash/c1000(src)
new /obj/item/weapon/spacecash/c1000(src)
/obj/item/weapon/storage/box/syndie_kit/stimulants
name = "box of stimulants"
desc = "Comes with a combat inhaler, a large cartridge of hyperzine, a large cartridge of inaprovaline, and a large empty cartridge."
/obj/item/weapon/storage/box/syndie_kit/stimulants/fill()
..()
new /obj/item/weapon/personal_inhaler/combat( src )
new /obj/item/weapon/reagent_containers/personal_inhaler_cartridge/large/hyperzine( src )
new /obj/item/weapon/reagent_containers/personal_inhaler_cartridge/large/inaprovaline( src )
new /obj/item/weapon/reagent_containers/personal_inhaler_cartridge/large( src )
+6
View File
@@ -30,6 +30,7 @@
if(!H || !src || !H.organs_by_name["head"] || !H.has_eyes() || H.glasses || (H.head && (H.head.body_parts_covered & FACE)))
return
playsound(src, 'sound/items/tape.ogg',25)
user.visible_message("<span class='danger'>\The [user] has taped up \the [H]'s eyes!</span>")
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/blindfold/tape(H), slot_glasses)
H.update_inv_glasses()
@@ -47,6 +48,8 @@
if(H.head && (H.head.body_parts_covered & FACE))
user << "<span class='warning'>Remove their [H.head] first.</span>"
return
playsound(src, 'sound/items/tape.ogg',25)
user.visible_message("<span class='danger'>\The [user] begins taping up \the [H]'s mouth!</span>")
if(!do_after(user, 30))
@@ -56,11 +59,13 @@
if(!H || !src || !H.organs_by_name["head"] || !H.check_has_mouth() || H.wear_mask || (H.head && (H.head.body_parts_covered & FACE)))
return
playsound(src, 'sound/items/tape.ogg',25)
user.visible_message("<span class='danger'>\The [user] has taped up \the [H]'s mouth!</span>")
H.equip_to_slot_or_del(new /obj/item/clothing/mask/muzzle/tape(H), slot_wear_mask)
H.update_inv_wear_mask()
else if(target_zone == "r_hand" || target_zone == "l_hand")
playsound(src, 'sound/items/tape.ogg',25)
var/obj/item/weapon/handcuffs/cable/tape/T = new(user)
if(!T.place_handcuffs(H, user))
user.unEquip(T)
@@ -132,6 +137,7 @@
return // reduce papers around corners issue.
user.drop_from_inventory(src)
playsound(src, 'sound/items/tape.ogg',25)
forceMove(source_turf)
if(params)
+48 -2
View File
@@ -196,7 +196,8 @@
/obj/item/seeds/ambrosiavulgarisseed = 2,
/obj/item/seeds/ambrosiadeusseed = 1,
/obj/item/clothing/mask/gas/voice = 1,
/obj/item/clothing/gloves/brassknuckles = 2
/obj/item/clothing/gloves/brassknuckles = 2,
/obj/item/weapon/reagent_containers/inhaler/space_drugs = 2
)
/obj/random/energy
@@ -815,7 +816,9 @@
/obj/random/junk = 0.9,
/obj/item/weapon/spacecash/ewallet/lotto = 0.3,
/obj/random/spacecash = 0.3,
/obj/item/device/firing_pin = 0.3
/obj/item/device/firing_pin = 0.3,
/obj/item/weapon/reagent_containers/inhaler/hyperzine = 0.1,
/obj/item/weapon/storage/box/pineapple = 0.1
)
/obj/random/hoodie
@@ -939,3 +942,46 @@
/obj/item/weapon/material/sword/gladius
)
/obj/random/arcade
name = "random arcade loot"
desc = "Arcade loot!"
icon = 'icons/obj/items.dmi'
icon_state = "gift3"
spawnlist = list(
/obj/item/weapon/storage/box/snappops = 11,
/obj/item/clothing/under/syndicate/tacticool = 5,
/obj/item/toy/sword = 22,
/obj/item/weapon/gun/projectile/revolver/capgun = 11,
/obj/item/toy/crossbow = 11,
/obj/item/weapon/storage/fancy/crayons = 11,
/obj/item/toy/spinningtoy = 11,
/obj/item/toy/prize/ripley = 1,
/obj/item/toy/prize/fireripley = 1,
/obj/item/toy/prize/deathripley = 1,
/obj/item/toy/prize/gygax = 1,
/obj/item/toy/prize/durand = 1,
/obj/item/toy/prize/honk = 1,
/obj/item/toy/prize/marauder = 1,
/obj/item/toy/prize/seraph = 1,
/obj/item/toy/prize/mauler = 1,
/obj/item/toy/prize/odysseus = 1,
/obj/item/toy/prize/phazon = 1,
/obj/item/toy/waterflower = 5,
/obj/random/action_figure = 11,
/obj/random/plushie = 44,
/obj/item/toy/cultsword = 5,
/obj/item/toy/syndicateballoon = 5,
/obj/item/toy/nanotrasenballoon = 5,
/obj/item/toy/katana = 11,
/obj/item/toy/bosunwhistle = 5,
/obj/item/weapon/storage/belt/champion = 11,
/obj/item/weapon/pen/invisible = 5,
/obj/item/weapon/grenade/fake = 1,
/obj/item/weapon/bikehorn = 11,
/obj/item/clothing/mask/fakemoustache = 11,
/obj/item/clothing/mask/gas/clown_hat = 11,
/obj/item/clothing/mask/gas/mime = 11,
/obj/item/weapon/gun/energy/wand/toy = 5,
/obj/item/device/binoculars = 11,
/obj/item/device/megaphone = 11
)
@@ -111,6 +111,7 @@
new /obj/item/weapon/reagent_containers/hypospray(src)
new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(src)
new /obj/item/clothing/suit/storage/toggle/labcoat/cmoalt(src)
new /obj/item/weapon/storage/box/inhalers(src)
/obj/structure/closet/secure_closet/CMO2
name = "chief medical officer's attire"
@@ -168,7 +169,8 @@
new /obj/item/weapon/storage/box/pillbottles(src)
new /obj/item/weapon/storage/box/spraybottles(src)
new /obj/item/weapon/storage/box/spraybottles(src)
new /obj/item/weapon/storage/box/inhalers(src)
new /obj/item/weapon/storage/box/inhalers(src)
/obj/structure/closet/secure_closet/medical_wall
name = "first aid closet"
@@ -148,10 +148,13 @@
new /obj/item/taperoll/police(src)
new /obj/item/device/flash(src)
new /obj/item/device/holowarrant(src)
new /obj/item/device/breath_analyzer(src)
//Belts
new /obj/item/clothing/accessory/holster/waist(src)
new /obj/item/weapon/storage/belt/security(src)
/obj/structure/closet/secure_closet/hos2
name = "head of security's attire"
req_access = list(access_hos)
@@ -178,6 +181,8 @@
new /obj/item/weapon/storage/belt/security(src)
new /obj/item/clothing/accessory/holster/waist(src)
new /obj/item/device/breath_analyzer(src)
/obj/structure/closet/secure_closet/warden
name = "warden's locker"
req_access = list(access_armory)
@@ -28,6 +28,7 @@
new /obj/item/clothing/mask/breath(src)
new /obj/item/clothing/suit/space/emergency(src)
new /obj/item/clothing/head/helmet/space/emergency(src)
new /obj/item/device/oxycandle(src)
if ("aid")
new /obj/item/weapon/tank/emergency_oxygen(src)
new /obj/item/weapon/storage/toolbox/emergency(src)
@@ -35,11 +36,14 @@
new /obj/item/weapon/storage/firstaid/o2(src)
new /obj/item/clothing/suit/space/emergency(src)
new /obj/item/clothing/head/helmet/space/emergency(src)
new /obj/item/device/oxycandle(src)
if ("tank")
new /obj/item/weapon/tank/emergency_oxygen/engi(src)
new /obj/item/clothing/mask/breath(src)
new /obj/item/weapon/tank/emergency_oxygen/engi(src)
new /obj/item/clothing/mask/breath(src)
new /obj/item/device/oxycandle(src)
new /obj/item/device/oxycandle(src)
if ("both")
new /obj/item/weapon/storage/toolbox/emergency(src)
new /obj/item/weapon/tank/emergency_oxygen/engi(src)
@@ -49,6 +53,9 @@
new /obj/item/clothing/suit/space/emergency(src)
new /obj/item/clothing/head/helmet/space/emergency(src)
new /obj/item/clothing/head/helmet/space/emergency(src)
new /obj/item/device/oxycandle(src)
new /obj/item/device/oxycandle(src)
new /obj/item/device/oxycandle(src)
/obj/structure/closet/emcloset/legacy/fill()
..()
@@ -377,9 +377,9 @@
new /obj/item/clothing/under/color/green(src)
new /obj/item/clothing/under/color/orange(src)
new /obj/item/clothing/under/color/pink(src)
new /obj/item/clothing/under/dress/plaid_blue(src)
new /obj/item/clothing/under/dress/plaid_red(src)
new /obj/item/clothing/under/dress/plaid_purple(src)
new /obj/item/clothing/under/skirt/plaid_blue(src)
new /obj/item/clothing/under/skirt/plaid_red(src)
new /obj/item/clothing/under/skirt/plaid_purple(src)
new /obj/item/clothing/shoes/blue(src)
new /obj/item/clothing/shoes/yellow(src)
new /obj/item/clothing/shoes/green(src)
+6 -15
View File
@@ -52,14 +52,14 @@
random_junk
cheesy_honkers
author = "Assistant Editor Carl Ritz"
author = "Editor Carl Ritz"
channel_name = "The Gibson Gazette"
message = {"Do cheesy honkers increase risk of having a miscarriage? Several health administrations
say so!"}
round_time = 60 * 15
net_block
author = "Assistant Editor Carl Ritz"
author = "Editor Carl Ritz"
channel_name = "The Gibson Gazette"
message = {"Several corporations banding together to block access to 'wetskrell.nt', site administrators
claiming violation of net laws."}
@@ -129,19 +129,10 @@ proc/check_for_newscaster_updates(type)
announce_newscaster_news(news)
proc/announce_newscaster_news(datum/news_announcement/news)
var/datum/feed_channel/sendto
for(var/datum/feed_channel/FC in news_network.network_channels)
if(FC.channel_name == news.channel_name)
sendto = FC
break
var/datum/feed_channel/sendto = SSnews.GetFeedChannel(news.channel_name)
if(!sendto)
sendto = new /datum/feed_channel
sendto.channel_name = news.channel_name
sendto.author = news.author
sendto.locked = 1
sendto.is_admin_channel = 1
news_network.network_channels += sendto
SSnews.CreateFeedChannel(news.channel_name, news.author, 1, 1)
var/author = news.author ? news.author : sendto.author
news_network.SubmitArticle(news.message, author, news.channel_name, null, !news.can_be_redacted, news.message_type)
var/datum/feed_channel/ch = SSnews.GetFeedChannel(news.channel_name)
SSnews.SubmitArticle(news.message, author, ch, null, !news.can_be_redacted, news.message_type)
-5
View File
@@ -1,9 +1,4 @@
//Config stuff
#define SUPPLY_DOCKZ 3 //Z-level of the Dock.
#define SUPPLY_STATIONZ 1 //Z-level of the Station.
#define SUPPLY_STATION_AREATYPE /area/supply/station //Type of the supply shuttle area for station
#define SUPPLY_DOCK_AREATYPE /area/supply/dock //Type of the supply shuttle area for dock
//Supply packs are in /code/defines/obj/supplypacks.dm
//Computers are in /code/game/machinery/computer/supply.dm
+33 -29
View File
@@ -350,7 +350,7 @@ proc/admin_notice(var/message, var/rights)
<BR>Feed channels and stories entered through here will be uneditable and handled as official news by the rest of the units.
<BR>Note that this panel allows full freedom over the news network, there are no constrictions except the few basic ones. Don't break things!
"}
if(news_network.wanted_issue)
if(SSnews.wanted_issue)
dat+= "<HR><A href='?src=\ref[src];ac_view_wanted=1'>Read Wanted Issue</A>"
dat+= {"<HR><BR><A href='?src=\ref[src];ac_create_channel=1'>Create Feed Channel</A>
@@ -360,7 +360,7 @@ proc/admin_notice(var/message, var/rights)
"}
var/wanted_already = 0
if(news_network.wanted_issue)
if(SSnews.wanted_issue)
wanted_already = 1
dat+={"<HR><B>Feed Security functions:</B><BR>
@@ -371,14 +371,15 @@ proc/admin_notice(var/message, var/rights)
"}
if(1)
dat+= "Station Feed Channels<HR>"
if( isemptylist(news_network.network_channels) )
if( isemptylist(SSnews.network_channels) )
dat+="<I>No active channels found...</I>"
else
for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
if(CHANNEL.is_admin_channel)
dat+="<B><FONT style='BACKGROUND-COLOR: LightGreen'><A href='?src=\ref[src];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A></FONT></B><BR>"
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
if(FC.is_admin_channel)
dat+="<B><FONT style='BACKGROUND-COLOR: LightGreen'><A href='?src=\ref[src];ac_show_channel=\ref[FC]'>[FC.channel_name]</A></FONT></B><BR>"
else
dat+="<B><A href='?src=\ref[src];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR></B>"
dat+="<B><A href='?src=\ref[src];ac_show_channel=\ref[FC]'>[FC.channel_name]</A> [(FC.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR></B>"
dat+={"<BR><HR><A href='?src=\ref[src];ac_refresh=1'>Refresh</A>
<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Back</A>
"}
@@ -421,7 +422,8 @@ proc/admin_notice(var/message, var/rights)
if(src.admincaster_feed_channel.channel_name =="" || src.admincaster_feed_channel.channel_name == "\[REDACTED\]")
dat+="<FONT COLOR='maroon'>•Invalid channel name.</FONT><BR>"
var/check = 0
for(var/datum/feed_channel/FC in news_network.network_channels)
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
if(FC.channel_name == src.admincaster_feed_channel.channel_name)
check = 1
break
@@ -458,11 +460,12 @@ proc/admin_notice(var/message, var/rights)
Keep in mind that users attempting to view a censored feed will instead see the \[REDACTED\] tag above it.</FONT>
<HR>Select Feed channel to get Stories from:<BR>
"}
if(isemptylist(news_network.network_channels))
if(isemptylist(SSnews.network_channels))
dat+="<I>No feed channels found active...</I><BR>"
else
for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
dat+="<A href='?src=\ref[src];ac_pick_censor_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
dat+="<A href='?src=\ref[src];ac_pick_censor_channel=\ref[FC]'>[FC.channel_name]</A> [(FC.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Cancel</A>"
if(11)
dat+={"
@@ -471,11 +474,12 @@ proc/admin_notice(var/message, var/rights)
morale, integrity or disciplinary behaviour. A D-Notice will render a channel unable to be updated by anyone, without deleting any feed
stories it might contain at the time. You can lift a D-Notice if you have the required access at any time.</FONT><HR>
"}
if(isemptylist(news_network.network_channels))
if(isemptylist(SSnews.network_channels))
dat+="<I>No feed channels found active...</I><BR>"
else
for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
dat+="<A href='?src=\ref[src];ac_pick_d_notice=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
dat+="<A href='?src=\ref[src];ac_pick_d_notice=\ref[FC]'>[FC.channel_name]</A> [(FC.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Back</A>"
if(12)
@@ -514,7 +518,7 @@ proc/admin_notice(var/message, var/rights)
dat+="<B>Wanted Issue Handler:</B>"
var/wanted_already = 0
var/end_param = 1
if(news_network.wanted_issue)
if(SSnews.wanted_issue)
wanted_already = 1
end_param = 2
if(wanted_already)
@@ -525,7 +529,7 @@ proc/admin_notice(var/message, var/rights)
<A href='?src=\ref[src];ac_set_wanted_desc=1'>Description</A>: [src.admincaster_feed_message.body] <BR>
"}
if(wanted_already)
dat+="<B>Wanted Issue created by:</B><FONT COLOR='green'> [news_network.wanted_issue.backup_author]</FONT><BR>"
dat+="<B>Wanted Issue created by:</B><FONT COLOR='green'> [SSnews.wanted_issue.backup_author]</FONT><BR>"
else
dat+="<B>Wanted Issue will be created under prosecutor:</B><FONT COLOR='green'> [src.admincaster_signature]</FONT><BR>"
dat+="<BR><A href='?src=\ref[src];ac_submit_wanted=[end_param]'>[(wanted_already) ? ("Edit Issue") : ("Submit")]</A>"
@@ -551,13 +555,13 @@ proc/admin_notice(var/message, var/rights)
"}
if(18)
dat+={"
<B><FONT COLOR ='maroon'>-- STATIONWIDE WANTED ISSUE --</B></FONT><BR><FONT SIZE=2>\[Submitted by: <FONT COLOR='green'>[news_network.wanted_issue.backup_author]</FONT>\]</FONT><HR>
<B>Criminal</B>: [news_network.wanted_issue.author]<BR>
<B>Description</B>: [news_network.wanted_issue.body]<BR>
<B><FONT COLOR ='maroon'>-- STATIONWIDE WANTED ISSUE --</B></FONT><BR><FONT SIZE=2>\[Submitted by: <FONT COLOR='green'>[SSnews.wanted_issue.backup_author]</FONT>\]</FONT><HR>
<B>Criminal</B>: [SSnews.wanted_issue.author]<BR>
<B>Description</B>: [SSnews.wanted_issue.body]<BR>
<B>Photo:</B>:
"}
if(news_network.wanted_issue.img)
usr << browse_rsc(news_network.wanted_issue.img, "tmp_photow.png")
if(SSnews.wanted_issue.img)
usr << browse_rsc(SSnews.wanted_issue.img, "tmp_photow.png")
dat+="<BR><img src='tmp_photow.png' width = '180'>"
else
dat+="None"
@@ -1204,7 +1208,7 @@ proc/admin_notice(var/message, var/rights)
H.regenerate_icons()
/proc/get_options_bar(whom, detail = 2, name = 0, link = 1, highlight_special = 1, var/datum/ticket/ticket = null)
/proc/get_options_bar(whom, detail = 2, name = 0, link = 1, highlight_special = 1, var/datum/ticket/ticket = null)
if(!whom)
return "<b>(*null*)</b>"
var/mob/M
@@ -1216,25 +1220,25 @@ proc/admin_notice(var/message, var/rights)
M = whom
C = M.client
else
return "<b>(*not a mob*)</b>"
return "<b>(*not a mob*)</b>"
switch(detail)
if(0)
return "<b>[key_name(C, link, name, highlight_special, ticket)]</b>"
return "<b>[key_name(C, link, name, highlight_special, ticket)]</b>"
if(1) //Private Messages
return "<b>[key_name(C, link, name, highlight_special, ticket)](<A HREF='?_src_=holder;adminmoreinfo=\ref[M]'>?</A>)</b>"
return "<b>[key_name(C, link, name, highlight_special, ticket)](<A HREF='?_src_=holder;adminmoreinfo=\ref[M]'>?</A>)</b>"
if(2) //Admins
var/ref_mob = "\ref[M]"
return "<b>[key_name(C, link, name, highlight_special, ticket)](<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(M, src)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>)</b>"
return "<b>[key_name(C, link, name, highlight_special, ticket)](<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(M, src)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>)</b>"
if(3) //Devs
if(3) //Devs
var/ref_mob = "\ref[M]"
return "<b>[key_name(C, link, name, highlight_special, ticket)](<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>)([admin_jump_link(M, src)])</b>"
return "<b>[key_name(C, link, name, highlight_special, ticket)](<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>)([admin_jump_link(M, src)])</b>"
if(4) //Mentors
var/ref_mob = "\ref[M]"
return "<b>[key_name(C, link, name, highlight_special, ticket)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[M]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(M, src)])</b>"
return "<b>[key_name(C, link, name, highlight_special, ticket)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[M]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(M, src)])</b>"
//
//ALL DONE
+16 -13
View File
@@ -1312,7 +1312,8 @@
else if(href_list["ac_submit_new_channel"])
var/check = 0
for(var/datum/feed_channel/FC in news_network.network_channels)
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
if(FC.channel_name == src.admincaster_feed_channel.channel_name)
check = 1
break
@@ -1321,7 +1322,7 @@
else
var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel")
if(choice=="Confirm")
news_network.CreateFeedChannel(admincaster_feed_channel.channel_name, admincaster_signature, admincaster_feed_channel.locked, 1)
SSnews.CreateFeedChannel(admincaster_feed_channel.channel_name, admincaster_signature, admincaster_feed_channel.locked, 1)
feedback_inc("newscaster_channels",1) //Adding channel to the global network
log_admin("[key_name_admin(usr)] created command feed channel: [src.admincaster_feed_channel.channel_name]!",admin_key=key_name(usr))
src.admincaster_screen=5
@@ -1329,8 +1330,9 @@
else if(href_list["ac_set_channel_receiving"])
var/list/available_channels = list()
for(var/datum/feed_channel/F in news_network.network_channels)
available_channels += F.channel_name
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
available_channels += FC.channel_name
src.admincaster_feed_channel.channel_name = sanitizeSafe(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels )
src.access_news_network()
@@ -1343,7 +1345,8 @@
src.admincaster_screen = 6
else
feedback_inc("newscaster_stories",1)
news_network.SubmitArticle(src.admincaster_feed_message.body, src.admincaster_signature, src.admincaster_feed_channel.channel_name, null, 1)
var/datum/feed_channel/ch = SSnews.GetFeedChannel(src.admincaster_feed_channel.channel_name)
SSnews.SubmitArticle(src.admincaster_feed_message.body, src.admincaster_signature, ch, null, 1)
src.admincaster_screen=4
log_admin("[key_name_admin(usr)] submitted a feed story to channel: [src.admincaster_feed_channel.channel_name]!",admin_key=key_name(usr))
@@ -1367,12 +1370,12 @@
else if(href_list["ac_menu_wanted"])
var/already_wanted = 0
if(news_network.wanted_issue)
if(SSnews.wanted_issue)
already_wanted = 1
if(already_wanted)
src.admincaster_feed_message.author = news_network.wanted_issue.author
src.admincaster_feed_message.body = news_network.wanted_issue.body
src.admincaster_feed_message.author = SSnews.wanted_issue.author
src.admincaster_feed_message.body = SSnews.wanted_issue.body
src.admincaster_screen = 14
src.access_news_network()
@@ -1397,15 +1400,15 @@
WANTED.body = src.admincaster_feed_message.body //Wanted desc
WANTED.backup_author = src.admincaster_signature //Submitted by
WANTED.is_admin_message = 1
news_network.wanted_issue = WANTED
SSnews.wanted_issue = WANTED
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
NEWSCASTER.newsAlert()
NEWSCASTER.update_icon()
src.admincaster_screen = 15
else
news_network.wanted_issue.author = src.admincaster_feed_message.author
news_network.wanted_issue.body = src.admincaster_feed_message.body
news_network.wanted_issue.backup_author = src.admincaster_feed_message.backup_author
SSnews.wanted_issue.author = src.admincaster_feed_message.author
SSnews.wanted_issue.body = src.admincaster_feed_message.body
SSnews.wanted_issue.backup_author = src.admincaster_feed_message.backup_author
src.admincaster_screen = 19
log_admin("[key_name_admin(usr)] issued a Station-wide Wanted Notification for [src.admincaster_feed_message.author]!",admin_key=key_name(usr))
src.access_news_network()
@@ -1413,7 +1416,7 @@
else if(href_list["ac_cancel_wanted"])
var/choice = alert("Please confirm Wanted Issue removal","Network Security Handler","Confirm","Cancel")
if(choice=="Confirm")
news_network.wanted_issue = null
SSnews.wanted_issue = null
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
NEWSCASTER.update_icon()
src.admincaster_screen=17
+6 -1
View File
@@ -1,7 +1,9 @@
#ifdef AO_USE_LIGHTING_OPACITY
#define AO_TURF_CHECK(T) (!T.has_opaque_atom || !T.permit_ao)
#define AO_SELF_CHECK(T) (!T.has_opaque_atom)
#else
#define AO_TURF_CHECK(T) (!T.density || !T.opacity || !T.permit_ao)
#define AO_SELF_CHECK(T) (!T.density && !T.opacity)
#endif
/turf
@@ -29,7 +31,7 @@
var/turf/T
if (flags & MIMIC_BELOW)
CALCULATE_NEIGHBORS(src, ao_neighbors_mimic, T, (T.flags & MIMIC_BELOW))
if (!has_opaque_atom && !(flags & MIMIC_NO_AO))
if (AO_SELF_CHECK(src) && !(flags & MIMIC_NO_AO))
CALCULATE_NEIGHBORS(src, ao_neighbors, T, AO_TURF_CHECK(T))
/proc/make_ao_image(corner, i, px = 0, py = 0, pz = 0, pw = 0)
@@ -41,6 +43,7 @@
I.alpha = WALL_AO_ALPHA
I.blend_mode = BLEND_OVERLAY
I.appearance_flags = RESET_ALPHA|RESET_COLOR|TILE_BOUND
I.layer = AO_LAYER
// If there's an offset, counteract it.
if (px || py || pz || pw)
I.pixel_x = -px
@@ -109,3 +112,5 @@
#undef REGEN_AO
#undef PROCESS_AO_CORNER
#undef AO_TURF_CHECK
#undef AO_SELF_CHECK
+70 -56
View File
@@ -58,6 +58,8 @@ var/global/stockname = ""
*/
var/list/global/random_stock_common = list(
"backpack" = 1,
"drawing" = 1,
"toolbox" = 4,
"meds" = 5,
"steel" = 7,
@@ -74,8 +76,6 @@ var/list/global/random_stock_common = list(
"light" = 1.8,
"aid" = 4,
"flame" = 2,
"crayons" = 1.5,
"figure" = 1,
"bombsupply" = 4.5,
"tech" = 5,
"smokes" = 2,
@@ -85,13 +85,12 @@ var/list/global/random_stock_common = list(
"circuitboard" = 2,
"smalloxy" = 3.2,
"belts" = 2,
"backpack" = 4.5,
"weldgear" = 2,
"inflatable" = 3,
"wheelchair" = 1,
"meson" = 1.5,
"beartrap" = 2,
"trays" = 1.8,
"trays" = 0.8,
"utensil" = 2,
"metalfoam" = 1.5,
"nanopaste" = 2,
@@ -122,8 +121,7 @@ var/list/global/random_stock_common = list(
"hailer" = 1.1,
"target" = 2,
"snacks" = 4,
"oxytank" = 2.5,//
"signs" = 4,
"oxytank" = 2.5,
"posters" = 3,
"parts" = 6,
"cane" = 2,
@@ -134,9 +132,11 @@ var/list/global/random_stock_common = list(
"paicard" = 2,
"phoronsheets" = 2,
"hide" = 1,
"arcade" = 2,
"nothing" = 0)
var/list/global/random_stock_uncommon = list(
"beekit" = 1,
"glowshrooms" = 2,
"plasteel" = 3,
"silver" = 2,
@@ -152,19 +152,17 @@ var/list/global/random_stock_uncommon = list(
"monkey" = 2,
"specialcrayon" = 1.5,
"contraband" = 2,
"figure" = 4,
"plushie" = 4,
"mediumcell" = 3,
"chempack" = 5,
"robolimbs" = 3,
"circuitboards" = 3,
"jetpack" = 3,
"xenocostume" = 1,
"bible" = 1,
"inhaler" = 1,
"advwelder" = 2,
"sord" = 1,
"policebaton" = 1.5,
"stunbaton" = 0.75,//batons spawn with no powercell
"stunbaton" = 0.75, //batons spawn with no powercell
"firingpin" = 3,
"watches" = 3,
"MMI" = 1.5,
@@ -183,7 +181,6 @@ var/list/global/random_stock_uncommon = list(
"fireaxe" = 1,
"service" = 2,
"robot" = 2,
"latexb" = 0.5,
"taperoll" = 1,
"headset" = 2,
"bat" = 1.2,
@@ -196,7 +193,6 @@ var/list/global/random_stock_uncommon = list(
"exoquip" = 2,
"laserscalpel" = 1.3,
"electropack" = 1,
"beesmoker" = 1.5,
"monkeyhide" = 0.5,
"cathide" = 0.5,
"corgihide" = 0.5,
@@ -465,6 +461,11 @@ var/list/global/random_stock_large = list(
/proc/spawn_stock(var/stock, var/atom/L, var/datum/cargospawner/CS = null)
//L is the location we spawn in. Using a single letter as shorthand because its written so often
switch(stock)
if("arcade")
new /obj/random/arcade(L)
new /obj/random/arcade(L)
new /obj/random/arcade(L)
if ("toolbox")
if (prob(5))
new /obj/item/weapon/storage/toolbox/syndicate(L)
@@ -562,8 +563,6 @@ var/list/global/random_stock_large = list(
new /obj/item/weapon/flame/lighter/random(L)
new /obj/item/weapon/storage/fancy/candle_box(L)
new /obj/item/weapon/storage/fancy/candle_box(L)
if ("crayons")
new /obj/item/weapon/storage/fancy/crayons(L)
if("bombsupply")
new /obj/random/bomb_supply(L)
@@ -640,9 +639,6 @@ var/list/global/random_stock_large = list(
if("belts")
new /obj/random/belt(L)
new /obj/random/belt(L)
if("backpack")
new /obj/random/backpack(L)
new /obj/random/backpack(L)
if("weldgear")
if (prob(50))
new /obj/item/clothing/glasses/welding(L)
@@ -708,6 +704,7 @@ var/list/global/random_stock_large = list(
//A random scanning device, most are useless
var/list/possible = list(
/obj/item/device/healthanalyzer = 5,
/obj/item/device/breath_analyzer = 1,
/obj/item/device/analyzer = 0.5,
/obj/item/device/mass_spectrometer = 0.5,
/obj/item/device/mass_spectrometer/adv = 0.5,
@@ -976,13 +973,11 @@ var/list/global/random_stock_large = list(
new type(L)
if ("cleanernades")
new /obj/item/weapon/grenade/chem_grenade/cleaner(L)
new /obj/item/weapon/grenade/chem_grenade/cleaner(L)
if (prob(50))
if(prob(90))
new /obj/item/weapon/grenade/chem_grenade/cleaner(L)
new /obj/item/weapon/grenade/chem_grenade/cleaner(L)
else
new /obj/item/weapon/grenade/chem_grenade/large/phoroncleaner(L)
if ("mining")
if (prob(50))
@@ -1007,12 +1002,35 @@ var/list/global/random_stock_large = list(
if ("hide")
new /obj/item/stack/material/animalhide(L, rand(5,50))
if("drawing")
var/list/drawing = list(
/obj/item/weapon/pen/crayon/rainbow = 2,
/obj/item/weapon/pen/crayon/mime = 2,
/obj/item/weapon/storage/fancy/crayons = 4,
/obj/item/weapon/pen/chameleon = 1,
/obj/item/weapon/pen/invisible = 2,
/obj/item/weapon/pen/multi = 2
)
var/type = pickweight(drawing)
new type(L)
if("backpack")
var/obj/item/weapon/storage/pack = new /obj/random/backpack(src)
if(istype(pack) && prob(75))
new /obj/random/loot(pack)
new /obj/random/loot(pack)
new /obj/random/loot(pack)
//Uncommon items below here
//=============================================================
//=============================================================
//=============================================================
if ("glowshrooms")
if("beekit")
new /obj/item/bee_pack(src)
new /obj/item/weapon/bee_net(src)
new /obj/item/weapon/bee_smoker(src)
if("glowshrooms")
new /obj/item/seeds/glowshroom(L)
new /obj/item/seeds/glowshroom(L)
new /obj/item/seeds/glowshroom(L)
@@ -1059,12 +1077,6 @@ var/list/global/random_stock_large = list(
while (number > 0)
new /obj/random/contraband(L)
number--
if("figure")
new /obj/random/action_figure(L)
new /obj/random/action_figure(L)
new /obj/random/action_figure(L)
if("plushie")
new /obj/random/plushie(L)
if("firingpin")
new /obj/item/weapon/storage/box/firingpins(L)
if("mediumcell")
@@ -1130,11 +1142,6 @@ var/list/global/random_stock_large = list(
if ("xenocostume")
new /obj/item/clothing/suit/xenos(L)
new /obj/item/clothing/head/xenos(L)
if ("bible")
if (prob(25))
new /obj/item/weapon/storage/bible/booze(L)
else
new /obj/item/weapon/storage/bible(L)
if ("advwelder")
new /obj/item/weapon/weldingtool/hugetank(L)
@@ -1157,22 +1164,6 @@ var/list/global/random_stock_large = list(
if ("voidsuit")
new /obj/random/voidsuit(L,1)
if ("signs")
var/list/allsigns = subtypesof(/obj/structure/sign)
allsigns -= typesof(/obj/structure/sign/double)
allsigns -= typesof(/obj/structure/sign/poster)
allsigns -= /obj/structure/sign/directions
allsigns -= typesof(/obj/structure/sign/christmas)
allsigns -= typesof(/obj/structure/sign/flag)
var/number = rand(1,5)
while (number > 0)
var/newsign = pick(allsigns)
if (newsign != /obj/structure/sign)//Dont want to spawn the generic parent class
var/obj/structure/sign/S = new newsign(L)
S.unfasten()
number--
if ("posters")
new /obj/item/weapon/contraband/poster(L)
if (prob(50))
@@ -1244,8 +1235,6 @@ var/list/global/random_stock_large = list(
newbot.on = 0//Deactivated
if (prob(10))
newbot.emag_act(9999,null)
if ("latexb")
new /obj/item/latexballon(L)
//Random headsets for low-security department
//No command or sec
@@ -1372,9 +1361,6 @@ var/list/global/random_stock_large = list(
cr.rigged = 1//Boobytrapped crate, will electrocute when you attempt to open it
//Can be disarmed with wirecutters or ignored with insulated gloves
if ("beesmoker")
new /obj/item/weapon/bee_smoker(L)
if("monkeyhide")
new /obj/item/stack/material/animalhide/monkey(L, 50)
@@ -1390,7 +1376,6 @@ var/list/global/random_stock_large = list(
if ("wintercoat")
new /obj/random/hoodie(L)
if("cookingoil")
var/turf/T = get_turf(L)
if (!turf_clear(T))
@@ -1539,6 +1524,35 @@ var/list/global/random_stock_large = list(
if ("contraband")
new /obj/random/contraband(L)
if ("inhaler")
if(prob(33))
if(prob(10))
new/obj/item/weapon/storage/box/inhalers_large(src)
else
new /obj/item/weapon/storage/box/inhalers(src)
else
var/number = rand(2,3)
var/list/inhalers = list(
/obj/item/weapon/reagent_containers/inhaler/dexalin = 8,
/obj/item/weapon/reagent_containers/inhaler/hyperzine = 2,
/obj/item/weapon/reagent_containers/inhaler/phoron = 2,
/obj/item/weapon/reagent_containers/inhaler/soporific = 1,
/obj/item/weapon/reagent_containers/inhaler/space_drugs = 3
)
while(number > 0)
var/type = pickweight(inhalers)
var/obj/item/weapon/reagent_containers/inhaler/spawned = new type(L)
if(prob(10) || istype(spawned,/obj/item/weapon/reagent_containers/inhaler/space_drugs))
spawned.name = "unlabeled inhaler"
spawned.desc = "A rapid and safe way to administer small amounts of drugs into the lungs by untrained or trained personnel. This one is unlabeled."
number -= 1
if(prob(33))
new /obj/item/device/breath_analyzer(L)
//Large items go below here
//=============================================================
//=============================================================
@@ -51,6 +51,15 @@
ties["blue tie"] = /obj/item/clothing/accessory/blue
ties["red tie"] = /obj/item/clothing/accessory/red
ties["horrible tie"] = /obj/item/clothing/accessory/horrible
ties["blue tie with a clip"] = /obj/item/clothing/accessory/tie/blue_clip
ties["blue long tie"] = /obj/item/clothing/accessory/tie/blue_long
ties["red tie with a clip"] = /obj/item/clothing/accessory/tie/red_clip
ties["red long tie"] = /obj/item/clothing/accessory/tie/red_long
ties["black tie"] = /obj/item/clothing/accessory/tie/black
ties["dark green tie"] = /obj/item/clothing/accessory/tie/darkgreen
ties["yellow tie"] = /obj/item/clothing/accessory/tie/yellow
ties["navy tie"] = /obj/item/clothing/accessory/tie/navy
ties["white tie"] = /obj/item/clothing/accessory/tie/white
gear_tweaks += new/datum/gear_tweak/path(ties)
/datum/gear/accessory/brown_vest
@@ -97,6 +106,18 @@
display_name = "silver locket"
path = /obj/item/clothing/accessory/locket
/datum/gear/accessory/locket
display_name = "silver locket"
path = /obj/item/clothing/accessory/locket
/datum/gear/accessory/sweater
display_name = "sweater"
path = /obj/item/clothing/accessory/sweater
/datum/gear/accessory/sweater/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/accessory/scarf
display_name = "scarf selection"
path = /obj/item/clothing/accessory/scarf
@@ -94,4 +94,8 @@
display_name = "HUDpatch, Welding"
path = /obj/item/clothing/glasses/eyepatch/hud/welder
allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Engineering Apprentice","Research Director","Roboticist")
cost = 2
cost = 2
/datum/gear/eyes/spiffygogs
display_name = "Orange Goggles"
path = /obj/item/clothing/glasses/spiffygogs
@@ -36,7 +36,7 @@
/datum/gear/flask/New()
..()
gear_tweaks += new/datum/gear_tweak/reagents(lunchables_ethanol_reagents())
gear_tweaks += new/datum/gear_tweak/reagents(lunchables_alcohol_reagents())
/datum/gear/vacflask
display_name = "vacuum-flask"
@@ -173,3 +173,11 @@
surgical["surgical cap, green"] = /obj/item/clothing/head/surgery/green
surgical["surgical cap, black"] = /obj/item/clothing/head/surgery/black
gear_tweaks += new/datum/gear_tweak/path(surgical)
/datum/gear/head/headbando
display_name = "Basic Headband"
path = /obj/item/clothing/head/headbando
/datum/gear/head/headbando/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
@@ -54,4 +54,32 @@
shoes["dress flats, blue"] = /obj/item/clothing/shoes/flats/blue
shoes["dress flats, green"] = /obj/item/clothing/shoes/flats/green
shoes["dress flats, purple"] = /obj/item/clothing/shoes/flats/purple
gear_tweaks += new/datum/gear_tweak/path(shoes)
gear_tweaks += new/datum/gear_tweak/path(shoes)
/datum/gear/shoes/cowboy
display_name = "cowboy boots selection"
path = /obj/item/clothing/shoes/cowboy
/datum/gear/shoes/cowboy/New()
..()
var/shoes = list()
shoes["cowboy boots"] = /obj/item/clothing/shoes/cowboy
shoes["classic cowboy boots"] = /obj/item/clothing/shoes/cowboy/classic
shoes["snakeskin cowboy boots"] = /obj/item/clothing/shoes/cowboy/snakeskin
gear_tweaks += new/datum/gear_tweak/path(shoes)
/datum/gear/shoes/heels
display_name = "high heels"
path = /obj/item/clothing/shoes/heels
/datum/gear/shoes/heels/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/shoes/tongs
display_name = "flip flops"
path = /obj/item/clothing/shoes/sandal/flipflop
/datum/gear/shoes/tongs/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
@@ -25,6 +25,10 @@
jackets["flannel jacket, grey"] = /obj/item/clothing/suit/storage/toggle/flannel/gray
jackets["flannel jacket, purple"] = /obj/item/clothing/suit/storage/toggle/flannel/purple
jackets["flannel jacket, yellow"] = /obj/item/clothing/suit/storage/toggle/flannel/yellow
jackets["black vest"] = /obj/item/clothing/suit/storage/toggle/leather_vest
jackets["brown vest"] = /obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless
jackets["leather coat"] = /obj/item/clothing/suit/leathercoat
gear_tweaks += new/datum/gear_tweak/path(jackets)
/datum/gear/suit/hazard_vest
@@ -172,4 +176,18 @@
/datum/gear/suit/secjackethos
display_name = "navy security jacket (Head of Security)"
path = /obj/item/clothing/suit/security/navyhos
allowed_roles = list("Head of Security")
allowed_roles = list("Head of Security")
/datum/gear/suit/dominia
display_name = "dominia great coat selection"
path = /obj/item/clothing/suit/storage/toggle/dominia
/datum/gear/suit/dominia/New()
..()
var/coat = list()
coat["dominia great coat"] = /obj/item/clothing/suit/storage/toggle/dominia
coat["dominia great coat, alternative"] = /obj/item/clothing/suit/storage/toggle/dominia/alt
coat["dominia cape"] = /obj/item/clothing/suit/storage/dominia
coat["dominia great coat, black"] = /obj/item/clothing/suit/storage/toggle/dominia/black
coat["dominia great coat, alternative black"] = /obj/item/clothing/suit/storage/toggle/dominia/black/alt
gear_tweaks += new/datum/gear_tweak/path(coat)
@@ -40,16 +40,23 @@
/datum/gear/uniform/skirt
display_name = "skirt selection"
path = /obj/item/clothing/under/dress/plaid_blue
path = /obj/item/clothing/under/skirt/
/datum/gear/uniform/skirt/New()
..()
var/skirts = list()
skirts["plaid skirt, blue"] = /obj/item/clothing/under/dress/plaid_blue
skirts["plaid skirt, purple"] = /obj/item/clothing/under/dress/plaid_purple
skirts["plaid skirt, red"] = /obj/item/clothing/under/dress/plaid_red
skirts["jumpskirt, black"] = /obj/item/clothing/under/blackjumpskirt
skirts["skirt, black"] = /obj/item/clothing/under/blackskirt
skirts["plaid skirt, blue"] = /obj/item/clothing/under/skirt/plaid_blue
skirts["plaid skirt, purple"] = /obj/item/clothing/under/skirt/plaid_purple
skirts["plaid skirt, red"] = /obj/item/clothing/under/skirt/plaid_red
skirts["jumpskirt, black"] = /obj/item/clothing/under/skirt/blackjumpskirt
skirts["skirt, black"] = /obj/item/clothing/under/skirt/
skirts["skirt, khaki"] = /obj/item/clothing/under/skirt/khaki
skirts["short skirt, black"] = /obj/item/clothing/under/skirt/short_black
skirts["short skirt, blue"] = /obj/item/clothing/under/skirt/blue
skirts["short skirt, red"] = /obj/item/clothing/under/skirt/red
skirts["skirt, swept"] = /obj/item/clothing/under/skirt/swept
gear_tweaks += new/datum/gear_tweak/path(skirts)
/datum/gear/uniform/suit
@@ -168,17 +175,39 @@
pants["khaki pants"] = /obj/item/clothing/under/pants/khaki
pants["track pants"] = /obj/item/clothing/under/pants/track
pants["camo pants"] = /obj/item/clothing/under/pants/camo
pants["athletic shorts, black"] = /obj/item/clothing/under/shorts
pants["athletic shorts, red"] = /obj/item/clothing/under/shorts/red
pants["athletic shorts, green"] = /obj/item/clothing/under/shorts/green
pants["athletic shorts, black"] = /obj/item/clothing/under/shorts/black
pants["athletic shorts, grey"] = /obj/item/clothing/under/shorts/grey
pants["jean shorts"] = /obj/item/clothing/under/shorts/jeans
pants["jean short shorts"] = /obj/item/clothing/under/shorts/jeans/female
pants["classic jeans shorts"] = /obj/item/clothing/under/shorts/jeans/classic
pants["classic jeans shorts shorts"] = /obj/item/clothing/under/shorts/jeans/classic/female
pants["mustang jeans shorts"] = /obj/item/clothing/under/shorts/jeans/mustang
pants["mustang jeans shorts shorts"] = /obj/item/clothing/under/shorts/jeans/mustang/female
pants["young folks jeans shorts"] = /obj/item/clothing/under/shorts/jeans/youngfolks
pants["young folks jeans shorts shorts"] = /obj/item/clothing/under/shorts/jeans/youngfolks/female
pants["black jeans shorts"] = /obj/item/clothing/under/shorts/jeans/black
pants["black jeans shorts shorts"] = /obj/item/clothing/under/shorts/jeans/black/female
pants["grey jeans shorts"] = /obj/item/clothing/under/shorts/jeans/grey
pants["grey jeans shorts shorts"] = /obj/item/clothing/under/shorts/jeans
pants["khaki shorts"] = /obj/item/clothing/under/shorts/khaki
pants["khaki shorts shorts"] = /obj/item/clothing/under/shorts/khaki/female
gear_tweaks += new/datum/gear_tweak/path(pants)
/datum/gear/uniform/turtleneck
display_name = "tacticool turtleneck"
path = /obj/item/clothing/under/syndicate/tacticool
/datum/gear/uniform/dominia
display_name = "dominia suit selection"
path = /obj/item/clothing/under/dominia
/datum/gear/uniform/sweater
display_name = "sweater"
path = /obj/item/clothing/under/sweater
/datum/gear/uniform/sweater/New()
/datum/gear/uniform/dominia/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
var/suit = list()
suit["dominia suit"] = /obj/item/clothing/under/dominia
suit["dominia suit, black"] = /obj/item/clothing/under/dominia/black
suit["lyodsuit"] = /obj/item/clothing/under/dom_thermal
gear_tweaks += new/datum/gear_tweak/path(suit)
@@ -140,11 +140,19 @@
gear_tweaks += new/datum/gear_tweak/path(taj_gloves)
/datum/gear/suit/tajara_coat
display_name = "tajaran naval coat (Tajara)"
display_name = "tajara coat selection (Tajara)"
path = /obj/item/clothing/suit/storage/tajaran
whitelisted = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara")
sort_category = "Xenowear"
/datum/gear/suit/tajara_coat/New()
..()
var/coat = list()
coat["tajaran naval coat"] = /obj/item/clothing/suit/storage/tajaran
coat["commoner cloak"] = /obj/item/clothing/suit/storage/tajaran/cloak
coat["royal cloak"] = /obj/item/clothing/suit/storage/tajaran/cloak/fancy
gear_tweaks += new/datum/gear_tweak/path(coat)
/datum/gear/suit/tajaran_labcoat
display_name = "PRA medical coat (Tajara)"
path = /obj/item/clothing/suit/storage/toggle/labcoat/tajaran
@@ -152,6 +160,70 @@
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Paramedic", "Medical Resident")
sort_category = "Xenowear"
/datum/gear/uniform/tajara
display_name = "tajaran uniform selection (Tajara)"
path = /obj/item/clothing/under/tajaran
whitelisted = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara")
sort_category = "Xenowear"
/datum/gear/uniform/tajara/New()
..()
var/uniform = list()
uniform["laborers clothes"] = /obj/item/clothing/under/tajaran
uniform["fancy uniform"] = /obj/item/clothing/under/tajaran/fancy
uniform["NanoTrasen overalls"] = /obj/item/clothing/under/tajaran/nt
gear_tweaks += new/datum/gear_tweak/path(uniform)
/datum/gear/uniform/tajara_dress
display_name = "tajaran dress selection (Tajara)"
path = /obj/item/clothing/under/dress/tajaran
whitelisted = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara")
sort_category = "Xenowear"
/datum/gear/uniform/tajara_dress/New()
..()
var/dress = list()
dress["white fancy adhomian dress"] = /obj/item/clothing/under/dress/tajaran
dress["blue fancy adhomian dress"] = /obj/item/clothing/under/dress/tajaran/blue
dress["green fancy adhomian dress"] = /obj/item/clothing/under/dress/tajaran/green
dress["red fancy adhomian dress"] = /obj/item/clothing/under/dress/tajaran/red
dress["red noble adhomian dress"] = /obj/item/clothing/under/dress/tajaran/fancy
dress["black noble adhomian dress"] = /obj/item/clothing/under/dress/tajaran/fancy/black
gear_tweaks += new/datum/gear_tweak/path(dress)
/datum/gear/accessory/tajara
display_name = "fur scarf (Tajara)"
path = /obj/item/clothing/accessory/tajaran
whitelisted = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara")
sort_category = "Xenowear"
/datum/gear/accessory/tajara/New()
..()
var/scarf = list()
scarf["brown fur scarf"] = /obj/item/clothing/accessory/tajaran
scarf["light brown fur scarf"] = /obj/item/clothing/accessory/tajaran/lbrown
scarf["cinnamon fur scarf"] = /obj/item/clothing/accessory/tajaran/cinnamon
scarf["blue fur scarf"] = /obj/item/clothing/accessory/tajaran/blue
scarf["silver fur scarf"] = /obj/item/clothing/accessory/tajaran/silver
scarf["black fur scarf"] = /obj/item/clothing/accessory/tajaran/black
scarf["ruddy fur scarf"] = /obj/item/clothing/accessory/tajaran/ruddy
scarf["orange fur scarf"] = /obj/item/clothing/accessory/tajaran/orange
scarf["cream fur scarf"] = /obj/item/clothing/accessory/tajaran/cream
gear_tweaks += new/datum/gear_tweak/path(scarf)
/datum/gear/head/tajara
display_name = "dress circlet selection (Tajara)"
path = /obj/item/clothing/head/tajaran/circlet
whitelisted = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara")
sort_category = "Xenowear"
/datum/gear/head/tajara/New()
..()
var/circlet = list()
circlet["golden dress circlet"] = /obj/item/clothing/head/tajaran/circlet
circlet["silver dress circlet"] = /obj/item/clothing/head/tajaran/circlet/silver
gear_tweaks += new/datum/gear_tweak/path(circlet)
//other things
/datum/gear/uniform/gearharness

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