diff --git a/.gitignore b/.gitignore
index 210efc84d75b..105a74f3dbaf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,3 +31,5 @@ test_environment.txt
# byond-tracy backend, not shipped with the codebase so it shouldn't be maintained
prof.dll
libprof.so
+
+code\__DEFINES\__rust_g.dm
diff --git a/.tgs.yml b/.tgs.yml
index ba3fc6b26c66..733fc80a74f1 100644
--- a/.tgs.yml
+++ b/.tgs.yml
@@ -3,6 +3,7 @@ byond: "514.1588"
static_files:
- name: config
- name: data
+ - name: local.db
linux_scripts:
PreCompile.sh: tools/tgs_scripts/PreCompile.sh
WatchdogLaunch.sh: tools/tgs_scripts/WatchdogLaunch.sh
diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm
index 97e4b0dbd1e8..4eba0bb90498 100644
--- a/code/__DEFINES/access.dm
+++ b/code/__DEFINES/access.dm
@@ -37,6 +37,7 @@ most of them are tied into map-placed objects. This should be reworked in the fu
#define ACCESS_MARINE_KITCHEN 30
#define ACCESS_MARINE_CO 31
#define ACCESS_MARINE_TL_PREP 32
+#define ACCESS_MARINE_WALKER 33
#define ACCESS_MARINE_MAINT 34
#define ACCESS_MARINE_OT 35
diff --git a/code/__DEFINES/conflict.dm b/code/__DEFINES/conflict.dm
index 241bcb469622..0820c709cdae 100644
--- a/code/__DEFINES/conflict.dm
+++ b/code/__DEFINES/conflict.dm
@@ -26,7 +26,7 @@
#define AMMO_IGNORE_RESIST (1<<10)
#define AMMO_BALLISTIC (1<<11)
#define AMMO_IGNORE_COVER (1<<12)
-// (1<<13) unused, previously was AMMO_SCANS_NEARBY
+#define AMMO_ANTIVEHICLE (1<<13)
#define AMMO_STOPPED_BY_COVER (1<<14)
#define AMMO_SPECIAL_EMBED (1<<15)
/// If the projectile hits a dense turf it'll do on_hit_turf on the turf just in front of the turf instead of on the turf itself
diff --git a/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm b/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm
index 323e0ee6966c..9eff6fa3ddc8 100644
--- a/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm
+++ b/code/__DEFINES/dcs/signals/atom/mob/signals_mob.dm
@@ -116,3 +116,9 @@
#define COMSIG_MOB_MOUSEDRAG "mob_mousedrag" //from /client/MouseDrag(): (atom/src_object, atom/over_object, turf/src_location, turf/over_location, src_control, over_control, params)
#define COMSIG_MOB_CLICK_CANCELED (1<<0)
#define COMSIG_MOB_CLICK_HANDLED (1<<1)
+
+#define COMSIG_MOB_DEPLOYED_BIPOD "mob_deployed_bipod"
+#define COMSIG_MOB_UNDEPLOYED_BIPOD "mob_undeployed_bipod"
+
+/// From /obj/item/proc/pickup() : (obj/item/picked_up)
+#define COMSIG_MOB_PICKUP_ITEM "mob_pickup_item"
diff --git a/code/__DEFINES/dcs/signals/atom/signals_item.dm b/code/__DEFINES/dcs/signals/atom/signals_item.dm
index b7bbca9f64a3..6c31b77f76a4 100644
--- a/code/__DEFINES/dcs/signals/atom/signals_item.dm
+++ b/code/__DEFINES/dcs/signals/atom/signals_item.dm
@@ -55,6 +55,11 @@
#define COMSIG_GUN_BURST_SHOTS_TO_FIRE_MODIFIED "gun_burst_shots_to_fire_modified"
#define COMSIG_GUN_BURST_SHOT_DELAY_MODIFIED "gun_burst_shot_delay_modified"
+#define COMSIG_GUN_VULTURE_FIRED_ONEHAND "gun_vulture_fired_onehand"
+#define COMSIG_VULTURE_SCOPE_MOVED "vulture_scope_moved"
+#define COMSIG_VULTURE_SCOPE_SCOPED "vulture_scope_scoped"
+#define COMSIG_VULTURE_SCOPE_UNSCOPED "vulture_scope_unscoped"
+
/// from /obj/item/weapon/gun/proc/recalculate_attachment_bonuses() : ()
#define COMSIG_GUN_RECALCULATE_ATTACHMENT_BONUSES "gun_recalculate_attachment_bonuses"
diff --git a/code/__DEFINES/equipment.dm b/code/__DEFINES/equipment.dm
index 461eae27a2a3..ccfc9e4773da 100644
--- a/code/__DEFINES/equipment.dm
+++ b/code/__DEFINES/equipment.dm
@@ -233,6 +233,8 @@
#define SLOT_LEGS (1<<13)
#define SLOT_ACCESSORY (1<<14)
#define SLOT_SUIT_STORE (1<<15) //this allows items to be stored in the suit slot regardless of suit
+/// Anything with this flag cannot be worn in suit storage, period.
+#define SLOT_BLOCK_SUIT_STORE (1<<16)
//=================================================
//slots
diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm
index eac5121f173e..ec9496009e86 100644
--- a/code/__DEFINES/job.dm
+++ b/code/__DEFINES/job.dm
@@ -76,9 +76,10 @@ var/global/list/job_command_roles = JOB_COMMAND_ROLES_LIST
#define JOB_PILOT "Pilot Officer"
#define JOB_DROPSHIP_CREW_CHIEF "Dropship Crew Chief"
#define JOB_CREWMAN "Vehicle Crewman"
+#define JOB_WALKER "Mech Operator"
#define JOB_INTEL "Intelligence Officer"
#define JOB_AUXILIARY_ROLES /datum/timelock/auxiliary
-#define JOB_AUXILIARY_ROLES_LIST list(JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_CREWMAN, JOB_INTEL)
+#define JOB_AUXILIARY_ROLES_LIST list(JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_CREWMAN, JOB_WALKER, JOB_INTEL)
#define JOB_POLICE "Military Police"
#define JOB_WARDEN "Military Warden"
diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm
index b55a1b7ce583..8904c0295abf 100644
--- a/code/__DEFINES/layers.dm
+++ b/code/__DEFINES/layers.dm
@@ -153,6 +153,8 @@
#define FULLSCREEN_BLIND_LAYER 17.15
/// pain flashes
#define FULLSCREEN_PAIN_LAYER 17.2
+/// Vulture sniper/spotter scope
+#define FULLSCREEN_VULTURE_SCOPE_LAYER 17.21
/// in critical
#define FULLSCREEN_CRIT_LAYER 17.25
diff --git a/code/__DEFINES/mode.dm b/code/__DEFINES/mode.dm
index 6ca6a142beb2..a9475a27b07a 100644
--- a/code/__DEFINES/mode.dm
+++ b/code/__DEFINES/mode.dm
@@ -6,7 +6,7 @@
#define SHUTTLE_LOCK_COOLDOWN 10 MINUTES
#define MONORAIL_LOCK_COOLDOWN 3 MINUTES
#define SHUTTLE_LOCK_TIME_LOCK 1 MINUTES
-#define EVACUATION_AUTOMATIC_DEPARTURE 10 MINUTES //All pods automatically depart in 10 minutes, unless they are full or unable to launch for some reason.
+#define EVACUATION_AUTOMATIC_DEPARTURE (10 MINUTES) //All pods automatically depart in 10 minutes, unless they are full or unable to launch for some reason.
#define EVACUATION_ESTIMATE_DEPARTURE ((evac_time + EVACUATION_AUTOMATIC_DEPARTURE - world.time) * 0.1)
#define EVACUATION_STATUS_STANDING_BY 0
@@ -109,12 +109,12 @@
//=================================================
//Role defines, specifically lists of roles for job bans, crew manifests and the like.
-var/global/list/ROLES_COMMAND = list(JOB_CO, JOB_XO, JOB_SO, JOB_AUXILIARY_OFFICER, JOB_INTEL, JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_CREWMAN, JOB_POLICE, JOB_CORPORATE_LIAISON, JOB_COMBAT_REPORTER, JOB_CHIEF_REQUISITION, JOB_CHIEF_ENGINEER, JOB_CMO, JOB_CHIEF_POLICE, JOB_SEA, JOB_SYNTH, JOB_WARDEN)
+var/global/list/ROLES_COMMAND = list(JOB_CO, JOB_XO, JOB_SO, JOB_AUXILIARY_OFFICER, JOB_INTEL, JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_CREWMAN, JOB_WALKER, JOB_POLICE, JOB_CORPORATE_LIAISON, JOB_COMBAT_REPORTER, JOB_CHIEF_REQUISITION, JOB_CHIEF_ENGINEER, JOB_CMO, JOB_CHIEF_POLICE, JOB_SEA, JOB_SYNTH, JOB_WARDEN)
//Marine roles
-#define ROLES_OFFICERS list(JOB_CO, JOB_XO, JOB_SO, JOB_AUXILIARY_OFFICER, JOB_INTEL, JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_SEA, JOB_CORPORATE_LIAISON, JOB_COMBAT_REPORTER, JOB_SYNTH, JOB_CHIEF_POLICE, JOB_WARDEN, JOB_POLICE)
+#define ROLES_OFFICERS list(JOB_CO, JOB_XO, JOB_SO, JOB_AUXILIARY_OFFICER, JOB_INTEL, JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_CREWMAN, JOB_WALKER, JOB_SEA, JOB_CORPORATE_LIAISON, JOB_COMBAT_REPORTER, JOB_SYNTH, JOB_CHIEF_POLICE, JOB_WARDEN, JOB_POLICE)
var/global/list/ROLES_CIC = list(JOB_CO, JOB_XO, JOB_SO, JOB_WO_CO, JOB_WO_XO)
-var/global/list/ROLES_AUXIL_SUPPORT = list(JOB_AUXILIARY_OFFICER, JOB_INTEL, JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_WO_CHIEF_POLICE, JOB_WO_SO, JOB_WO_CREWMAN, JOB_WO_POLICE, JOB_WO_PILOT)
+var/global/list/ROLES_AUXIL_SUPPORT = list(JOB_AUXILIARY_OFFICER, JOB_INTEL, JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF, JOB_CREWMAN, JOB_WALKER, JOB_WO_CHIEF_POLICE, JOB_WO_SO, JOB_WO_CREWMAN, JOB_WO_POLICE, JOB_WO_PILOT)
var/global/list/ROLES_MISC = list(JOB_SYNTH, JOB_WORKING_JOE, JOB_SEA, JOB_CORPORATE_LIAISON, JOB_COMBAT_REPORTER, JOB_MESS_SERGEANT, JOB_WO_CORPORATE_LIAISON, JOB_WO_SYNTH)
var/global/list/ROLES_POLICE = list(JOB_CHIEF_POLICE, JOB_WARDEN, JOB_POLICE)
var/global/list/ROLES_ENGINEERING = list(JOB_CHIEF_ENGINEER, JOB_ORDNANCE_TECH, JOB_MAINT_TECH, JOB_WO_CHIEF_ENGINEER, JOB_WO_ORDNANCE_TECH)
@@ -125,7 +125,7 @@ var/global/list/ROLES_SQUAD_ALL = list(SQUAD_MARINE_1, SQUAD_MARINE_2, SQUAD_MAR
//Groundside roles
var/global/list/ROLES_XENO = list(JOB_XENOMORPH_QUEEN, JOB_XENOMORPH)
-var/global/list/ROLES_WHITELISTED = list(JOB_SYNTH_SURVIVOR, JOB_CO_SURVIVOR, JOB_PREDATOR)
+var/global/list/ROLES_WHITELISTED = list(JOB_SYNTH_SURVIVOR, JOB_CO_SURVIVOR, JOB_PREDATOR, JOB_WALKER)
var/global/list/ROLES_SPECIAL = list(JOB_SURVIVOR)
var/global/list/ROLES_USCM = ROLES_CIC + ROLES_POLICE + ROLES_AUXIL_SUPPORT + ROLES_MISC + ROLES_ENGINEERING + ROLES_REQUISITION + ROLES_MEDICAL + ROLES_MARINES - ROLES_WO
@@ -138,7 +138,7 @@ var/global/list/ROLES_FACTION_CLASH = ROLES_USCM + JOB_PREDATOR
var/global/list/ROLES_UNASSIGNED = list(JOB_SQUAD_MARINE)
var/global/list/ROLES_WO = list(JOB_WO_CO, JOB_WO_XO, JOB_WO_CORPORATE_LIAISON, JOB_WO_SYNTH, JOB_WO_CHIEF_POLICE, JOB_WO_SO, JOB_WO_CREWMAN, JOB_WO_POLICE, JOB_WO_PILOT, JOB_WO_CHIEF_ENGINEER, JOB_WO_ORDNANCE_TECH, JOB_WO_CHIEF_REQUISITION, JOB_WO_REQUISITION, JOB_WO_CMO, JOB_WO_DOCTOR, JOB_WO_RESEARCHER, JOB_WO_SQUAD_MARINE, JOB_WO_SQUAD_MEDIC, JOB_WO_SQUAD_ENGINEER, JOB_WO_SQUAD_SMARTGUNNER, JOB_WO_SQUAD_SPECIALIST, JOB_WO_SQUAD_LEADER)
//Role lists used for switch() checks in show_blurb_uscm(). Cosmetic, determines ex. "Engineering, USS Almayer", "2nd Bat. 'Falling Falcons'" etc.
-#define BLURB_USCM_COMBAT JOB_CO, JOB_XO, JOB_SO, JOB_WO_CO, JOB_WO_XO, JOB_WO_CHIEF_POLICE, JOB_WO_SO, JOB_WO_CREWMAN, JOB_WO_POLICE, JOB_SEA,\
+#define BLURB_USCM_COMBAT JOB_CO, JOB_XO, JOB_SO, JOB_WO_CO, JOB_WO_XO, JOB_CREWMAN, JOB_WALKER, JOB_WO_CHIEF_POLICE, JOB_WO_SO, JOB_WO_CREWMAN, JOB_WO_POLICE, JOB_SEA,\
JOB_SQUAD_LEADER, JOB_SQUAD_TEAM_LEADER, JOB_SQUAD_SPECIALIST, JOB_SQUAD_SMARTGUN, JOB_SQUAD_MEDIC, JOB_SQUAD_ENGI, JOB_SQUAD_MARINE
#define BLURB_USCM_FLIGHT JOB_PILOT, JOB_DROPSHIP_CREW_CHIEF
#define BLURB_USCM_MP JOB_CHIEF_POLICE, JOB_WARDEN, JOB_POLICE
diff --git a/code/__DEFINES/skills.dm b/code/__DEFINES/skills.dm
index fdd1a8f083ad..8a2ad0b4f7d5 100644
--- a/code/__DEFINES/skills.dm
+++ b/code/__DEFINES/skills.dm
@@ -51,12 +51,14 @@
#define SKILL_SPEC_GRENADIER 5
/// Can use heavy flamers
#define SKILL_SPEC_PYRO 6
+/// Can use Heavy-Shield and N45
+#define SKILL_SPEC_ST 7
/// Can use smartguns
-#define SKILL_SPEC_SMARTGUN 7
+#define SKILL_SPEC_SMARTGUN 8
/// UPP special training
-#define SKILL_SPEC_UPP 8
+#define SKILL_SPEC_UPP 9
/// Can use ALL specialist weapons
-#define SKILL_SPEC_ALL 9
+#define SKILL_SPEC_ALL 10
//construction skill
#define SKILL_CONSTRUCTION_DEFAULT 0
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index bc939fc2450b..793e7b6b2f35 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -177,6 +177,8 @@
#define TRAIT_USING_WHEELCHAIR "t_using_wheelchair"
/// If the mob will instantly go permadead upon death
#define TRAIT_HARDCORE "t_hardcore"
+/// If the mob is able to use the vulture rifle or spotting scope
+#define TRAIT_VULTURE_USER "t_vulture_user"
// -- ability traits --
/// Xenos with this trait cannot have plasma transfered to them
@@ -203,6 +205,9 @@
// GUN TRAITS
#define TRAIT_GUN_SILENCED "t_gun_silenced"
+
+#define TRAIT_GUN_BIPODDED "t_gun_bipodded"
+
#define TRAIT_GUN_LIGHT_DEACTIVATED "t_gun_light_deactivated"
// Miscellaneous item traits.
@@ -239,7 +244,8 @@ GLOBAL_LIST_INIT(mob_traits, list(
TRAIT_LEADERSHIP,
TRAIT_DEXTROUS,
TRAIT_REAGENT_SCANNER,
- TRAIT_ABILITY_BURROWED
+ TRAIT_ABILITY_BURROWED,
+ TRAIT_VULTURE_USER,
))
/*
@@ -271,6 +277,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_EMOTE_CD_EXEMPT" = TRAIT_EMOTE_CD_EXEMPT,
"TRAIT_LISPING" = TRAIT_LISPING,
"TRAIT_CANNOT_EAT" = TRAIT_CANNOT_EAT,
+ "TRAIT_VULTURE_USER" = TRAIT_VULTURE_USER,
),
/mob/living/carbon/xenomorph = list(
"TRAIT_ABILITY_NO_PLASMA_TRANSFER" = TRAIT_ABILITY_NO_PLASMA_TRANSFER,
@@ -299,6 +306,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
),
/obj/item/weapon/gun = list(
"TRAIT_GUN_SILENCED" = TRAIT_GUN_SILENCED,
+ "TRAIT_GUN_BIPODDED" = TRAIT_GUN_BIPODDED,
),
/obj/structure/surface/table = list(
"TRAIT_STRUCTURE_FLIPPING" = TRAIT_TABLE_FLIPPING,
diff --git a/code/__DEFINES/urls.dm b/code/__DEFINES/urls.dm
index 4d9268220f2b..ea032444b086 100644
--- a/code/__DEFINES/urls.dm
+++ b/code/__DEFINES/urls.dm
@@ -17,6 +17,7 @@
#define URL_WIKI_CONSTRUCTION "https://cm-ss13.com/wiki/Guide_to_construction"
#define URL_WIKI_ENGINEERING "https://cm-ss13.com/wiki/Guide_to_Engineering"
#define URL_WIKI_HACKING "https://cm-ss13.com/wiki/Guide_to_Engineering#Hacking"
+#define URL_WIKI_APC "https://cm-ss13.com/wiki/Guide_to_Engineering#APC_Maintenance"
#define URL_WIKI_SURGERY "https://cm-ss13.com/wiki/Surgery"
#define URL_WIKI_MEDICAL "https://cm-ss13.com/wiki/Guide_to_Medicine"
@@ -37,6 +38,7 @@
#define URL_WIKI_ASO_GUIDE "https://cm-ss13.com/wiki/Auxiliary_Support_Officer" // Auxiliary Support
#define URL_WIKI_PO_GUIDE "https://cm-ss13.com/wiki/Pilot_Officer"
#define URL_WIKI_DCC_GUIDE "https://cm-ss13.com/wiki/Dropship_Crew_Chief"
+#define URL_WIKI_VC_GUIDE "https://cm-ss13.com/wiki/Vehicle_Crewman"
#define URL_WIKI_IO_GUIDE "https://cm-ss13.com/wiki/Intelligence_Officer"
#define URL_WIKI_SYN_GUIDE "https://cm-ss13.com/wiki/Synthetic"
#define URL_WIKI_CE_GUIDE "https://cm-ss13.com/wiki/Chief_Engineer" // Engineering
diff --git a/code/__DEFINES/vehicle.dm b/code/__DEFINES/vehicle.dm
index 9c6685085788..ed9809968808 100644
--- a/code/__DEFINES/vehicle.dm
+++ b/code/__DEFINES/vehicle.dm
@@ -11,7 +11,9 @@
#define HDPT_LAYER_SUPPORT 2
#define HDPT_LAYER_ARMOR 3
#define HDPT_LAYER_TURRET 4
-#define HDPT_LAYER_MAX 4
+#define HDPT_LAYER_SECONDARY_GUN 5
+#define HDPT_LAYER_PRIMARY_GUN 6
+#define HDPT_LAYER_MAX 6
#define VEHICLE_DRIVER "driver"
#define VEHICLE_GUNNER "primary gunner"
diff --git a/code/__DEFINES/vendors.dm b/code/__DEFINES/vendors.dm
index 04ee5ffef2b6..95eec1bf8405 100644
--- a/code/__DEFINES/vendors.dm
+++ b/code/__DEFINES/vendors.dm
@@ -34,6 +34,10 @@
#define VEHICLE_ALL_AVAILABLE (VEHICLE_INTEGRAL_AVAILABLE|VEHICLE_PRIMARY_AVAILABLE|VEHICLE_SECONDARY_AVAILABLE|VEHICLE_SUPPORT_AVAILABLE|VEHICLE_ARMOR_AVAILABLE|VEHICLE_TREADS_AVAILABLE)
+#define MECH_GUN "mech_gun"
+#define MECH_ALL_AVAIBALE list(MECH_GUN = 2)
+
+
#define VENDOR_THEME_COMPANY 0
#define VENDOR_THEME_USCM 1
#define VENDOR_THEME_CLF 2
diff --git a/code/__DEFINES/weapon_stats.dm b/code/__DEFINES/weapon_stats.dm
index 590223426a66..beac54d98892 100644
--- a/code/__DEFINES/weapon_stats.dm
+++ b/code/__DEFINES/weapon_stats.dm
@@ -136,6 +136,7 @@ As such, don't expect any values assigned to common firearms to even consider ho
//How many ticks you have to wait between firing. Burst delay uses the same variable!
*/
+#define FIRE_DELAY_TIER_VULTURE 20
#define FIRE_DELAY_TIER_1 12
#define FIRE_DELAY_TIER_2 10
#define FIRE_DELAY_TIER_3 9
diff --git a/code/__HELPERS/job.dm b/code/__HELPERS/job.dm
index 43902b07cfd9..9e9d70ae2aa6 100644
--- a/code/__HELPERS/job.dm
+++ b/code/__HELPERS/job.dm
@@ -62,6 +62,8 @@
JOB_INTEL,
JOB_PILOT,
JOB_DROPSHIP_CREW_CHIEF,
+ JOB_CREWMAN,
+ JOB_WALKER,
JOB_CORPORATE_LIAISON,
JOB_COMBAT_REPORTER,
JOB_CHIEF_ENGINEER,
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index d4d9eb320633..527a7c1aac88 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -27,13 +27,13 @@
//Removes a few problematic characters
/proc/sanitize_simple(text, list/repl_chars = list("\n"=" ","\t"=" ","�"=" "))
for(var/char in repl_chars)
- text = replacetext(text, char, repl_chars[char])
+ text = replacetext_char(text, char, repl_chars[char])
return text
/proc/readd_quotes(text)
var/list/repl_chars = list(""" = "\"", "'" = "'")
for(var/char in repl_chars)
- text = replacetext(text, char, repl_chars[char])
+ text = replacetext_char(text, char, repl_chars[char])
return text
//Runs byond's sanitization proc along-side sanitize_simple
@@ -54,12 +54,12 @@
//Runs sanitize and strip_html_simple
//I believe strip_html_simple() is required to run first to prevent '<' from displaying as '<' after sanitize() calls byond's html_encode()
/proc/strip_html(text, limit=MAX_MESSAGE_LEN)
- return copytext((sanitize(strip_html_simple(text))), 1, limit)
+ return copytext_char((sanitize(strip_html_simple(text))), 1, limit)
//Runs byond's sanitization proc along-side strip_html_simple
//I believe strip_html_simple() is required to run first to prevent '<' from displaying as '<' that html_encode() would cause
/proc/adminscrub(text, limit=MAX_MESSAGE_LEN)
- return copytext((html_encode(strip_html_simple(text))), 1, limit)
+ return copytext_char((html_encode(strip_html_simple(text))), 1, limit)
//Returns null if there is any bad text in the string
/proc/reject_bad_text(text, max_length=512)
@@ -202,7 +202,7 @@
//Returns a string with the first element of the string capitalized.
/proc/capitalize(t as text)
- return uppertext(copytext(t, 1, 2)) + copytext(t, 2)
+ return uppertext(copytext_char(t, 1, 2)) + copytext_char(t, 2)
/proc/stringpercent(text,character = "*")
//This proc returns the number of chars of the string that is the character
@@ -234,7 +234,7 @@
return "[copytext(string, 1, len - 3)]..."
/proc/strip_improper(input_text)
- return replacetext(replacetext(input_text, "\proper", ""), "\improper", "")
+ return replacetext_char(replacetext_char(input_text, "\proper", ""), "\improper", "")
// Used to remove the string shortcuts for a clean transfer
/proc/sanitize_filename(t)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 575071b76833..9a6ee4362088 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -2066,3 +2066,30 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list(
if(stop_type && istype(turf_to_check, stop_type))
break
return turf_to_check
+
+/// Given a direction, return the direction and the +-45 degree directions next to it
+/proc/get_related_directions(direction = NORTH)
+ switch(direction)
+ if(NORTH)
+ return list(NORTH, NORTHEAST, NORTHWEST)
+
+ if(EAST)
+ return list(EAST, NORTHEAST, SOUTHEAST)
+
+ if(SOUTH)
+ return list(SOUTH, SOUTHEAST, SOUTHWEST)
+
+ if(WEST)
+ return list(WEST, NORTHWEST, SOUTHWEST)
+
+ if(NORTHEAST)
+ return list(NORTHEAST, NORTH, EAST)
+
+ if(SOUTHEAST)
+ return list(SOUTHEAST, EAST, SOUTH)
+
+ if(SOUTHWEST)
+ return list(SOUTHWEST, SOUTH, WEST)
+
+ if(NORTHWEST)
+ return list(NORTHWEST, NORTH, WEST)
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index a497f4d01dfb..53dd40ff6035 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -249,6 +249,7 @@ DEFINE_BITFIELD(valid_equip_slots, list(
"SLOT_LEGS" = SLOT_LEGS,
"SLOT_ACCESSORY" = SLOT_ACCESSORY,
"SLOT_SUIT_STORE" = SLOT_SUIT_STORE,
+ "SLOT_BLOCK_SUIT_STORE" = SLOT_BLOCK_SUIT_STORE,
))
DEFINE_BITFIELD(flags_alarm_state, list(
diff --git a/code/_globalvars/global_lists.dm b/code/_globalvars/global_lists.dm
index 36058a44fc37..a5766fadd8e1 100644
--- a/code/_globalvars/global_lists.dm
+++ b/code/_globalvars/global_lists.dm
@@ -94,7 +94,8 @@ GLOBAL_LIST_INIT(resin_build_order_ovipositor, list(
/datum/resin_construction/resin_obj/acid_pillar,
/datum/resin_construction/resin_obj/sticky_resin,
/datum/resin_construction/resin_obj/fast_resin,
- /datum/resin_construction/resin_obj/resin_spike
+ /datum/resin_construction/resin_obj/resin_spike,
+ /datum/resin_construction/resin_obj/sunken_colony
))
//Xeno Leader Mark Meanings
@@ -478,7 +479,8 @@ var/global/list/available_specialist_sets = list(
"Sniper Set",
"Demolitionist Set",
"Heavy Grenadier Set",
- "Pyro Set"
+ "Pyro Set",
+ "Stormtrooper Set"
)
//Similar thing, but used in /obj/item/spec_kit
@@ -488,6 +490,7 @@ var/global/list/available_specialist_kit_boxes = list(
"Sniper" = 2,
"Scout" = 2,
"Demo" = 2,
+ "ST" = 2
)
/proc/init_global_referenced_datums()
diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm
index ff271b889e6c..fec62c35317f 100644
--- a/code/_onclick/hud/fullscreen.dm
+++ b/code/_onclick/hud/fullscreen.dm
@@ -72,9 +72,11 @@
var/severity = 0
var/fs_view = 7
var/show_when_dead = FALSE
+ /// If this should try and resize if the user's view is bigger than the default
+ var/should_resize = TRUE
/atom/movable/screen/fullscreen/proc/update_for_view(client_view)
- if (screen_loc == "CENTER-7,CENTER-7" && fs_view != client_view)
+ if (screen_loc == "CENTER-7,CENTER-7" && fs_view != client_view && should_resize)
var/list/actualview = getviewsize(client_view)
fs_view = client_view
transform = matrix(actualview[1]/FULLSCREEN_OVERLAY_RESOLUTION_X, 0, 0, 0, actualview[2]/FULLSCREEN_OVERLAY_RESOLUTION_Y, 0)
@@ -169,6 +171,14 @@
/atom/movable/screen/fullscreen/laser_blind
icon_state = "impairedoverlay1"
+/atom/movable/screen/fullscreen/vulture
+ icon_state = "vulture_scope_overlay_sniper"
+ layer = FULLSCREEN_VULTURE_SCOPE_LAYER
+
+/atom/movable/screen/fullscreen/vulture/spotter
+ icon_state = "vulture_scope_overlay_spotter"
+ should_resize = FALSE
+
//Weather overlays//
/atom/movable/screen/fullscreen/weather
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 9643d0f652ae..206b1dbf9979 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -639,3 +639,7 @@
/atom/movable/screen/rotate/alt
dir = WEST
rotate_amount = -90
+
+/atom/movable/screen/vulture_scope // The part of the vulture's scope that drifts over time
+ icon_state = "vulture_unsteady"
+ screen_loc = "CENTER,CENTER"
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 0e23b99a9cc2..c6b2f38e9143 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -255,7 +255,7 @@ SUBSYSTEM_DEF(ticker)
save_mode(CONFIG_GET(string/gamemode_default))
if(round_statistics)
- to_chat_spaced(world, html = FONT_SIZE_BIG(SPAN_ROLE_BODY("Welcome to [round_statistics.round_name]")))
+ to_chat_spaced(world, html = FONT_SIZE_BIG(SPAN_ROLE_BODY("Добро пожаловать на [round_statistics.round_name]")))
supply_controller.process() //Start the supply shuttle regenerating points -- TLE
@@ -361,10 +361,10 @@ SUBSYSTEM_DEF(ticker)
var/skip_delay = check_rights()
if(delay_end && !skip_delay)
- to_chat(world, SPAN_BOLDNOTICE("An admin has delayed the round end."))
+ to_chat(world, SPAN_BOLDNOTICE("Администратор отложил конец раунда."))
return
- to_chat(world, SPAN_BOLDNOTICE("Rebooting World in [DisplayTimeText(delay)]. [reason]"))
+ to_chat(world, SPAN_BOLDNOTICE("Перезагрузка мира через [DisplayTimeText(delay)]. [reason]"))
var/start_wait = world.time
sleep(delay - (world.time - start_wait))
@@ -373,7 +373,7 @@ SUBSYSTEM_DEF(ticker)
to_chat(world, SPAN_BOLDNOTICE("Reboot was cancelled by an admin."))
return
- log_game("Rebooting World. [reason]")
+ log_game("АГАСЬ. [reason]")
to_chat_forced(world, "
[SPAN_BOLDNOTICE("Rebooting...")]
")
world.Reboot(TRUE)
diff --git a/code/datums/browser.dm b/code/datums/browser.dm
index 3b694e8f44bb..7af9c2cb9f03 100644
--- a/code/datums/browser.dm
+++ b/code/datums/browser.dm
@@ -84,7 +84,7 @@
return {"
-
+
[head_content]
diff --git a/code/datums/elements/bullet_trait/penetrating/heavy.dm b/code/datums/elements/bullet_trait/penetrating/heavy.dm
new file mode 100644
index 000000000000..13086d01b212
--- /dev/null
+++ b/code/datums/elements/bullet_trait/penetrating/heavy.dm
@@ -0,0 +1,47 @@
+/datum/element/bullet_trait_penetrating/heavy
+ // Generic bullet trait vars
+ element_flags = ELEMENT_DETACH|ELEMENT_BESPOKE
+ id_arg_index = 3
+
+ /// For every turf this pierces, how much damage should this lose?
+ var/damage_lost_per_pen = 100
+ /// Typecache of things to annihilate if the bullet is on a tile with it
+ var/static/list/bullet_destroy_structures = typecacheof(list(
+ /obj/structure/surface,
+ /obj/structure/barricade,
+ ))
+
+/datum/element/bullet_trait_penetrating/heavy/Attach(datum/target, distance_loss_per_hit = 3, damage_lost_per_pen = 75)
+ . = ..()
+ if(. == ELEMENT_INCOMPATIBLE)
+ return
+
+ src.damage_lost_per_pen = damage_lost_per_pen
+
+/datum/element/bullet_trait_penetrating/heavy/handle_passthrough_movables(obj/item/projectile/bullet, atom/movable/hit_movable, did_hit)
+ if(did_hit)
+ var/slow_mult = 1
+ if(ismob(hit_movable))
+ var/mob/mob = hit_movable
+ if(mob.mob_size >= MOB_SIZE_BIG)
+ slow_mult = 2
+
+ bullet.distance_travelled += (distance_loss_per_hit * slow_mult)
+
+ if(is_type_in_typecache(hit_movable, bullet_destroy_structures))
+ var/obj/structure/cade = hit_movable
+ cade.deconstruct() // This bullet just tears through whatever cades you put it up against from either side
+ bullet.damage -= damage_lost_per_pen
+
+ return COMPONENT_BULLET_PASS_THROUGH
+
+/datum/element/bullet_trait_penetrating/heavy/handle_passthrough_turf(obj/item/projectile/bullet, turf/closed/wall/hit_wall)
+ bullet.distance_travelled += distance_loss_per_hit
+ bullet.damage -= damage_lost_per_pen
+
+ if(!istype(hit_wall))
+ return COMPONENT_BULLET_PASS_THROUGH
+
+ if(!hit_wall.hull)
+ return COMPONENT_BULLET_PASS_THROUGH
+
diff --git a/code/datums/elements/bullet_trait/penetrating.dm b/code/datums/elements/bullet_trait/penetrating/penetrating.dm
similarity index 100%
rename from code/datums/elements/bullet_trait/penetrating.dm
rename to code/datums/elements/bullet_trait/penetrating/penetrating.dm
diff --git a/code/datums/emergency_calls/big_game_hunter.dm b/code/datums/emergency_calls/big_game_hunter.dm
index e749b6654355..d5f88057f2c2 100644
--- a/code/datums/emergency_calls/big_game_hunter.dm
+++ b/code/datums/emergency_calls/big_game_hunter.dm
@@ -10,7 +10,7 @@
/datum/emergency_call/van_bandolier/New()
. = ..()
- arrival_message = "'Heard your distress call, [MAIN_SHIP_NAME]. It had best be something which will look good on my wall, eh? Tally ho!'"
+ arrival_message = "'Слышу ваш сигнал бедствия, [MAIN_SHIP_NAME]. Лучше там быть чему-то что я смогу повесить себе на стеночку, агась? Талли хо!'"
/datum/emergency_call/van_bandolier/create_member(datum/mind/M, turf/override_spawn_loc)
var/turf/spawn_loc = override_spawn_loc ? override_spawn_loc : get_spawn_point()
diff --git a/code/datums/emergency_calls/cmb.dm b/code/datums/emergency_calls/cmb.dm
index 52da1c967a00..296201551abf 100644
--- a/code/datums/emergency_calls/cmb.dm
+++ b/code/datums/emergency_calls/cmb.dm
@@ -16,7 +16,7 @@
/datum/emergency_call/cmb/New()
..()
- arrival_message = "Incoming Transmission: [MAIN_SHIP_NAME], this is Anchorpoint Station with the Colonial Marshal Bureau. We are receiving your distress signal and are dispatching a nearby team to board with you now. Standby."
+ arrival_message = "Входящая передача: [MAIN_SHIP_NAME], это станция Anchorpoint с Бюро Колониальных Маршалов. Мы принимаем ваш сигнал бедствия и отправляем ближайшую команду к вам. Ожидайте."
objectives = "Investigate the distress signal aboard the [MAIN_SHIP_NAME], and assist the crew with rescue if possible. If necessary, a contingent of our Colonial Marines may be ready to act as a QRF to reinforce you."
will_spawn_icc_liaison = prob(50)
diff --git a/code/datums/emergency_calls/contractor.dm b/code/datums/emergency_calls/contractor.dm
index a5d6c2d7e80f..a750d96510a7 100644
--- a/code/datums/emergency_calls/contractor.dm
+++ b/code/datums/emergency_calls/contractor.dm
@@ -12,7 +12,7 @@
/datum/emergency_call/contractors/New()
..()
- arrival_message = "[MAIN_SHIP_NAME], this is USCSS Inheritor with Vanguard's Arrow Incorporated, Primary Operations; we are responding to your distress call and boarding in accordance with the Military Aid Act of 2177, authenticication code Lima-18153. "
+ arrival_message = "[MAIN_SHIP_NAME], это USCSS Inheritor с Vanguard's Arrow Incorporated, Primary Operations на борту; мы принимаем ваш сигнал бедствия и совершим посадку согласно закону о военной помощи от 2177го, код авторизации Lima-18153. "
objectives = "Ensure the survival of the [MAIN_SHIP_NAME], eliminate any hostiles, and assist the crew in any way possible."
diff --git a/code/datums/emergency_calls/deathsquad.dm b/code/datums/emergency_calls/deathsquad.dm
index 0bfab8fbf2b7..9b615806989f 100644
--- a/code/datums/emergency_calls/deathsquad.dm
+++ b/code/datums/emergency_calls/deathsquad.dm
@@ -6,7 +6,7 @@
name = "Weyland Whiteout Operators"
mob_max = 8
mob_min = 5
- arrival_message = "'!`2*%slau#*jer t*h$em a!l%. le&*ve n(o^ w&*nes%6es.*v$e %#d ou^'"
+ arrival_message = "'!`2*%еб#*зите и*h$хm в!сl%х. Н& о*vтаeв(oт^е с&*ви%лей.*v$e %#d на^'"
objectives = "Whiteout protocol is in effect for the target. Ensure there are no traces of the infestation or any witnesses."
probability = 0
shuttle_id = "Distress_PMC"
diff --git a/code/datums/emergency_calls/dutch.dm b/code/datums/emergency_calls/dutch.dm
index 32620fa43014..b89dd944803f 100644
--- a/code/datums/emergency_calls/dutch.dm
+++ b/code/datums/emergency_calls/dutch.dm
@@ -9,7 +9,7 @@
max_heavies = 1
max_medics = 1
- arrival_message = "'We're here to kick ass and kill Yautja. Mainly kill Yautja."
+ arrival_message = "'Мы здесь надрать задниц и перебить Яутж. В основном наебашить Яутж."
objectives = "Hunt down and kill all Yautja without mercy. Retrieve the gear and leave."
probability = 0
diff --git a/code/datums/emergency_calls/emergency_call.dm b/code/datums/emergency_calls/emergency_call.dm
index 6d41c2d64d0b..f4ec23409d10 100644
--- a/code/datums/emergency_calls/emergency_call.dm
+++ b/code/datums/emergency_calls/emergency_call.dm
@@ -12,7 +12,7 @@
/datum/game_mode/proc/ares_online()
var/name = "ARES Online"
- var/input = "ARES. Online. Good morning, marines."
+ var/input = "ARES. Онлайн. Доброе утро, солдаты."
shipwide_ai_announcement(input, name, 'sound/AI/ares_online.ogg')
/datum/game_mode/proc/request_ert(user, ares = FALSE)
@@ -26,7 +26,7 @@
var/name = "name"
var/mob_max = 3
var/mob_min = 3
- var/dispatch_message = "An encrypted signal has been received from a nearby vessel. Stand by." //Msg to display when starting
+ var/dispatch_message = "Зашифрованный сигнал перехвачен с ближайшего судна. Ожидайте." //Msg to display when starting
var/arrival_message = "" //Msg to display about when the shuttle arrives
var/objectives //Txt of objectives to display to joined. Todo: make this into objective notes
var/objective_info //For additional info in the objectives txt
@@ -204,7 +204,7 @@
message_admins("Distress beacon: '[name]' activated [src.hostility? "[SPAN_WARNING("(THEY ARE HOSTILE)")]":"(they are friendly)"]. Looking for candidates.")
if(announce)
- marine_announcement("A distress beacon has been launched from the [MAIN_SHIP_NAME].", "Priority Alert", 'sound/AI/distressbeacon.ogg', logging = ARES_LOG_SECURITY)
+ marine_announcement("Активирован сигнал бедствия на борту [MAIN_SHIP_NAME].", "Приоритетное оповещение", 'sound/AI/distressbeacon.ogg', logging = ARES_LOG_SECURITY)
addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/emergency_call, spawn_candidates), announce, override_spawn_loc, announce_dispatch_message), 30 SECONDS)
@@ -220,7 +220,7 @@
candidates = list()
if(announce)
- marine_announcement("The distress signal has not received a response, the launch tubes are now recalibrating.", "Distress Beacon", logging = ARES_LOG_SECURITY)
+ marine_announcement("Сигнал бедствия не получил ответа, перекалибровка пусковых труб.", "Сигнал бедствия", logging = ARES_LOG_SECURITY)
return
//We've got enough!
@@ -250,7 +250,7 @@
to_chat(I.current, SPAN_WARNING("You didn't get selected to join the distress team. Better luck next time!"))
if(announce)
- marine_announcement(dispatch_message, "Distress Beacon", 'sound/AI/distressreceived.ogg', logging = ARES_LOG_SECURITY) //Announcement that the Distress Beacon has been answered, does not hint towards the chosen ERT
+ marine_announcement(dispatch_message, "Сигнал бедствия", 'sound/AI/distressreceived.ogg', logging = ARES_LOG_SECURITY) //Announcement that the Distress Beacon has been answered, does not hint towards the chosen ERT
message_admins("Distress beacon: [src.name] finalized, setting up candidates.")
@@ -306,7 +306,7 @@
candidates = list()
if(arrival_message && announce)
- marine_announcement(arrival_message, "Intercepted Tranmission:")
+ marine_announcement(arrival_message, "Перехваченная Передача:")
/datum/emergency_call/proc/add_candidate(mob/M)
if(!M.client || (M.mind && (M.mind in candidates)) || istype(M, /mob/living/carbon/xenomorph))
diff --git a/code/datums/emergency_calls/feral_xenos.dm b/code/datums/emergency_calls/feral_xenos.dm
index 5d9f14a4680c..f07c12143308 100644
--- a/code/datums/emergency_calls/feral_xenos.dm
+++ b/code/datums/emergency_calls/feral_xenos.dm
@@ -12,7 +12,7 @@
/datum/emergency_call/feral_xenos/New()
..()
- arrival_message = "[MAIN_SHIP_NAME], this is USS Vriess respond-- #&...*#&^#.. signal... oh god, they're in the vent---... Priority Warning: Signal lost."
+ arrival_message = "[MAIN_SHIP_NAME], это USS Vriess на связ-- #&...*#&^#.. сигнал... БЛЯТЬ, они в вентиля---... Приоритетное Предупреждение: Сигнал потерян."
objectives = "Destroy everything!"
/datum/emergency_call/feral_xenos/spawn_items()
diff --git a/code/datums/emergency_calls/goons.dm b/code/datums/emergency_calls/goons.dm
index 8a0b00968807..89875a30258a 100644
--- a/code/datums/emergency_calls/goons.dm
+++ b/code/datums/emergency_calls/goons.dm
@@ -5,7 +5,7 @@
/datum/emergency_call/goon/New()
..()
- arrival_message = "[MAIN_SHIP_NAME], this is a Weyland-Yutani Corporate Security shuttle inbound to your distress beacon. We are coming to help."
+ arrival_message = "[MAIN_SHIP_NAME], это шаттл Корпоративной Безопасности Weyland-Yutani направляющийся на ваш сигнал бедствия. Мы летим с помощью."
objectives = "Secure the Corporate Liaison and the [MAIN_SHIP_NAME]'s Commanding Officer, and eliminate any hostile threats. Do not damage Wey-Yu property."
/datum/emergency_call/goon/create_member(datum/mind/M, turf/override_spawn_loc)
diff --git a/code/datums/emergency_calls/hefa_knight.dm b/code/datums/emergency_calls/hefa_knight.dm
index 2af2f99f443e..46671834d91c 100644
--- a/code/datums/emergency_calls/hefa_knight.dm
+++ b/code/datums/emergency_calls/hefa_knight.dm
@@ -3,7 +3,7 @@
name = "HEFA knights"
mob_max = 15
mob_min = 3
- arrival_message = "'Prepaerth to surrender thine HEFAs unto the order!'"
+ arrival_message = "'Падгатовьтись сдаца HEFAs па приказю!'"
objectives = "You are a Brother of the Order of HEFA! You and your fellow brothers must retrieve as many HEFAs as possible!"
probability = 0
hostility = TRUE
diff --git a/code/datums/emergency_calls/mercs.dm b/code/datums/emergency_calls/mercs.dm
index 40210c845c6f..80643e7bfef0 100644
--- a/code/datums/emergency_calls/mercs.dm
+++ b/code/datums/emergency_calls/mercs.dm
@@ -11,7 +11,7 @@
/datum/emergency_call/mercs/New()
. = ..()
hostility = pick(75;FALSE,25;TRUE)
- arrival_message = "[MAIN_SHIP_NAME], this is Freelancer shuttle [pick(alphabet_lowercase)][pick(alphabet_lowercase)]-[rand(1, 99)] responding to your distress call. Prepare for boarding."
+ arrival_message = "[MAIN_SHIP_NAME], это частный шаттл [pick(alphabet_lowercase)][pick(alphabet_lowercase)]-[rand(1, 99)] отвечает на ваш сигнал бедствия. Подготовьтесь к посадке."
if(hostility)
objectives = "Ransack the [MAIN_SHIP_NAME] and kill anyone who gets in your way. Do what your Captain says. Ensure your survival at all costs."
else
@@ -25,7 +25,7 @@
/datum/emergency_call/mercs/friendly/New()
. = ..()
hostility = FALSE
- arrival_message = "[MAIN_SHIP_NAME], this is Freelancer shuttle [pick(alphabet_lowercase)][pick(alphabet_lowercase)]-[rand(1, 99)] responding to your distress call. Prepare for boarding."
+ arrival_message = "[MAIN_SHIP_NAME], это частный шаттл [pick(alphabet_lowercase)][pick(alphabet_lowercase)]-[rand(1, 99)] отвечает на ваш сигнал бедствия. Подготовьтесь к посадке."
objectives = "Help the crew of the [MAIN_SHIP_NAME] in exchange for payment, and choose your payment well. Do what your Captain says. Ensure your survival at all costs."
/datum/emergency_call/mercs/hostile //ditto
@@ -36,7 +36,7 @@
/datum/emergency_call/mercs/hostile/New()
. = ..()
hostility = TRUE
- arrival_message = "[MAIN_SHIP_NAME], this is Freelancer shuttle [pick(alphabet_lowercase)][pick(alphabet_lowercase)]-[rand(1, 99)] responding to your distress call. Prepare for boarding."
+ arrival_message = "[MAIN_SHIP_NAME], это частный шаттл [pick(alphabet_lowercase)][pick(alphabet_lowercase)]-[rand(1, 99)] отвечает на ваш сигнал бедствия. Подготовьтесь к посадке."
objectives = "Ransack the [MAIN_SHIP_NAME] and kill anyone who gets in your way. Do what your Captain says. Ensure your survival at all costs."
/datum/emergency_call/mercs/print_backstory(mob/living/carbon/human/H)
@@ -96,7 +96,7 @@
/datum/emergency_call/heavy_mercs/New()
. = ..()
hostility = pick(75;FALSE,25;TRUE)
- arrival_message = "[MAIN_SHIP_NAME], this is Elite Freelancer shuttle [pick(alphabet_lowercase)][pick(alphabet_lowercase)]-[rand(1, 99)] responding to your distress call. Prepare for boarding."
+ arrival_message = "[MAIN_SHIP_NAME], это элитный частный шаттл [pick(alphabet_lowercase)][pick(alphabet_lowercase)]-[rand(1, 99)] отвечает на ваш сигнал бедствия. Подготовьтесь к посадке."
if(hostility)
objectives = "Ransack the [MAIN_SHIP_NAME] and kill anyone who gets in your way. Do what your Captain says. Ensure your survival at all costs."
else
@@ -108,7 +108,7 @@
/datum/emergency_call/heavy_mercs/hostile/New()
. = ..()
hostility = TRUE
- arrival_message = "[MAIN_SHIP_NAME], this is Elite Freelancer shuttle [pick(alphabet_lowercase)][pick(alphabet_lowercase)]-[rand(1, 99)] responding to your distress call. Prepare for boarding."
+ arrival_message = "[MAIN_SHIP_NAME], это элитный частный шаттл [pick(alphabet_lowercase)][pick(alphabet_lowercase)]-[rand(1, 99)] отвечает на ваш сигнал бедствия. Подготовьтесь к посадке."
objectives = "Ransack the [MAIN_SHIP_NAME] and kill anyone who gets in your way. Do what your Captain says. Ensure your survival at all costs."
/datum/emergency_call/heavy_mercs/friendly
@@ -117,7 +117,7 @@
/datum/emergency_call/heavy_mercs/friendly/New()
. = ..()
hostility = FALSE
- arrival_message = "[MAIN_SHIP_NAME], this is Elite Freelancer shuttle [pick(alphabet_lowercase)][pick(alphabet_lowercase)]-[rand(1, 99)] responding to your distress call. Prepare for boarding."
+ arrival_message = "[MAIN_SHIP_NAME], это элитный частный шаттл [pick(alphabet_lowercase)][pick(alphabet_lowercase)]-[rand(1, 99)] отвечает на ваш сигнал бедствия. Подготовьтесь к посадке."
objectives = "Help the crew of the [MAIN_SHIP_NAME] in exchange for payment, and choose your payment well. Do what your Captain says. Ensure your survival at all costs."
/datum/emergency_call/heavy_mercs/print_backstory(mob/living/carbon/human/H)
diff --git a/code/datums/emergency_calls/pirates.dm b/code/datums/emergency_calls/pirates.dm
index 7a9d333de970..4d51423f4079 100644
--- a/code/datums/emergency_calls/pirates.dm
+++ b/code/datums/emergency_calls/pirates.dm
@@ -4,7 +4,7 @@
name = "Fun - Pirates"
mob_max = 35
mob_min = 10
- arrival_message = "'What shall we do with a drunken sailor? What shall we do with a drunken sailor? What shall we do with a drunken sailor early in the morning?'"
+ arrival_message = "'Чтоо-о-о мы делаем с пьяным моряк-о-о-м? Что делаем с пьяным моряк-о-о-о-м? Что мы делаем с пьяным моряком с утра пораньше?'"
objectives = "Pirate! Loot! Ransom!"
probability = 0
hostility = TRUE
diff --git a/code/datums/emergency_calls/pizza.dm b/code/datums/emergency_calls/pizza.dm
index a35ce584c68d..35348cab8c46 100644
--- a/code/datums/emergency_calls/pizza.dm
+++ b/code/datums/emergency_calls/pizza.dm
@@ -4,7 +4,7 @@
name = "Pizza Delivery"
mob_max = 1
mob_min = 1
- arrival_message = "'That'll be... sixteen orders of cheesy fries, eight large double topping pizzas, nine bottles of Four Loko... hello? Is anyone on this ship? Your pizzas are getting cold.'"
+ arrival_message = "'Тогда... шестнадцать порций картошки с сыром, восемь больших пицц с двойной начинкой, девять бутылок Four Loko... эм? Есть кто-нибудь на корабле? Ваши пиццы остывают.'"
objectives = "Make sure you get a tip!"
shuttle_id = "Distress_Small"
name_of_spawn = /obj/effect/landmark/ert_spawns/distress_pizza
diff --git a/code/datums/emergency_calls/pmc.dm b/code/datums/emergency_calls/pmc.dm
index a06b0cc0c02e..7c524111d08e 100644
--- a/code/datums/emergency_calls/pmc.dm
+++ b/code/datums/emergency_calls/pmc.dm
@@ -17,7 +17,7 @@
/datum/emergency_call/pmc/New()
..()
- arrival_message = "[MAIN_SHIP_NAME], this is USCSS Royce responding to your distress call. We are boarding. Any hostile actions will be met with lethal force."
+ arrival_message = "[MAIN_SHIP_NAME], на ваш сигнал бедствия отвечает USCSS Royce. Мы садимся. Любые агрессивные действия будут встречены применением летальной силы."
objectives = "Secure the Corporate Liaison and the [MAIN_SHIP_NAME]'s Commanding Officer, and eliminate any hostile threats. Do not damage Wey-Yu property."
@@ -99,7 +99,7 @@
/datum/emergency_call/pmc/chem_retrieval/New()
..()
- dispatch_message = "[MAIN_SHIP_NAME], this is USCSS Royce. We are sending a second squad aboard to retrieve all samples of a chemical recently scanned from your research department. If you do not cooperate, the team is authorized to use lethal force and terminate the research department."
+ dispatch_message = "[MAIN_SHIP_NAME], это USCSS Royce. Мы отправляем второй отряд на борт для сбора всех экземпляров химикатов которые были просканированы в вашем научном отделе. Если вы не будете сотрудничать, команде разрешено применить силу и устранить научный персонал."
objectives = "Secure all documents, samples and chemicals containing the property DNA_Disintegrating from [MAIN_SHIP_NAME] research department."
/datum/emergency_call/pmc/chem_retrieval/proc/check_objective_info()
diff --git a/code/datums/emergency_calls/supplies.dm b/code/datums/emergency_calls/supplies.dm
index e562680eca4c..b382528352e6 100644
--- a/code/datums/emergency_calls/supplies.dm
+++ b/code/datums/emergency_calls/supplies.dm
@@ -5,7 +5,7 @@
name = "Supply Drop"
mob_max = 0
mob_min = 0
- arrival_message = "Weyland-Yutani Automated Supply Drop 334-Q signal received. Docking procedures have commenced."
+ arrival_message = "Автоматический Сброс Припасов Weyland-Yutani по сигналу Drop 334-Q. Процедуры стыковки активированы."
probability = 0
auto_shuttle_launch = TRUE
diff --git a/code/datums/emergency_calls/upp.dm b/code/datums/emergency_calls/upp.dm
index 04bcfecf9128..1f21a6ded866 100644
--- a/code/datums/emergency_calls/upp.dm
+++ b/code/datums/emergency_calls/upp.dm
@@ -20,7 +20,7 @@
/datum/emergency_call/upp/New()
..()
- arrival_message = "T*is i* UP* d^sp^*ch`. STr*&e teaM, #*u are cLe*% for a*pr*%^h. Pr*mE a*l wE*p^ns )0r c|*$e @u*r*r$ c0m&*t."
+ arrival_message = "Э*т* УП* в^sа^*ка`. КоМ*&а зачистки, #*u вы г*%вы к п*ос*%^е. По*тE в*е оР*ж^е )0r и|*$e @а*й*с$ c0н&*о."
objectives = "Eliminate the UA Forces to ensure the UPP prescence in this sector is continued. Listen to your superior officers and take over the [MAIN_SHIP_NAME] at all costs."
diff --git a/code/datums/emergency_calls/xenos.dm b/code/datums/emergency_calls/xenos.dm
index 5245954e1b0e..8c8245b8b368 100644
--- a/code/datums/emergency_calls/xenos.dm
+++ b/code/datums/emergency_calls/xenos.dm
@@ -9,7 +9,7 @@
/datum/emergency_call/xenos/New()
..()
- arrival_message = "[MAIN_SHIP_NAME], this is USS Vriess respond-- #&...*#&^#.. signal... oh god, they're in the vent---... Priority Warning: Signal lost."
+ arrival_message = "[MAIN_SHIP_NAME], это USS Vriess отвечает-- #&...*#&^#.. сигнал... Боже, они в вентиляции---... Приоритетное Оповещение: Сигнал потерян."
objectives = "For the Empress!"
diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm
index b691d87a2169..6c0c4a100e44 100644
--- a/code/datums/emotes.dm
+++ b/code/datums/emotes.dm
@@ -94,7 +94,7 @@
var/tmp_sound = get_sound(user)
if(TIMER_COOLDOWN_CHECK(user, type))
- to_chat(user, SPAN_NOTICE("You just did an emote. Wait awhile."))
+ to_chat(user, SPAN_NOTICE("По-моему я слишком эмоционален."))
return
else if(tmp_sound && should_play_sound(user, intentional))
if(TIMER_COOLDOWN_CHECK(user, COOLDOWN_MOB_AUDIO))
diff --git a/code/datums/entities/player_note.dm b/code/datums/entities/player_note.dm
index 420bb5f0a470..216e20b40701 100644
--- a/code/datums/entities/player_note.dm
+++ b/code/datums/entities/player_note.dm
@@ -94,4 +94,4 @@ BSQL_PROTECT_DATUM(/datum/entity/player_note)
/// Returns all notes associated with a CKEY, structured as a list of strings.
/proc/get_all_notes(player_ckey)
for(var/datum/view_record/note_view/note in DB_VIEW(/datum/view_record/note_view, DB_COMP("player_ckey", DB_EQUALS, player_ckey)))
- LAZYADDASSOC(., "[note.note_category]", "\"[note.text]\", by [note.admin_ckey] ([note.admin_rank]) on [note.date] ([note.round_id])")
+ LAZYADDASSOCLIST(., "[note.note_category]", "\"[note.text]\", by [note.admin_ckey] ([note.admin_rank]) on [note.date] ([note.round_id])")
diff --git a/code/datums/factions/uscm.dm b/code/datums/factions/uscm.dm
index cf77142ce5d6..0683f06672b7 100644
--- a/code/datums/factions/uscm.dm
+++ b/code/datums/factions/uscm.dm
@@ -26,6 +26,7 @@
if(JOB_INTEL) marine_rk = "io"
if(JOB_DROPSHIP_CREW_CHIEF) marine_rk = "dcc"
if(JOB_CREWMAN) marine_rk = "tc"
+ if(JOB_WALKER) marine_rk = "tc"
if(JOB_MARINE_RAIDER) marine_rk = "soc"
if(JOB_MARINE_RAIDER_SL) marine_rk = "soctl"
if(JOB_MARINE_RAIDER_CMD) marine_rk = "soccmd"
@@ -89,6 +90,10 @@
marine_rk = "po"
if(JOB_DROPSHIP_CREW_CHIEF)
marine_rk = "dcc"
+ if(JOB_CREWMAN)
+ marine_rk = "tc"
+ if(JOB_WALKER)
+ marine_rk = "tc"
if(JOB_CHIEF_POLICE)
marine_rk = "cmp"
border_rk = "command"
diff --git a/code/datums/langchat/langchat.dm b/code/datums/langchat/langchat.dm
index d1a6adafa2f3..73400e4095cd 100644
--- a/code/datums/langchat/langchat.dm
+++ b/code/datums/langchat/langchat.dm
@@ -11,6 +11,8 @@
/mob/living/carbon/xenomorph/defender/langchat_height = 48
/mob/living/carbon/xenomorph/warrior/langchat_height = 48
+/obj/vehicle/multitile/langchat_height = 80
+
#define LANGCHAT_LONGEST_TEXT 64
#define LANGCHAT_WIDTH 96
#define LANGCHAT_X_OFFSET -32
diff --git a/code/datums/statistics/entities/death_stats.dm b/code/datums/statistics/entities/death_stats.dm
index 4a01e4e9d72b..0af788cb60ef 100644
--- a/code/datums/statistics/entities/death_stats.dm
+++ b/code/datums/statistics/entities/death_stats.dm
@@ -69,15 +69,15 @@
stack_trace("track_mob_death called with string cause ([cause_data]) instead of datum")
cause_data = create_cause_data(cause_data)
- var/log_message = "\[[time_stamp()]\] [key_name(src)] died to "
+ var/log_message = "\[[time_stamp()]\] [key_name(src)] умер(ла) от "
if(cause_data)
log_message += "[cause_data.cause_name]"
else
- log_message += "unknown causes"
+ log_message += "неизвестных причин"
var/mob/cause_mob = cause_data?.resolve_mob()
if(cause_mob)
- log_message += " from [key_name(cause_data.resolve_mob())]"
- cause_mob.attack_log += "\[[time_stamp()]\] [key_name(cause_mob)] killed [key_name(src)] with [cause_data.cause_name]."
+ log_message += " от [key_name(cause_data.resolve_mob())]"
+ cause_mob.attack_log += "\[[time_stamp()]\] [key_name(cause_mob)] убил [key_name(src)] с помощью [cause_data.cause_name]."
attack_log += "[log_message]."
@@ -163,11 +163,11 @@
/mob/proc/handle_observer_message(datum/cause_data/cause_data, mob/cause_mob, turf/death_loc, area/death_area)
var/observer_message = "[real_name] has died"
if(cause_data && cause_data.cause_name)
- observer_message += " to [cause_data.cause_name]"
+ observer_message += " от [cause_data.cause_name]"
if(death_area.name)
- observer_message += " at \the [death_area.name]"
+ observer_message += " в \the [death_area.name]"
if(cause_data && cause_mob)
- observer_message += " from [cause_mob]"
+ observer_message += " из [cause_mob]"
msg_admin_attack(observer_message, death_loc.x, death_loc.y, death_loc.z)
diff --git a/code/datums/statistics/entities/round_stats.dm b/code/datums/statistics/entities/round_stats.dm
index 0e1fb6e387db..cabfeb23e69a 100644
--- a/code/datums/statistics/entities/round_stats.dm
+++ b/code/datums/statistics/entities/round_stats.dm
@@ -341,28 +341,28 @@
var/stats = ""
stats += "[SSticker.mode.round_finished]\n"
- stats += "Game mode: [game_mode]\n"
- stats += "Map name: [current_map.name]\n"
- stats += "Round time: [duration2text(round_length)]\n"
- stats += "End round player population: [end_round_player_population]\n"
+ stats += "Режим: [game_mode]\n"
+ stats += "Карта: [current_map.name]\n"
+ stats += "Время раунда: [duration2text(round_length)]\n"
+ stats += "Игроков под конец игры: [end_round_player_population]\n"
- stats += "Total xenos spawned: [total_xenos_created]\n"
- stats += "Total Preds spawned: [total_predators_spawned]\n"
- stats += "Total Predaliens spawned: [total_predaliens]\n"
- stats += "Total humans spawned: [total_humans_created]\n"
+ stats += "Присутствовало ксеноморфов: [total_xenos_created]\n"
+ stats += "Присутствовало хищников: [total_predators_spawned]\n"
+ stats += "Присутствовало предалиенов: [total_predaliens]\n"
+ stats += "Присутствовало людей: [total_humans_created]\n"
- stats += "Xeno count during hijack: [xeno_count_during_hijack]\n"
- stats += "Human count during hijack: [human_count_during_hijack]\n"
+ stats += "Ксеноморфов во время угона: [xeno_count_during_hijack]\n"
+ stats += "Людей во время угона: [human_count_during_hijack]\n"
- stats += "Total huggers applied: [total_huggers_applied]\n"
- stats += "Total chestbursts: [total_larva_burst]\n"
+ stats += "Лицехватов: [total_huggers_applied]\n"
+ stats += "Грудоломов выскочило: [total_larva_burst]\n"
- stats += "Total shots fired: [total_projectiles_fired]\n"
- stats += "Total friendly fire instances: [total_friendly_fire_instances]\n"
+ stats += "Всего выстрелов: [total_projectiles_fired]\n"
+ stats += "Всего дружественных попаданий: [total_friendly_fire_instances]\n"
- stats += "Marines remaining: [end_of_round_marines]\n"
- stats += "Xenos remaining: [end_of_round_xenos]\n"
- stats += "Hijack time: [duration2text(round_hijack_time)]\n"
+ stats += "Солдат осталось: [end_of_round_marines]\n"
+ stats += "Ксеноморфов осталось: [end_of_round_xenos]\n"
+ stats += "Время для угона: [duration2text(round_hijack_time)]\n"
stats += "[log_end]"
diff --git a/code/datums/statistics/random_facts/damage_fact.dm b/code/datums/statistics/random_facts/damage_fact.dm
index 2fa8a5d06491..4f36c306e468 100644
--- a/code/datums/statistics/random_facts/damage_fact.dm
+++ b/code/datums/statistics/random_facts/damage_fact.dm
@@ -1,6 +1,6 @@
/datum/random_fact/damage
- statistic_name = "damage"
- statistic_verb = "took"
+ statistic_name = "урона"
+ statistic_verb = "получил(а)"
/datum/random_fact/damage/life_grab_stat(mob/fact_mob)
return fact_mob.life_damage_taken_total
diff --git a/code/datums/statistics/random_facts/kills_fact.dm b/code/datums/statistics/random_facts/kills_fact.dm
index 7ef1c2b238de..190f8b1b21a3 100644
--- a/code/datums/statistics/random_facts/kills_fact.dm
+++ b/code/datums/statistics/random_facts/kills_fact.dm
@@ -1,6 +1,6 @@
/datum/random_fact/kills
- statistic_name = "kills"
- statistic_verb = "earned"
+ statistic_name = "убийств"
+ statistic_verb = "совершил(а)"
/datum/random_fact/kills/life_grab_stat(mob/fact_mob)
return fact_mob.life_kills_total
diff --git a/code/datums/statistics/random_facts/random_fact.dm b/code/datums/statistics/random_facts/random_fact.dm
index 76c6e82f776d..bab7dfd388a8 100644
--- a/code/datums/statistics/random_facts/random_fact.dm
+++ b/code/datums/statistics/random_facts/random_fact.dm
@@ -57,25 +57,25 @@
if(living_stat_gotten > death_stat_gotten)
name = mob_to_report.real_name
stat_gotten = living_stat_gotten
- additional_message = "and survived! Great work!"
+ additional_message = "не погибнув! Отличная работа!"
else
name = death_to_report.mob_name
stat_gotten = death_stat_gotten
- additional_message = "before dying"
+ additional_message = "перед смертью от"
if(death_to_report.cause_name)
- additional_message += " to [death_to_report.cause_name]"
- additional_message += ". Good work!"
+ additional_message += " [death_to_report.cause_name]"
+ additional_message += ". Хорошая работа!"
else if(death_to_report)
name = death_to_report.mob_name
stat_gotten = death_stat_gotten
- additional_message = "before dying"
+ additional_message = "перед смертью от"
if(death_to_report.cause_name)
- additional_message += " to [death_to_report.cause_name]"
- additional_message += ". Good work!"
+ additional_message += " [death_to_report.cause_name]"
+ additional_message += ". Отличная работа!"
else
name = mob_to_report.real_name
stat_gotten = living_stat_gotten
- additional_message = "and survived! Great work!"
+ additional_message = "не погибнув! Отличная работа!"
message = "[name] [statistic_verb] [stat_gotten] [statistic_name] [additional_message]"
diff --git a/code/datums/statistics/random_facts/revives_fact.dm b/code/datums/statistics/random_facts/revives_fact.dm
index 60b6daa896d2..ca0668a0961b 100644
--- a/code/datums/statistics/random_facts/revives_fact.dm
+++ b/code/datums/statistics/random_facts/revives_fact.dm
@@ -1,6 +1,6 @@
/datum/random_fact/revives
- statistic_name = "people"
- statistic_verb = "revived"
+ statistic_name = "людей"
+ statistic_verb = "спасено"
/datum/random_fact/revives/life_grab_stat(mob/fact_mob)
return fact_mob.life_revives_total
diff --git a/code/datums/supply_packs/weapons.dm b/code/datums/supply_packs/weapons.dm
index a28e0c7191ce..927db853e9fd 100644
--- a/code/datums/supply_packs/weapons.dm
+++ b/code/datums/supply_packs/weapons.dm
@@ -42,7 +42,7 @@
group = "Weapons"
/datum/supply_packs/grenade_launchers
- name = "M79 Grenade Launcher Crate (x2 Guncasess)"
+ name = "M79 Grenade Launcher Crate (x2 Guncases)"
contains = list(
/obj/item/storage/box/guncase/m79,
/obj/item/storage/box/guncase/m79,
@@ -120,6 +120,16 @@
containername = "\improper XM88 Heavy Rifle crate"
group = "Weapons"
+/* Uncomment me if it's decided to let the m707 be purchasable through req
+/datum/supply_packs/gun/m707
+ name = "M707 Anti-Materiel Rifle crate (M707 x1)"
+ contains = list()
+ cost = 120
+ containertype = /obj/structure/closet/crate/secure/vulture
+ containername = "M707 crate"
+ group = "Weapons"
+*/
+
/datum/supply_packs/gun/merc
contains = list()
name = "black market firearms (x1)"
diff --git a/code/game/gamemodes/cm_process.dm b/code/game/gamemodes/cm_process.dm
index 33377f7dc6fd..bcffa2d781e8 100644
--- a/code/game/gamemodes/cm_process.dm
+++ b/code/game/gamemodes/cm_process.dm
@@ -42,8 +42,8 @@ of predators), but can be added to include variant game modes (like humans vs. h
fallen_list += fallen_list_cross
if(fallen_list.len)
var/dat = "
"
- dat += SPAN_ROUNDBODY("In Flanders fields...
")
- dat += SPAN_CENTERBOLD("In memoriam of our fallen soldiers:
")
+ dat += SPAN_ROUNDBODY("На полях Фландрии...
")
+ dat += SPAN_CENTERBOLD("В память нашим падшим солдатам:
")
for(var/i = 1 to fallen_list.len)
if(i != fallen_list.len)
dat += "[fallen_list[i]], "
@@ -57,7 +57,7 @@ of predators), but can be added to include variant game modes (like humans vs. h
sleep(2 SECONDS)
if(LAZYLEN(xenomorphs) || LAZYLEN(dead_queens))
var/dat = "
"
- dat += SPAN_ROUNDBODY("
The xenomorph Queen(s) were:")
+ dat += SPAN_ROUNDBODY("
В роли Королевы Ксеноморфов:")
var/mob/living/carbon/xenomorph/xeno_mob
for (var/msg in dead_queens)
dat += msg
@@ -69,7 +69,7 @@ of predators), but can be added to include variant game modes (like humans vs. h
if(!xeno_mob || !xeno_mob.loc)
xeno_mob = xeno_mind.original
if(xeno_mob && xeno_mob.loc && isqueen(xeno_mob) && xeno_mob.stat != DEAD) // Dead queens handled separately
- dat += "
[xeno_mob.full_designation] was [xeno_mob] [SPAN_BOLDNOTICE("(SURVIVED)")]"
+ dat += "
[xeno_mob.full_designation] был [xeno_mob] [SPAN_BOLDNOTICE("(ВЫЖИЛ)")]"
to_world("[dat]")
@@ -78,9 +78,9 @@ of predators), but can be added to include variant game modes (like humans vs. h
sleep(2 SECONDS)
if(length(predators))
var/dat = "
"
- dat += SPAN_ROUNDBODY("
The Predators were:")
+ dat += SPAN_ROUNDBODY("
В роли Хищников:")
for(var/entry in predators)
- dat += "
[entry] was [predators[entry]["Name"]] [SPAN_BOLDNOTICE("([predators[entry]["Status"]])")]"
+ dat += "
[entry] был [predators[entry]["Name"]] [SPAN_BOLDNOTICE("([predators[entry]["Status"]])")]"
to_world("[dat]")
@@ -89,26 +89,26 @@ of predators), but can be added to include variant game modes (like humans vs. h
sleep(2 SECONDS)
if(GLOB.medal_awards.len)
var/dat = "
"
- dat += SPAN_ROUNDBODY("
Medal Awards:")
+ dat += SPAN_ROUNDBODY("
Медали получили:")
for(var/recipient in GLOB.medal_awards)
var/datum/recipient_awards/recipient_award = GLOB.medal_awards[recipient]
for(var/i in 1 to recipient_award.medal_names.len)
- dat += "
[recipient_award.recipient_rank] [recipient] is awarded [recipient_award.posthumous[i] ? "posthumously " : ""]the [recipient_award.medal_names[i]]: \'[recipient_award.medal_citations[i]]\'."
+ dat += "
[recipient_award.recipient_rank] [recipient] наградили [recipient_award.posthumous[i] ? "посмертно " : ""]the [recipient_award.medal_names[i]]: \'[recipient_award.medal_citations[i]]\'."
to_world(dat)
if(GLOB.jelly_awards.len)
var/dat = "
"
- dat += SPAN_ROUNDBODY("
Royal Jelly Awards:")
+ dat += SPAN_ROUNDBODY("
Награды Королевского Желе:")
for(var/recipient in GLOB.jelly_awards)
var/datum/recipient_awards/recipient_award = GLOB.jelly_awards[recipient]
for(var/i in 1 to recipient_award.medal_names.len)
- dat += "
[recipient] is awarded [recipient_award.posthumous[i] ? "posthumously " : ""]a [recipient_award.medal_names[i]]: \'[recipient_award.medal_citations[i]]\'[recipient_award.giver_rank[i] ? " by [recipient_award.giver_rank[i]]" : ""][recipient_award.giver_name[i] ? " ([recipient_award.giver_name[i]])" : ""]."
+ dat += "
[recipient] наградили [recipient_award.posthumous[i] ? "посмертно " : ""]a [recipient_award.medal_names[i]]: \'[recipient_award.medal_citations[i]]\'[recipient_award.giver_rank[i] ? " by [recipient_award.giver_rank[i]]" : ""][recipient_award.giver_name[i] ? " ([recipient_award.giver_name[i]])" : ""]."
to_world(dat)
/datum/game_mode/proc/declare_fun_facts()
set waitfor = 0
sleep(2 SECONDS)
to_chat_spaced(world, margin_bottom = 0, html = SPAN_ROLE_BODY("|______________________|"))
- to_world(SPAN_ROLE_HEADER("FUN FACTS"))
+ to_world(SPAN_ROLE_HEADER("ИНТЕРЕСНЫЕ ФАКТЫ"))
var/list/fact_types = subtypesof(/datum/random_fact)
for(var/fact_type as anything in fact_types)
var/datum/random_fact/fact_human = new fact_type(set_check_human = TRUE, set_check_xeno = FALSE)
diff --git a/code/game/gamemodes/cm_self_destruct.dm b/code/game/gamemodes/cm_self_destruct.dm
index 8c022fd0d916..a29d23a41f7a 100644
--- a/code/game/gamemodes/cm_self_destruct.dm
+++ b/code/game/gamemodes/cm_self_destruct.dm
@@ -97,13 +97,13 @@ var/global/datum/authority/branch/evacuation/EvacuationAuthority //This is initi
if(force || (evac_status == EVACUATION_STATUS_STANDING_BY && !(flags_scuttle & FLAGS_EVACUATION_DENY)))
evac_time = world.time
evac_status = EVACUATION_STATUS_INITIATING
- ai_announcement("Attention. Emergency. All personnel must evacuate immediately. You have [round(EVACUATION_ESTIMATE_DEPARTURE/60,1)] minute\s until departure.", 'sound/AI/evacuate.ogg')
- xeno_message_all("A wave of adrenaline ripples through the hive. The fleshy creatures are trying to escape!")
+ ai_announcement("Внимание. Тревога. Всему персоналу немедленно эвакуироваться. У вас есть [round(EVACUATION_ESTIMATE_DEPARTURE/60,1)] минут перед отправлением.", 'sound/AI/evacuate.ogg')
+ xeno_message_all("Волна адреналина прокатывается по обитателям улья. Эти мясные существа пытаются сбежать!")
for(var/obj/structure/machinery/status_display/SD in machines)
if(is_mainship_level(SD.z))
SD.set_picture("evac")
- for(var/obj/docking_port/mobile/escape_shuttle/shuttle in SSshuttle.mobile)
+ for(var/obj/docking_port/mobile/crashable/escape_shuttle/shuttle in SSshuttle.mobile)
shuttle.prepare_evac()
activate_lifeboats()
process_evacuation()
@@ -114,14 +114,14 @@ var/global/datum/authority/branch/evacuation/EvacuationAuthority //This is initi
evac_time = null
evac_status = EVACUATION_STATUS_STANDING_BY
deactivate_lifeboats()
- ai_announcement("Evacuation has been cancelled.", 'sound/AI/evacuate_cancelled.ogg')
+ ai_announcement("Эвакуация была отменена.", 'sound/AI/evacuate_cancelled.ogg')
if(get_security_level() == "red")
for(var/obj/structure/machinery/status_display/SD in machines)
if(is_mainship_level(SD.z))
SD.set_picture("redalert")
- for(var/obj/docking_port/mobile/escape_shuttle/shuttle in SSshuttle.mobile)
+ for(var/obj/docking_port/mobile/crashable/escape_shuttle/shuttle in SSshuttle.mobile)
shuttle.cancel_evac()
return TRUE
@@ -129,23 +129,23 @@ var/global/datum/authority/branch/evacuation/EvacuationAuthority //This is initi
if(evac_status == EVACUATION_STATUS_INITIATING)
evac_status = EVACUATION_STATUS_IN_PROGRESS //Cannot cancel at this point. All shuttles are off.
spawn() //One of the few times spawn() is appropriate. No need for a new proc.
- ai_announcement("WARNING: Evacuation order confirmed. Launching escape pods.", 'sound/AI/evacuation_confirmed.ogg')
+ ai_announcement("ПРЕДУПРЕЖДЕНИЕ: Приказ об эвакуации подтвержден. Запуск спасательных шлюпок.", 'sound/AI/evacuation_confirmed.ogg')
addtimer(CALLBACK(src, PROC_REF(launch_lifeboats)), 10 SECONDS) // giving some time to board lifeboats
- for(var/obj/docking_port/mobile/escape_shuttle/shuttle in SSshuttle.mobile)
+ for(var/obj/docking_port/mobile/crashable/escape_shuttle/shuttle in SSshuttle.mobile)
shuttle.evac_launch()
sleep(50)
sleep(300) //Sleep 30 more seconds to make sure everyone had a chance to leave.
var/lifesigns = 0
// lifesigns += P.passengers
- var/obj/docking_port/mobile/lifeboat/lifeboat1 = SSshuttle.getShuttle(MOBILE_SHUTTLE_LIFEBOAT_PORT)
+ var/obj/docking_port/mobile/crashable/lifeboat/lifeboat1 = SSshuttle.getShuttle(MOBILE_SHUTTLE_LIFEBOAT_PORT)
lifeboat1.check_for_survivors()
lifesigns += lifeboat1.survivors
- var/obj/docking_port/mobile/lifeboat/lifeboat2 = SSshuttle.getShuttle(MOBILE_SHUTTLE_LIFEBOAT_STARBOARD)
+ var/obj/docking_port/mobile/crashable/lifeboat/lifeboat2 = SSshuttle.getShuttle(MOBILE_SHUTTLE_LIFEBOAT_STARBOARD)
lifeboat2.check_for_survivors()
lifesigns += lifeboat2.survivors
- ai_announcement("ATTENTION: Evacuation complete. Outbound lifesigns detected: [lifesigns ? lifesigns : "none"].", 'sound/AI/evacuation_complete.ogg')
+ ai_announcement("ВНИМАНИЕ: Процедуры эвакуации завершены. Внешних признаков жизни зафиксировано: [lifesigns ? lifesigns : "0"].", 'sound/AI/evacuation_complete.ogg')
evac_status = EVACUATION_STATUS_COMPLETE
return TRUE
@@ -166,7 +166,7 @@ var/global/datum/authority/branch/evacuation/EvacuationAuthority //This is initi
// LIFEBOATS CORNER
/datum/authority/branch/evacuation/proc/activate_lifeboats()
for(var/obj/docking_port/stationary/lifeboat_dock/lifeboat_dock in GLOB.lifeboat_almayer_docks)
- var/obj/docking_port/mobile/lifeboat/lifeboat = lifeboat_dock.get_docked()
+ var/obj/docking_port/mobile/crashable/lifeboat/lifeboat = lifeboat_dock.get_docked()
if(lifeboat && lifeboat.available)
lifeboat.status = LIFEBOAT_ACTIVE
lifeboat_dock.open_dock()
@@ -174,15 +174,15 @@ var/global/datum/authority/branch/evacuation/EvacuationAuthority //This is initi
/datum/authority/branch/evacuation/proc/deactivate_lifeboats()
for(var/obj/docking_port/stationary/lifeboat_dock/lifeboat_dock in GLOB.lifeboat_almayer_docks)
- var/obj/docking_port/mobile/lifeboat/lifeboat = lifeboat_dock.get_docked()
+ var/obj/docking_port/mobile/crashable/lifeboat/lifeboat = lifeboat_dock.get_docked()
if(lifeboat && lifeboat.available)
lifeboat.status = LIFEBOAT_INACTIVE
/datum/authority/branch/evacuation/proc/launch_lifeboats()
for(var/obj/docking_port/stationary/lifeboat_dock/lifeboat_dock in GLOB.lifeboat_almayer_docks)
- var/obj/docking_port/mobile/lifeboat/lifeboat = lifeboat_dock.get_docked()
+ var/obj/docking_port/mobile/crashable/lifeboat/lifeboat = lifeboat_dock.get_docked()
if(lifeboat && lifeboat.available)
- lifeboat.send_to_infinite_transit()
+ lifeboat.evac_launch()
//=========================================================================================
//=========================================================================================
diff --git a/code/game/gamemodes/colonialmarines/colonialmarines.dm b/code/game/gamemodes/colonialmarines/colonialmarines.dm
index cf2b7819a596..4a7868503224 100644
--- a/code/game/gamemodes/colonialmarines/colonialmarines.dm
+++ b/code/game/gamemodes/colonialmarines/colonialmarines.dm
@@ -26,7 +26,7 @@
return TRUE
/datum/game_mode/colonialmarines/announce()
- to_chat_spaced(world, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDHEADER("The current map is - [SSmapping.configs[GROUND_MAP].map_name]!"))
+ to_chat_spaced(world, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDHEADER("Игровая карта - [SSmapping.configs[GROUND_MAP].map_name]!"))
/datum/game_mode/colonialmarines/get_roles_list()
return ROLES_DISTRESS_SIGNAL
diff --git a/code/game/gamemodes/colonialmarines/xenovsxeno.dm b/code/game/gamemodes/colonialmarines/xenovsxeno.dm
index a0d555acd2fb..25fb8bffbf6e 100644
--- a/code/game/gamemodes/colonialmarines/xenovsxeno.dm
+++ b/code/game/gamemodes/colonialmarines/xenovsxeno.dm
@@ -35,7 +35,7 @@
return TRUE
/datum/game_mode/xenovs/announce()
- to_chat_spaced(world, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDHEADER("The current map is - [SSmapping.configs[GROUND_MAP].map_name]!"))
+ to_chat_spaced(world, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDHEADER("Игровая карта - [SSmapping.configs[GROUND_MAP].map_name]!"))
/datum/game_mode/xenovs/get_roles_list()
return ROLES_XENO
@@ -284,7 +284,7 @@
if(round_statistics)
round_statistics.track_round_end()
log_game("Round end result: [round_finished]")
- to_chat_spaced(world, margin_top = 2, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDHEADER("|Round Complete|"))
+ to_chat_spaced(world, margin_top = 2, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDHEADER("|Раунд Завершен|"))
to_chat_spaced(world, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDBODY("Thus ends the story of the battling hives on [SSmapping.configs[GROUND_MAP].map_name]. [round_finished]\nThe game-mode was: [master_mode]!\nEnd of Round Grief (EORG) is an IMMEDIATE 3 hour ban with no warnings, see rule #3 for more details."))
// for the toolbox
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 5b007d275c32..f06d5703a4a9 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -128,8 +128,8 @@ var/global/cas_tracking_id_increment = 0 //this var used to assign unique tracki
if(round_statistics)
round_statistics.track_round_end()
log_game("Round end result: [round_finished]")
- to_chat_spaced(world, margin_top = 2, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDHEADER("|Round Complete|"))
- to_chat_spaced(world, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDBODY("Thus ends the story of the brave men and women of the [MAIN_SHIP_NAME] and their struggle on [SSmapping.configs[GROUND_MAP].map_name].\nThe game-mode was: [master_mode]!\nEnd of Round Grief (EORG) is an IMMEDIATE 3 hour ban with no warnings, see rule #3 for more details."))
+ to_chat_spaced(world, margin_top = 2, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDHEADER("|Раунд завершен|"))
+ to_chat_spaced(world, type = MESSAGE_TYPE_SYSTEM, html = SPAN_ROUNDBODY("Так заканчивается история экипажа [MAIN_SHIP_NAME] и их борьбы на объекте [SSmapping.configs[GROUND_MAP].map_name].\nРежим игры: [master_mode]!\nГриф в конце раунда (EORG) влечет немедленный бан на 3 часа, смотрите правило #3 для деталей."))
/datum/game_mode/proc/declare_completion()
if(round_statistics)
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 0d10b06d5fef..8399e2884ee2 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -389,6 +389,8 @@
return "[MAIN_SHIP_NAME] Command"
if(ACCESS_MARINE_CREWMAN)
return "Vehicle Crewman"
+ if(ACCESS_MARINE_WALKER)
+ return "Walker Crewman"
if(ACCESS_MARINE_PREP)
return "Marine Prep"
if(ACCESS_MARINE_ENGPREP)
diff --git a/code/game/jobs/job/antag/xeno/queen.dm b/code/game/jobs/job/antag/xeno/queen.dm
index 5702f9b1a671..253f1427d74c 100644
--- a/code/game/jobs/job/antag/xeno/queen.dm
+++ b/code/game/jobs/job/antag/xeno/queen.dm
@@ -19,7 +19,7 @@
to_chat(new_queen, "Talk in Hivemind using ; (e.g. ';Hello my children!')")
AddTimelock(/datum/job/antag/xenos/queen, list(
- JOB_XENO_ROLES = 10 HOURS,
- JOB_DRONE_ROLES = 5 HOURS,
- JOB_T3_ROLES = 3 HOURS,
+ JOB_XENO_ROLES = 3 HOURS,
+ JOB_DRONE_ROLES = 1 HOURS,
+ JOB_T3_ROLES = 1 HOURS,
))
diff --git a/code/game/jobs/job/civilians/other/liaison.dm b/code/game/jobs/job/civilians/other/liaison.dm
index ba65720b8251..3e868b1efbf7 100644
--- a/code/game/jobs/job/civilians/other/liaison.dm
+++ b/code/game/jobs/job/civilians/other/liaison.dm
@@ -24,5 +24,5 @@
job = /datum/job/civilian/liaison
AddTimelock(/datum/job/civilian/liaison, list(
- JOB_HUMAN_ROLES = 10 HOURS,
+ JOB_HUMAN_ROLES = 1 HOURS,
))
diff --git a/code/game/jobs/job/civilians/other/reporter.dm b/code/game/jobs/job/civilians/other/reporter.dm
index c681768f93bc..eabc1b51b505 100644
--- a/code/game/jobs/job/civilians/other/reporter.dm
+++ b/code/game/jobs/job/civilians/other/reporter.dm
@@ -35,5 +35,5 @@ This could be the story of the sector! 'Brave Marines responding to dangerous di
job = /datum/job/civilian/reporter
AddTimelock(/datum/job/civilian/reporter, list(
- JOB_HUMAN_ROLES = 10 HOURS,
+ JOB_HUMAN_ROLES = 1 HOURS,
))
diff --git a/code/game/jobs/job/civilians/other/survivors.dm b/code/game/jobs/job/civilians/other/survivors.dm
index ff2d7d229fba..15e7b13091ae 100644
--- a/code/game/jobs/job/civilians/other/survivors.dm
+++ b/code/game/jobs/job/civilians/other/survivors.dm
@@ -119,9 +119,9 @@
SSticker.mode.survivors_by_type_amounts[preferred_variant] += 1
AddTimelock(/datum/job/civilian/survivor, list(
- JOB_SQUAD_ROLES = 5 HOURS,
- JOB_ENGINEER_ROLES = 5 HOURS,
- JOB_MEDIC_ROLES = 5 HOURS
+ JOB_SQUAD_ROLES = 1 HOURS,
+ JOB_ENGINEER_ROLES = 1 HOURS,
+ JOB_MEDIC_ROLES = 1 HOURS
))
/datum/job/civilian/survivor/synth
diff --git a/code/game/jobs/job/civilians/support/cmo.dm b/code/game/jobs/job/civilians/support/cmo.dm
index 9f3ff20cffb3..91fe434e1bb7 100644
--- a/code/game/jobs/job/civilians/support/cmo.dm
+++ b/code/game/jobs/job/civilians/support/cmo.dm
@@ -9,7 +9,7 @@
entry_message_body = "You're a commissioned officer of the USCM. You have authority over everything related to Medbay and Research, only able to be overriden by the XO and CO. You are in charge of medical staff, surgery, chemistry, stimulants and keeping the marines healthy overall."
AddTimelock(/datum/job/civilian/professor, list(
- JOB_MEDIC_ROLES = 10 HOURS
+ JOB_MEDIC_ROLES = 1 HOURS
))
/obj/effect/landmark/start/professor
diff --git a/code/game/jobs/job/civilians/support/researcher.dm b/code/game/jobs/job/civilians/support/researcher.dm
index fd33d1f03f0a..6ef965885d11 100644
--- a/code/game/jobs/job/civilians/support/researcher.dm
+++ b/code/game/jobs/job/civilians/support/researcher.dm
@@ -28,7 +28,7 @@
return positions
AddTimelock(/datum/job/civilian/researcher, list(
- JOB_MEDIC_ROLES = 5 HOURS
+ JOB_MEDIC_ROLES = 1 HOURS
))
/obj/effect/landmark/start/researcher
diff --git a/code/game/jobs/job/command/auxiliary/auxiliary_support_officer.dm b/code/game/jobs/job/command/auxiliary/auxiliary_support_officer.dm
index 262ba271edbf..af8e21a27f12 100644
--- a/code/game/jobs/job/command/auxiliary/auxiliary_support_officer.dm
+++ b/code/game/jobs/job/command/auxiliary/auxiliary_support_officer.dm
@@ -8,10 +8,10 @@
entry_message_body = "Your job is to oversee the hangar crew, the intel officers, the engineering department, and requisition department. You have many responsibilities and a few plates to keep spinning but your subordinates are mostly self-reliant. Assist where you can and make sure command personnel are confident the auxiliary departments are operating at peak efficiency."
AddTimelock(/datum/job/command/auxiliary_officer, list(
- JOB_SQUAD_ROLES = 5 HOURS,
- JOB_REQUISITION_ROLES = 5 HOURS,
- JOB_ENGINEER_ROLES = 5 HOURS,
- JOB_AUXILIARY_ROLES = 5 HOURS,
+ JOB_SQUAD_ROLES = 1 HOURS,
+ JOB_REQUISITION_ROLES = 1 HOURS,
+ JOB_ENGINEER_ROLES = 1 HOURS,
+ JOB_AUXILIARY_ROLES = 1 HOURS,
))
/obj/effect/landmark/start/auxiliary_officer
diff --git a/code/game/jobs/job/command/auxiliary/crew_chief.dm b/code/game/jobs/job/command/auxiliary/crew_chief.dm
index 5f846bf6581e..3289fec0f82d 100644
--- a/code/game/jobs/job/command/auxiliary/crew_chief.dm
+++ b/code/game/jobs/job/command/auxiliary/crew_chief.dm
@@ -10,7 +10,7 @@
entry_message_body = "Your job is to assist the pilot officer maintain the ship's dropship. You have authority only on the dropship, but you are expected to maintain order, as not to disrupt the pilot."
AddTimelock(/datum/job/command/crew_chief, list(
- JOB_SQUAD_ROLES = 5 HOURS
+ JOB_SQUAD_ROLES = 1 HOURS
))
/obj/effect/landmark/start/crew_chief
diff --git a/code/game/jobs/job/command/auxiliary/intel.dm b/code/game/jobs/job/command/auxiliary/intel.dm
index 10b8381c417e..597f3289c610 100644
--- a/code/game/jobs/job/command/auxiliary/intel.dm
+++ b/code/game/jobs/job/command/auxiliary/intel.dm
@@ -24,7 +24,7 @@
return positions
AddTimelock(/datum/job/command/intel, list(
- JOB_SQUAD_ROLES = 5 HOURS
+ JOB_SQUAD_ROLES = 1 HOURS
))
/obj/effect/landmark/start/intel
diff --git a/code/game/jobs/job/command/auxiliary/pilot.dm b/code/game/jobs/job/command/auxiliary/pilot.dm
index 57495fe8be28..57901f3bec91 100644
--- a/code/game/jobs/job/command/auxiliary/pilot.dm
+++ b/code/game/jobs/job/command/auxiliary/pilot.dm
@@ -10,7 +10,7 @@
entry_message_body = "Your job is to fly, protect, and maintain the ship's dropship. While you are an officer, your authority is limited to the dropship, where you have authority over the enlisted personnel. If you are not piloting, there is an autopilot fallback for command, but don't leave the dropship without reason."
AddTimelock(/datum/job/command/pilot, list(
- JOB_SQUAD_ROLES = 5 HOURS
+ JOB_SQUAD_ROLES = 1 HOURS
))
/obj/effect/landmark/start/pilot
diff --git a/code/game/jobs/job/command/auxiliary/senior.dm b/code/game/jobs/job/command/auxiliary/senior.dm
index 68b9a99e4c4f..c64f27842b1a 100644
--- a/code/game/jobs/job/command/auxiliary/senior.dm
+++ b/code/game/jobs/job/command/auxiliary/senior.dm
@@ -25,13 +25,13 @@
return filtered_job_options
AddTimelock(/datum/job/command/senior, list(
- JOB_SQUAD_ROLES = 15 HOURS,
+ JOB_SQUAD_ROLES = 3 HOURS,
- JOB_ENGINEER_ROLES = 10 HOURS,
- JOB_POLICE_ROLES = 10 HOURS,
- JOB_MEDIC_ROLES = 10 HOURS,
+ JOB_ENGINEER_ROLES = 1 HOURS,
+ JOB_POLICE_ROLES = 1 HOURS,
+ JOB_MEDIC_ROLES = 1 HOURS,
- JOB_COMMAND_ROLES = 5 HOURS,
+ JOB_COMMAND_ROLES = 3 HOURS,
))
/obj/effect/landmark/start/senior
diff --git a/code/game/jobs/job/command/auxiliary/tankcrew.dm b/code/game/jobs/job/command/auxiliary/tankcrew.dm
new file mode 100644
index 000000000000..5e8d7b145c4c
--- /dev/null
+++ b/code/game/jobs/job/command/auxiliary/tankcrew.dm
@@ -0,0 +1,18 @@
+/datum/job/command/tank_crew
+ title = JOB_CREWMAN
+ total_positions = 2
+ spawn_positions = 2
+ allow_additional = 1
+ scaled = 0
+ flags_startup_parameters = ROLE_ADD_TO_DEFAULT
+ gear_preset = /datum/equipment_preset/uscm/tank
+ entry_message_body = "Your job is to operate and maintain the ship's armored vehicles. You are in charge of representing the armored presence amongst the marines during the operation, as well as maintaining and repairing your own vehicles."
+
+AddTimelock(/datum/job/command/tank_crew, list(
+ JOB_SQUAD_ROLES = 1 HOURS,
+ JOB_ENGINEER_ROLES = 1 HOURS
+))
+
+/obj/effect/landmark/start/tank_crew
+ name = JOB_CREWMAN
+ job = /datum/job/command/tank_crew
diff --git a/code/game/jobs/job/command/cic/executive.dm b/code/game/jobs/job/command/cic/executive.dm
index cc9b4f65e624..85fa5fc1bb61 100644
--- a/code/game/jobs/job/command/cic/executive.dm
+++ b/code/game/jobs/job/command/cic/executive.dm
@@ -18,7 +18,7 @@
GLOB.marine_leaders -= JOB_XO
AddTimelock(/datum/job/command/executive, list(
- JOB_COMMAND_ROLES = 5 HOURS,
+ JOB_COMMAND_ROLES = 8 HOURS,
))
/obj/effect/landmark/start/executive
diff --git a/code/game/jobs/job/command/cic/staffofficer.dm b/code/game/jobs/job/command/cic/staffofficer.dm
index 82a537dc83f6..50cb3a9dda51 100644
--- a/code/game/jobs/job/command/cic/staffofficer.dm
+++ b/code/game/jobs/job/command/cic/staffofficer.dm
@@ -27,8 +27,8 @@
return ..()
AddTimelock(/datum/job/command/bridge, list(
- JOB_SQUAD_LEADER = 1 HOURS,
- JOB_HUMAN_ROLES = 15 HOURS
+ JOB_SQUAD_LEADER = 3 HOURS,
+ JOB_HUMAN_ROLES = 3 HOURS
))
/obj/effect/landmark/start/bridge
diff --git a/code/game/jobs/job/command/police/chief_police.dm b/code/game/jobs/job/command/police/chief_police.dm
index 60bc564af3b1..20452db9ee8e 100644
--- a/code/game/jobs/job/command/police/chief_police.dm
+++ b/code/game/jobs/job/command/police/chief_police.dm
@@ -7,7 +7,7 @@
entry_message_body = "You are held by a higher standard and are required to obey not only the server rules but the Marine Law. Failure to do so may result in a job ban or server ban. You lead the Military Police, ensure your officers maintain peace and stability aboard the ship. Marines can get rowdy after a few weeks of cryosleep! In addition, you are tasked with the security of high-ranking personnel, including the command staff. Keep them safe!"
AddTimelock(/datum/job/command/warrant, list(
- JOB_POLICE_ROLES = 15 HOURS,
+ JOB_POLICE_ROLES = 5 HOURS,
JOB_COMMAND_ROLES = 5 HOURS
))
diff --git a/code/game/jobs/job/command/police/police.dm b/code/game/jobs/job/command/police/police.dm
index 48cd9b33e99c..a153b84b2c6f 100644
--- a/code/game/jobs/job/command/police/police.dm
+++ b/code/game/jobs/job/command/police/police.dm
@@ -26,7 +26,7 @@
return positions
AddTimelock(/datum/job/command/police, list(
- JOB_SQUAD_ROLES = 10 HOURS
+ JOB_SQUAD_ROLES = 3 HOURS
))
/obj/effect/landmark/start/police
diff --git a/code/game/jobs/job/command/police/warden.dm b/code/game/jobs/job/command/police/warden.dm
index 851b43debd3c..31e9b7064799 100644
--- a/code/game/jobs/job/command/police/warden.dm
+++ b/code/game/jobs/job/command/police/warden.dm
@@ -8,7 +8,7 @@
entry_message_body = "You are held by a higher standard and are required to obey not only the server rules but the Marine Law. Failure to do so may result in a job ban or server ban. Your primary job is to maintain peace and stability aboard the ship. Marines can get rowdy after a few weeks of cryosleep! In addition, you are tasked with the mainting security records and overwatching any prisoners in Brig."
AddTimelock(/datum/job/command/warden, list(
- JOB_POLICE_ROLES = 10 HOURS
+ JOB_POLICE_ROLES = 3 HOURS
))
/obj/effect/landmark/start/warden
diff --git a/code/game/jobs/job/logistics/cargo/chief_req.dm b/code/game/jobs/job/logistics/cargo/chief_req.dm
index 3b6fb7262a80..79e92f5e5795 100644
--- a/code/game/jobs/job/logistics/cargo/chief_req.dm
+++ b/code/game/jobs/job/logistics/cargo/chief_req.dm
@@ -6,7 +6,7 @@
entry_message_body = "Your job is to dispense supplies to the marines, including weapon attachments. Your cargo techs can help you out, but you have final say in your department. Make sure they're not goofing off. While you may request paperwork for supplies, do not go out of your way to screw with marines, unless you want to get deposed. A happy ship is a well-functioning ship."
AddTimelock(/datum/job/logistics/requisition, list(
- JOB_REQUISITION_ROLES = 10 HOURS,
+ JOB_REQUISITION_ROLES = 1 HOURS,
))
/obj/effect/landmark/start/requisition
diff --git a/code/game/jobs/job/logistics/engi/chief_engineer.dm b/code/game/jobs/job/logistics/engi/chief_engineer.dm
index 9db14540e74a..9159dc1d8084 100644
--- a/code/game/jobs/job/logistics/engi/chief_engineer.dm
+++ b/code/game/jobs/job/logistics/engi/chief_engineer.dm
@@ -6,7 +6,7 @@
entry_message_body = "Your job is to maintain your department and keep your technicians in check. You are responsible for engineering, power, ordnance, and the orbital cannon. Should the commanding and executive officer be unavailable, you are next in the chain of command."
AddTimelock(/datum/job/logistics/engineering, list(
- JOB_ENGINEER_ROLES = 10 HOURS,
+ JOB_ENGINEER_ROLES = 5 HOURS,
))
/obj/effect/landmark/start/engineering
diff --git a/code/game/jobs/job/marine/squad/leader.dm b/code/game/jobs/job/marine/squad/leader.dm
index aa2173d173d0..5956bb111505 100644
--- a/code/game/jobs/job/marine/squad/leader.dm
+++ b/code/game/jobs/job/marine/squad/leader.dm
@@ -1,7 +1,7 @@
/datum/job/marine/leader
title = JOB_SQUAD_LEADER
- total_positions = 4
- spawn_positions = 4
+ total_positions = 2
+ spawn_positions = 2
supervisors = "the acting commanding officer"
flags_startup_parameters = ROLE_ADD_TO_DEFAULT|ROLE_ADD_TO_SQUAD
gear_preset = /datum/equipment_preset/uscm/leader
@@ -13,7 +13,7 @@
gear_preset = /datum/equipment_preset/wo/marine/sl
AddTimelock(/datum/job/marine/leader, list(
- JOB_SQUAD_ROLES = 10 HOURS
+ JOB_SQUAD_ROLES = 5 HOURS
))
/obj/effect/landmark/start/marine/leader
diff --git a/code/game/jobs/job/marine/squad/medic.dm b/code/game/jobs/job/marine/squad/medic.dm
index 637567d47d4d..1d85cdf14fc7 100644
--- a/code/game/jobs/job/marine/squad/medic.dm
+++ b/code/game/jobs/job/marine/squad/medic.dm
@@ -33,7 +33,6 @@
gear_preset = /datum/equipment_preset/wo/marine/medic
AddTimelock(/datum/job/marine/medic, list(
- JOB_MEDIC_ROLES = 1 HOURS,
JOB_SQUAD_ROLES = 1 HOURS
))
diff --git a/code/game/jobs/job/marine/squad/smartgunner.dm b/code/game/jobs/job/marine/squad/smartgunner.dm
index 5753434e62ee..e6255ec23e59 100644
--- a/code/game/jobs/job/marine/squad/smartgunner.dm
+++ b/code/game/jobs/job/marine/squad/smartgunner.dm
@@ -28,10 +28,6 @@
flags_startup_parameters = ROLE_ADD_TO_SQUAD
gear_preset = /datum/equipment_preset/wo/marine/sg
-AddTimelock(/datum/job/marine/smartgunner, list(
- JOB_SQUAD_ROLES = 5 HOURS
-))
-
/obj/effect/landmark/start/marine/smartgunner
name = JOB_SQUAD_SMARTGUN
icon_state = "smartgunner_spawn"
diff --git a/code/game/jobs/job/marine/squad/specialist.dm b/code/game/jobs/job/marine/squad/specialist.dm
index 539d3a158690..7afe592eeec2 100644
--- a/code/game/jobs/job/marine/squad/specialist.dm
+++ b/code/game/jobs/job/marine/squad/specialist.dm
@@ -30,7 +30,7 @@
gear_preset = /datum/equipment_preset/wo/marine/spec
AddTimelock(/datum/job/marine/specialist, list(
- JOB_SQUAD_ROLES = 5 HOURS
+ JOB_SQUAD_ROLES = 1 HOURS
))
/obj/effect/landmark/start/marine/spec
diff --git a/code/game/jobs/job/marine/squad/tl.dm b/code/game/jobs/job/marine/squad/tl.dm
index f6c58cce3e0d..be408be0747b 100644
--- a/code/game/jobs/job/marine/squad/tl.dm
+++ b/code/game/jobs/job/marine/squad/tl.dm
@@ -1,7 +1,7 @@
/datum/job/marine/tl
title = JOB_SQUAD_TEAM_LEADER
- total_positions = 8
- spawn_positions = 8
+ total_positions = 4
+ spawn_positions = 4
allow_additional = 1
flags_startup_parameters = ROLE_ADD_TO_DEFAULT|ROLE_ADD_TO_SQUAD
gear_preset = /datum/equipment_preset/uscm/tl
@@ -12,7 +12,7 @@
spawning_human.important_radio_channels += JTAC_FREQ
AddTimelock(/datum/job/marine/tl, list(
- JOB_SQUAD_ROLES = 8 HOURS
+ JOB_SQUAD_ROLES = 3 HOURS
))
/obj/effect/landmark/start/marine/tl
diff --git a/code/game/jobs/job/marine/squads.dm b/code/game/jobs/job/marine/squads.dm
index fb85be012d30..3665c693b815 100644
--- a/code/game/jobs/job/marine/squads.dm
+++ b/code/game/jobs/job/marine/squads.dm
@@ -42,15 +42,15 @@
/// Can use any squad vendor regardless of squad connection
var/omni_squad_vendor = FALSE
/// maximum # of engineers allowed in the squad
- var/max_engineers = 3
+ var/max_engineers = 6
/// maximum # of squad medics allowed in the squad
- var/max_medics = 4
+ var/max_medics = 8
/// maximum # of specs allowed in the squad
- var/max_specialists = 1
+ var/max_specialists = 2
/// maximum # of fireteam leaders allowed in the suqad
var/max_tl = 2
/// maximum # of smartgunners allowed in the squad
- var/max_smartgun = 1
+ var/max_smartgun = 2
/// maximum # of squad leaders allowed in the squad
var/max_leaders = 1
/// Squad headsets default radio frequency
@@ -123,7 +123,7 @@
access = list(ACCESS_MARINE_ALPHA)
radio_freq = ALPHA_FREQ
minimap_color = MINIMAP_SQUAD_ALPHA
-
+/*
/datum/squad/marine/bravo
name = SQUAD_MARINE_2
equipment_color = "#ffc32d"
@@ -132,6 +132,10 @@
radio_freq = BRAVO_FREQ
minimap_color = MINIMAP_SQUAD_BRAVO
+ active = FALSE
+ roundstart = FALSE
+ locked = TRUE
+
/datum/squad/marine/charlie
name = SQUAD_MARINE_3
equipment_color = "#c864c8"
@@ -140,6 +144,11 @@
radio_freq = CHARLIE_FREQ
minimap_color = MINIMAP_SQUAD_CHARLIE
+ active = FALSE
+ roundstart = FALSE
+ locked = TRUE
+*/
+
/datum/squad/marine/delta
name = SQUAD_MARINE_4
equipment_color = "#4148c8"
@@ -148,6 +157,7 @@
radio_freq = DELTA_FREQ
minimap_color = MINIMAP_SQUAD_DELTA
+
/datum/squad/marine/echo
name = SQUAD_MARINE_5
equipment_color = "#67d692"
diff --git a/code/game/jobs/role_authority.dm b/code/game/jobs/role_authority.dm
index d1934c597da7..10b30d95e487 100644
--- a/code/game/jobs/role_authority.dm
+++ b/code/game/jobs/role_authority.dm
@@ -63,7 +63,6 @@ var/global/players_preassigned = 0
/datum/job/special/uaac,
/datum/job/special/uaac/tis,
/datum/job/special/uscm,
- /datum/job/command/tank_crew //Rip VC
)
var/squads_all[] = typesof(/datum/squad) - /datum/squad
var/castes_all[] = subtypesof(/datum/caste_datum)
diff --git a/code/game/jobs/slot_scaling.dm b/code/game/jobs/slot_scaling.dm
index 7230f57eb745..a11029be746c 100644
--- a/code/game/jobs/slot_scaling.dm
+++ b/code/game/jobs/slot_scaling.dm
@@ -13,40 +13,40 @@
return round(Clamp((marine_count/factor)+c, min, max))
/proc/medic_slot_formula(playercount)
- return job_slot_formula(playercount,40,1,3,5)
+ return job_slot_formula(playercount,20,1,3,5)
/proc/engi_slot_formula(playercount)
- return job_slot_formula(playercount,50,1,2,4)
+ return job_slot_formula(playercount,25,1,2,4)
/proc/mp_slot_formula(playercount)
return job_slot_formula(playercount,25,2,4,8)
/proc/so_slot_formula(playercount)
- return job_slot_formula(playercount,40,1,2,5)
+ return job_slot_formula(playercount,20,1,2,5)
/proc/doc_slot_formula(playercount)
- return job_slot_formula(playercount,25,1,4,6)
+ return job_slot_formula(playercount,15,1,4,6)
/proc/rsc_slot_formula(playercount)
- return job_slot_formula(playercount,40,1,2,3)
+ return job_slot_formula(playercount,20,1,2,3)
/proc/ot_slot_formula(playercount)
- return job_slot_formula(playercount,60,1,2,3)
+ return job_slot_formula(playercount,30,1,2,3)
/proc/ct_slot_formula(playercount)
- return job_slot_formula(playercount,30,0,2,3)
+ return job_slot_formula(playercount,15,0,2,3)
/proc/int_slot_formula(playercount)
- return job_slot_formula(playercount,30,1,1,3)
+ return job_slot_formula(playercount,15,1,1,3)
/proc/spec_slot_formula(playercount)
- return job_slot_formula(playercount,20,1,2,4)
+ return job_slot_formula(playercount,15,1,2,4)
/proc/sg_slot_formula(playercount)
- return job_slot_formula(playercount,20,1,2,4)
+ return job_slot_formula(playercount,15,1,2,4)
/proc/synth_slot_formula(playercount)
- return job_slot_formula(playercount,120,1,1,2)
+ return job_slot_formula(playercount,60,1,1,2)
/proc/working_joe_slot_formula(playercount)
- return job_slot_formula(playercount,30,1,3,6)
+ return job_slot_formula(playercount,15,1,3,6)
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index eb9aed4f71e4..463bb6b02d49 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -342,6 +342,8 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li
set_name = "Scout Set"
if(SKILL_SPEC_SNIPER)
set_name = "Sniper Set"
+ if(SKILL_SPEC_ST)
+ set_name = "Stormtrooper Set"
if(set_name && !available_specialist_sets.Find(set_name))
available_specialist_sets += set_name
diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm
index da4ad01c086b..e6dccbdedbac 100644
--- a/code/game/machinery/doors/multi_tile.dm
+++ b/code/game/machinery/doors/multi_tile.dm
@@ -353,8 +353,8 @@
/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override)
. = ..()
- if(istype(port, /obj/docking_port/mobile/lifeboat))
- var/obj/docking_port/mobile/lifeboat/lifeboat = port
+ if(istype(port, /obj/docking_port/mobile/crashable/lifeboat))
+ var/obj/docking_port/mobile/crashable/lifeboat/lifeboat = port
lifeboat.doors += src
/// External airlock that is part of the lifeboat dock
diff --git a/code/game/machinery/medical_pod/autodoc.dm b/code/game/machinery/medical_pod/autodoc.dm
index 7049df4c661c..a9c07c1be972 100644
--- a/code/game/machinery/medical_pod/autodoc.dm
+++ b/code/game/machinery/medical_pod/autodoc.dm
@@ -243,6 +243,10 @@
if(H.disfigured)
surgery_list += create_autodoc_surgery(L,LIMB_SURGERY,"facial")
+ if(istype(L,/obj/limb/chest))
+ if(locate(/obj/item/alien_embryo) in M.contents)
+ surgery_list += create_autodoc_surgery(L,LIMB_SURGERY,"shrapnel")
+
if(L.status & LIMB_BROKEN)
surgery_list += create_autodoc_surgery(L,LIMB_SURGERY,"broken")
if(L.status & LIMB_DESTROYED)
@@ -253,7 +257,8 @@
if(!is_type_in_list(I,known_implants))
surgery_list += create_autodoc_surgery(L,LIMB_SURGERY,"shrapnel")
if(M.incision_depths[L.name] != SURGERY_DEPTH_SURFACE)
- surgery_list += create_autodoc_surgery(L,LIMB_SURGERY,"open")
+ surgery_list += create_autodoc_surgery(L,LIMB_SURGERY,"open")
+
var/datum/internal_organ/I = M.internal_organs_by_name["eyes"]
if(I && (M.disabilities & NEARSIGHTED || M.sdisabilities & DISABILITY_BLIND || I.damage > 0))
surgery_list += create_autodoc_surgery(null,ORGAN_SURGERY,"eyes",0,I)
@@ -477,13 +482,13 @@
H.UpdateDamageIcon()
if("shrapnel")
- if(prob(30)) visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Beginning shrapnel removal.");
+ if(prob(30)) visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Beginning foreign bodies removal.");
if(S.unneeded)
sleep(UNNEEDED_DELAY)
visible_message("[icon2html(src, viewers(src))] \The [src] speaks: Procedure has been deemed unnecessary.");
surgery_todo_list -= S
continue
-
+
open_incision(H,S.limb_ref)
if(S.limb_ref.name == "chest" || S.limb_ref.name == "head")
open_encased(H,S.limb_ref)
@@ -495,6 +500,11 @@
S.limb_ref.implants -= I
H.embedded_items -= I
qdel(I)
+ var/obj/item/larva_ref = locate(/obj/item/alien_embryo) in H.contents
+ if(S.limb_ref.name == "chest" && larva_ref)
+ sleep(REMOVE_OBJECT_MAX_DURATION*surgery_mod)
+ H.contents -= larva_ref
+ qdel(larva_ref)
if(S.limb_ref.name == "chest" || S.limb_ref.name == "head")
close_encased(H,S.limb_ref)
if(!surgery) break
@@ -713,7 +723,7 @@
dat += "Limb Replacement Surgery"
if("shrapnel")
surgeryqueue["shrapnel"] = 1
- dat += "Shrapnel Removal Surgery"
+ dat += "Foreign Bodies Removal Surgery"
if("facial")
surgeryqueue["facial"] = 1
dat += "Facial Reconstruction Surgery"
@@ -733,7 +743,9 @@
if(isnull(surgeryqueue["open"]))
dat += "Close Open Incisions
"
if(isnull(surgeryqueue["shrapnel"]))
- dat += "Shrapnel Removal Surgery
"
+ dat += "Foreign Bodies Removal Surgery
"
+ if(isnull(surgeryqueue["facial"]))
+ dat += "Facial Reconstruction Surgery
"
dat += "Hematology Treatments"
dat += "
"
if(isnull(surgeryqueue["blood"]))
@@ -742,9 +754,18 @@
dat += "Dialysis
"
if(isnull(surgeryqueue["toxin"]))
dat += "Bloodstream Toxin Removal
"
+ dat += "Internal Surgery"
dat += "
"
+ if(isnull((surgeryqueue["organdamage"])))
+ dat += "Organ Treatment Procedure
"
+ if(isnull((surgeryqueue["internal"])))
+ dat += "Internal Bleeding Surgery
"
+ if(isnull((surgeryqueue["broken"])))
+ dat += "Bone Repair Treatment
"
+ if(isnull((surgeryqueue["missing"])))
+ dat += "Limb Replacement Surgery
"
else
- dat += "The autodoc is empty."
+ dat += "
The autodoc is empty."
dat += text("Close", user)
show_browser(user, dat, "Auto-Doc Medical System", "sleeper", "size=300x400")
onclose(user, "sleeper")
@@ -840,6 +861,9 @@
if(!is_type_in_list(I,known_implants))
N.fields["autodoc_manual"] += create_autodoc_surgery(L,LIMB_SURGERY,"shrapnel")
needed++
+ if(istype(L,/obj/limb/chest) && locate(/obj/item/alien_embryo) in connected.occupant.contents)
+ N.fields["autodoc_manual"] += create_autodoc_surgery(L,LIMB_SURGERY,"shrapnel")
+ needed++
if(!needed)
N.fields["autodoc_manual"] += create_autodoc_surgery(null,LIMB_SURGERY,"shrapnel",1)
updateUsrDialog()
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index f8250fad271c..0a5b639d864a 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -82,7 +82,7 @@
/proc/Broadcast_Message(datum/radio_frequency/connection, mob/M,
vmask, vmessage, obj/item/device/radio/radio,
message, name, job, realname, vname,
- data, compression, list/level, freq, verbage = "says",
+ data, compression, list/level, freq, verbage = "говорит",
datum/language/speaking = null, volume = RADIO_VOLUME_QUIET)
/* ###### Prepare the radio connection ###### */
@@ -222,7 +222,7 @@
// --- Some more pre-message formatting ---
var/part_b_extra = ""
if(data == 3) // intercepted radio message
- part_b_extra = " (Intercepted)"
+ part_b_extra = " (ПЕРЕХВАЧЕНО)"
var/part_b = " [icon2html(radio, (heard_masked + heard_normal + heard_voice + heard_garbled + heard_gibberish))]\[[freq_text]\][part_b_extra] " // Tweaked for security headsets -- TLE
if(display_freq in M.important_radio_channels)
diff --git a/code/game/machinery/vending/cm_vending.dm b/code/game/machinery/vending/cm_vending.dm
index bf7c4fffee65..fa1892729663 100644
--- a/code/game/machinery/vending/cm_vending.dm
+++ b/code/game/machinery/vending/cm_vending.dm
@@ -502,6 +502,9 @@ GLOBAL_LIST_EMPTY(vending_products)
if("Pyro Set")
user.skills.set_skill(SKILL_SPEC_WEAPONS, SKILL_SPEC_PYRO)
specialist_assignment = "Pyro"
+ if("Stormtrooper Set")
+ user.skills.set_skill(SKILL_SPEC_WEAPONS, SKILL_SPEC_ST)
+ specialist_assignment = "ST"
else
to_chat(user, SPAN_WARNING("Something bad occured with [src], tell a Dev."))
vend_fail()
diff --git a/code/game/machinery/vending/vending_types.dm b/code/game/machinery/vending/vending_types.dm
index a61934324491..d7334a26e9aa 100644
--- a/code/game/machinery/vending/vending_types.dm
+++ b/code/game/machinery/vending/vending_types.dm
@@ -395,15 +395,9 @@
products = list(
/obj/item/device/cassette_tape/pop1 = 10,
- /obj/item/device/cassette_tape/hiphop = 10,
- /obj/item/device/cassette_tape/nam = 10,
- /obj/item/device/cassette_tape/ocean = 10,
- /obj/item/device/cassette_tape/pop3 = 10,
- /obj/item/device/cassette_tape/pop4 = 10,
/obj/item/device/cassette_tape/pop2 = 10,
- /obj/item/device/cassette_tape/heavymetal = 10,
- /obj/item/device/cassette_tape/hairmetal = 10,
- /obj/item/device/cassette_tape/indie = 10,
+ /obj/item/device/cassette_tape/pop3 = 10,
+ /obj/item/device/cassette_tape/heavymetal = 5,
/obj/item/device/walkman = 50,
/obj/item/storage/pouch/cassette = 15,
/obj/item/toy/deck = 5,
@@ -417,15 +411,9 @@
prices = list(
/obj/item/device/cassette_tape/pop1 = 5,
- /obj/item/device/cassette_tape/hiphop = 5,
- /obj/item/device/cassette_tape/nam = 5,
- /obj/item/device/cassette_tape/ocean = 6,
- /obj/item/device/cassette_tape/pop3 = 5,
- /obj/item/device/cassette_tape/pop4 = 5,
/obj/item/device/cassette_tape/pop2 = 5,
+ /obj/item/device/cassette_tape/pop3 = 5,
/obj/item/device/cassette_tape/heavymetal = 5,
- /obj/item/device/cassette_tape/hairmetal = 5,
- /obj/item/device/cassette_tape/indie = 5,
/obj/item/device/walkman = 15,
/obj/item/storage/pouch/cassette = 10,
/obj/item/toy/deck = 20,
diff --git a/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm b/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm
index 891a2a907b39..7f657a058db1 100644
--- a/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm
+++ b/code/game/machinery/vending/vendor_types/crew/vehicle_crew.dm
@@ -16,7 +16,6 @@
vend_sound = 'sound/machines/medevac_extend.ogg'
var/selected_vehicle
- var/budget_points = 0
var/available_categories = VEHICLE_ALL_AVAILABLE
available_points_to_display = 0
@@ -51,12 +50,17 @@
malfunction()
return
-/obj/structure/machinery/cm_vending/gear/vehicle_crew/proc/populate_products(datum/source, obj/vehicle/multitile/V)
+/obj/structure/machinery/cm_vending/gear/vehicle_crew/proc/populate_products(datum/source, datum/vehicle_order/VO)
SIGNAL_HANDLER
UnregisterSignal(SSdcs, COMSIG_GLOB_VEHICLE_ORDERED)
- selected_vehicle = "APC"
- available_categories &= ~(VEHICLE_ARMOR_AVAILABLE|VEHICLE_INTEGRAL_AVAILABLE) //APC lacks these, so we need to remove these flags to be able to access spare parts section
+ available_categories = VEHICLE_ALL_AVAILABLE
+
+ if(istype(VO, /datum/vehicle_order/tank))
+ selected_vehicle = "TANK"
+ else if(istype(VO, /datum/vehicle_order/apc))
+ selected_vehicle = "APC"
+ available_categories &= ~(VEHICLE_ARMOR_AVAILABLE|VEHICLE_INTEGRAL_AVAILABLE) //APC lacks these, so we need to remove these flags to be able to access spare parts section
/obj/structure/machinery/cm_vending/gear/vehicle_crew/get_listed_products(mob/user)
var/list/display_list = list()
@@ -86,7 +90,7 @@
. += ui_static_data(user)
if(supply_controller.tank_points) //we steal points from supply_controller, meh-he-he. Solely to be able to modify amount of points in vendor if needed by just changing one var.
- available_points_to_display = supply_controller.tank_points
+ available_points_to_display += supply_controller.tank_points
supply_controller.tank_points = 0
.["current_m_points"] = available_points_to_display
@@ -97,7 +101,7 @@
var/prod_available = FALSE
var/p_cost = myprod[2]
var/avail_flag = myprod[4]
- if(budget_points >= p_cost && (!avail_flag || available_categories & avail_flag))
+ if(available_points_to_display >= p_cost && (!avail_flag || available_categories & avail_flag))
prod_available = TRUE
stock_values += list(prod_available)
@@ -116,7 +120,7 @@
to_chat(H, SPAN_WARNING("Not enough points."))
vend_fail()
return FALSE
- budget_points -= L[2]
+ available_points_to_display -= L[2]
/obj/structure/machinery/cm_vending/gear/vehicle_crew/get_appropriate_vend_turf(mob/living/carbon/human/H)
var/turf/T = get_turf(src)
diff --git a/code/game/machinery/vending/vendor_types/general.dm b/code/game/machinery/vending/vendor_types/general.dm
index f4f6aa42aaf1..d4cf6876f53f 100644
--- a/code/game/machinery/vending/vendor_types/general.dm
+++ b/code/game/machinery/vending/vendor_types/general.dm
@@ -13,15 +13,9 @@
GLOBAL_LIST_INIT(cm_vending_walkman, list(
list("WALKMAN", -1, null, null),
list("Blue Cassette", 10, /obj/item/device/cassette_tape/pop1, VENDOR_ITEM_REGULAR),
- list("Blue Stripe Cassette", 10, /obj/item/device/cassette_tape/hiphop, VENDOR_ITEM_REGULAR),
- list("Green Cassette", 10, /obj/item/device/cassette_tape/nam, VENDOR_ITEM_REGULAR),
- list("Ocean Cassette", 10, /obj/item/device/cassette_tape/ocean, VENDOR_ITEM_REGULAR),
list("Orange Cassette", 10, /obj/item/device/cassette_tape/pop3, VENDOR_ITEM_REGULAR),
- list("Pink Cassette", 10, /obj/item/device/cassette_tape/pop4, VENDOR_ITEM_REGULAR),
list("Rainbow Cassette", 10, /obj/item/device/cassette_tape/pop2, VENDOR_ITEM_REGULAR),
list("Red-Black Cassette", 10, /obj/item/device/cassette_tape/heavymetal, VENDOR_ITEM_REGULAR),
- list("Red Striped Cassette", 10, /obj/item/device/cassette_tape/hairmetal, VENDOR_ITEM_REGULAR),
- list("Rising Sun Cassette", 10, /obj/item/device/cassette_tape/indie, VENDOR_ITEM_REGULAR),
list("Walkman", 50, /obj/item/device/walkman, VENDOR_ITEM_REGULAR),
list("Cassette Pouch", 15, /obj/item/storage/pouch/cassette, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm
index b09ae4aa15c5..e95d9c9dc697 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm
@@ -6,6 +6,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_spec, list(
list("Heavy Grenadier Set", 0, /obj/item/storage/box/spec/heavy_grenadier, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR),
list("Pyro Set", 0, /obj/item/storage/box/spec/pyro, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR),
list("Scout Set", 0, /obj/item/storage/box/spec/scout, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR),
+ list("Stormtrooper Set", 0, /obj/item/storage/box/spec/st, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR),
list("Sniper Set", 0, /obj/item/storage/box/spec/sniper, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_RECOMMENDED),
list("EXTRA SCOUT AMMUNITION", 0, null, null, null),
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm
index 4f64ca7e81fa..43502952732a 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm
@@ -80,6 +80,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_tl, list(
list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY),
list("Map", 0, /obj/item/map/current_map, MARINE_CAN_BUY_KIT, VENDOR_ITEM_MANDATORY),
list("Essential Fireteam Leader Utilities", 0, /obj/effect/essentials_set/tl, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY),
+ list("USCM Radio Telephone Pack", 0, /obj/item/storage/backpack/marine/satchel/rto, MARINE_CAN_BUY_BACKPACK, VENDOR_ITEM_MANDATORY),
list("BELT (CHOOSE 1)", 0, null, null, null),
list("G8-A General Utility Pouch", 0, /obj/item/storage/backpack/general_belt, MARINE_CAN_BUY_BELT, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/supplies.dm b/code/game/machinery/vending/vendor_types/supplies.dm
index 2a2f35de8c19..376edf7ffc5d 100644
--- a/code/game/machinery/vending/vendor_types/supplies.dm
+++ b/code/game/machinery/vending/vendor_types/supplies.dm
@@ -23,8 +23,6 @@
list("FOOD AND BEVERAGE", -1, null, null),
list("MRE", 25, /obj/item/storage/box/MRE, VENDOR_ITEM_REGULAR),
list("Water Bottle", 25, /obj/item/reagent_container/food/drinks/cans/waterbottle, VENDOR_ITEM_REGULAR),
- list("Aspen Beer", 10, /obj/item/storage/beer_pack, VENDOR_ITEM_REGULAR),//NOTE TO SELF, LOCK THIS ALCOHOL BEHIND SHIP ESCAPE
- list("Wey-Yu Sake", 5, /obj/item/reagent_container/food/drinks/bottle/sake, VENDOR_ITEM_REGULAR),
list("UTILITY", -1, null, null),
list("M94 Marking Flare Pack", 5, /obj/item/storage/box/m94, VENDOR_ITEM_REGULAR),
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 80254be4a6d9..f497bc20ba83 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -368,6 +368,7 @@ cases. Override_icon_state should be a list.*/
/obj/item/proc/pickup(mob/user, silent)
SHOULD_CALL_PARENT(TRUE)
SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user)
+ SEND_SIGNAL(user, COMSIG_MOB_PICKUP_ITEM, src)
setDir(SOUTH)//Always rotate it south. This resets it to default position, so you wouldn't be putting things on backwards
if(pickup_sound && !silent && src.loc?.z)
playsound(src, pickup_sound, pickupvol, pickup_vary)
@@ -635,6 +636,8 @@ cases. Override_icon_state should be a list.*/
return FALSE
if(flags_equip_slot & SLOT_SUIT_STORE)
return TRUE
+ if(flags_equip_slot & SLOT_BLOCK_SUIT_STORE)
+ return FALSE
if(!H.wear_suit && (WEAR_JACKET in mob_equip))
if(!disable_warning)
to_chat(H, SPAN_WARNING("You need a suit before you can attach this [name]."))
diff --git a/code/game/objects/items/circuitboards/computer.dm b/code/game/objects/items/circuitboards/computer.dm
index d754ada57ca1..84c9eaae63ad 100644
--- a/code/game/objects/items/circuitboards/computer.dm
+++ b/code/game/objects/items/circuitboards/computer.dm
@@ -189,17 +189,14 @@
name = "Circuit board (vehicle ASRS console)"
build_path = /obj/structure/machinery/computer/supplycomp/vehicle
var/spent = FALSE //so that they can't just reconstruct the console to get another APC
- var/tank_unlocked = FALSE
/obj/item/circuitboard/computer/supplycomp/vehicle/construct(obj/structure/machinery/computer/supplycomp/vehicle/SCV)
if (..(SCV))
SCV.spent = spent
- SCV.tank_unlocked = tank_unlocked
/obj/item/circuitboard/computer/supplycomp/vehicle/disassemble(obj/structure/machinery/computer/supplycomp/vehicle/SCV)
if (..(SCV))
spent = SCV.spent
- tank_unlocked = SCV.tank_unlocked
/obj/item/circuitboard/computer/operating
name = "Circuit board (Operating Computer)"
diff --git a/code/game/objects/items/devices/device.dm b/code/game/objects/items/devices/device.dm
index 148d47249201..d3058960233c 100644
--- a/code/game/objects/items/devices/device.dm
+++ b/code/game/objects/items/devices/device.dm
@@ -5,7 +5,7 @@
icon = 'icons/obj/items/devices.dmi'
var/serial_number
-/obj/item/device/Initialize()
+/obj/item/device/Initialize(mapload, ...)
. = ..()
serial_number = "[rand(0,9)][pick(alphabet_uppercase)][rand(0,9)][rand(0,9)][rand(0,9)][rand(0,9)][pick(alphabet_uppercase)]"
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 2092ffa108c6..75e414690113 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -206,7 +206,7 @@
// If we were to send to a channel we don't have, drop it.
return null
-/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel, verb = "says", datum/language/speaking = null)
+/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel, verb = "говорит", datum/language/speaking = null)
if(!on) return // the device has to be on
// Fix for permacell radios, but kinda eh about actually fixing them.
if(!M || !message) return
@@ -328,7 +328,7 @@
return null
return target_zs
-/obj/item/device/radio/hear_talk(mob/M as mob, msg, verb = "says", datum/language/speaking = null)
+/obj/item/device/radio/hear_talk(mob/M as mob, msg, verb = "говорит", datum/language/speaking = null)
if (broadcasting)
if(get_dist(src, M) <= canhear_range)
talk_into(M, msg,null,verb,speaking)
diff --git a/code/game/objects/items/devices/vulture_spotter.dm b/code/game/objects/items/devices/vulture_spotter.dm
new file mode 100644
index 000000000000..b89009efde7e
--- /dev/null
+++ b/code/game/objects/items/devices/vulture_spotter.dm
@@ -0,0 +1,41 @@
+/obj/item/device/vulture_spotter_scope
+ name = "\improper M707 spotter scope"
+ desc = "A scope that, when mounted on a tripod, allows a user to assist the M707's firer in target acquisition."
+ icon_state = "vulture_scope"
+ item_state = "electronic"
+ flags_atom = FPRINT|CONDUCT
+ unacidable = TRUE
+ indestructible = TRUE
+ /// A weakref to the corresponding rifle
+ var/datum/weakref/bound_rifle
+
+/obj/item/device/vulture_spotter_scope/Initialize(mapload, datum/weakref/rifle)
+ . = ..()
+ if(rifle)
+ bound_rifle = rifle
+
+/obj/item/device/vulture_spotter_scope/attack_self(mob/user)
+ . = ..()
+ to_chat(user, SPAN_WARNING("[src] needs to be mounted on a tripod to use!"))
+
+/obj/item/device/vulture_spotter_tripod
+ name = "\improper M707 spotter tripod"
+ desc = "A tripod, meant for stabilizing a spotting scope for the M707 anti-materiel rifle."
+ icon_state = "vulture_tripod"
+ item_state = "electronic"
+ flags_atom = FPRINT|CONDUCT
+ unacidable = TRUE
+ indestructible = TRUE
+
+/obj/item/device/vulture_spotter_tripod/get_examine_text(mob/user)
+ . = ..()
+ . += SPAN_NOTICE("[src] can be set down by using in-hand.")
+
+/obj/item/device/vulture_spotter_tripod/attack_self(mob/user)
+ . = ..()
+ user.balloon_alert(user, "setting up tripod...")
+ if(!do_after(user, 1.5 SECONDS, target = user))
+ return
+
+ new /obj/structure/vulture_spotter_tripod(get_turf(user))
+ qdel(src)
diff --git a/code/game/objects/items/devices/walkman.dm b/code/game/objects/items/devices/walkman.dm
index 2bbcb802d426..ab376f14588a 100644
--- a/code/game/objects/items/devices/walkman.dm
+++ b/code/game/objects/items/devices/walkman.dm
@@ -335,7 +335,7 @@
/obj/item/device/cassette_tape/pop1
name = "blue cassette"
id = 2
- desc = "A plastic cassette tape with a blue sticker."
+ desc = "A plastic cassette tape with a blue sticker.\nFrom 13th with love."
icon_state = "cassette_blue"
side1_icon = "cassette_blue"
songs = list("side1" = list("sound/music/walkman/pop1/1-1-1.ogg",\
@@ -348,7 +348,7 @@
/obj/item/device/cassette_tape/pop2
name = "rainbow cassette"
id = 3
- desc = "A plastic cassette tape with a rainbow-colored sticker."
+ desc = "A plastic cassette tape with a rainbow-colored sticker.\nFrom 13th with love."
icon_state = "cassette_rainbow"
side1_icon = "cassette_rainbow"
songs = list("side1" = list("sound/music/walkman/pop2/2-1-1.ogg",\
@@ -361,7 +361,7 @@
/obj/item/device/cassette_tape/pop3
name = "orange cassette"
id = 4
- desc = "A plastic cassette tape with an orange sticker."
+ desc = "A plastic cassette tape with an orange sticker.\nFrom shizoidov with love."
icon_state = "cassette_orange"
side1_icon = "cassette_orange"
songs = list("side1" = list("sound/music/walkman/pop3/3-1-1.ogg",\
@@ -374,7 +374,7 @@
/obj/item/device/cassette_tape/pop4
name = "pink cassette"
id = 5
- desc = "A plastic cassette tape with a pink striped sticker."
+ desc = "A plastic cassette tape with a pink striped sticker.\nSeems empty."
icon_state = "cassette_pink_stripe"
side1_icon = "cassette_pink_stripe"
songs = list("side1" = list("sound/music/walkman/pop4/4-1-1.ogg",\
@@ -400,7 +400,7 @@
/obj/item/device/cassette_tape/hairmetal
name = "red striped cassette"
id = 7
- desc = "A plastic cassette tape with a gray sticker with red stripes."
+ desc = "A plastic cassette tape with a gray sticker with red stripes.\nSeems empty."
icon_state = "cassette_red_stripe"
side1_icon = "cassette_red_stripe"
songs = list("side1" = list("sound/music/walkman/hairmetal/6-1-1.ogg",\
@@ -413,7 +413,7 @@
/obj/item/device/cassette_tape/indie
name = "rising sun cassette"
id = 8
- desc = "A plastic cassette tape with the Japanese Rising Sun."
+ desc = "A plastic cassette tape with the Japanese Rising Sun.\nSeems empty."
icon_state = "cassette_rising_sun"
side1_icon = "cassette_rising_sun"
songs = list("side1" = list("sound/music/walkman/indie/7-1-1.ogg",\
@@ -426,7 +426,7 @@
/obj/item/device/cassette_tape/hiphop
name = "blue stripe cassette"
id = 9
- desc = "An orange plastic cassette tape with a blue stripe."
+ desc = "An orange plastic cassette tape with a blue stripe.\nSeems empty."
icon_state = "cassette_orange_blue"
side1_icon = "cassette_orange_blue"
songs = list("side1" = list("sound/music/walkman/hiphop/8-1-1.ogg",\
@@ -439,7 +439,7 @@
/obj/item/device/cassette_tape/nam
name = "green cassette"
id = 10
- desc = "A green plastic cassette tape."
+ desc = "A green plastic cassette tape.\nSeems empty."
icon_state = "cassette_green"
side1_icon = "cassette_green"
songs = list("side1" = list("sound/music/walkman/nam/9-1-1.ogg",\
@@ -452,7 +452,7 @@
/obj/item/device/cassette_tape/ocean
name = "ocean cassette"
id = 11
- desc = "A blue and white plastic cassette tape."
+ desc = "A blue and white plastic cassette tape.\nSeems empty."
icon_state = "cassette_ocean"
side1_icon = "cassette_ocean"
songs = list("side1" = list("sound/music/walkman/surf/10-1-1.ogg",\
@@ -468,7 +468,7 @@
/obj/item/device/cassette_tape/aesthetic
name = "aesthetic cassette"
id = 12
- desc = "An aesthetic looking cassette tape. 'Jacket' is written on the front."
+ desc = "An aesthetic looking cassette tape. 'Jacket' is written on the front.\nSeems empty."
icon_state = "cassette_aesthetic"
side1_icon = "cassette_aesthetic"
@@ -476,7 +476,7 @@
/obj/item/device/cassette_tape/cargocrate
name = "weyland yutani cassette"
id = 13
- desc = "A blue metallic cassette with a weyland yutani logo."
+ desc = "A blue metallic cassette with a weyland yutani logo.\nSeems empty."
icon_state = "cassette_wy"
side1_icon = "cassette_wy"
@@ -484,7 +484,7 @@
/obj/item/device/cassette_tape/solaris
name = "red UCP cassette"
id = 14
- desc = "A cassette with a red UCP camo design."
+ desc = "A cassette with a red UCP camo design.\nSeems empty."
icon_state = "cassette_solaris"
side1_icon = "cassette_solaris"
@@ -492,27 +492,27 @@
/obj/item/device/cassette_tape/icecolony
name = "frozen cassette"
id = 15
- desc = "A cassette. It's covered in ice and snow."
+ desc = "A cassette. It's covered in ice and snow.\nSeems empty."
icon_state = "cassette_ice"
side1_icon = "cassette_ice"
/obj/item/device/cassette_tape/lz
name = "nostalgic cassette"
id = 16
- desc = "There's a cut up postcard taped to this cassette. You know this place."
+ desc = "There's a cut up postcard taped to this cassette. You know this place.\nSeems empty."
icon_state = "cassette_lz"
side1_icon = "cassette_lz"
/obj/item/device/cassette_tape/desertdam
name = "dam cassette"
id = 17
- desc = "Attached to this cassette is a picture of a dam."
+ desc = "Attached to this cassette is a picture of a dam.\nSeems empty."
icon_state = "cassette_dam"
side1_icon = "cassette_dam"
/obj/item/device/cassette_tape/prison
name = "broken cassette"
id = 18
- desc = "The shell on this cassette is broken, it still looks like it'll work, though!"
+ desc = "The shell on this cassette is broken, it still looks like it'll work, though!\nSeems empty."
icon_state = "cassette_worstmap"
side1_icon = "cassette_worstmap"
diff --git a/code/game/objects/items/pamphlets.dm b/code/game/objects/items/pamphlets.dm
index dd96f275ef17..682215be67bb 100644
--- a/code/game/objects/items/pamphlets.dm
+++ b/code/game/objects/items/pamphlets.dm
@@ -186,3 +186,38 @@
desc = "A piece of paper covered in crude depictions of bananas and various types of primates. Probably drawn by a three-year-old child - or an unusually intelligent marine."
trait = /datum/character_trait/language/primitive
+
+/obj/item/pamphlet/trait
+ bypass_pamphlet_limit = TRUE
+ /// What trait to give the user
+ var/trait_to_give
+
+/obj/item/pamphlet/trait/can_use(mob/living/carbon/human/user)
+ if(!istype(user))
+ return FALSE
+
+ if(HAS_TRAIT(user, trait_to_give))
+ to_chat(user, SPAN_WARNING("You know this already!"))
+ return FALSE
+
+ if(user.job != JOB_SQUAD_MARINE)
+ to_chat(user, SPAN_WARNING("Only squad riflemen can use this."))
+ return FALSE
+
+ if(user.has_used_pamphlet && !bypass_pamphlet_limit)
+ to_chat(user, SPAN_WARNING("You've already used a pamphlet!"))
+ return FALSE
+
+ return TRUE
+
+/obj/item/pamphlet/trait/on_use(mob/living/carbon/human/user)
+ to_chat(user, SPAN_NOTICE(flavour_text))
+ ADD_TRAIT(user, trait_to_give, "pamphlet")
+ if(!bypass_pamphlet_limit)
+ user.has_used_pamphlet = TRUE
+
+/obj/item/pamphlet/trait/vulture
+ name = "\improper M707 instructional pamphlet"
+ desc = "A pamphlet used to quickly impart vital knowledge of how to shoot big guns and spot for them."
+ icon_state = "pamphlet_vulture"
+ trait_to_give = TRAIT_VULTURE_USER
diff --git a/code/game/objects/items/props/helmetgarb.dm b/code/game/objects/items/props/helmetgarb.dm
index 661c8d422316..00f2c9a0978e 100644
--- a/code/game/objects/items/props/helmetgarb.dm
+++ b/code/game/objects/items/props/helmetgarb.dm
@@ -396,7 +396,7 @@
to_chat(user, SPAN_WARNING("You cannot use \the [src] when they are hidden."))
return
- if(user.client.view > 7 && shape != NVG_SHAPE_COSMETIC)
+ if(user.client.view > 7 && shape != NVG_SHAPE_COSMETIC && !istype(user.buckled, /obj/structure/bed/chair/comfy/vehicle))
to_chat(user, SPAN_WARNING("You cannot use \the [src] while using optics."))
return
diff --git a/code/game/objects/items/reagent_containers/syringes.dm b/code/game/objects/items/reagent_containers/syringes.dm
index 06cbb559360c..1166a18d4faa 100644
--- a/code/game/objects/items/reagent_containers/syringes.dm
+++ b/code/game/objects/items/reagent_containers/syringes.dm
@@ -254,7 +254,7 @@
return
var/hit_area = affecting.display_name
- if((user != target) && H.check_shields(7, "the [src.name]"))
+ if((user != target) && H.check_shields(7, "the [src.name]", attacker_dir = get_dir(user,target)))
return
if (target != user && target.getarmor(target_zone, ARMOR_MELEE) > 5 && prob(50))
diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm
index cdab7db87ed7..cb390fb89fec 100644
--- a/code/game/objects/items/weapons/swords_axes_etc.dm
+++ b/code/game/objects/items/weapons/swords_axes_etc.dm
@@ -94,7 +94,7 @@
return
/obj/item/weapon/telebaton/proc/stun(mob/living/carbon/human/target, mob/living/user)
- if(target.check_shields(src, 0, "[user]'s [name]"))
+ if(target.check_shields(src, 0, "[user]'s [name]", get_dir(user,target)))
return FALSE
// Visuals and sound
playsound(target, 'sound/weapons/baton.ogg', 50, TRUE, 7)
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 9ef2f6f716b1..9b0b8cf30aae 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -15,7 +15,7 @@
projectile_coverage = PROJECTILE_COVERAGE_MEDIUM
can_block_movement = TRUE
-/obj/structure/Initialize()
+/obj/structure/Initialize(mapload, ...)
. = ..()
if(climbable)
verbs += /obj/structure/proc/climb_on
diff --git a/code/game/objects/structures/crates_lockers/secure_crates.dm b/code/game/objects/structures/crates_lockers/secure_crates.dm
index 0bd77d877ee6..a308c4c0a21c 100644
--- a/code/game/objects/structures/crates_lockers/secure_crates.dm
+++ b/code/game/objects/structures/crates_lockers/secure_crates.dm
@@ -176,6 +176,18 @@
icon_locked = "secure_locked_weyland"
icon_unlocked = "secure_unlocked_weyland"
+/obj/structure/closet/crate/secure/vulture
+ name = "secure M707 crate"
+ desc = "A secure crate, containing an M707 anti-materiel rifle."
+ icon_state = "secure_locked_vulture"
+ icon_opened = "secure_open_vulture"
+ icon_locked = "secure_locked_vulture"
+ icon_unlocked = "secure_unlocked_vulture"
+
+/obj/structure/closet/crate/secure/vulture/Initialize()
+ . = ..()
+ new /obj/item/storage/box/guncase/vulture(src)
+
//special version, able to store OB fuel and warheads only
/obj/structure/closet/crate/secure/ob
name = "secure orbital bombardment ammunition crate"
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index 4e2413a50f40..d47537743111 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -526,24 +526,6 @@ ICEY GRASS. IT LOOKS LIKE IT'S MADE OF ICE.
/// For things that might affect someone/everyone's round if hidden.
var/static/blocked_atoms = list(/obj/item/device/cotablet, /obj/item/card/id)
var/static/blacklist_typecache
- //layer shouldn't be put on dmm unless aestetic reason....
- layer = ABOVE_XENO_LAYER
-
-//made for fiorina.
-/obj/structure/flora/pottedplant/pottedplant_27
- icon_state = "pottedplant_27"
-/obj/structure/flora/pottedplant/pottedplant_29
- icon_state = "pottedplant_29"
-/obj/structure/flora/pottedplant/pottedplant_22
- icon_state = "pottedplant_22"
-/obj/structure/flora/pottedplant/pottedplant_21
- icon_state = "pottedplant_21"
-/obj/structure/flora/pottedplant/pottedplant_7
- icon_state = "pottedplant_7"
-/obj/structure/flora/pottedplant/pottedplant_17
- icon_state = "pottedplant_17";
-/obj/structure/flora/pottedplant/pottedplant_18
- icon_state = "pottedplant_18";
/obj/structure/flora/pottedplant/Initialize(mapload)
. = ..()
diff --git a/code/game/objects/structures/misc.dm b/code/game/objects/structures/misc.dm
index e7a3699a87d2..9323bca2877e 100644
--- a/code/game/objects/structures/misc.dm
+++ b/code/game/objects/structures/misc.dm
@@ -73,9 +73,6 @@
anchored = TRUE
layer = ATMOS_PIPE_LAYER + 0.01
-//used on fiorina
-/obj/structure/monorail/launchtrack
- name = "launch track"
//ICE COLONY RESEARCH DECORATION-----------------------//
//Most of icons made by ~Morrinn
@@ -154,18 +151,7 @@
/obj/structure/stairs/perspective //instance these for the required icons
icon = 'icons/obj/structures/stairs/perspective_stairs.dmi'
icon_state = "np_stair"
-//for fiorina
-/obj/structure/stairs/perspective/p_stair_sn_full_cap
- icon_state = "p_stair_sn_full_cap"
-/obj/structure/stairs/perspective/p_stair_full
- icon_state = "p_stair_full"
-
-/obj/structure/stairs/perspective/p_stair_ew_full_cap
- icon_state = "p_stair_ew_full_cap"
-
-/obj/structure/stairs/perspective/p_stair_ew_half_cap
- icon_state = "p_stair_ew_half_cap"
/obj/structure/stairs/perspective/kutjevo
icon = 'icons/obj/structures/stairs/perspective_stairs_kutjevo.dmi'
diff --git a/code/game/objects/structures/vulture_spotter.dm b/code/game/objects/structures/vulture_spotter.dm
new file mode 100644
index 000000000000..a668cb562028
--- /dev/null
+++ b/code/game/objects/structures/vulture_spotter.dm
@@ -0,0 +1,305 @@
+/obj/structure/vulture_spotter_tripod
+ name = "\improper M707 spotting tripod"
+ desc = "A tripod for an M707 anti-materiel rifle's spotting scope."
+ icon_state = "vulture_tripod"
+ density = TRUE
+ anchored = TRUE
+ unacidable = TRUE
+ /// Weakref to the associated rifle
+ var/datum/weakref/bound_rifle
+ /// Weakref to the scope user, if any
+ var/datum/weakref/scope_user
+ /// If the tripod has an attached spotting scope
+ var/scope_attached = FALSE
+ /// If the scope is currently being used
+ var/scope_using = FALSE
+ /// Ref to the action to give the user of the scope
+ var/datum/action/vulture_tripod_unscope/unscope_action
+ /// How far out the scope zooms
+ var/scope_zoom = 10
+ /// How much to increase the user's dark vision by
+ var/darkness_view = 12
+ /// The maximum distance this can be from the sniper scope
+ var/max_sniper_distance = 7
+
+/obj/structure/vulture_spotter_tripod/Initialize(mapload)
+ . = ..()
+ desc = initial(desc) + " Though, it doesn't seem to have one attached yet."
+
+/obj/structure/vulture_spotter_tripod/Destroy()
+ if(scope_user)
+ var/mob/user = scope_user.resolve()
+ user.unset_interaction()
+ QDEL_NULL(unscope_action)
+ return ..()
+
+/obj/structure/vulture_spotter_tripod/deconstruct(disassembled)
+ . = ..()
+ if(scope_attached && bound_rifle)
+ new /obj/item/device/vulture_spotter_scope(get_turf(src), bound_rifle)
+ new /obj/item/device/vulture_spotter_tripod(get_turf(src))
+
+/obj/structure/vulture_spotter_tripod/get_examine_text(mob/user)
+ . = ..()
+ if(scope_attached)
+ . += SPAN_NOTICE("You can remove the scope from [src] with a screwdriver.")
+ else
+ . += SPAN_NOTICE("You can pick up [src] by dragging it to your sprite.")
+ . += SPAN_NOTICE("You can rotate [src] with Alt-click.")
+
+/obj/structure/vulture_spotter_tripod/attackby(obj/item/thing, mob/user)
+ if(istype(thing, /obj/item/device/vulture_spotter_scope))
+ on_scope_attach(user, thing)
+ return
+
+ if(HAS_TRAIT(thing, TRAIT_TOOL_SCREWDRIVER))
+ on_screwdriver(user)
+ return
+
+ return ..()
+
+/obj/structure/vulture_spotter_tripod/MouseDrop(over_object, src_location, over_location)
+ if(!ishuman(usr))
+ return
+ var/mob/living/carbon/human/user = usr //this is us
+
+ if(!HAS_TRAIT(user, TRAIT_VULTURE_USER))
+ to_chat(user, SPAN_WARNING("You don't know how to use this!"))
+ return
+
+ if(!scope_attached)
+ fold_up(user)
+ return
+
+ try_scope(user)
+
+/obj/structure/vulture_spotter_tripod/on_set_interaction(mob/user)
+ var/obj/item/attachable/vulture_scope/scope = get_vulture_scope()
+ scope.spotter_spotting = TRUE
+ to_chat(scope.scope_user, SPAN_NOTICE("You notice that [scope] drifts less."))
+ RegisterSignal(scope, COMSIG_VULTURE_SCOPE_MOVED, PROC_REF(on_vulture_move))
+ RegisterSignal(scope, COMSIG_VULTURE_SCOPE_UNSCOPED, PROC_REF(on_vulture_unscope))
+ if(user.client)
+ RegisterSignal(user.client, COMSIG_PARENT_QDELETING, PROC_REF(do_unscope))
+ user.client.change_view(scope_zoom, src)
+ RegisterSignal(user, list(COMSIG_MOB_PICKUP_ITEM, COMSIG_MOB_RESISTED), PROC_REF(do_unscope))
+ user.see_in_dark += darkness_view
+ user.lighting_alpha = 127
+ user.sync_lighting_plane_alpha()
+ user.overlay_fullscreen("vulture_spotter", /atom/movable/screen/fullscreen/vulture/spotter)
+ user.freeze()
+ user.status_flags |= IMMOBILE_ACTION
+ user.visible_message(SPAN_NOTICE("[user] looks through [src]."),SPAN_NOTICE("You look through [src], ready to go!"))
+ user.forceMove(loc)
+ user.setDir(dir)
+ scope_user = WEAKREF(user)
+ update_pixels(TRUE)
+ give_action(user, /datum/action/vulture_tripod_unscope, null, null, src)
+ set_scope_loc(user, scope)
+
+/obj/structure/vulture_spotter_tripod/on_unset_interaction(mob/user)
+ user.status_flags &= ~IMMOBILE_ACTION
+ user.visible_message(SPAN_NOTICE("[user] looks up from [src]."),SPAN_NOTICE("You look up from [src]."))
+ user.unfreeze()
+ user.reset_view(null)
+ user.Move(get_step(src, reverse_direction(src.dir)))
+ user.client?.change_view(world_view_size, src)
+ user.setDir(dir) //set the direction of the player to the direction the gun is facing
+ update_pixels(FALSE)
+ remove_action(user, /datum/action/vulture_tripod_unscope)
+ unscope()
+
+/obj/structure/vulture_spotter_tripod/clicked(mob/user, list/mods)
+ if(mods["alt"])
+ if(in_range(src, user) && !user.is_mob_incapacitated())
+ rotate(user)
+ return TRUE
+ return ..()
+
+/// Rotates the tripod 90* counter-clockwise
+/obj/structure/vulture_spotter_tripod/proc/rotate(mob/user)
+ if(scope_using)
+ to_chat(user, SPAN_WARNING("You can't rotate [src] while someone is using it!"))
+ return FALSE
+
+ playsound(src, 'sound/items/Ratchet.ogg', 25, 1)
+ user.visible_message("[user] rotates [src].","You rotate [src].")
+ setDir(turn(dir, -90))
+ update_pixels(TRUE)
+
+/// Updates the direction the operator should be facing, and their pixel offset
+/obj/structure/vulture_spotter_tripod/proc/update_pixels(mounting = TRUE)
+ if(!scope_user)
+ return
+
+ var/mob/user = scope_user.resolve()
+ if(mounting)
+ var/diff_x = 0
+ var/diff_y = 0
+ switch(dir)
+ if(NORTH)
+ diff_y = -16
+ if(SOUTH)
+ diff_y = 16
+ if(EAST)
+ diff_x = -16
+ if(WEST)
+ diff_x = 16
+
+ user.pixel_x = diff_x
+ user.pixel_y = diff_y
+ else
+ user.pixel_x = 0
+ user.pixel_y = 0
+
+/// Handler for when the scope is being attached to the tripod
+/obj/structure/vulture_spotter_tripod/proc/on_scope_attach(mob/user, obj/structure/vulture_spotter_tripod/scope)
+ if(scope_attached)
+ return
+
+ user.visible_message(SPAN_NOTICE("[user] attaches [scope] to [src]."), SPAN_NOTICE("You attach [scope] to [src]."))
+ icon_state = "vulture_scope"
+ setDir(user.dir)
+ bound_rifle = scope.bound_rifle
+ scope_attached = TRUE
+ desc = initial(desc)
+ qdel(scope)
+
+/// Handler for when the scope is being detached from the tripod by screwdriver
+/obj/structure/vulture_spotter_tripod/proc/on_screwdriver(mob/user)
+ if(!scope_attached)
+ to_chat(user, SPAN_NOTICE("You don't need a screwdriver to pick this up!"))
+ return
+ user.visible_message(SPAN_NOTICE("[user] unscrews the scope from [src] before detaching it."), SPAN_NOTICE("You unscrew the scope from [src], detaching it."))
+ icon_state = initial(icon_state)
+ unscope()
+ scope_attached = FALSE
+ desc = initial(desc) + " Though, it doesn't seem to have one attached yet."
+ new /obj/item/device/vulture_spotter_scope(get_turf(src), bound_rifle)
+
+/// Handler for user folding up the tripod, picking it up
+/obj/structure/vulture_spotter_tripod/proc/fold_up(mob/user)
+ user.visible_message(SPAN_NOTICE("[user] folds up [src]."), SPAN_NOTICE("You fold up [src]."))
+ var/obj/item/device/vulture_spotter_tripod/tripod = new(get_turf(src))
+ user.put_in_hands(tripod, TRUE)
+ qdel(src)
+
+/// Checks if the user is able to use the scope, uses it if so
+/obj/structure/vulture_spotter_tripod/proc/try_scope(mob/living/carbon/human/user)
+ if(!user.client)
+ return
+
+ if(user.l_hand || user.r_hand)
+ to_chat(user, SPAN_WARNING("Your hands need to be free to use [src]!"))
+ return
+
+ var/obj/item/attachable/vulture_scope/scope = get_vulture_scope()
+ if(!scope)
+ return
+
+ if(get_dist(get_turf(scope), get_turf(src)) > max_sniper_distance)
+ to_chat(user, SPAN_WARNING("[src] needs to be closer to the M707 to be used!"))
+ return
+
+ if(!scope.scoping)
+ to_chat(user, SPAN_WARNING("The M707's sight needs to be in use to be able to look through [src]!"))
+ return
+
+ user.set_interaction(src)
+
+/// Handler for when the user should be unscoping
+/obj/structure/vulture_spotter_tripod/proc/do_unscope()
+ SIGNAL_HANDLER
+
+ if(!scope_user)
+ return
+
+ var/mob/user = scope_user.resolve()
+ user.unset_interaction()
+
+/// Unscopes the user, cleaning up everything related
+/obj/structure/vulture_spotter_tripod/proc/unscope()
+ SIGNAL_HANDLER
+ if(scope_user)
+ var/mob/living/carbon/human/user = scope_user.resolve()
+ user.see_in_dark -= darkness_view
+ user.lighting_alpha = user.default_lighting_alpha
+ user.sync_lighting_plane_alpha()
+ user.clear_fullscreen("vulture_spotter")
+ UnregisterSignal(user, list(COMSIG_MOB_PICKUP_ITEM, COMSIG_MOB_RESISTED))
+ user.pixel_x = 0
+ user.pixel_y = 0
+ if(user.client)
+ user.client.change_view(world_view_size, src)
+ user.client.pixel_x = 0
+ user.client.pixel_y = 0
+ UnregisterSignal(user.client, COMSIG_PARENT_QDELETING)
+
+ var/obj/item/attachable/vulture_scope/scope = get_vulture_scope()
+ if(scope)
+ scope.spotter_spotting = FALSE
+ to_chat(scope.scope_user, SPAN_NOTICE("You notice that [scope] starts drifting more."))
+ UnregisterSignal(scope, list(COMSIG_VULTURE_SCOPE_MOVED, COMSIG_VULTURE_SCOPE_UNSCOPED))
+
+ QDEL_NULL(unscope_action)
+
+/// Sets the scope's sight location to the same as the sniper's
+/obj/structure/vulture_spotter_tripod/proc/set_scope_loc(mob/living/carbon/human/user, obj/item/attachable/vulture_scope/scope)
+ if(!user.client || !scope)
+ return
+
+ var/turf/user_turf = get_turf(user)
+ var/x_off = scope.scope_x - user_turf.x
+ var/y_off = scope.scope_y - user_turf.y
+ var/pixels_per_tile = 32
+
+ user.client.pixel_x = x_off * pixels_per_tile
+ user.client.pixel_y = y_off * pixels_per_tile
+
+/// Handler for when the vulture spotter scope moves
+/obj/structure/vulture_spotter_tripod/proc/on_vulture_move(datum/source)
+ SIGNAL_HANDLER
+ if(!scope_user)
+ return
+
+ set_scope_loc(scope_user.resolve(), get_vulture_scope())
+
+/// Handler for when the sniper unscopes
+/obj/structure/vulture_spotter_tripod/proc/on_vulture_unscope(datum/source)
+ SIGNAL_HANDLER
+ if(!scope_user)
+ return
+
+ var/mob/user = scope_user.resolve()
+
+ to_chat(user, SPAN_WARNING("[src]'s sight disengages as the linked rifle unscopes."))
+ unscope()
+
+/// Getter for the vulture scope on the sniper
+/obj/structure/vulture_spotter_tripod/proc/get_vulture_scope()
+ RETURN_TYPE(/obj/item/attachable/vulture_scope)
+ if(!bound_rifle)
+ return
+
+ var/obj/item/weapon/gun/boltaction/vulture/rifle = bound_rifle.resolve()
+ if(!("rail" in rifle.attachments) || !istype(rifle.attachments["rail"], /obj/item/attachable/vulture_scope))
+ return
+
+ return rifle.attachments["rail"]
+
+/datum/action/vulture_tripod_unscope
+ name = "Stop Using Scope"
+ action_icon_state = "vulture_tripod_close"
+ /// Weakref to the tripod that this is linked to
+ var/datum/weakref/tripod
+
+/datum/action/vulture_tripod_unscope/New(Target, override_icon_state, obj/structure/vulture_spotter_tripod/spotting_tripod)
+ . = ..()
+ tripod = WEAKREF(spotting_tripod)
+
+/datum/action/vulture_tripod_unscope/action_activate()
+ if(!tripod)
+ return
+
+ var/obj/structure/vulture_spotter_tripod/spotting_tripod = tripod.resolve()
+ spotting_tripod.do_unscope()
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index 4d60c6c263cf..3a2272b2c320 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -425,6 +425,7 @@ var/datum/controller/supply/supply_controller = new()
//dropship part fabricator's points, so we can reference them globally (mostly for DEFCON)
var/dropship_points = 10000 //gains roughly 18 points per minute | Original points of 5k doubled due to removal of prespawned ammo.
var/tank_points = 0
+ var/mech_points = 5
/datum/controller/supply/New()
ordernum = rand(1,9000)
@@ -516,6 +517,64 @@ var/datum/controller/supply/supply_controller = new()
points += points_per_crate
qdel(C)
+ //Зачем им трупы
+ var/points_per_xeno_t1 = 20
+ var/points_per_xeno_t2 = 40
+ var/points_per_xeno_t3 = 70
+ var/points_per_xeno_q = 150
+ for(var/mob/living/carbon/xenomorph/larva in area_shuttle)
+ points += 6
+ qdel(larva)
+ for(var/mob/living/carbon/xenomorph/carrier in area_shuttle)
+ points += points_per_xeno_t2
+ qdel(carrier)
+ for(var/mob/living/carbon/xenomorph/ravager in area_shuttle)
+ points += points_per_xeno_t3
+ qdel(ravager)
+ for(var/mob/living/carbon/xenomorph/praetorian in area_shuttle)
+ points += points_per_xeno_t3
+ qdel(praetorian)
+ for(var/mob/living/carbon/xenomorph/hivelord in area_shuttle)
+ points += points_per_xeno_t2
+ qdel(hivelord)
+ for(var/mob/living/carbon/xenomorph/defender in area_shuttle)
+ points += points_per_xeno_t1
+ qdel(defender)
+ for(var/mob/living/carbon/xenomorph/warrior in area_shuttle)
+ points += points_per_xeno_t2
+ qdel(warrior)
+ for(var/mob/living/carbon/xenomorph/facehugger in area_shuttle)
+ points += 5
+ qdel(facehugger)
+ for(var/mob/living/carbon/xenomorph/runner in area_shuttle)
+ points += points_per_xeno_t1
+ qdel(runner)
+ for(var/mob/living/carbon/xenomorph/boiler in area_shuttle)
+ points += points_per_xeno_t3
+ qdel(boiler)
+ for(var/mob/living/carbon/xenomorph/crusher in area_shuttle)
+ points += points_per_xeno_t3
+ qdel(crusher)
+ for(var/mob/living/carbon/xenomorph/burrower in area_shuttle)
+ points += points_per_xeno_t2
+ qdel(burrower)
+ for(var/mob/living/carbon/xenomorph/drone in area_shuttle)
+ points += points_per_xeno_t1
+ qdel(drone)
+ for(var/mob/living/carbon/xenomorph/spitter in area_shuttle)
+ points += points_per_xeno_t2
+ qdel(spitter)
+ for(var/mob/living/carbon/xenomorph/sentinel in area_shuttle)
+ points += points_per_xeno_t1
+ qdel(sentinel)
+ for(var/mob/living/carbon/xenomorph/lurker in area_shuttle)
+ points += points_per_xeno_t2
+ qdel(lurker)
+ for(var/mob/living/carbon/xenomorph/queen in area_shuttle)
+ points += points_per_xeno_q
+ qdel(queen) //Квина иди нахуй
+
+
// Sell manifests.
var/screams = FALSE
for(var/atom/movable/movable_atom in area_shuttle)
@@ -1268,8 +1327,7 @@ var/datum/controller/supply/supply_controller = new()
req_access = list(ACCESS_MARINE_CREWMAN)
circuit = /obj/item/circuitboard/computer/supplycomp/vehicle
// Can only retrieve one vehicle per round
- var/spent = TRUE
- var/tank_unlocked = FALSE
+ var/spent = FALSE
var/list/allowed_roles = list(JOB_CREWMAN)
var/list/vehicles
@@ -1278,7 +1336,6 @@ var/datum/controller/supply/supply_controller = new()
var/name = "vehicle order"
var/obj/vehicle/ordered_vehicle
- var/unlocked = TRUE
var/failure_message = "Not enough resources were allocated to repair this vehicle during this operation.
"
/datum/vehicle_order/proc/has_vehicle_lock()
@@ -1291,20 +1348,17 @@ var/datum/controller/supply/supply_controller = new()
name = "M34A2 Longstreet Light Tank"
ordered_vehicle = /obj/effect/vehicle_spawner/tank/decrepit
-/datum/vehicle_order/tank/has_vehicle_lock()
- return
-
/datum/vehicle_order/apc
name = "M577 Armored Personnel Carrier"
ordered_vehicle = /obj/effect/vehicle_spawner/apc/decrepit
/datum/vehicle_order/apc/med
name = "M577-MED Armored Personnel Carrier"
- ordered_vehicle = /obj/effect/vehicle_spawner/apc_med/decrepit
+ ordered_vehicle = /obj/effect/vehicle_spawner/apc/med/decrepit
/datum/vehicle_order/apc/cmd
name = "M577-CMD Armored Personnel Carrier"
- ordered_vehicle = /obj/effect/vehicle_spawner/apc_cmd/decrepit
+ ordered_vehicle = /obj/effect/vehicle_spawner/apc/cmd/decrepit
/obj/structure/machinery/computer/supplycomp/vehicle/Initialize()
. = ..()
@@ -1313,10 +1367,11 @@ var/datum/controller/supply/supply_controller = new()
/datum/vehicle_order/apc,
/datum/vehicle_order/apc/med,
/datum/vehicle_order/apc/cmd,
+ /datum/vehicle_order/tank,
)
for(var/order as anything in vehicles)
- new order
+ vehicles[order] = new order
if(!VehicleElevatorConsole)
VehicleElevatorConsole = src
@@ -1361,12 +1416,12 @@ var/datum/controller/supply/supply_controller = new()
dat += "Available vehicles:
"
for(var/d in vehicles)
- var/datum/vehicle_order/VO = d
+ var/datum/vehicle_order/VO = vehicles[d]
if(VO.has_vehicle_lock())
dat += VO.failure_message
else
- dat += "[VO.name]
"
+ dat += "[VO.name]
"
show_browser(H, dat, "Automated Storage and Retrieval System", "computer", "size=575x450")
@@ -1403,7 +1458,7 @@ var/datum/controller/supply/supply_controller = new()
var/obj/vehicle/multitile/ordered_vehicle
- var/datum/vehicle_order/VO = locate(href_list["get_vehicle"])
+ var/datum/vehicle_order/VO = vehicles[text2path(href_list["get_vehicle"])]
if(!VO) return
if(VO.has_vehicle_lock()) return
@@ -1414,7 +1469,7 @@ var/datum/controller/supply/supply_controller = new()
VO.on_created(ordered_vehicle)
- SEND_GLOBAL_SIGNAL(COMSIG_GLOB_VEHICLE_ORDERED, ordered_vehicle)
+ SEND_GLOBAL_SIGNAL(COMSIG_GLOB_VEHICLE_ORDERED, VO)
add_fingerprint(usr)
updateUsrDialog()
diff --git a/code/game/turfs/floor_types.dm b/code/game/turfs/floor_types.dm
index 1ad7ab3223eb..4e47fd004f74 100644
--- a/code/game/turfs/floor_types.dm
+++ b/code/game/turfs/floor_types.dm
@@ -554,173 +554,6 @@
icon_state = "floor"
plating_type = /turf/open/floor/plating/prison
-
-//so that the floor turf it's not on default. for Fiorina_SciAnnex.dmm
-/turf/open/floor/prison/floor
-
-//darkred2
-/turf/open/floor/prison/darkred2
- icon_state = "darkred2"
-/turf/open/floor/prison/darkred2corner
- icon_state = "darkred2corner"
-/turf/open/floor/prison/darkred2angle
- icon_state = "darkred2angle"
-/turf/open/floor/prison/darkred2full
- icon_state = "darkred2full"
-//darkbrown2
-/turf/open/floor/prison/darkbrown2
- icon_state = "darkbrown2"
-/turf/open/floor/prison/darkbrown2corner
- icon_state = "darkbrown2corner"
-/turf/open/floor/prison/darkbrown2angle
- icon_state = "darkbrown2angle"
-/turf/open/floor/prison/darkbrown2full
- icon_state = "darkbrown2full"
-//darkyellow2
-/turf/open/floor/prison/darkyellow2
- icon_state = "darkyellow2"
-/turf/open/floor/prison/darkyellow2corner
- icon_state = "darkyellow2corner"
-/turf/open/floor/prison/darkyellow2angle
- icon_state = "darkyellow2angle"
-/turf/open/floor/prison/darkyellow2full
- icon_state = "darkyellow2full"
-//darkpurple2
-/turf/open/floor/prison/darkpurple2
- icon_state = "darkpurple2"
-/turf/open/floor/prison/darkpurple2corner
- icon_state = "darkpurple2corner"
-/turf/open/floor/prison/darkpurple2angle
- icon_state = "darkpurple2angle"
-/turf/open/floor/prison/darkpurple2full
- icon_state = "darkpurple2full"
-
-
-//green
-/turf/open/floor/prison/green
- icon_state = "green"
-/turf/open/floor/prison/greencorner
- icon_state = "greencorner"
-/turf/open/floor/prison/greenangle
- icon_state = "greenangle"
-/turf/open/floor/prison/greenfull
- icon_state = "greenfull"
-/turf/open/floor/prison/greenfull_2
- icon_state = "greenfull_2"
-//random alone tiles.
-/turf/open/floor/prison/sterile_white
- icon_state = "sterile_white"
-/turf/open/floor/prison/kitchen
- icon_state = "kitchen"
-
-/turf/open/floor/prison/cell_stripe
- icon_state = "cell_stripe"
-
-/turf/open/floor/prison/floor_plate
- icon_state = "floor_plate"
-
-/turf/open/floor/prison/floor_marked
- icon_state = "floor_marked"
-
-/turf/open/floor/prison/bright_clean_marked
- icon_state = "bright_clean_marked"
-/turf/open/floor/prison/bright_clean2
- icon_state = "bright_clean2"
-//whitegreen
-/turf/open/floor/prison/whitegreen
- icon_state = "whitegreen"
-
-/turf/open/floor/prison/whitegreencorner
- icon_state = "whitegreencorner"
-
-/turf/open/floor/prison/whitegreenangle
- icon_state = "whitegreenangle"
-/turf/open/floor/prison/whitegreenfull
- icon_state = "whitegreenfull"
-//there is a sprite called sterile that isn't use and look exactly the same.
-/turf/open/floor/prison/sterile
- icon_state = "sterile"
-
-//blue
-/turf/open/floor/prison/blue
- icon_state = "blue"
-/turf/open/floor/prison/bluecorner
- icon_state = "bluecorner"
-/turf/open/floor/prison/blueangle
- icon_state = "blueangle"
-/turf/open/floor/prison/bluefull
- icon_state = "bluefull"
-/turf/open/floor/prison/bluefull_2
- icon_state = "bluefull_2"
-
-//whitepurple
-/turf/open/floor/prison/whitepurple
- icon_state = "whitepurple"
-/turf/open/floor/prison/whitepurplecorner
- icon_state = "whitepurplecorner"
-/turf/open/floor/prison/whitepurpleangle
- icon_state = "whitepurpleangle"
-/turf/open/floor/prison/whitepurplefull
- icon_state = "whitepurplefull"
-/turf/open/floor/prison/whitepurplefull
- icon_state = "whitepurplefull"
-//red
-/turf/open/floor/prison/red
- icon_state = "red"
-/turf/open/floor/prison/redcorner
- icon_state = "redcorner"
-/turf/open/floor/prison/redangle
- icon_state = "redangle"
-/turf/open/floor/prison/redfull
- icon_state = "redfull"
-//yellow
-/turf/open/floor/prison/yellow
- icon_state = "yellow"
-
-/turf/open/floor/prison/yellowcorner
- icon_state = "yellowcorner"
-/turf/open/floor/prison/yellowangle
- icon_state = "yellowangle"
-/turf/open/floor/prison/yellowfull
- icon_state = "yellowfull"
-//greenblue
-/turf/open/floor/prison/greenblue
- icon_state = "greenblue"
-/turf/open/floor/prison/greenbluecorner
- icon_state = "greenbluecorner"
-/turf/open/floor/prison/greenblueangle
- icon_state = "greenblueangle"
-//blue plate
-/turf/open/floor/prison/blue_plate
- icon_state = "blue_plate"
-/turf/open/floor/prison/blue_plate_2
- icon_state = "blue_plate_2"
-/turf/open/floor/prison/blue_plate_3
- icon_state = "blue_plate_3"
-//damage plate
-/turf/open/floor/prison/platingdmg1
- icon_state = "platingdmg1"
-/turf/open/floor/prison/platingdmg2
- icon_state = "platingdmg2"
-/turf/open/floor/prison/platingdmg3
- icon_state = "platingdmg3"
-/turf/open/floor/prison/damaged1
- icon_state = "damaged1"
-/turf/open/floor/prison/damaged2
- icon_state = "damaged2"
-/turf/open/floor/prison/damaged3
- icon_state = "damaged3"
-/turf/open/floor/prison/damaged4
- icon_state = "damaged4"
-/turf/open/floor/prison/damaged5
- icon_state = "damaged5"
-/turf/open/floor/prison/floorscorched1
- icon_state = "floorscorched1"
-/turf/open/floor/prison/floorscorched2
- icon_state = "floorscorched2"
-/turf/open/floor/prison/panelscorched
- icon_state = "panelscorched"
-
/turf/open/floor/prison/trim/red
icon_state = "darkred2"
diff --git a/code/game/turfs/walls/wall_types.dm b/code/game/turfs/walls/wall_types.dm
index 8262caef4258..0b30570bfbfe 100644
--- a/code/game/turfs/walls/wall_types.dm
+++ b/code/game/turfs/walls/wall_types.dm
@@ -1217,7 +1217,12 @@ INITIALIZE_IMMEDIATE(/turf/closed/wall/indestructible/splashscreen)
/turf/closed/wall/resin/attackby(obj/item/W, mob/living/user)
if(SEND_SIGNAL(src, COMSIG_WALL_RESIN_ATTACKBY, W, user) & COMPONENT_CANCEL_ATTACKBY)
return
-
+
+ if(istype(W, /obj/item/weapon/twohanded/st_hammer))
+ if(!skillcheck(user, SKILL_SPEC_WEAPONS, SKILL_SPEC_ALL) && (user.skills.get_skill_level(SKILL_SPEC_WEAPONS) != SKILL_SPEC_ST))
+ to_chat(user, SPAN_HIGHDANGER("[W.name] is too heavy for you..."))
+ return
+
if(!(W.flags_item & NOBLUDGEON))
user.animation_attack_on(src)
take_damage(W.force*RESIN_MELEE_DAMAGE_MULTIPLIER, user)
diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm
index bf6d8e261ab3..d49a7cf91c63 100644
--- a/code/modules/admin/IsBanned.dm
+++ b/code/modules/admin/IsBanned.dm
@@ -13,9 +13,9 @@
//Guest Checking
if(!real_bans_only && CONFIG_GET(flag/guest_ban) && IsGuestKey(key))
- log_access("Failed Login: [key] - Guests not allowed")
- message_admins("Failed Login: [key] - Guests not allowed")
- return list("reason"="guest", "desc"="\nReason: Guests not allowed. Please sign in with a byond account.")
+ log_access("Ой ой, [key] не смог зайти - Гости не нужны")
+ message_admins("Ой ой, [key] не смог зайти - Гости не нужны")
+ return list("reason"="guest", "desc"="\nПричина: Guests not allowed. Please sign in with a byond account.")
WAIT_DB_READY
if(admin_datums[ckey] && (admin_datums[ckey].rights & R_MOD))
@@ -28,8 +28,8 @@
//check if the IP address is a known TOR node
if(CONFIG_GET(flag/ToRban) && ToRban_isbanned(address))
- log_access("Failed Login: [src] - Banned: ToR")
- message_admins("Failed Login: [src] - Banned: ToR")
+ log_access("Агаааа, [src] не смог зайти - бан: ТоР")
+ message_admins("Агаааа, [src] не смог зайти - бан: ТоР")
return list("reason"="Using ToR", "desc"="\nReason: The network you are using to connect has been banned.\nIf you believe this is a mistake, please request help at [CONFIG_GET(string/banappeals)]")
// wait for database to be ready
diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm
index b64b1e4682fd..477fa504dded 100644
--- a/code/modules/admin/NewBan.dm
+++ b/code/modules/admin/NewBan.dm
@@ -20,10 +20,10 @@ var/savefile/Banlist
ClearTempbans()
return 0
else
- .["desc"] = "\nReason: [Banlist["reason"]]\nExpires: [GetExp(Banlist["minutes"])]\nBy: [Banlist["bannedby"]][appeal]"
+ .["desc"] = "\nПричина: [Banlist["reason"]]\nСрок: [GetExp(Banlist["minutes"])]\nВыдан: [Banlist["bannedby"]][appeal]"
else
Banlist.cd = "/base/[ckey][id]"
- .["desc"] = "\nReason: [Banlist["reason"]]\nExpires: PERMENANT\nBy: [Banlist["bannedby"]][appeal]"
+ .["desc"] = "\nПричина: [Banlist["reason"]]\nСрок: ПЕРМА\nВыдан: [Banlist["bannedby"]][appeal]"
.["reason"] = "ckey/id"
return .
else
@@ -46,9 +46,9 @@ var/savefile/Banlist
ClearTempbans()
return 0
else
- .["desc"] = "\nReason: [Banlist["reason"]]\nExpires: [GetExp(Banlist["minutes"])]\nBy: [Banlist["bannedby"]][appeal]"
+ .["desc"] = "\nПричина: [Banlist["reason"]]\nСрок: [GetExp(Banlist["minutes"])]\nBy: [Banlist["bannedby"]][appeal]"
else
- .["desc"] = "\nReason: [Banlist["reason"]]\nExpires: PERMENANT\nBy: [Banlist["bannedby"]][appeal]"
+ .["desc"] = "\nПричина: [Banlist["reason"]]\nСрок: ПЕРМА\nВыдан: [Banlist["bannedby"]][appeal]"
.["reason"] = matches
return .
return 0
@@ -62,10 +62,10 @@ var/savefile/Banlist
Banlist = new("data/banlist.bdb")
log_admin("Loading Banlist")
- if (!length(Banlist.dir)) log_admin("Banlist is empty.")
+ if (!length(Banlist.dir)) log_admin("Банлист пуст. Ой.")
if (!Banlist.dir.Find("base"))
- log_admin("Banlist missing base dir.")
+ log_admin("Банлист не имеет базовой директории.")
Banlist.dir.Add("base")
Banlist.cd = "/base"
else if (Banlist.dir.Find("base"))
@@ -82,8 +82,8 @@ var/savefile/Banlist
Banlist.cd = "/base/[A]"
if (!Banlist["key"] || !Banlist["id"])
RemoveBan(A)
- log_admin("Invalid Ban.")
- message_admins("Invalid Ban.")
+ log_admin("Некорректный бан.")
+ message_admins("Некорректный бан.")
continue
if (!Banlist["temp"]) continue
@@ -137,12 +137,12 @@ var/savefile/Banlist
if (!Banlist.dir.Remove(foldername)) return 0
if(!usr)
- log_admin("Ban Expired: [key]")
- message_admins("Ban Expired: [key]")
+ log_admin("Срок бана истек: [key]")
+ message_admins("Срок бана истек: [key]")
else
- ban_unban_log_save("[key_name_admin(usr)] unbanned [key]")
- log_admin("[key_name_admin(usr)] unbanned [key]")
- message_admins("[key_name_admin(usr)] unbanned: [key]")
+ ban_unban_log_save("[key_name_admin(usr)] разбанил [key]")
+ log_admin("[key_name_admin(usr)] разбанил [key]")
+ message_admins("[key_name_admin(usr)] разбанил: [key]")
for (var/A in Banlist.dir)
Banlist.cd = "/base/[A]"
if (key == Banlist["key"] /*|| id == Banlist["id"]*/)
@@ -160,11 +160,11 @@ var/savefile/Banlist
else
var/timeleftstring
if (exp >= 1440) //1440 = 1 day in minutes
- timeleftstring = "[round(exp / 1440, 0.1)] Days"
+ timeleftstring = "[round(exp / 1440, 0.1)] Дней"
else if (exp >= 60) //60 = 1 hour in minutes
- timeleftstring = "[round(exp / 60, 0.1)] Hours"
+ timeleftstring = "[round(exp / 60, 0.1)] Часов"
else
- timeleftstring = "[exp] Minutes"
+ timeleftstring = "[exp] Минут"
return timeleftstring
/datum/admins/proc/unbanpanel()
@@ -182,12 +182,12 @@ var/savefile/Banlist
expiry = "Permaban"
var/unban_link = "(U)"
- dat += "[unban_link] Key: [ban.ckey] | ComputerID: [ban.last_known_cid] | IP: [ban.last_known_ip] | [expiry] | (By: [ban.admin]) | (Reason: [ban.reason]) |
"
+ dat += "[unban_link] Ключ: [ban.ckey] | ComputerID: [ban.last_known_cid] | IP: [ban.last_known_ip] | [expiry] | (By: [ban.admin]) | (Причина: [ban.reason]) |
"
dat += ""
- var/dat_header = "
Bans: (U) = Unban"
- dat_header += " - Ban Listing
[dat]"
- show_browser(usr, dat_header, "Unban Panel", "unbanp", "size=875x400")
+ var/dat_header = "
Баны: (U) = Разбанить"
+ dat_header += " - Список банов
[dat]"
+ show_browser(usr, dat_header, "Панель Разбанов", "unbanp", "size=875x400")
//////////////////////////////////// DEBUG ////////////////////////////////////
@@ -237,17 +237,17 @@ var/savefile/Banlist
return //mods+ cannot be banned. Even if they could, the ban doesn't affect them anyway
if(!M.ckey)
- to_chat(usr, SPAN_DANGER("Warning: Mob ckey for [M.name] not found."))
+ to_chat(usr, SPAN_DANGER("Внимание: Сикей для моба [M.name] не найден."))
return
var/mob_key = M.ckey
- var/mins = tgui_input_number(usr,"How long (in minutes)? \n 180 = 3 hours \n 1440 = 1 day \n 4320 = 3 days \n 10080 = 7 days \n 43800 = 1 Month","Ban time", 1440, 262800, 1)
+ var/mins = tgui_input_number(usr,"На сколько (в минутах)? \n 180 = 3 часа \n 1440 = 1 день \n 4320 = 3 дня \n 10080 = Неделя \n 43800 = Месяц","Срок бана", 1440, 262800, 1)
if(!mins)
return
if(mins >= 525600) mins = 525599
- var/reason = input(usr,"Reason? \n\nPress 'OK' to finalize the ban.","reason","Griefer") as message|null
+ var/reason = input(usr,"Причина? \n\nНажмите 'ОК' чтобы закончить.","причина","Гриферок") as message|null
if(!reason)
return
var/datum/entity/player/P = get_player_from_key(mob_key) // you may not be logged in, but I will find you and I will ban you
- if(P.is_time_banned && alert(usr, "Ban already exists. Proceed?", "Confirmation", "Yes", "No") != "Yes")
+ if(P.is_time_banned && alert(usr, "Бан уже существует. Продолжим?", "Подтверждение", "Да", "Нет") != "Да")
return
P.add_timed_ban(reason, mins)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 2c749df71bb7..cd4760c51f0e 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -2,7 +2,7 @@
/proc/message_admins(msg, jmp_x=0, jmp_y=0, jmp_z=0) // +MOD and above, not mentors
log_admin(msg)
- msg = "ADMIN LOG: [msg]"
+ msg = "АДМИН ЛОГ: [msg]"
if(jmp_x && jmp_y && jmp_z)
msg += " (JMP)"
msg += ""
@@ -15,7 +15,7 @@
if(GLOB.perf_flags & PERF_TOGGLE_ATTACKLOGS)
return
log_attack(text)
- var/rendered = SPAN_COMBAT("ATTACK: [text] (JMP)")
+ var/rendered = SPAN_COMBAT("АТАКА: [text] (JMP)")
for(var/client/C as anything in GLOB.admins)
if(C && C.admin_holder && (R_MOD & C.admin_holder.rights))
if(C.prefs.toggles_chat & CHAT_ATTACKLOGS)
@@ -24,14 +24,14 @@
/proc/msg_admin_niche(msg) //Toggleable Niche Messages
log_admin(msg)
- msg = SPAN_ADMIN("ADMIN NICHE LOG: [msg]")
+ msg = SPAN_ADMIN("ЛОГ АДМИНСКОЙ НИШИ: [msg]")
for(var/client/C as anything in GLOB.admins)
if(C && C.admin_holder && (R_MOD & C.admin_holder.rights))
if(C.prefs.toggles_chat & CHAT_NICHELOGS)
to_chat(C, msg)
/proc/msg_sea(msg, nosound = FALSE) //Only used for newplayer ticker message, hence no logging
- msg = FONT_SIZE_LARGE("MENTOR ALERT: [msg]")
+ msg = FONT_SIZE_LARGE("ТРЕВОГА ДЛЯ МЕНТОРОВ: [msg]")
for(var/mob/possible_sea as anything in GLOB.player_list)
if(!isSEA(possible_sea))
continue
@@ -44,9 +44,9 @@
/proc/msg_admin_ff(text, alive = TRUE)
var/rendered
if(alive)
- rendered = SPAN_COMBAT("ATTACK: [text]") //I used because I never learned html correctly, fix this if you want
+ rendered = SPAN_COMBAT("АТАКА: [text]") //I used because I never learned html correctly, fix this if you want
else
- rendered = SPAN_COMBAT("ATTACK: [text]")
+ rendered = SPAN_COMBAT("АТАКА: [text]")
text = "///DEAD/// - " + text
log_attack(text) //Do everything normally BUT IN GREEN SO THEY KNOW
for(var/client/C as anything in GLOB.admins)
@@ -76,7 +76,7 @@
if (!istype(src,/datum/admins))
src = usr.client.admin_holder
if (!istype(src,/datum/admins) || !(src.rights & R_MOD))
- to_chat(usr, "Error: you are not an admin!")
+ to_chat(usr, "Ошибочка - вы не админ!")
return
var/dat = ""
@@ -84,12 +84,12 @@
var/list/datum/view_record/note_view/NL = DB_VIEW(/datum/view_record/note_view, DB_COMP("player_ckey", DB_EQUALS, key))
for(var/datum/view_record/note_view/N in NL)
var/admin_ckey = N.admin_ckey
- var/confidential_text = N.is_confidential ? " \[CONFIDENTIALLY\]" : ""
+ var/confidential_text = N.is_confidential ? " \[КОНФИДЕНЦИАЛЬНО\]" : ""
var/color = "#008800"
if(N.is_ban)
- var/time_d = N.ban_time ? "Banned for [N.ban_time] minutes | " : ""
+ var/time_d = N.ban_time ? "Забанен на [N.ban_time] минут | " : ""
color = "#880000" //Removed confidential check because we can't make confidential bans
- dat += "[time_d][N.text] by [admin_ckey] ([N.admin_rank])[confidential_text] on [N.date] [NOTE_ROUND_ID(N)] "
+ dat += "[time_d][N.text] [admin_ckey] ([N.admin_rank])[confidential_text] on [N.date] [NOTE_ROUND_ID(N)] "
else
if(N.is_confidential)
color = "#AA0055"
@@ -104,12 +104,12 @@
dat += "[N.text] by [admin_ckey] ([N.admin_rank])[confidential_text] on [N.date] [NOTE_ROUND_ID(N)] "
if(admin_ckey == usr.ckey || admin_ckey == "Adminbot" || ishost(usr))
- dat += "Remove"
+ dat += "Удалить"
dat += "
"
dat += ""
- show_browser(usr, dat, "Info on [key]", "allplayerinfo", "size=480x480")
+ show_browser(usr, dat, "Информаци о [key]", "allplayerinfo", "size=480x480")
/datum/admins/proc/Jobbans()
@@ -127,9 +127,9 @@
i = jobban_keylist[r][c] //These are already strings, as you're iterating through them. Anyway, establish jobban.
t = "[c] - [r] ## [i]"
u = "[c] - [r]"
- dat += "[t] (unban) |
"
+ dat += "[t] (разбанить) |
"
dat += "
"
- show_browser(usr, dat, "Job Bans", "ban", "size=400x400")
+ show_browser(usr, dat, "Джоб баны", "бан", "size=400x400")
/datum/admins/proc/Game()
@@ -202,7 +202,7 @@
else
new chosen(usr.loc)
- log_admin("[key_name(usr)] spawned [chosen] at ([usr.x],[usr.y],[usr.z])")
+ log_admin("[key_name(usr)] спаунит [chosen] по координатам ([usr.x],[usr.y],[usr.z])")
/client/proc/update_mob_sprite(mob/living/carbon/human/H as mob)
@@ -211,7 +211,7 @@
set desc = "Should fix any mob sprite update errors."
if (!admin_holder || !(admin_holder.rights & R_MOD))
- to_chat(src, "Only administrators may use this command.")
+ to_chat(src, "Ай яй яй, эта команда только для администраторов.")
return
if(istype(H))
@@ -241,7 +241,7 @@
if(SSticker)
var/success = SSticker.send_tip_of_the_round()
if(!success)
- to_chat(usr, SPAN_ADMINNOTICE("Sending tip failed!"))
+ to_chat(usr, SPAN_ADMINNOTICE("Подсказочка не отправилась!"))
/// Allow admin to add or remove traits of datum
/datum/admins/proc/modify_traits(datum/D)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 7d9127313094..051623f67e3f 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -391,7 +391,7 @@ var/list/roundstart_mod_verbs = list(
set category = "OOC.OOC"
set name = "OOC Text Color - Self"
if(!admin_holder && !donator) return
- var/new_ooccolor = input(src, "Please select your OOC color.", "OOC color") as color|null
+ var/new_ooccolor = input(src, "Настало время выбрать цвет.", "Цвет OOC") as color|null
if(new_ooccolor)
prefs.ooccolor = new_ooccolor
prefs.save_preferences()
@@ -406,30 +406,30 @@ var/list/roundstart_mod_verbs = list(
if(!warned_ckey || !istext(warned_ckey)) return
if(warned_ckey in admin_datums)
- to_chat(usr, "Error: warn(): You can't warn admins.")
+ to_chat(usr, "Ошибочка: warn(): Зачем варнить админов?")
return
var/datum/entity/player/P = get_player_from_key(warned_ckey) // you may not be logged in, but I will find you and I will ban you
if(!P)
- to_chat(src, "Error: warn(): No such ckey found.")
+ to_chat(src, "Ошибочка: warn(): Такого сикея нет.")
return
if(++P.warning_count >= MAX_WARNS) //uh ohhhh...you'reee iiiiin trouuuubble O:)
- ban_unban_log_save("[ckey] warned [warned_ckey], resulting in a [AUTOBANTIME] minute autoban.")
+ ban_unban_log_save("[ckey] варнит [warned_ckey], что влечет за собой [AUTOBANTIME] минутный автобан.")
if(P.owning_client)
- message_admins("[key_name_admin(src)] has warned [ckey] resulting in a [AUTOBANTIME] minute ban.")
+ message_admins("[key_name_admin(src)] варнит [ckey], что влечет за собой [AUTOBANTIME] минутный бан.")
to_chat_forced(P.owning_client, "You have been autobanned due to a warning by [key_name_admin(P.owning_client)].
This is a temporary ban, it will be removed in [AUTOBANTIME] minutes.")
else
- message_admins("[key_name_admin(src)] has warned [warned_ckey] resulting in a [AUTOBANTIME] minute ban.")
+ message_admins("[key_name_admin(src)] варнит [warned_ckey], что влечет за собой [AUTOBANTIME] минутный бан.")
P.add_timed_ban("Autobanning due to too many formal warnings", AUTOBANTIME)
else
if(P.owning_client)
to_chat(P.owning_client, "You have been formally warned by an administrator.
Further warnings will result in an autoban.")
- message_admins("[key_name_admin(src)] has warned [key_name_admin(P.owning_client)]. They have [MAX_WARNS-P.warning_count] strikes remaining.")
+ message_admins("[key_name_admin(src)] предупреждает [key_name_admin(P.owning_client)]. У них осталось [MAX_WARNS-P.warning_count] страйков.")
else
- message_admins("[key_name_admin(src)] has warned [warned_ckey] (DC). They have [MAX_WARNS-P.warning_count] strikes remaining.")
+ message_admins("[key_name_admin(src)] предувпреждает [warned_ckey] (DC). У них осталось [MAX_WARNS-P.warning_count] страйков.")
/client/proc/give_disease(mob/T as mob in GLOB.mob_list) // -- Giacom
set category = "Admin.Fun"
@@ -438,12 +438,12 @@ var/list/roundstart_mod_verbs = list(
var/list/disease_names = list()
for(var/v in diseases)
disease_names.Add(copytext("[v]", 16, 0))
- var/datum/disease/D = tgui_input_list(usr, "Choose the disease to give to that guy", "ACHOO", disease_names)
+ var/datum/disease/D = tgui_input_list(usr, "Чем заразим паренька?", "Хихи", disease_names)
if(!D) return
var/path = text2path("/datum/disease/[D]")
T.contract_disease(new path, 1)
- message_admins("[key_name_admin(usr)] gave [key_name(T)] the disease [D].")
+ message_admins("[key_name_admin(usr)] заражает [key_name(T)] болезнью [D].")
/client/proc/object_talk(msg as text) // -- TLE
@@ -454,7 +454,7 @@ var/list/roundstart_mod_verbs = list(
if(!msg)
return
for (var/mob/V in hearers(mob.control_object))
- V.show_message("[mob.control_object.name] says: \"" + msg + "\"", SHOW_MESSAGE_AUDIBLE)
+ V.show_message("[mob.control_object.name] говорит: \"" + msg + "\"", SHOW_MESSAGE_AUDIBLE)
/client/proc/toggle_log_hrefs()
diff --git a/code/modules/admin/autoreply.dm b/code/modules/admin/autoreply.dm
index a90e21b7f311..8d8632c9e7e5 100644
--- a/code/modules/admin/autoreply.dm
+++ b/code/modules/admin/autoreply.dm
@@ -9,6 +9,10 @@ GLOBAL_REFERENCE_LIST_INDEXED(adminreplies, /datum/autoreply/admin, title)
var/closer = TRUE
/// Admin Replies
+/datum/autoreply/admin/regurgitate
+ title = "Проглатывание За Ксеноморфа"
+ message = "Проглатывание живых существ способствует их быстрой транспортировке к яйцам. Для того, чтобы проглотить жертву, схватите ее (CTRL+Click) и затем нажмите на себя. Для того, чтобы срыгнуть жертву, нажмите кнопку 'Regurgitate' на интерфейсе слева вверху. Держать людей в себе можно в течении минуты, после которой вы их срыгнете, а жертве расплавит случайную конечность."
+
/datum/autoreply/admin/handled
title = "Being Handled"
message = "Staff are aware of this issue and it is being handled"
diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm
index 18f06e79a66a..0720dca268b8 100644
--- a/code/modules/admin/banjob.dm
+++ b/code/modules/admin/banjob.dm
@@ -23,39 +23,39 @@ var/jobban_keylist[0] //to store the keys & ranks
/proc/jobban_client_fullban(ckey, rank)
if (!ckey || !rank) return
rank = check_jobban_path(rank)
- jobban_keylist[rank][ckey] = "Reason Unspecified"
+ jobban_keylist[rank][ckey] = "Причина не указана"
//returns a reason if M is banned from rank, returns 0 otherwise
/proc/jobban_isbanned(mob/M, rank, datum/entity/player/P = null)
if(!rank)
- return "Non-existant job"
+ return "Несуществующая профессия"
rank = ckey(rank)
if(P)
// asking for a friend
if(!P.jobbans_loaded)
- return "Not yet loaded"
+ return "Еще не загрузились"
var/datum/entity/player_job_ban/PJB = P.job_bans[rank]
return PJB ? PJB.text : null
if(M)
if(!M.client || !M.client.player_data || !M.client.player_data.jobbans_loaded)
- return "Not yet loaded"
+ return "Еще не загрузились"
if(guest_jobbans(rank))
if(CONFIG_GET(flag/guest_jobban) && IsGuestKey(M.key))
- return "Guest Job-ban"
+ return "Гостевой джоб-банчик"
if(CONFIG_GET(flag/usewhitelist) && !check_whitelist(M))
- return "Whitelisted Job"
+ return "Профессия по вайтлисту"
var/datum/entity/player_job_ban/PJB = M.client.player_data.job_bans[rank]
return PJB ? PJB.text : null
/proc/jobban_loadbanfile()
var/savefile/S=new("data/job_new.ban")
S["new_bans"] >> jobban_keylist
- log_admin("Loading jobban_rank")
+ log_admin("Загружаю jobban_rank")
S["runonce"] >> jobban_runonce
if (!length(jobban_keylist))
jobban_keylist=list()
- log_admin("jobban_keylist was empty")
+ log_admin("jobban_keylist был пуст")
/proc/jobban_savebanfile()
var/savefile/S=new("data/job_new.ban")
@@ -87,7 +87,7 @@ var/jobban_keylist[0] //to store the keys & ranks
return
if(!M.ckey) //sanity
- to_chat(usr, "This mob has no ckey")
+ to_chat(usr, "У моба нет сикея")
return
if(!RoleAuthority)
to_chat(usr, "The Role Authority is not set up!")
diff --git a/code/modules/admin/callproc.dm b/code/modules/admin/callproc.dm
index 1af1f5aa9fa3..93d719275bca 100644
--- a/code/modules/admin/callproc.dm
+++ b/code/modules/admin/callproc.dm
@@ -18,7 +18,7 @@ GLOBAL_PROTECT(LastAdminCalledProc)
/// So usr is set to this for any proccalls that don't have any usr mob/client to refer to.
/mob/proccall_handler
name = "ProcCall Handler"
- desc = "If you are seeing this, tell a coder."
+ desc = "Если вы это видите - напишите кодеру."
var/list/callers = list()
@@ -57,7 +57,7 @@ GLOBAL_PROTECT(LastAdminCalledProc)
if(GLOB.AdminProcCallHandler != src)
return ..()
if(!force)
- stack_trace("Attempted deletion on [type] - [name], aborting.")
+ stack_trace("попытался удалить [type] - [name], отмена.")
return QDEL_HINT_LETMELIVE
return ..()
diff --git a/code/modules/admin/fax_templates.dm b/code/modules/admin/fax_templates.dm
index 91b23abb2422..99c26726f326 100644
--- a/code/modules/admin/fax_templates.dm
+++ b/code/modules/admin/fax_templates.dm
@@ -63,7 +63,7 @@
if(show_wy_logo)
dat += ""
- dat += "
"
+ dat += "
"
dat += "
"
dat += "