diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm
index 7ce18ed805a8..e6d9b03347e4 100644
--- a/code/__DEFINES/colors.dm
+++ b/code/__DEFINES/colors.dm
@@ -210,3 +210,9 @@
0, 0, 0, 1, \
0, 0, 0, 0)
+
+#define PAINKILLERS_FILTER list(1.25, 0, 0, 0, \
+ 0, 1.25, 0, 0, \
+ 0, 0, 1.25, 0, \
+ 0, 0, 0, 1, \
+ -0.05,-0.05,-0.05, 0)
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 6c593f9a140b..99add07ecc06 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -111,3 +111,9 @@
#define MOVESET_TYPE "moveset_type"
#define MOVESET_ROLES "moveset_role"
#define MOVESET_QUALITY "moveset_quality"
+
+//Painkiller effectiveness (for get_painkiller_effect() comparison)
+#define PAINKILLERS_EFFECT_SLIGHT 0.95 //all painkillers.
+#define PAINKILLERS_EFFECT_MEDIUM 0.75 //weak painkillers, allow you to ignore minor pain and not see pain() messages.
+#define PAINKILLERS_EFFECT_HEAVY 0.6 //powerful painkillers, allow you to not see custom_pain() messages.
+#define PAINKILLERS_EFFECT_VERY_HEAVY 0.5 //very powerful painkillers that does not allow the user to determine the location of the injury.
diff --git a/code/__DEFINES/gamemodes.dm b/code/__DEFINES/gamemodes.dm
index 24aa2cde80a7..57717103d4bb 100644
--- a/code/__DEFINES/gamemodes.dm
+++ b/code/__DEFINES/gamemodes.dm
@@ -67,6 +67,7 @@
#define REPLICATOR "Replicator"
#define PIRATE "Pirate"
#define PRISONER "Prisoner"
+#define THIEF "Thief"
////////////////////// GREETS /////////////////////////
#define GREET_DEFAULT "default"
diff --git a/code/__DEFINES/messages.dm b/code/__DEFINES/messages.dm
index 2f4f3c4631da..07537cd2260a 100644
--- a/code/__DEFINES/messages.dm
+++ b/code/__DEFINES/messages.dm
@@ -3,7 +3,7 @@
#define MAX_BOOK_MESSAGE_LEN 27648
#define MAX_NAME_LEN 26
#define MAX_LNAME_LEN 64
-#define MAX_REV_REASON_LEN 255
+#define MAX_MEDAL_REASON_LEN 128
//#define SHOWMSG_SELF
#define SHOWMSG_VISUAL (1<<0)
diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm
index 56ca366f294f..8b502f6c90a5 100644
--- a/code/__DEFINES/mob.dm
+++ b/code/__DEFINES/mob.dm
@@ -262,3 +262,11 @@
#define LOGOUT_GHOST 2
#define LOGOUT_REENTER 3
#define LOGOUT_SWAP 4 // not so safe, check other things if available
+
+// traumatic shock levels
+#define TRAUMATIC_SHOCK_MINOR 10
+#define TRAUMATIC_SHOCK_SERIOUS 30
+#define TRAUMATIC_SHOCK_INTENSE 50
+#define TRAUMATIC_SHOCK_MIND_SHATTERING 80
+#define TRAUMATIC_SHOCK_CRITICAL 100
+
diff --git a/code/__DEFINES/religion.dm b/code/__DEFINES/religion.dm
index be96e23d101d..6b021fd4bb0d 100644
--- a/code/__DEFINES/religion.dm
+++ b/code/__DEFINES/religion.dm
@@ -45,6 +45,7 @@
// Religion Techs
#define RTECH_MEMORIZE_RUNE "Memorize Rune"
+#define RTECH_COOLDOWN_REDUCTION "Cooldown Reduction"
#define RTECH_REUSABLE_RUNE "Reusable Rune"
#define RTECH_BUILD_EVERYWHERE "Build Everywhere"
#define RTECH_MORE_RUNES "More Runes"
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 26db7de23070..907597810240 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -47,6 +47,132 @@
if(gender==FEMALE) return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
else return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
+/proc/random_eye_color()
+ var/red
+ var/green
+ var/blue
+
+ var/col = pick ("black", "grey", "brown", "chestnut", "blue", "lightblue", "green", "albino")
+ switch(col)
+ if("black")
+ red = 0
+ green = 0
+ blue = 0
+ if("grey")
+ red = rand (100, 200)
+ green = red
+ blue = red
+ if("brown")
+ red = 102
+ green = 51
+ blue = 0
+ if("chestnut")
+ red = 153
+ green = 102
+ blue = 0
+ if("blue")
+ red = 51
+ green = 102
+ blue = 204
+ if("lightblue")
+ red = 102
+ green = 204
+ blue = 255
+ if("green")
+ red = 0
+ green = 102
+ blue = 0
+ if("albino")
+ red = rand (200, 255)
+ green = rand (0, 150)
+ blue = rand (0, 150)
+
+ return list(red, green, blue)
+
+/proc/random_hair_color()
+ var/red
+ var/green
+ var/blue
+
+ var/col = pick ("blonde", "black", "chestnut", "copper", "brown", "wheat", "old", "punk")
+ switch(col)
+ if("blonde")
+ red = 255
+ green = 255
+ blue = 0
+ if("black")
+ red = 0
+ green = 0
+ blue = 0
+ if("chestnut")
+ red = 153
+ green = 102
+ blue = 51
+ if("copper")
+ red = 255
+ green = 153
+ blue = 0
+ if("brown")
+ red = 102
+ green = 51
+ blue = 0
+ if("wheat")
+ red = 255
+ green = 255
+ blue = 153
+ if("old")
+ red = rand (100, 255)
+ green = red
+ blue = red
+ if("punk")
+ red = rand (0, 255)
+ green = rand (0, 255)
+ blue = rand (0, 255)
+
+ return list(red, green, blue)
+
+/proc/random_skin_color() // for species who has skin_color flag
+ var/red
+ var/green
+ var/blue
+
+ var/col = pick ("black", "grey", "brown", "chestnut", "blue", "lightblue", "green", "albino")
+ switch(col)
+ if("black")
+ red = 0
+ green = 0
+ blue = 0
+ if("grey")
+ red = rand (100, 200)
+ green = red
+ blue = red
+ if("brown")
+ red = 102
+ green = 51
+ blue = 0
+ if("chestnut")
+ red = 153
+ green = 102
+ blue = 0
+ if("blue")
+ red = 51
+ green = 102
+ blue = 204
+ if("lightblue")
+ red = 102
+ green = 204
+ blue = 255
+ if("green")
+ red = 0
+ green = 102
+ blue = 0
+ if("albino")
+ red = rand (200, 255)
+ green = rand (0, 150)
+ blue = rand (0, 150)
+
+ return list(red, green, blue)
+
/proc/random_skin_tone()
switch(pick(60;"caucasian", 15;"afroamerican", 10;"african", 10;"latino", 5;"albino"))
if("caucasian") . = -10
diff --git a/code/_globalvars/lists/mob.dm b/code/_globalvars/lists/mob.dm
index 787f75ba6295..d3a0291dd300 100644
--- a/code/_globalvars/lists/mob.dm
+++ b/code/_globalvars/lists/mob.dm
@@ -43,6 +43,6 @@ var/global/list/gods_list = list()
//feel free to add shit to lists below
var/global/list/tachycardics = list("coffee", "inaprovaline", "hyperzine", "nitroglycerin", "thirteenloko", "nicotine", "ambrosium", "jenkem") //increase heart rate
-var/global/list/bradycardics = list("neurotoxin", "cryoxadone", "clonexadone", "space_drugs", "stoxin") //decrease heart rate
+var/global/list/bradycardics = list("neurotoxin", "cryoxadone", "clonexadone", "space_drugs", "stoxin", "tramadol", "oxycodone") //decrease heart rate
var/global/list/heartstopper = list("potassium_phorochloride", "zombie_powder") //this stops the heart
var/global/list/cheartstopper = list("potassium_chloride") //this stops the heart when overdose is met -- c = conditional
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index bd40c0a082c6..d91db387f411 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -114,11 +114,11 @@ var/global/bridge_secret = null
//game_options.txt configs
var/health_threshold_softcrit = 0
- var/health_threshold_crit = 0
+ var/health_threshold_crit = -50
var/health_threshold_dead = -100
var/organ_health_multiplier = 1
- var/organ_regeneration_multiplier = 1
+ var/organ_regeneration_multiplier = 0.75
var/revival_pod_plants = 1
var/revival_cloning = 1
@@ -195,7 +195,7 @@ var/global/bridge_secret = null
// The object used for the clickable stat() button.
var/obj/effect/statclick/statclick
- var/craft_recipes_visibility = FALSE // If false, then users won't see crafting recipes in personal crafting menu until they have all required components and then it will show up.
+ var/craft_recipes_visibility = TRUE // Show all recipes (TRUE) or only these that have all required components around (FALSE) in craft menu.
var/nightshift = FALSE
var/list/maplist = list()
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 16f115d421c2..ef634507afb3 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -35,7 +35,7 @@ SUBSYSTEM_DEF(ticker)
var/atom/movable/screen/cinematic = null
var/datum/station_state/start_state = null
-
+ var/list/medal_list = list()
var/station_was_nuked = FALSE //see nuclearbomb.dm and malfunction.dm
var/explosion_in_progress = FALSE //sit back and relax
var/nar_sie_has_risen = FALSE //check, if there is already one god in the world who was summoned (only for tomes)
@@ -637,6 +637,13 @@ SUBSYSTEM_DEF(ticker)
return text
+/datum/controller/subsystem/ticker/proc/show_medals()
+ var/text = "
Были выданы следующие медали:"
+ for(var/datum/medal/medal as anything in medal_list)
+ var/award_text = "[medal.key] as [medal.target_name] was awarded \"[medal.medal_name]\" for \"[medal.reason]\" by [medal.parent_name]!"
+ text += "
[bicon(medal.image)] [award_text]"
+ return text
+
/datum/controller/subsystem/ticker/proc/start_now()
if(SSticker.current_state != GAME_STATE_PREGAME)
return FALSE
diff --git a/code/datums/components/gamemodes/syndicate.dm b/code/datums/components/gamemodes/syndicate.dm
index aa49e45e0902..317ee9f00696 100644
--- a/code/datums/components/gamemodes/syndicate.dm
+++ b/code/datums/components/gamemodes/syndicate.dm
@@ -201,8 +201,8 @@
return
var/obj/item/I = find_syndicate_uplink(traitor_mob)
- if(I?.hidden_uplink)
- QDEL_NULL(I.hidden_uplink)
+ if(I)
+ QDEL_NULL(I)
/datum/component/gamemode/syndicate/OnPostSetup(datum/source, laterole)
equip_traitor()
@@ -248,6 +248,4 @@
if(href_list["removeuplink"])
take_uplink(M.current)
- var/datum/role/role = parent
- role.antag.memory = null
to_chat(M.current, "You have been stripped of your uplink.")
diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm
index c724405d2e75..c193ca1d3d5a 100644
--- a/code/datums/components/mood.dm
+++ b/code/datums/components/mood.dm
@@ -355,22 +355,20 @@
return
var/mob/living/carbon/C = parent
- if(C.shock_stage <= 0)
- if(C.traumatic_shock < 10)
- clear_event(null, "pain")
- else
- add_event(null, "pain", /datum/mood_event/mild_pain)
-
+ if(!C.traumatic_shock)
+ clear_event(null, "pain")
return
- switch(C.shock_stage)
- if(0 to 30)
+ switch(C.traumatic_shock)
+ if(0 to TRAUMATIC_SHOCK_MINOR)
+ add_event(null, "pain", /datum/mood_event/mild_pain)
+ if(TRAUMATIC_SHOCK_MINOR to TRAUMATIC_SHOCK_SERIOUS)
add_event(null, "pain", /datum/mood_event/moderate_pain)
- if(30 to 60)
+ if(TRAUMATIC_SHOCK_SERIOUS to TRAUMATIC_SHOCK_INTENSE)
add_event(null, "pain", /datum/mood_event/intense_pain)
- if(60 to 120)
+ if(TRAUMATIC_SHOCK_INTENSE to TRAUMATIC_SHOCK_MIND_SHATTERING)
add_event(null, "pain", /datum/mood_event/unspeakable_pain)
- if(120 to INFINITY)
+ if(TRAUMATIC_SHOCK_MIND_SHATTERING to INFINITY)
add_event(null, "pain", /datum/mood_event/agony)
/datum/component/mood/proc/check_area_mood(datum/source, area/A, atom/OldLoc)
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index e92011503504..6e483f10d3ee 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -177,10 +177,9 @@
if(T.density)
return FALSE
if(dest_checkdensity == TELE_CHECK_ALL)
- T.Enter(teleatom) //We want do normal bumping/checks with teleatom first (maybe we got access to that door or to push the atom on the other side),
- var/obj/effect/E = new(center) //then we do the real check (if we can enter from destination turf onto target turf).
- E.invisibility = INVISIBILITY_ABSTRACT //Because, checking this with teleatom - won't give us accurate data, since teleatom is far away at this time.
- if(!T.Enter(E)) //That's why we test this with the "fake dummy".
+ var/obj/effect/E = new(center) //Because checking this with teleatom won't give us accurate data, since teleatom is far away at this time.
+ E.invisibility = INVISIBILITY_ABSTRACT //That's why we test this with the "fake dummy".
+ if(!can_enter_turf(E, T))
qdel(E)
return FALSE
qdel(E)
diff --git a/code/datums/outfits/jobs/assistant.dm b/code/datums/outfits/jobs/assistant.dm
index ad5d9eed6836..d20b6311eba9 100644
--- a/code/datums/outfits/jobs/assistant.dm
+++ b/code/datums/outfits/jobs/assistant.dm
@@ -26,13 +26,15 @@
suit = /obj/item/clothing/suit/leathercoat
l_pocket = /obj/item/weapon/lighter/zippo
-/datum/outfit/job/assistant/reporter
- name = OUTFIT_JOB_NAME("Reporter")
+/datum/outfit/job/assistant/journalist
+ name = OUTFIT_JOB_NAME("Journalist")
- uniform = /obj/item/clothing/under/lawyer/black
+ uniform = /obj/item/clothing/under/lawyer/red
shoes = /obj/item/clothing/shoes/black
belt = /obj/item/device/pda/reporter
- l_pocket = /obj/item/device/camera/polar
+ l_pocket = /obj/item/weapon/spacecash/c10
+ r_pocket = /obj/item/weapon/spacecash/c10
+ backpack_contents = list(/obj/item/device/camera)
/datum/outfit/job/assistant/test_subject
name = OUTFIT_JOB_NAME("Test Subject")
diff --git a/code/datums/qualities/negativeish.dm b/code/datums/qualities/negativeish.dm
index 23c1680d41f2..7d58cb8ad742 100644
--- a/code/datums/qualities/negativeish.dm
+++ b/code/datums/qualities/negativeish.dm
@@ -89,8 +89,6 @@
H.dyed_b_facial = dirt_b
H.facial_painted = TRUE
- H.apply_recolor()
- H.update_body()
H.regenerate_icons()
diff --git a/code/datums/qualities/positiveish.dm b/code/datums/qualities/positiveish.dm
index 6ecd10930b3b..d70a29404985 100644
--- a/code/datums/qualities/positiveish.dm
+++ b/code/datums/qualities/positiveish.dm
@@ -334,7 +334,7 @@
/datum/quality/positiveish/cqc
name = "CQC"
- desc = "Вы прошли курсы единоборств и теперь знаете на несколько приёмов больше."
+ desc = "Ты прошёл курсы единоборств и теперь знаешь на несколько приёмов больше."
requirement = "Нет."
/datum/quality/positiveish/cqc/add_effect(mob/living/carbon/human/H)
diff --git a/code/datums/qualities/quirkieish.dm b/code/datums/qualities/quirkieish.dm
index 5e6f1d4e021b..913667efb708 100644
--- a/code/datums/qualities/quirkieish.dm
+++ b/code/datums/qualities/quirkieish.dm
@@ -365,7 +365,7 @@
name = "Prisoner"
desc = "Ты загремел в каталажку за какое-то серьёзное преступление и, конечно, не собираешься исправляться."
- requirement = "Подопытный."
+ requirement = "Подопытный. Включённая опция \"Быть предателем\"."
/datum/quality/quirkieish/prisoner/satisfies_requirements(mob/living/carbon/human/H, latespawn)
return H.mind.role_alt_title == "Test Subject"
@@ -426,3 +426,21 @@
var/obj/item/weapon/stamp/centcomm/S = new
S.stamp_paper(P)
H.equip_or_collect(P, SLOT_L_HAND)
+
+/datum/quality/quirkieish/thief
+ name = "Thief"
+ desc = "Ты задумал кое-что украсть..."
+ requirement = "Все, кроме охраны и глав. Включённая опция \"Быть предателем\"."
+ var/list/restricted_jobs = list("Security Officer", "Security Cadet", "Head of Security", "Forensic Technician", "Detective", "Captain", "Warden", "Head of Personnel", "Blueshield Officer", "Research Director", "Chief Engineer", "Chief Medical Officer", "Internal Affairs Agent")
+
+/datum/quality/quirkieish/thief/satisfies_requirements(mob/living/carbon/human/H, latespawn)
+ return !(H.mind.assigned_role in restricted_jobs)
+
+/datum/quality/quirkieish/thief/add_effect(mob/living/carbon/human/H, latespawn)
+ if(jobban_isbanned(H, "Syndicate") || !(ROLE_TRAITOR in H.client.prefs.be_role))
+ return
+
+ create_and_setup_role(/datum/role/thief, H)
+
+ to_chat(H, "В твоей сумке лежат особые перчатки, они позволят тебе незаметно красть вещи у людей.")
+ H.equip_or_collect(new /obj/item/clothing/gloves/black/strip(H), SLOT_IN_BACKPACK)
diff --git a/code/defines/obj/hydro.dm b/code/defines/obj/hydro.dm
index f7850f044d5e..0ca30a391ec5 100644
--- a/code/defines/obj/hydro.dm
+++ b/code/defines/obj/hydro.dm
@@ -78,13 +78,14 @@
return FALSE
return ..() // Fallthrough to item/attackby() so that bags can pick seeds up
-/obj/item/seeds/gatfruit
- name = "pack of gatfruit seeds"
- desc = "These seeds grow into .357 revolvers."
+/obj/item/seeds/peashooter
+ name = "pack of peashooter seeds"
+ cases = list("семена Горохострела", "семян Горохострела", "семенам Горохострела", "семена Горохострела", "семенами Горохострела", "семенах Горохострела")
+ desc = "Эти семена вырастают в Горохострел"
icon_state = "seed-gatfruit"
- species = "gatfruit"
- plantname = "Gatfruit Tree"
- product_type = /obj/item/weapon/reagent_containers/food/snacks/grown/gatfruit
+ species = "peashooter"
+ plantname = "Peashooter Tree"
+ product_type = /obj/item/weapon/reagent_containers/food/snacks/grown/peashooter
lifespan = 20
endurance = 20
maturation = 10
@@ -115,7 +116,7 @@
if(!istype(E, /datum/disease2/effect/gibbingtons))
return
if(prob(holder.stage * 10))
- mutatelist = list(/obj/item/seeds/gatfruit)
+ mutatelist = list(/obj/item/seeds/peashooter)
tray.mutatespecie()
/obj/item/seeds/chiliseed
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index 3df19ccbd208..2b8f775a3dff 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -183,9 +183,6 @@
if((0 < height) && (height <= heights_list.len))
H.height = heights_list[height]
- H.apply_recolor()
- H.update_body()
- H.update_hair()
H.regenerate_icons()
// Used below, simple injection modifier.
diff --git a/code/game/gamemodes/factions/revolution.dm b/code/game/gamemodes/factions/revolution.dm
index 2f182dc01479..4c387fee0c03 100644
--- a/code/game/gamemodes/factions/revolution.dm
+++ b/code/game/gamemodes/factions/revolution.dm
@@ -21,9 +21,6 @@
var/last_command_report = 0
var/tried_to_add_revheads = 0
- //associative
- var/list/reasons = list()
-
/datum/faction/revolution/proc/get_all_heads()
var/list/heads = list()
for(var/mob/living/carbon/human/player as anything in human_list)
@@ -245,71 +242,13 @@
return dat
-/datum/faction/revolution/GetScoreboard()
- var/count = 1
- var/score_results = ""
- if(objective_holder.objectives.len > 0)
- score_results += "
"
- var/custom_result = custom_result()
- score_results += custom_result
- score_results += "
"
- for(var/datum/objective/objective in objective_holder.GetObjectives())
- objective.extra_info()
- score_results += "Objective #[count]: [objective.explanation_text] [objective.completion_to_string()]"
- feedback_add_details("[ID]_objective","[objective.type]|[objective.completion_to_string(FALSE)]")
- count++
- if(count <= objective_holder.objectives.len)
- score_results += "
"
- score_results += "
"
- score_results += ""
-
- var/have_objectives = FALSE
- var/have_reason_string = FALSE
- if(reasons.len)
- have_reason_string = TRUE
-
- var/list/name_by_members = list()
- score_results += "Members:
"
- for(var/datum/role/R in members)
- if(!name_by_members[R.name])
- name_by_members[R.name] = list()
- name_by_members[R.name] += R
-
- for(var/name in name_by_members)
- score_results += "[name]:"
- for(var/datum/role/R in name_by_members[name])
- var/results = R.GetScoreboard()
- if(results)
- score_results += results
- score_results += "
"
- if(R.objectives.objectives.len)
- have_objectives = TRUE
- if(have_reason_string)
- var/reason_string = reasons[R.antag.key]
- if(reason_string)
- score_results += "- Reason to join the revolution: [reason_string]
"
-
- score_results += "
"
-
- score_results += "
"
-
- if(!have_objectives)
- score_results += "
"
-
- return score_results
-
/datum/faction/revolution/proc/convert_revolutionare_by_invite(mob/possible_rev, mob/inviter)
if(!inviter)
return FALSE
var/datum/role/rev_leader/lead = get_member_by_mind(inviter.mind)
var/choice = tgui_alert(possible_rev, "Asked by [inviter]: Do you want to join the revolution?", "Join the Revolution!", list("No!","Yes!"))
if(choice == "Yes!")
- var/reason_string = find_reason(possible_rev)
- if(!reason_string)
- to_chat(inviter, "[possible_rev] has no reason to support the revolution!")
- lead.rev_cooldown = world.time + 5 SECONDS
- return FALSE
- if(add_user_to_rev(possible_rev, reason_string))
+ if(add_user_to_rev(possible_rev))
to_chat(inviter, "[possible_rev] has joined the revolution!")
add_tc_to_headrev(inviter, lead)
return TRUE
@@ -321,24 +260,8 @@
lead.rev_cooldown = world.time + 5 SECONDS
return FALSE
-/datum/faction/revolution/proc/convert_revolutionare(mob/possible_rev)
- var/reason_string = find_reason(possible_rev)
- if(!reason_string)
- return FALSE
- if(add_user_to_rev(possible_rev, reason_string))
- return TRUE
- return FALSE
-
-/datum/faction/revolution/proc/find_reason(mob/user)
- var/reason_string = sanitize_safe(input(user, "Please write the reason why you want to join the ranks of the revolution", "Write Reason") as null|message, MAX_REV_REASON_LEN)
- if(!reason_string)
- to_chat(user, "You have no reason to join the revolution!")
- return null
- return reason_string
-
-/datum/faction/revolution/proc/add_user_to_rev(mob/user, reason_string)
+/datum/faction/revolution/proc/add_user_to_rev(mob/user)
if(add_faction_member(src, user, TRUE))
- reasons[user.mind.key] = reason_string
to_chat(user, "You join the revolution!")
return TRUE
return FALSE
diff --git a/code/game/gamemodes/modes_gameplays/blob/theblob.dm b/code/game/gamemodes/modes_gameplays/blob/theblob.dm
index 0f7f2e899f1b..61afb88c7352 100644
--- a/code/game/gamemodes/modes_gameplays/blob/theblob.dm
+++ b/code/game/gamemodes/modes_gameplays/blob/theblob.dm
@@ -143,7 +143,7 @@
return
var/obj/structure/blob/normal/B = new /obj/structure/blob/normal(src.loc)
B.density = TRUE
- if(T.Enter(B))//Attempt to move into the tile
+ if(can_enter_turf(B, T))//Attempt to move into the tile
B.density = initial(B.density)
B.loc = T
else
diff --git a/code/game/gamemodes/modes_gameplays/changeling/powers/epinephrine.dm b/code/game/gamemodes/modes_gameplays/changeling/powers/epinephrine.dm
index 78a5f67d957f..2d9dccce4d7a 100644
--- a/code/game/gamemodes/modes_gameplays/changeling/powers/epinephrine.dm
+++ b/code/game/gamemodes/modes_gameplays/changeling/powers/epinephrine.dm
@@ -24,7 +24,6 @@
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.setHalLoss(0)
- H.shock_stage = 0
feedback_add_details("changeling_powers","UNS")
return TRUE
diff --git a/code/game/gamemodes/modes_gameplays/cult/eminence.dm b/code/game/gamemodes/modes_gameplays/cult/eminence.dm
index 79e11755c28a..479f00ba5a01 100644
--- a/code/game/gamemodes/modes_gameplays/cult/eminence.dm
+++ b/code/game/gamemodes/modes_gameplays/cult/eminence.dm
@@ -298,7 +298,6 @@
L.SetDrunkenness(0)
if(iscarbon(L))
var/mob/living/carbon/C = L
- C.shock_stage = 0
if(ishuman(C))
var/mob/living/carbon/human/H = C
H.restore_blood()
diff --git a/code/game/gamemodes/modes_gameplays/cult/rune_datum.dm b/code/game/gamemodes/modes_gameplays/cult/rune_datum.dm
index 685126a7a56c..6a26d8c850b7 100644
--- a/code/game/gamemodes/modes_gameplays/cult/rune_datum.dm
+++ b/code/game/gamemodes/modes_gameplays/cult/rune_datum.dm
@@ -30,9 +30,12 @@
fizzle(user)
action(user)
holder_reaction(user)
- if(!religion.get_tech(RTECH_REUSABLE_RUNE))
+ if(!is_reusable())
qdel(holder)
+/datum/rune/proc/is_reusable()
+ return religion.get_tech(RTECH_REUSABLE_RUNE)
+
/datum/rune/proc/holder_reaction(mob/living/carbon/user)
if(istype(holder, /obj/effect/rune))
return rune_reaction(user)
@@ -56,6 +59,9 @@
/datum/rune/cult/teleport
var/delay = 1 SECONDS
+/datum/rune/cult/teleport/is_reusable()
+ return FALSE
+
/datum/rune/cult/teleport/proc/teleporting(turf/target, mob/user)
playsound(user, 'sound/magic/Teleport_diss.ogg', VOL_EFFECTS_MASTER)
new /obj/effect/temp_visual/cult/blood/out(user.loc)
@@ -85,7 +91,12 @@
if(!destination)
var/area/A = locate(religion.area_type)
destination = get_turf(pick(A.contents))
- teleporting(destination , user)
+ if(!religion.get_tech(RTECH_COOLDOWN_REDUCTION))
+ if(do_after(user, 20, target = user))
+ teleporting(destination , user)
+ else
+ if(do_after(user, 10, target = user))
+ teleporting(destination , user)
/datum/rune/cult/teleport/teleport_to_heaven/proc/create_from_heaven(turf/target, mob/user)
if(isenvironmentturf(target))
@@ -200,6 +211,9 @@
qdel(statue)
return ..()
+/datum/rune/cult/capture_area/is_reusable()
+ return FALSE
+
/datum/rune/cult/capture_area/can_action(mob/living/carbon/user)
var/datum/religion/cult/R = global.cult_religion
if(R.capturing_area)
diff --git a/code/game/gamemodes/modes_gameplays/ninja/space_ninja.dm b/code/game/gamemodes/modes_gameplays/ninja/space_ninja.dm
index a3e84f643636..ed3c9713a603 100644
--- a/code/game/gamemodes/modes_gameplays/ninja/space_ninja.dm
+++ b/code/game/gamemodes/modes_gameplays/ninja/space_ninja.dm
@@ -79,11 +79,10 @@
var/mob/living/carbon/human/new_ninja = new(spawn_point.loc)
var/ninja_title = pick(ninja_titles)
var/ninja_name = pick(ninja_names)
- new_ninja.gender = pick(MALE, FEMALE)
- var/datum/preferences/A = new()//Randomize appearance for the ninja.
- A.randomize_appearance_for(new_ninja)
- new_ninja.real_name = "[ninja_title] [ninja_name]"
+ new_ninja.randomize_appearance()
+ new_ninja.name = "[ninja_title] [ninja_name]"
+ new_ninja.real_name = new_ninja.name
new_ninja.dna.ready_dna(new_ninja)
new_ninja.create_mind_space_ninja()
new_ninja.equip_space_ninja()
diff --git a/code/game/gamemodes/roles/thief.dm b/code/game/gamemodes/roles/thief.dm
new file mode 100644
index 000000000000..e4f35ada0490
--- /dev/null
+++ b/code/game/gamemodes/roles/thief.dm
@@ -0,0 +1,12 @@
+/datum/role/thief
+ name = THIEF
+ id = THIEF
+ logo_state = "thief"
+
+/datum/role/thief/forgeObjectives()
+ . = ..()
+ if(!.)
+ return
+
+ AppendObjective(/datum/objective/steal, TRUE)
+ AppendObjective(/datum/objective/escape)
diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm
index 8c59736f8981..7e43846476f0 100644
--- a/code/game/gamemodes/scoreboard.dm
+++ b/code/game/gamemodes/scoreboard.dm
@@ -1,6 +1,8 @@
/datum/controller/subsystem/ticker/proc/scoreboard(completions, mob/one_mob)
if(SSStatistics.achievements.len)
completions += "[achievement_declare_completion()]
"
+ if(medal_list.len)
+ completions += "[show_medals()]
"
// Who is alive/dead, who escaped
for (var/mob/living/silicon/ai/I as anything in ai_list)
@@ -164,7 +166,7 @@
Электропитание по всей станции: [SSStatistics.score.powerbonus ? "Да" : "Нет"] ([PLURALIZE_RUSSIAN_POINTS(SSStatistics.score.powerbonus * 2500)])
Самая чистая станция: [SSStatistics.score.mess ? "Нет" : "Да"] ([PLURALIZE_RUSSIAN_POINTS(SSStatistics.score.messbonus * 3000)])
ПЛОХО:
- Успешность действий антоганистов: [SSStatistics.score.roleswon] (-[PLURALIZE_RUSSIAN_POINTS(SSStatistics.score.roleswon * 250)])
+ Успешность действий антагонистов: [SSStatistics.score.roleswon] (-[PLURALIZE_RUSSIAN_POINTS(SSStatistics.score.roleswon * 250)])
Мёртвые тела на станции: [SSStatistics.score.crew_dead] (-[PLURALIZE_RUSSIAN_POINTS(SSStatistics.score.crew_dead * 250)])
Не убрано мусора: [SSStatistics.score.mess] (-[PLURALIZE_RUSSIAN_POINTS(SSStatistics.score.mess)])
Проблемы с электропитанием на станции: [SSStatistics.score.powerloss] (-[PLURALIZE_RUSSIAN_POINTS(SSStatistics.score.powerloss * 30)])
diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm
index b88bfd445d22..c47e9cab28fc 100644
--- a/code/game/jobs/job/assistant.dm
+++ b/code/game/jobs/job/assistant.dm
@@ -13,7 +13,7 @@
"Test Subject" = /datum/outfit/job/assistant/test_subject,
"Lawyer" = /datum/outfit/job/assistant/lawyer,
"Private Eye" = /datum/outfit/job/assistant/private_eye,
- "Reporter" = /datum/outfit/job/assistant/reporter,
+ "Journalist" = /datum/outfit/job/assistant/journalist,
"Waiter" = /datum/outfit/job/assistant/waiter,
"Vice Officer" = /datum/outfit/job/assistant/vice_officer,
"Paranormal Investigator" = /datum/outfit/job/assistant/paranormal_investigator
@@ -25,7 +25,7 @@
"Lawyer" = /datum/skillset/assistant/lawyer,
"Mecha Operator" = /datum/skillset/assistant/mecha,
"Private Eye" = /datum/skillset/assistant/detective,
- "Reporter" = /datum/skillset/assistant/reporter,
+ "Journalist" = /datum/skillset/assistant/journalist,
"Waiter" = /datum/skillset/assistant/waiter,
"Vice Officer" = /datum/skillset/assistant/vice_officer,
"Paranormal Investigator" = /datum/skillset/assistant/paranormal
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index 1bb855952fb6..252bb8a52902 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -212,7 +212,6 @@
idtype = /obj/item/weapon/card/id/civ
access = list(access_library)
salary = 40
- alt_titles = list("Journalist")
minimal_player_ingame_minutes = 120
outfit = /datum/outfit/job/librarian
skillsets = list("Librarian" = /datum/skillset/librarian)
diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm
index 2afa6a9b44f7..94c34eebbd1d 100644
--- a/code/game/machinery/ai_slipper.dm
+++ b/code/game/machinery/ai_slipper.dm
@@ -1,7 +1,8 @@
/obj/machinery/ai_slipper
name = "AI Liquid Dispenser"
- icon = 'icons/obj/device.dmi'
- icon_state = "motion3"
+ desc = "A remotely-activatable dispenser for crowd-controlling foam."
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "ai-slipper0"
layer = 3
plane = FLOOR_PLANE
anchored = TRUE
@@ -27,9 +28,9 @@
/obj/machinery/ai_slipper/update_icon()
if(stat)
- icon_state = "motion0"
+ icon_state = "ai-slipper0"
else
- icon_state = disabled ? "motion0" : "motion3"
+ icon_state = disabled ? "ai-slipper0" : "ai-slipper1"
/obj/machinery/ai_slipper/AICtrlClick()
toggle_on()
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index 9a23c3b6dabf..7f3045c8f960 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -232,7 +232,7 @@
dat += "Установить время: [(setminute ? text("[setminute]:") : null)][setsecond]
"
// Controls
- dat += "- - + +
"
+ dat += "- - Ввести время + +
"
// Mounted flash controls
for(var/obj/machinery/flasher/F in targets)
@@ -341,6 +341,12 @@
timeset(addtime)
+ if(href_list["set_time"]) // set timer (in minutes)
+ var/new_time = input(usr, "Введите время заключения (в минутах):", "Ввод времени") as num
+ new_time = clamp(new_time, 0, 60)
+
+ timeset(new_time * 60)
+
if(href_list["fc"])
for(var/obj/machinery/flasher/F in targets)
F.flash()
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 3acde2d1b6bc..3e32b7de0655 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -71,15 +71,11 @@
src.attached = over_object
update_icon()
-
/obj/machinery/iv_drip/attackby(obj/item/weapon/W, mob/user)
- if (istype(W, /obj/item/weapon/reagent_containers))
+ if (istype(W, /obj/item/weapon/reagent_containers/glass/beaker) || istype(W, /obj/item/weapon/reagent_containers/blood) || istype(W, /obj/item/weapon/reagent_containers/glass/bottle))
if(!isnull(src.beaker))
to_chat(user, "There is already a reagent container loaded!")
return
- if(istype(W, /obj/item/weapon/reagent_containers/pill/twopart))
- W.flags &= ~NOREACT
- W.reagents.handle_reactions()
user.drop_from_inventory(W, src)
src.beaker = W
to_chat(user, "You attach \the [W] to \the [src].")
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index bd8c845fb45e..7b650f2ab6d9 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -7,19 +7,33 @@
/datum/feed_message
var/author = ""
var/body = ""
+ var/datum/money_account/author_account = null
+ var/is_licensed = FALSE
//var/parent_channel
var/backup_body = ""
var/backup_author = ""
var/is_admin_message = 0
var/icon/img = null
var/icon/backup_img
- var/list/voters = list() //stores a string with voters
- var/likes = 0
- var/dislikes = 0
+ var/list/voters = list() //stores a string with voters and his mark
+ var/displayVoters = FALSE
var/count_comments = 0
- var/comments_closed = TRUE //spoiler
var/list/datum/comment_pages/pages = list()
+/datum/feed_message/proc/get_likes()
+ var/likes = 0
+ for(var/voter in voters)
+ if(voters[voter] > 0)
+ likes += voters[voter]
+ return likes
+
+/datum/feed_message/proc/get_dislikes()
+ var/dislikes = 0
+ for(var/voter in voters)
+ if(voters[voter] < 0)
+ dislikes -= voters[voter]
+ return dislikes
+
/datum/comment_pages
var/list/datum/message_comment/comments = list() //stores COMMENTS_ON_PAGE comments
@@ -43,21 +57,21 @@
//var/page = null //For newspapers
/datum/feed_message/proc/clear()
- src.author = ""
- src.body = ""
- src.backup_body = ""
- src.backup_author = ""
- src.img = null
- src.backup_img = null
+ author = ""
+ body = ""
+ backup_body = ""
+ backup_author = ""
+ img = null
+ backup_img = null
/datum/feed_channel/proc/clear()
- src.channel_name = ""
- src.messages = list()
- src.locked = 0
- src.author = ""
- src.backup_author = ""
- src.censored = 0
- src.is_admin_channel = 0
+ channel_name = ""
+ messages = list()
+ locked = 0
+ author = ""
+ backup_author = ""
+ censored = 0
+ is_admin_channel = 0
/datum/feed_message/Destroy()
QDEL_LIST(pages)
@@ -156,6 +170,9 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
// 0 = there hasn't been a news/wanted update in the last alert_delay
// 1 = there has
var/scanned_user = "Unknown" //Will contain the name of the person who currently uses the newscaster
+ var/datum/money_account/user_account = null
+ var/have_license = FALSE
+ var/is_guest = FALSE
var/msg = "" //Feed message
var/obj/item/weapon/photo/photo = null
var/channel_name = "" //the feed channel which will be receiving the feed, or being created
@@ -202,7 +219,7 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
add_overlay("newscaster_alert")
if(hitstaken > 0) //Cosmetic damage overlay
- add_overlay(image(src.icon, "crack[hitstaken]"))
+ add_overlay(image(icon, "crack[hitstaken]"))
icon_state = "newscaster_normal"
return
@@ -252,7 +269,7 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
switch(screen)
if(0)
- dat += "Добро пожаловать в Новостной Модуль #[src.unit_no].
Все системы новостной сети функционируют."
+ dat += "Добро пожаловать в Новостной Модуль #[unit_no].
Все системы новостной сети функционируют."
dat += "
Собственность Nanotrasen Corp."
if(news_network.wanted_issue)
dat+= "
Раздел \"Розыск\""
@@ -260,7 +277,7 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
dat+= "
Новостные Каналы"
dat+= "
Создать Историю"
dat+= "
Распечатать газету"
- if(src.securityCaster)
+ if(securityCaster)
var/wanted_already = 0
if(news_network.wanted_issue)
wanted_already = 1
@@ -269,7 +286,7 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
dat+="
[(wanted_already) ? ("Изменить") : ("Объявить в")] розыск"
dat+="
Цензурировать Истории"
dat+="
Отметить Новостной Канал ❌-меткой НаноТрейзен"
- dat+="
Новостной модуль распознает вас, как: [src.scanned_user]"
+ dat+="
Новостной модуль распознает вас, как: [scanned_user]"
dat+="
Сканировать пользователя"
if(1)
dat+= "Новостные Каналы станции
"
@@ -285,31 +302,38 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
dat+="
Назад"
if(2)
dat+="Создание Новостного Канала..."
- dat+="
Название Канала: [src.channel_name]
"
- dat+="Автор Канала: [src.scanned_user]
"
- dat+="Истории других пользователей: [(src.c_locked) ? ("НЕТ") : ("ДА")]
"
+ dat+="
Название Канала: [channel_name]
"
+ dat+="Автор Канала: [scanned_user]
"
+ dat+="Истории других пользователей: [(c_locked) ? ("НЕТ") : ("ДА")]
"
dat+="
Создать
Отменить
"
if(3)
dat+="Создание Истории..."
- dat+="
Канал: [src.channel_name]
" //MARK
- dat+="Автор Истории: [src.scanned_user]
"
- dat+="Текст Истории: [src.msg]
"
- dat+="Прикрепить снимок: [(src.photo ? "Снимок прикреплен" : "Нет снимка")]
"
+ dat+="
Канал: [channel_name]
" //MARK
+ dat+="Автор Истории: [scanned_user]
"
+ dat+="Текст Истории: [msg]
"
+ dat+="Прикрепить снимок: [(photo ? "Снимок прикреплен" : "Нет снимка")]
"
dat+="
Опубликовать
Отменить
"
if(4)
- dat+="История успешно опубликована в [src.channel_name].
"
+ dat+="История успешно опубликована в [channel_name].
"
dat+="
Вернуться
"
if(5)
- dat+="Канал \"[src.channel_name]\" успешно создан.
"
+ dat+="Канал \"[channel_name]\" успешно создан.
"
dat+="
Вернуться
"
if(6)
dat+="ОШИБКА: Не удалось опубликовать Историю.
"
- if(src.channel_name=="")
+ if(channel_name=="")
dat+="Недопустимое имя Канала.
"
- if(src.scanned_user=="Unknown")
+ if(scanned_user=="Unknown")
dat+="Автор канала не подтвержден.
"
- if(src.msg == "" || src.msg == "\[██████\]")
+ if(msg == "" || msg == "\[██████\]")
dat+="Недопустимый текст.
"
+ if(is_guest)
+ dat+="Гостевой пропуск не поддерживается.
"
+ var/payment = 20
+ if(have_license)
+ payment /= 2
+ if(user_account.money < payment)
+ dat+="Недостаточно средств для оплаты публикации.
"
dat+="
Вернуться
"
if(7)
@@ -322,18 +346,20 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
existing_authors += FC.backup_author
else
existing_authors += FC.author
- if(src.scanned_user in existing_authors)
+ if(scanned_user in existing_authors)
dat+="Вы уже являетесь автором Новостного Канала.
"
- if(src.channel_name=="" || src.channel_name == "\[██████\]")
+ if(channel_name=="" || channel_name == "\[██████\]")
dat+="Недопустимое имя Канала.
"
+ if(is_guest)
+ dat+="Гостевой пропуск не поддерживается.
"
var/check = 0
for(var/datum/feed_channel/FC in news_network.network_channels)
- if(FC.channel_name == src.channel_name)
+ if(FC.channel_name == channel_name)
check = 1
break
if(check)
dat+="Имя Канала уже используется.
"
- if(src.scanned_user=="Unknown")
+ if(scanned_user=="Unknown")
dat+="Автор канала не подтвержден.
"
dat+="
Вернуться
"
if(8)
@@ -346,20 +372,20 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
else
active_num--
dat+="В настоящий момент существует [total_num] Новостных Каналов, [active_num] из которых активны. Всего было создано [message_num] Историй."
- dat+="
Количество жидкой бумаги: [(src.paper_remaining) *100 ] см^3"
+ dat+="
Количество жидкой бумаги: [(paper_remaining) *100 ] см^3"
dat+="
Распечатать газету"
dat+="
Назад"
if(9)
- dat+="[src.viewing_channel.channel_name]: \[создано: [src.viewing_channel.author]\]
"
- if(src.viewing_channel.censored)
- dat+="ВНИМАНИЕ: Этот Канал был признан угрозой благополучию станции, и был отмечен ❌-меткой НаноТрейзен.
"
+ dat+="[viewing_channel.channel_name]: \[создано: [viewing_channel.author]\]
"
+ if(viewing_channel.censored)
+ dat+="ВНИМАНИЕ: Этот Канал был признан угрозой благополучию станции и был отмечен ❌-меткой НаноТрейзен.
"
dat+="Невозможно опубликовывать новые Истории, пока действует ❌-метка.
"
else
- if( isemptylist(src.viewing_channel.messages) )
+ if( isemptylist(viewing_channel.messages) )
dat+="В этом Канале Истории не обнаружены...
"
else
var/i = 0
- for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages)
+ for(var/datum/feed_message/MESSAGE in viewing_channel.messages)
i++
dat+="-[MESSAGE.body]
"
if(MESSAGE.img)
@@ -367,10 +393,33 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
dat+="
"
dat+="\[Автор: [MESSAGE.author]\]
"
//If a person has already voted, then the button will not be clickable
- dat+="[((src.scanned_user in MESSAGE.voters) || (src.scanned_user == "Unknown")) ? ("") : ("")]: [MESSAGE.likes] \
- [((src.scanned_user in MESSAGE.voters) || (src.scanned_user == "Unknown")) ? ("") : ("")]: [MESSAGE.dislikes]"
-
- dat+="
Открыть комментарии - ([MESSAGE.count_comments])
"
+ dat+="[((scanned_user in MESSAGE.voters) || (scanned_user == "Unknown")) ? ("") : ("")]: [MESSAGE.get_likes()] \
+ [((scanned_user in MESSAGE.voters) || (scanned_user == "Unknown")) ? ("") : ("")]: [MESSAGE.get_dislikes()]"
+ if(securityCaster)
+ dat+=" "
+ dat+=""
+ dat+=""
+ dat+="
"
+ if(MESSAGE.displayVoters)
+ var/likes = MESSAGE.get_likes()
+ var/dislikes = MESSAGE.get_dislikes()
+ if(likes > 0)
+ dat+="Лайки"
+ dat+=""
+ for(var/voterName in MESSAGE.voters)
+ if(MESSAGE.voters[voterName] > 0)
+ dat+="- [voterName]
"
+ dat+="
"
+ if(dislikes > 0)
+ dat+="Дизлайки"
+ dat+=""
+ for(var/voterName in MESSAGE.voters)
+ if(MESSAGE.voters[voterName] < 0)
+ dat+="- [voterName]
"
+ dat+="
"
+ else
+ dat+="
"
+ dat+="Открыть комментарии - ([MESSAGE.count_comments])
"
dat+="Обновить"
dat+="
Назад"
@@ -387,9 +436,9 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
dat+="
Назад"
if(11)
dat+="Обработчик ❌-метки НаноТрейзен
"
- dat+="❌-меткой должен быть отмечен канал, который служба безопасности сочтет Канал опасным для морального духа и дисциплины персонала станции."
- dat+="❌-метка не позволяет кому-либо обновлять, изменять или добавлять Истории в Канал, но при этом сохраняет всю информацию."
- dat+="Вы можете наложить или убрать ❌-метку в любое время, если у вас есть необходимый доступ.
"
+ dat+="❌-меткой должен быть отмечен Канал, который служба безопасности сочтет опасным для морального духа и дисциплины персонала станции. \
+ ❌-метка не позволяет кому-либо обновлять, изменять или добавлять Истории в Канал, но при этом сохраняет всю информацию. \
+ Вы можете поставить или убрать ❌-метку в любое время, если у вас есть необходимый доступ.
"
if(isemptylist(news_network.network_channels))
dat+="Активных Каналов не найдено...
"
else
@@ -398,28 +447,28 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
dat+="
Назад"
if(12)
- dat+="[src.viewing_channel.channel_name]: "
- dat+="\[создано: [src.viewing_channel.author] \]
"
+ dat+="[viewing_channel.channel_name]: "
+ dat+="\[создано: [viewing_channel.author] \]
"
- if( isemptylist(src.viewing_channel.messages) )
+ if( isemptylist(viewing_channel.messages) )
dat+="В этом Канале Истории не обнаружены...
"
else
- for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages)
+ for(var/datum/feed_message/MESSAGE in viewing_channel.messages)
dat+="-[MESSAGE.body]
"
dat+="\[Story by [MESSAGE.author]\]
"
- dat+="
Открыть комментарии - [(src.viewing_channel.lock_comments) ? ("Открыть") : ("Закрыть")]
"
+ dat+="
Открыть комментарии - [(viewing_channel.lock_comments) ? ("Открыть") : ("Закрыть")]
"
dat+="
Назад"
if(13)
- dat+="[src.viewing_channel.channel_name]: \[создано: [src.viewing_channel.author] \]
"
- dat+="Если вы считаете содержание опасным для станции, вы можете Наложить ❌-метку на Канал.
"
- if(src.viewing_channel.censored)
- dat+="ВНИМАНИЕ: Этот Канал был признан угрозой благополучию станции, и был отмечен ❌-меткой НаноТрейзен.
"
+ dat+="[viewing_channel.channel_name]: \[создано: [viewing_channel.author] \]
"
+ dat+="Если вы считаете содержание опасным для станции, вы можете Наложить ❌-метку на Канал.
"
+ if(viewing_channel.censored)
+ dat+="ВНИМАНИЕ: Этот Канал был признан угрозой благополучию станции и был отмечен ❌-меткой НаноТрейзен.
"
dat+="Невозможно опубликовывать новые Истории, пока действует ❌-метка.
"
else
- if( isemptylist(src.viewing_channel.messages) )
+ if( isemptylist(viewing_channel.messages) )
dat+="В этом Канале Истории не обнаружены...
"
else
- for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages)
+ for(var/datum/feed_message/MESSAGE in viewing_channel.messages)
dat+="-[MESSAGE.body]
\[создано [MESSAGE.author]\]
"
dat+="
Назад"
@@ -434,28 +483,30 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
if(wanted_already)
dat+="
Запрос розыска уже существует. Вы можете отредактировать его ниже."
dat+="
"
- dat+="Имя: [src.channel_name]
"
- dat+="Описание: [src.msg]
"
- dat+="Прикрепить снимок: [(src.photo ? "Снимок прикреплен" : "Нет снимка")]"
+ dat+="Имя: [channel_name]
"
+ dat+="Описание: [msg]
"
+ dat+="Прикрепить снимок: [(photo ? "Снимок прикреплен" : "Нет снимка")]"
if(wanted_already)
dat+="Розыск создан: [news_network.wanted_issue.backup_author]
"
else
- dat+="Розыск будет создан: [src.scanned_user]
"
+ dat+="Розыск будет создан: [scanned_user]
"
dat+="
[(wanted_already) ? ("Редактировать") : ("Опубликовать")]"
if(wanted_already)
dat+="
Удалить розыск"
dat+="
Отменить"
if(15)
- dat+="[src.channel_name] был объявлен в розыск.
"
+ dat+="[channel_name] был объявлен в розыск.
"
dat+="
Вернуться
"
if(16)
dat+="ОШИБКА: Не удалось создать розыск.
"
- if(src.channel_name=="" || src.channel_name == "\[██████\]")
+ if(channel_name=="" || channel_name == "\[██████\]")
dat+="Недопустимое имя разыскиваемого.
"
- if(src.scanned_user=="Unknown")
+ if(scanned_user=="Unknown")
dat+="Автор канала не подтвержден.
"
- if(src.msg == "" || src.msg == "\[██████\]")
+ if(msg == "" || msg == "\[██████\]")
dat+="Недопустимое описание.
"
+ if(is_guest)
+ dat+="Гостевой пропуск не поддерживается.
"
dat+="
Вернуться
"
if(17)
dat+="Розыск успешно удален.
"
@@ -472,7 +523,7 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
dat+="Отсутствует"
dat+="
Назад
"
if(19)
- dat+="Розыск в [src.channel_name] успешно изменен.
"
+ dat+="Розыск в [channel_name] успешно изменен.
"
dat+="
Вернуться
"
if(20)
dat+="Печать завершена. Пожалуйста, заберите вашу газету из нижней части Новостного Модуля
"
@@ -482,19 +533,19 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
dat+="Вернуться"
if(22)
dat+="ОШИБКА: Не удалось опубликовать комментарий.
"
- if(src.comment_msg == "" || src.comment_msg == null)
+ if(comment_msg == "" || comment_msg == null)
dat+="Недопустимая длина комментария.
"
- if(src.scanned_user == "Unknown")
+ if(scanned_user == "Unknown")
dat+="Автор канала не подтвержден.
"
dat+="
Вернуться
"
if(23)
- var/datum/feed_message/MESSAGE = src.viewing_message
+ var/datum/feed_message/MESSAGE = viewing_message
dat+="Количество комментариев - [MESSAGE.count_comments]
"
- if(!src.viewing_channel.lock_comments)
+ if(!viewing_channel.lock_comments)
dat+="Оставить комментарий"
else
dat+="Комментарии закрыты!"
- var/datum/comment_pages/PAGE = src.current_page
+ var/datum/comment_pages/PAGE = current_page
if(PAGE.comments.len != 0) //perfecto
dat+="
"
for(var/datum/message_comment/COMMENT in PAGE.comments)
@@ -504,14 +555,14 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
dat+="
"
for(var/datum/comment_pages/PAGES in MESSAGE.pages)
i++
- dat+="[(src.current_page != PAGES) ? (" [i]") : (" [i]")]"
+ dat+="[(current_page != PAGES) ? (" [i]") : (" [i]")]"
dat+="
Обновить
"
dat+="Вернуться"
if(24)
- dat+="Story ([src.viewing_message.body])
"
- var/datum/feed_message/MESSAGE = src.viewing_message
+ dat+="Story ([viewing_message.body])
"
+ var/datum/feed_message/MESSAGE = viewing_message
dat+="Количество комментариев - [MESSAGE.count_comments]
"
- var/datum/comment_pages/PAGE = src.current_page
+ var/datum/comment_pages/PAGE = current_page
for(var/datum/message_comment/COMMENT in PAGE.comments)
dat+="[COMMENT.author]"
dat+=" [COMMENT.time]
"
@@ -519,16 +570,19 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
var/i = 0
for(var/datum/comment_pages/PAGES in MESSAGE.pages)
i++
- dat+="[(src.current_page != PAGES) ? (" [i]") : (" [i]")]"
+ dat+="[(current_page != PAGES) ? (" [i]") : (" [i]")]"
dat+="
Обновить
"
dat+="Вернуться"
+ if(25)
+ dat+="ОШИБКА: гостевой пропуск не поддерживается.
"
+ dat+="
Вернуться
"
else
dat+="Ошибка 404.
[return_funny_title()]."
var/datum/asset/assets = get_asset_datum(/datum/asset/simple/newscaster) //Sending pictures to the client
assets.send(human_or_robot_user)
- var/datum/browser/popup = new(human_or_robot_user, "window=newscaster_main", src.name, 400, 600)
+ var/datum/browser/popup = new(human_or_robot_user, "window=newscaster_main", name, 400, 600)
popup.set_content(dat)
popup.open()
@@ -541,11 +595,11 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
var/new_name = sanitize_safe(input(usr, "Название Новостного Канала", "Обработчик Сети Новостей", input_default(channel_name)), MAX_LNAME_LEN)
if(!can_still_interact_with(usr) || !length(new_name))
return
- src.channel_name = new_name
+ channel_name = new_name
//update_icon()
else if(href_list["set_channel_lock"])
- src.c_locked = !src.c_locked
+ c_locked = !c_locked
//update_icon()
else if(href_list["submit_new_channel"])
@@ -559,25 +613,25 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
existing_authors +=FC.author
var/check = 0
for(var/datum/feed_channel/FC in news_network.network_channels)
- if(FC.channel_name == src.channel_name)
+ if(FC.channel_name == channel_name)
check = 1
break
- if(src.channel_name == "" || src.channel_name == "\[██████\]" || src.scanned_user == "Unknown" || check || (src.scanned_user in existing_authors) )
- src.screen = 7
+ if(channel_name == "" || channel_name == "\[██████\]" || scanned_user == "Unknown" || check || (scanned_user in existing_authors) || is_guest)
+ screen = 7
else
var/choice = tgui_alert(usr,"Подтвердите создание Новостного Канала","Обработчик Сети Новостей", list("Подтвердить","Отменить"))
if(!can_still_interact_with(usr))
return
if(choice=="Подтвердить")
var/datum/feed_channel/newChannel = new /datum/feed_channel
- newChannel.channel_name = src.channel_name
- newChannel.author = src.scanned_user
+ newChannel.channel_name = channel_name
+ newChannel.author = scanned_user
newChannel.locked = c_locked
feedback_inc("newscaster_channels",1)
/*for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) //Let's add the new channel in all casters.
NEWSCASTER.channel_list += newChannel*/ //Now that it is sane, get it into the list. -OBSOLETE
news_network.network_channels += newChannel //Adding channel to the global network
- src.screen = 5
+ screen = 5
//update_icon()
else if(href_list["set_channel_receiving"])
@@ -589,57 +643,64 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
var/new_name = input(usr, "Выберите Канал", "Обработчик Сети Новостей") in available_channels
if(!can_still_interact_with(usr) || !length(new_name))
return
- src.channel_name = new_name
+ channel_name = new_name
else if(href_list["set_new_message"])
- var/new_msg = sanitize(input(usr, "Напишите вашу Историю", "Обработчик Сети Новостей", input_default(src.msg)), extra = FALSE)
+ var/new_msg = sanitize(input(usr, "Напишите вашу Историю", "Обработчик Сети Новостей", input_default(msg)), extra = FALSE)
if(!can_still_interact_with(usr) || !length(new_msg))
return
- src.msg = new_msg
+ msg = new_msg
else if(href_list["set_attachment"])
AttachPhoto(usr)
else if(href_list["submit_new_message"])
- if(src.msg == "" || src.msg == "\[██████\]" || src.scanned_user == "Unknown" || src.channel_name == "" )
- src.screen = 6
+ var/payment = 20
+ if(have_license)
+ payment /= 2
+ if(msg == "" || msg == "\[██████\]" || scanned_user == "Unknown" || channel_name == "" || user_account.money < payment || is_guest)
+ screen = 6
else
var/datum/feed_message/newMsg = new /datum/feed_message
var/datum/comment_pages/CP = new /datum/comment_pages
- newMsg.author = src.scanned_user
- newMsg.body = src.msg
+ newMsg.author = scanned_user
+ newMsg.body = msg
+ newMsg.author_account = user_account
+ newMsg.is_licensed = have_license
+ charge_to_account(user_account.account_number, "Newscaster", "Вы опубликовали новость", name, -payment)
+ charge_to_account(global.station_account.account_number, "Newscaster", "Опубликована новость", name, payment)
if(photo)
newMsg.img = photo.img
feedback_inc("newscaster_stories",1)
for(var/datum/feed_channel/FC in news_network.network_channels)
- if(FC.channel_name == src.channel_name)
+ if(FC.channel_name == channel_name)
FC.messages += newMsg //Adding message to the network's appropriate feed_channel
newMsg.pages += CP
break
- src.screen = 4
+ screen = 4
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
- NEWSCASTER.newsAlert(src.channel_name)
+ NEWSCASTER.newsAlert(channel_name)
else if(href_list["create_channel"])
- src.screen = 2
+ screen = 2
else if(href_list["create_feed_story"])
- src.screen = 3
+ screen = 3
else if(href_list["menu_paper"])
- src.screen = 8
+ screen = 8
else if(href_list["print_paper"])
- if(!src.paper_remaining)
- src.screen = 21
+ if(!paper_remaining)
+ screen = 21
else
print_paper()
- src.screen = 20
+ screen = 20
else if(href_list["menu_censor_story"])
- src.screen = 10
+ screen = 10
else if(href_list["menu_censor_channel"])
- src.screen = 11
+ screen = 11
else if(href_list["menu_wanted"])
var/already_wanted = 0
@@ -647,9 +708,9 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
already_wanted = 1
if(already_wanted)
- src.channel_name = news_network.wanted_issue.author
- src.msg = news_network.wanted_issue.body
- src.screen = 14
+ channel_name = news_network.wanted_issue.author
+ msg = news_network.wanted_issue.body
+ screen = 14
else if(href_list["set_wanted_name"])
var/new_name = sanitize(input(usr, "Укажите имя разыскиваемого лица", "Сетевой Обработчик Безопасности", input_default(channel_name)), MAX_LNAME_LEN)
@@ -665,8 +726,8 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
else if(href_list["submit_wanted"])
var/input_param = text2num(href_list["submit_wanted"])
- if(src.msg == "" || src.channel_name == "" || src.scanned_user == "Unknown")
- src.screen = 16
+ if(msg == "" || channel_name == "" || scanned_user == "Unknown")
+ screen = 16
else
var/choice = tgui_alert(usr,"Подтвердите [(input_param==1) ? ("создание") : ("редактирование")] объявления.","Сетевой Обработчик Безопасности", list("Подтвердить","Отменить"))
if(!can_still_interact_with(usr))
@@ -674,26 +735,26 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
if(choice == "Подтвердить")
if(input_param == 1) //If input_param == 1 we're submitting a new wanted issue. At 2 we're just editing an existing one. See the else below
var/datum/feed_message/WANTED = new /datum/feed_message
- WANTED.author = src.channel_name
- WANTED.body = src.msg
- WANTED.backup_author = src.scanned_user //I know, a bit wacky
+ WANTED.author = channel_name
+ WANTED.body = msg
+ WANTED.backup_author = scanned_user //I know, a bit wacky
if(photo)
WANTED.img = photo.img
news_network.wanted_issue = WANTED
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
NEWSCASTER.newsAlert()
NEWSCASTER.update_icon()
- src.screen = 15
+ screen = 15
else
if(news_network.wanted_issue.is_admin_message)
to_chat(usr, "The wanted issue has been distributed by a Nanotrasen higherup. You cannot edit it.")
return FALSE
- news_network.wanted_issue.author = src.channel_name
- news_network.wanted_issue.body = src.msg
- news_network.wanted_issue.backup_author = src.scanned_user
+ news_network.wanted_issue.author = channel_name
+ news_network.wanted_issue.body = msg
+ news_network.wanted_issue.backup_author = scanned_user
if(photo)
news_network.wanted_issue.img = photo.img
- src.screen = 19
+ screen = 19
else if(href_list["cancel_wanted"])
if(news_network.wanted_issue.is_admin_message)
@@ -706,10 +767,10 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
news_network.wanted_issue = null
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
NEWSCASTER.update_icon()
- src.screen = 17
+ screen = 17
else if(href_list["view_wanted"])
- src.screen = 18
+ screen = 18
else if(href_list["censor_channel_author"])
var/datum/feed_channel/FC = locate(href_list["censor_channel_author"])
if(FC.is_admin_channel)
@@ -766,8 +827,8 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
else if(href_list["pick_d_notice"])
var/datum/feed_channel/FC = locate(href_list["pick_d_notice"])
- src.viewing_channel = FC
- src.screen = 13
+ viewing_channel = FC
+ screen = 13
else if(href_list["toggle_d_notice"])
var/datum/feed_channel/FC = locate(href_list["toggle_d_notice"])
@@ -777,70 +838,92 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
FC.censored = !FC.censored
else if(href_list["view"])
- src.screen = 1
+ screen = 1
else if(href_list["setScreen"]) //Brings us to the main menu and resets all fields~
- src.screen = text2num(href_list["setScreen"])
- if (src.screen == 0)
- src.scanned_user = "Unknown"
+ screen = text2num(href_list["setScreen"])
+ if (screen == 0)
+ scanned_user = "Unknown"
msg = ""
- src.c_locked = 0
+ c_locked = 0
channel_name = ""
- src.viewing_channel = null
+ viewing_channel = null
else if(href_list["show_channel"])
var/datum/feed_channel/FC = locate(href_list["show_channel"])
- src.viewing_channel = FC
- src.screen = 9
+ viewing_channel = FC
+ screen = 9
else if(href_list["pick_censor_channel"])
var/datum/feed_channel/FC = locate(href_list["pick_censor_channel"])
- src.viewing_channel = FC
- src.screen = 12
+ viewing_channel = FC
+ screen = 12
else if(href_list["setLike"])
- var/datum/feed_message/FM = locate(href_list["setLike"])
- FM.voters += src.scanned_user
- FM.likes += 1
+ if(is_guest)
+ screen = 25
+ else
+ var/datum/feed_message/FM = locate(href_list["setLike"])
+ FM.voters[scanned_user] = 1
+ var/datum/money_account/MA = FM.author_account
+ if(MA && !MA.suspended && (FM.author != scanned_user))
+ var/payment = 5
+ if(FM.is_licensed)
+ payment *= 2
+ charge_to_account(MA.account_number, "Newscaster", "Вашу новость оценили", name, payment)
+ charge_to_account(global.station_account.account_number, "Newscaster", "Оплата СМИ", name, -payment)
else if(href_list["setDislike"])
- var/datum/feed_message/FM = locate(href_list["setDislike"])
- FM.voters += src.scanned_user
- FM.dislikes += 1
+ if(is_guest)
+ screen = 25
+ else
+ var/datum/feed_message/FM = locate(href_list["setDislike"])
+ FM.voters[scanned_user] = -1
+ var/datum/money_account/MA = FM.author_account
+ if(MA && !MA.suspended && (FM.author != scanned_user))
+ var/payment = 5
+ if(FM.is_licensed)
+ payment *= 2
+ charge_to_account(MA.account_number, "Newscaster", "Вашу новость оценили", name, payment)
+ charge_to_account(global.station_account.account_number, "Newscaster", "Оплата СМИ", name, -payment)
+
+ else if(href_list["toggleDisplayVoters"])
+ var/datum/feed_message/FM = locate(href_list["toggleDisplayVoters"])
+ FM.displayVoters = !FM.displayVoters
else if(href_list["open_pages"]) //page with comments for assistants
var/datum/feed_message/FM = locate(href_list["open_pages"])
- src.viewing_message = FM
- src.current_page = FM.pages[1]
- src.screen = 23
+ viewing_message = FM
+ current_page = FM.pages[1]
+ screen = 23
else if(href_list["open_censor_pages"]) //page with comments for security
var/datum/feed_message/FM = locate(href_list["open_censor_pages"])
- src.viewing_message = FM
- src.current_page = FM.pages[1]
- src.screen = 24
+ viewing_message = FM
+ current_page = FM.pages[1]
+ screen = 24
else if(href_list["next_page"])
var/datum/comment_pages/CP = locate(href_list["next_page"])
- src.screen = 23
- src.current_page = CP
+ screen = 23
+ current_page = CP
else if(href_list["next_censor_page"])
var/datum/comment_pages/CP = locate(href_list["next_censor_page"])
- src.screen = 24
- src.current_page = CP
+ screen = 24
+ current_page = CP
else if(href_list["leave_a_comment"])
var/datum/feed_message/FM = locate(href_list["leave_a_comment"])
- src.comment_msg = sanitize(input(usr, "Напишите комментарий", "Обработчик Сети Новостей", input_default(src.comment_msg)), extra = FALSE)
+ comment_msg = sanitize(input(usr, "Напишите комментарий", "Обработчик Сети Новостей", input_default(comment_msg)), extra = FALSE)
if(!can_still_interact_with(usr))
return
- if(src.comment_msg == "" || src.comment_msg == null || src.scanned_user == "Unknown")
- src.screen = 22
+ if(comment_msg == "" || comment_msg == null || scanned_user == "Unknown")
+ screen = 22
else
var/datum/message_comment/COMMENT = new /datum/message_comment
- COMMENT.author = src.scanned_user
- COMMENT.body = src.comment_msg
+ COMMENT.author = scanned_user
+ COMMENT.body = comment_msg
COMMENT.time = worldtime2text()
var/length = FM.pages.len //find the last page
@@ -855,13 +938,13 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
FM.count_comments += 1
- src.comment_msg = ""
+ comment_msg = ""
else if(href_list["locked_comments"])
- if(src.viewing_channel.lock_comments)
- src.viewing_channel.lock_comments = FALSE
+ if(viewing_channel.lock_comments)
+ viewing_channel.lock_comments = FALSE
else
- src.viewing_channel.lock_comments = TRUE
+ viewing_channel.lock_comments = TRUE
updateUsrDialog()
@@ -917,7 +1000,7 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
/obj/machinery/newscaster/proc/AttachPhoto(mob/user)
if(photo)
if(!issilicon(user))
- photo.loc = src.loc
+ photo.loc = loc
user.put_in_inactive_hand(photo)
photo = null
if(istype(user.get_active_hand(), /obj/item/weapon/photo))
@@ -1000,34 +1083,34 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
if(ishuman(user))
var/mob/living/carbon/human/human_user = user
var/dat
- src.pages = 0
+ pages = 0
switch(screen)
if(0) //Cover
dat+="Грифон
"
dat+="Стандартная газета НаноТрейзен, предназначенная для использования на Космических Объектах НаноТрейзен©
"
- if(isemptylist(src.news_content))
- if(src.important_message)
- dat+="Содержание:
**Важные объявление службы безопасности** \[стр. [src.pages+2]\]
"
+ if(isemptylist(news_content))
+ if(important_message)
+ dat+="Содержание:
**Важные объявление службы безопасности** \[стр. [pages+2]\]
"
else
dat+="[return_funny_title()]"
else
dat+="Содержание:
"
- for(var/datum/feed_channel/NP in src.news_content)
- src.pages++
- if(src.important_message)
- dat+="**Важные объявление службы безопасности** \[стр. [src.pages+2]\]
"
+ for(var/datum/feed_channel/NP in news_content)
+ pages++
+ if(important_message)
+ dat+="**Важные объявление службы безопасности** \[стр. [pages+2]\]
"
var/temp_page=0
- for(var/datum/feed_channel/NP in src.news_content)
+ for(var/datum/feed_channel/NP in news_content)
temp_page++
dat+="[NP.channel_name] \[стр. [temp_page+1]\]
"
dat+="
"
if(scribble_page==curr_page)
- dat+="
Маленькая надпись внизу страницы гласит: \"[src.scribble]\""
+ dat+="
Маленькая надпись внизу страницы гласит: \"[scribble]\""
dat+= "
"
if(1) // X channel pages inbetween.
- for(var/datum/feed_channel/NP in src.news_content)
- src.pages++ //Let's get it right again.
- var/datum/feed_channel/C = src.news_content[src.curr_page]
+ for(var/datum/feed_channel/NP in news_content)
+ pages++ //Let's get it right again.
+ var/datum/feed_channel/C = news_content[curr_page]
dat+="[C.channel_name] \[создано: [C.author]\]
"
if(C.censored)
dat+="Содержание данного Новостного Канала было отмечено как угроза благополучию станции и помечено ❌-меткой. Эта статья не была напечатана в газете."
@@ -1044,15 +1127,15 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
user << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
dat+="
"
dat+="\[Автор: [MESSAGE.author]\]
"
- dat+="Лайки: [MESSAGE.likes] Дизлайки: [MESSAGE.dislikes]
"
+ dat+="Лайки: [MESSAGE.get_likes()] Дизлайки: [MESSAGE.get_dislikes()]
"
dat+=""
if(scribble_page==curr_page)
- dat+="
Маленькая надпись внизу страницы гласит: \"[src.scribble]\""
+ dat+="
Маленькая надпись внизу страницы гласит: \"[scribble]\""
dat+= "
"
if(2) //Last page
- for(var/datum/feed_channel/NP in src.news_content)
- src.pages++
- if(src.important_message != null)
+ for(var/datum/feed_channel/NP in news_content)
+ pages++
+ if(important_message != null)
dat+="Розыск:
"
dat+="Имя: [important_message.author]
"
dat+="Описание: [important_message.body]
"
@@ -1065,14 +1148,14 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
else
dat+="[return_funny_title()]"
if(scribble_page==curr_page)
- dat+="
Маленькая надпись внизу страницы гласит: \"[src.scribble]\""
+ dat+="
Маленькая надпись внизу страницы гласит: \"[scribble]\""
dat+= "
"
else
dat+="[return_funny_title()]"
- dat+="
[src.curr_page+1]
"
+ dat+="
[curr_page+1]
"
- var/datum/browser/popup = new(human_user, "window=newspaper_main", src.name, 300, 400, ntheme = CSS_THEME_LIGHT)
+ var/datum/browser/popup = new(human_user, "window=newspaper_main", name, 300, 400, ntheme = CSS_THEME_LIGHT)
popup.set_content(dat)
popup.open()
else
@@ -1086,42 +1169,42 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
return
U.set_machine(src)
if(href_list["next_page"])
- if(curr_page==src.pages+1)
+ if(curr_page==pages+1)
return //Don't need that at all, but anyway.
- if(src.curr_page == src.pages) //We're at the middle, get to the end
- src.screen = 2
+ if(curr_page == pages) //We're at the middle, get to the end
+ screen = 2
else
if(curr_page == 0) //We're at the start, get to the middle
- src.screen=1
- src.curr_page++
+ screen=1
+ curr_page++
playsound(src, pick(SOUNDIN_PAGETURN), VOL_EFFECTS_MASTER)
else if(href_list["prev_page"])
if(curr_page == 0)
return
if(curr_page == 1)
- src.screen = 0
+ screen = 0
else
- if(curr_page == src.pages+1) //we're at the end, let's go back to the middle.
- src.screen = 1
- src.curr_page--
+ if(curr_page == pages+1) //we're at the end, let's go back to the middle.
+ screen = 1
+ curr_page--
playsound(src, pick(SOUNDIN_PAGETURN), VOL_EFFECTS_MASTER)
- if(istype(src.loc, /mob))
- attack_self(src.loc)
+ if(istype(loc, /mob))
+ attack_self(loc)
/obj/item/weapon/newspaper/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/pen))
- if(src.scribble_page == src.curr_page)
+ if(scribble_page == curr_page)
to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?")
else
var/new_scribble = sanitize(input(user, "Write something", "Newspaper", ""))
if (!length(new_scribble))
return
- src.scribble_page = src.curr_page
- src.scribble = new_scribble
+ scribble_page = curr_page
+ scribble = new_scribble
attack_self(user)
return
return ..()
@@ -1132,24 +1215,17 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
/obj/machinery/newscaster/proc/scan_user(mob/living/user)
if(ishuman(user)) //User is a human
- var/mob/living/carbon/human/human_user = user
- if(human_user.wear_id) //Newscaster scans you
- if(istype(human_user.wear_id, /obj/item/device/pda) ) //autorecognition, woo!
- var/obj/item/device/pda/P = human_user.wear_id
- if(P.id)
- src.scanned_user = "[P.id.registered_name] ([P.id.assignment])"
- else
- src.scanned_user = "Unknown"
- else if(istype(human_user.wear_id, /obj/item/weapon/card/id) )
- var/obj/item/weapon/card/id/ID = human_user.wear_id
- src.scanned_user ="[ID.registered_name] ([ID.assignment])"
- else
- src.scanned_user ="Unknown"
- else
- src.scanned_user ="Unknown"
+ var/mob/living/carbon/human/H = user
+ var/obj/item/weapon/card/id/C = H.get_idcard()
+
+ if(C)
+ scanned_user ="[C.registered_name] ([C.assignment])"
+ user_account = get_account(C.associated_account_number)
+ have_license = (C.assignment == "Journalist")
+ is_guest = istype(C, /obj/item/weapon/card/id/guest)
else
var/mob/living/silicon/ai_user = user
- src.scanned_user = "[ai_user.name] ([ai_user.job])"
+ scanned_user = "[ai_user.name] ([ai_user.job])"
/obj/machinery/newscaster/proc/print_paper()
@@ -1160,7 +1236,7 @@ var/global/list/obj/machinery/newscaster/allCasters = list() //Global list that
if(news_network.wanted_issue)
NEWSPAPER.important_message = news_network.wanted_issue
NEWSPAPER.loc = get_turf(src)
- src.paper_remaining--
+ paper_remaining--
return
//Removed for now so these aren't even checked every tick. Left this here in-case Agouri needs it later.
diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm
index f47fbc4511d9..adac0f9f7818 100644
--- a/code/game/objects/effects/decals/contraband.dm
+++ b/code/game/objects/effects/decals/contraband.dm
@@ -665,7 +665,7 @@
to_chat(user, "You can't overcome the guilt to join the revolutionaries. (You are banned.)")
return
else if(!isrevhead(user) && !isrev(user))
- rev.convert_revolutionare(user)
+ rev.add_user_to_rev(user)
/obj/structure/sign/poster/revolution/examine(mob/user)
. = ..()
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index 9bda7509fdc7..5a288e516f2e 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -535,7 +535,7 @@ steam.start() -- spawns the effect
if(!T)
continue
- if(!T.Enter(src))
+ if(!can_enter_turf(src, T))
continue
var/obj/effect/effect/foam/F = locate() in T
diff --git a/code/game/objects/fitness.dm b/code/game/objects/fitness.dm
index 91c343f22443..205967ed0489 100644
--- a/code/game/objects/fitness.dm
+++ b/code/game/objects/fitness.dm
@@ -67,7 +67,7 @@
to_chat(user, "You should get off the [user.buckled] first.")
return
- if(gymnast.halloss > 80 || gymnast.shock_stage > 80)
+ if(gymnast.halloss > 80 || gymnast.traumatic_shock > 80)
to_chat(user, "You are too exausted.")
return
@@ -171,7 +171,7 @@
if(user.buckled && user.buckled != src)
to_chat(user, "You should get off the [user.buckled] first.")
return
- if(user.halloss > 80 || user.shock_stage > 80)
+ if(user.halloss > 80 || user.traumatic_shock > 80)
to_chat(user, "You are too exausted.")
return
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index ca240dd09983..ef348376ea30 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -403,7 +403,7 @@
// Suturing yourself brings much more pain.
var/pain_factor = H == user ? 40 : 20
if(H.stat == CONSCIOUS)
- H.AdjustShockStage(pain_factor)
+ H.adjustHalLoss(pain_factor)
BP.status &= ~ORGAN_ARTERY_CUT
BP.strap()
user.visible_message(
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index c815860a7b5b..9e7ca1dd8f7d 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -321,7 +321,6 @@
if(ishuman(S.imp_in))
var/mob/living/carbon/human/H = S.imp_in
H.setHalLoss(0)
- H.shock_stage = 0
S.imp_in.stat = CONSCIOUS
S.imp_in.SetParalysis(0)
S.imp_in.SetStunned(0)
diff --git a/code/game/objects/items/weapons/implants/mindshield.dm b/code/game/objects/items/weapons/implants/mindshield.dm
index 868d43c974b8..413b60f79b6b 100644
--- a/code/game/objects/items/weapons/implants/mindshield.dm
+++ b/code/game/objects/items/weapons/implants/mindshield.dm
@@ -82,7 +82,7 @@
if(.)
if(M.mind)
var/cleared_role = FALSE
- var/list/remove_roles = list(TRAITOR, NUKE_OP, NUKE_OP_LEADER, HEADREV, GANGSTER_LEADER)
+ var/list/remove_roles = list(TRAITOR, NUKE_OP, NUKE_OP_LEADER, HEADREV, GANGSTER_LEADER, PRISONER, THIEF)
for(var/role in remove_roles)
var/datum/role/R = M.mind.GetRole(role)
if(!R)
diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm
index c1664c8e4b45..66240ccfe975 100644
--- a/code/game/objects/items/weapons/storage/lockbox.dm
+++ b/code/game/objects/items/weapons/storage/lockbox.dm
@@ -20,16 +20,7 @@
to_chat(user, "It appears to be broken.")
return
if(allowed(user))
- locked = !( locked )
- if(locked)
- icon_state = icon_locked
- to_chat(user, "You lock the [src]!")
- close_all() // close the content window for all mobs, when lock lockbox
- return
- else
- icon_state = icon_closed
- to_chat(user, "You unlock the [src]!")
- return
+ toggle_lock()
else
to_chat(user, "Access Denied")
return
@@ -52,6 +43,18 @@
else
to_chat(user, "Its locked!")
+/obj/item/weapon/storage/lockbox/proc/toggle_lock()
+ locked = !( locked )
+ if(locked)
+ icon_state = icon_locked
+ to_chat(usr, "You lock the [src]!")
+ close_all() // close the content window for all mobs, when lock lockbox
+ return
+ else
+ icon_state = icon_closed
+ to_chat(usr, "You unlock the [src]!")
+ return
+
/obj/item/weapon/storage/lockbox/attack_hand(mob/user)
if ((loc == user) && locked)
to_chat(user, "[src] is locked and cannot be opened!")
@@ -124,7 +127,8 @@
/obj/item/weapon/storage/lockbox/medal
name = "medal box"
desc = "A locked box used to store medals of honor."
- req_access = list(access_captain)
+ req_access = list(access_cent_general)
+ var/list/req_roles = list() //string, role from "datum/mind/assigned_role" (probably better make defines?)
icon_state = "medalbox+l"
icon_locked = "medalbox+l"
icon_closed = "medalbox"
@@ -137,6 +141,15 @@
var/open = FALSE // used for overlays
+/obj/item/weapon/storage/lockbox/medal/attack_self(mob/user)
+ if (req_roles.Find(user.mind.assigned_role))
+ toggle_lock()
+ if(locked)
+ open = FALSE
+ update_overlays()
+ else
+ to_chat(user, "Access denied!")
+
/obj/item/weapon/storage/lockbox/medal/open(mob/user)
..()
open = TRUE
@@ -180,6 +193,7 @@
/obj/item/weapon/storage/lockbox/medal/captain
name = "Captain medal box"
desc = "A locked box used to store medals to be given to crew."
+ req_roles = list("Captain")
startswith = list(
/obj/item/clothing/accessory/medal/conduct,
@@ -196,7 +210,7 @@
/obj/item/weapon/storage/lockbox/medal/hop
name = "Head of Personnel medal box"
desc = "A locked box used to store medals to be given to those exhibiting excellence in management."
- req_access = list(access_hop)
+ req_roles = list("Captain", "Head of Personnel")
startswith = list(
/obj/item/clothing/accessory/medal/gold/bureaucracy,
@@ -207,7 +221,7 @@
/obj/item/weapon/storage/lockbox/medal/hos
name = "security medal box"
desc = "A locked box used to store medals to be given to members of the security department."
- req_access = list(access_hos)
+ req_roles = list("Captain", "Head of Security")
startswith = list(
/obj/item/clothing/accessory/medal/silver/security,
@@ -217,7 +231,7 @@
/obj/item/weapon/storage/lockbox/medal/cmo
name = "medical medal box"
desc = "A locked box used to store medals to be given to members of the medical department."
- req_access = list(access_cmo)
+ req_roles = list("Captain", "Chief Medical Officer")
startswith = list(
/obj/item/clothing/accessory/medal/silver/med_medal,
@@ -226,7 +240,7 @@
/obj/item/weapon/storage/lockbox/medal/rd
name = "science medal box"
desc = "A locked box used to store medals to be given to members of the science department."
- req_access = list(access_rd)
+ req_roles = list("Captain", "Research Director")
startswith = list(
/obj/item/clothing/accessory/medal/plasma/nobel_science,
diff --git a/code/game/objects/structures/survivor_cryopod.dm b/code/game/objects/structures/survivor_cryopod.dm
index 02bc087987d1..b2dbbc193ad6 100644
--- a/code/game/objects/structures/survivor_cryopod.dm
+++ b/code/game/objects/structures/survivor_cryopod.dm
@@ -54,27 +54,21 @@
H.SetSleeping(2000 SECONDS)
H.drowsyness = 1000
+ H.randomize_appearance()
+
if(fixed_gender)
switch(fixed_gender)
if("male")
H.gender = MALE
if("female")
H.gender = FEMALE
- else
- H.gender = pick(MALE, FEMALE)
- else
- H.gender = pick(MALE, FEMALE)
+
+ H.update_body()
+
if(fixed_name)
H.name = fixed_name
- else
- if(H.gender == MALE)
- H.name = pick(first_names_male)
- else
- H.name = pick(first_names_female)
- H.name += " [pick(last_names)]"
- H.real_name = H.name
- var/datum/preferences/A = new() //Randomize appearance for the human
- A.randomize_appearance_for(H)
+ H.real_name = fixed_name
+
H.dna.ready_dna(H)
H.dna.UpdateSE()
H.forceMove(src)
@@ -112,6 +106,9 @@
/obj/structure/survivor_cryopod/proc/equip_survivor(mob/living/carbon/human/H)
return
+/obj/structure/survivor_cryopod/nasa
+ fixed_name = "Major Tom" // ground control to maaaajor tom
+
/obj/structure/survivor_cryopod/nasa/equip_survivor(mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(H), SLOT_W_UNIFORM)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), SLOT_SHOES)
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 9a9f238d870b..b15b5ce5a10c 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -36,8 +36,8 @@
smooth = SMOOTH_TRUE
// todo:
-// probably we should make /obj/structure/falsewall
-// and /turf/simulated/wall as meta-types not used in the game, and move
+// probably we should make /obj/structure/falsewall
+// and /turf/simulated/wall as meta-types not used in the game, and move
// real walls and falsewalls to subtypes
/turf/simulated/wall/yellow
icon = 'icons/turf/walls/has_false_walls/wall_yellow.dmi'
@@ -447,7 +447,7 @@
//slowdown, user. No need destruct all walls without debuff
if(iscarbon(user))
var/mob/living/carbon/C = user
- C.shock_stage += 5
+ C.adjustHalLoss(15)
user.visible_message("[user] бьет стену!")
user.do_attack_animation(src)
playsound(user, pick(hammer.hitsound), VOL_EFFECTS_MASTER)
diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm
index ccce152c1f22..5acaac26f3f7 100644
--- a/code/game/turfs/simulated/walls_reinforced.dm
+++ b/code/game/turfs/simulated/walls_reinforced.dm
@@ -302,7 +302,7 @@
//slowdown, user. No need destruct all walls without debuff
if(iscarbon(user))
var/mob/living/carbon/C = user
- C.shock_stage += 5
+ C.adjustHalLoss(15)
user.do_attack_animation(src)
user.visible_message("[user] бьет укрепленную стену!",
"Вы пытаетесь снести укрепленную стену!",
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index e5bd8e0d136b..7d68189a2f8f 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -210,7 +210,7 @@
// Obstacle not on border or null
return rollback_obstacle
-/turf/Enter(atom/movable/mover as mob|obj, atom/old_loc as mob|obj|turf)
+/proc/can_enter_turf(atom/movable/mover as mob|obj, turf/new_loc, turf/old_loc)
if(movement_disabled && usr.ckey != movement_disabled_exception)
to_chat(usr, "Передвижение отключено администрацией.")//This is to identify lag problems
return FALSE
@@ -218,9 +218,9 @@
var/atom/bump_target
if(istype(mover, /obj/item/projectile))
- bump_target = get_projectile_bump_target(src, mover)
+ bump_target = get_projectile_bump_target(new_loc, mover)
else
- bump_target = get_bump_target(src, mover)
+ bump_target = get_bump_target(new_loc, mover)
if(bump_target)
mover.Bump(bump_target, TRUE)
@@ -228,6 +228,14 @@
return TRUE
+/turf/Exit(atom/movable/mover as mob|obj, atom/new_loc as mob|obj|turf)
+ if(!isturf(new_loc))
+ return TRUE
+ return can_enter_turf(mover, new_loc, src)
+
+/turf/Enter(atom/movable/mover as mob|obj, atom/old_loc as mob|obj|turf)
+ return TRUE
+
/turf/proc/is_mob_placeable(mob/M) // todo: maybe rewrite as COMSIG_ATOM_INTERCEPT_TELEPORT
if(density)
return FALSE
diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm
index f8b51996930a..23af7c96fc84 100644
--- a/code/modules/admin/create_mob.dm
+++ b/code/modules/admin/create_mob.dm
@@ -6,14 +6,3 @@
create_mob_html = replacetext(create_mob_html, "null /* object types */", "\"[mobjs]\"")
user << browse(replacetext(create_mob_html, "/* ref src */", "\ref[src]"), "window=create_mob;size=425x475")
-
-/proc/randomize_human(mob/living/carbon/human/H)
- H.gender = pick(MALE, FEMALE)
- if(H.gender == MALE)
- H.name = pick(first_names_male)
- else
- H.name = pick(first_names_female)
- H.name += " [pick(last_names)]"
- H.real_name = H.name
- var/datum/preferences/A = new() //Randomize appearance for the human
- A.randomize_appearance_for(H)
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index f1ba4e23e735..dc2bde34a521 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -437,7 +437,7 @@ var/global/movement_disabled_exception //This is the client that calls the proc,
else
for(var/obj/item/I in D)
qdel(I)
- randomize_human(D)
+ D.randomize_appearance()
JB.equip(D, TRUE, FALSE)
COMPILE_OVERLAYS(D)
var/icon/I = icon(getFlatIcon(D), frame = 1)
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index abfa11e54c26..e05df91fb64b 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -96,8 +96,7 @@
//First we spawn a dude.
var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned.
- randomize_human(new_character)
- new_character.age = rand(new_character.species.min_age, new_character.species.min_age * 1.5)
+ new_character.randomize_appearance()
new_character.dna.ready_dna(new_character)
new_character.key = G_found.key
@@ -110,10 +109,7 @@
var/syndicate_commando_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major")
var/syndicate_commando_name = pick(last_names)
- new_syndicate_commando.gender = pick(MALE, FEMALE)
-
- var/datum/preferences/A = new()//Randomize appearance for the commando.
- A.randomize_appearance_for(new_syndicate_commando)
+ new_syndicate_commando.randomize_appearance()
new_syndicate_commando.real_name = "[!syndicate_leader_selected ? syndicate_commando_rank : syndicate_commando_leader_rank] [syndicate_commando_name]"
new_syndicate_commando.name = new_syndicate_commando.real_name
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 44063a0b5bed..b239318357a3 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -445,9 +445,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
new_character.age = record_found.fields["age"]
new_character.dna.b_type = record_found.fields["b_type"]
else
- new_character.gender = pick(MALE,FEMALE)
- var/datum/preferences/A = new()
- A.randomize_appearance_for(new_character)
+ new_character.randomize_appearance()
+ new_character.name = G_found.name
new_character.real_name = G_found.real_name
if(!new_character.real_name)
diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm
index e1bda65251e1..ca9aa9374ed7 100644
--- a/code/modules/admin/verbs/striketeam.dm
+++ b/code/modules/admin/verbs/striketeam.dm
@@ -106,13 +106,11 @@ var/global/sent_strike_team = FALSE
var/commando_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major")
var/commando_name = pick(last_names)
- new_commando.gender = pick(MALE, FEMALE)
-
// Randomize appearance for the commando
- var/datum/preferences/A = new
- A.randomize_appearance_for(new_commando)
+ new_commando.randomize_appearance()
new_commando.real_name = "[is_leader ? commando_leader_rank : commando_rank] [commando_name]"
+ new_commando.name = new_commando.real_name
new_commando.age = is_leader ? rand(new_commando.species.min_age * 1.25, new_commando.species.min_age * 1.75) : rand(new_commando.species.min_age, new_commando.species.min_age * 1.5)
new_commando.dna.ready_dna(new_commando)
diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm
index 11ee1e939fbe..4a7f3836cb5c 100644
--- a/code/modules/admin/verbs/striketeam_syndicate.dm
+++ b/code/modules/admin/verbs/striketeam_syndicate.dm
@@ -127,12 +127,10 @@ var/global/sent_syndicate_strike_team = FALSE
var/syndicate_commando_rank = pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant 1st Class", "Master Sergeant", "Sergeant Major")
var/syndicate_commando_name = pick(last_names)
- new_syndicate_commando.gender = pick(MALE, FEMALE)
-
- var/datum/preferences/A = new()//Randomize appearance for the commando.
- A.randomize_appearance_for(new_syndicate_commando)
+ new_syndicate_commando.randomize_appearance()
new_syndicate_commando.real_name = "[!syndicate_leader_selected ? syndicate_commando_rank : syndicate_commando_leader_rank] [syndicate_commando_name]"
+ new_syndicate_commando.name = new_syndicate_commando.real_name
new_syndicate_commando.age = !syndicate_leader_selected ? rand(new_syndicate_commando.species.min_age, new_syndicate_commando.species.min_age * 1.5) : rand(new_syndicate_commando.species.min_age * 1.25, new_syndicate_commando.species.min_age * 1.75)
new_syndicate_commando.dna.ready_dna(new_syndicate_commando)//Creates DNA.
diff --git a/code/modules/cargo/exports/grown.dm b/code/modules/cargo/exports/grown.dm
index 6ba6ce49dd2c..88042a0caa5e 100644
--- a/code/modules/cargo/exports/grown.dm
+++ b/code/modules/cargo/exports/grown.dm
@@ -1,7 +1,7 @@
-/datum/export/gatfruit
+/datum/export/peashooter
unit_name = "strange fruit"
cost = 150
- export_types = list(/obj/item/weapon/reagent_containers/food/snacks/grown/gatfruit)
+ export_types = list(/obj/item/weapon/reagent_containers/food/snacks/grown/peashooter)
/*
/export/grown subtype
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index b1324bb8d4f0..451201be5e9e 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -3,11 +3,11 @@
//This is the current version, anything below this will attempt to update (if it's not obsolete)
-#define SAVEFILE_VERSION_MAX 50
+#define SAVEFILE_VERSION_MAX 51
//For repetitive updates, should be the same or below SAVEFILE_VERSION_MAX
//set this to (current SAVEFILE_VERSION_MAX)+1 when you need to update:
-#define SAVEFILE_VERSION_SPECIES_JOBS 50 // job preferences after breaking changes to any /datum/job/
+#define SAVEFILE_VERSION_SPECIES_JOBS 51 // job preferences after breaking changes to any /datum/job/
#define SAVEFILE_VERSION_QUIRKS 30 // quirks preferences after breaking changes to any /datum/quirk/
//breaking changes is when you remove any existing quirk/job or change their restrictions
//Don't forget to bump SAVEFILE_VERSION_MAX too
@@ -270,6 +270,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
be_role -= "Imposter"
S["be_role"] << be_role
+ if(current_version < 50)
+
+ if(player_alt_titles && (player_alt_titles["Assistant"] in list("Reporter")))
+ player_alt_titles -= "Assistant"
+ if(player_alt_titles && (player_alt_titles["Librarian"] in list("Journalist")))
+ player_alt_titles -= "Librarian"
+
+
//
/datum/preferences/proc/repetitive_updates_character(current_version, savefile/S)
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index cb0ccf848a92..56d0ff882946 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -224,11 +224,13 @@
name = "red bandana"
desc = "A fine red bandana with nanotech lining."
icon_state = "bandred"
+ item_state = "redbandana"
/obj/item/clothing/mask/bandana/blue
name = "blue bandana"
desc = "A fine blue bandana with nanotech lining."
icon_state = "bandblue"
+ item_state = "bluebandana"
/obj/item/clothing/mask/bandana/green
name = "green bandana"
@@ -239,16 +241,19 @@
name = "gold bandana"
desc = "A fine gold bandana with nanotech lining."
icon_state = "bandgold"
+ item_state = "goldbandana"
/obj/item/clothing/mask/bandana/black
name = "black bandana"
desc = "A fine black bandana with nanotech lining."
icon_state = "bandblack"
+ item_state = "blackbandana"
/obj/item/clothing/mask/bandana/skull
name = "skull bandana"
desc = "A fine black bandana with nanotech lining and a skull emblem."
icon_state = "bandskull"
+ item_state = "skullbandana"
/obj/item/clothing/mask/tie
body_parts_covered = 0
diff --git a/code/modules/clothing/spacesuits/rig/modules/ai.dm b/code/modules/clothing/spacesuits/rig/modules/ai.dm
index a2a17e39a2dc..7625147604dd 100644
--- a/code/modules/clothing/spacesuits/rig/modules/ai.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/ai.dm
@@ -366,7 +366,7 @@
if(H.getBruteLoss() > 40)
if(try_inject(H, chem_disp, list("bicaridine", "tricordrazine")))
return
- if(H.traumatic_shock > 40 || H.shock_stage > 40)
+ if(H.traumatic_shock > 40)
if(try_inject(H, chem_disp, list("oxycodone", "tramadol", "paracetamol")))
return
if(H.getToxLoss() > 20)
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index f8593b621e1b..77b16efb5449 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -166,6 +166,29 @@
icon_state = "metal_cross"
//Medals
+/datum/medal
+ // string, anything
+ var/key
+ // string, anything
+ var/target_name
+ // string, anything
+ var/medal_name
+ // string, anything
+ var/parent_name // person who awarded medal
+ //string, anything
+ var/reason
+ //object, icons
+ var/image //icon of medal
+
+/datum/medal/New(key, target_name, medal_name, parent_name, reason, image)
+ ..()
+ src.key = key
+ src.target_name = target_name
+ src.medal_name = medal_name
+ src.parent_name = parent_name
+ src.reason = reason
+ src.image = image
+
/obj/item/clothing/accessory/medal
name = "bronze medal"
desc = "A bronze medal."
@@ -196,8 +219,10 @@
user.visible_message("[user] is trying to pin [src] on [H]'s chest.", \
"You try to pin [src] on [H]'s chest.")
var/input
+ var/awarded_name
if(!commended && user != H)
- input = sanitize(input(user, "Reason for this commendation? Describe their accomplishments", "Commendation") as null|text)
+ awarded_name = sanitize(input(user, "Name of awarded person?", "Name", H.name) as null|text, MAX_LNAME_LEN)
+ input = sanitize(input(user, "Reason for this commendation? Describe their accomplishments", "Commendation") as null|text, MAX_MEDAL_REASON_LEN)
if(do_after(user, delay, target = H))
C.attach_accessory(src, user)
if(user != H)
@@ -208,6 +233,11 @@
desc += "
The inscription reads: [input] - [user.real_name]"
log_game("[key_name(H)] was given the following commendation by [key_name(user)]: [input]")
message_admins("[key_name_admin(H)] was given the following commendation by [key_name_admin(user)]: [input]")
+ if(awarded_name)
+ var/parent_name = sanitize(user.name)
+ var/datum/medal/medal = new(H.key, awarded_name, name, parent_name, input, image(icon, icon_state))
+ SSticker.medal_list.Add(medal)
+ SSStatistics.add_medal(H.key, awarded_name, name, parent_name, input)
return
..()
diff --git a/code/modules/events/cellular_biomass/biomass.dm b/code/modules/events/cellular_biomass/biomass.dm
index 5b2a5a2ecd5d..2cdad92bd63c 100644
--- a/code/modules/events/cellular_biomass/biomass.dm
+++ b/code/modules/events/cellular_biomass/biomass.dm
@@ -114,7 +114,7 @@
if(isfloorturf(step))
var/turf/simulated/floor/F = step
if(!locate(/obj/effect/biomass,F))
- if(F.Enter(src))
+ if(can_enter_turf(src, F))
if(master)
master.spawn_biomass_piece( F )
return 1
diff --git a/code/modules/events/cellular_biomass/spacevines.dm b/code/modules/events/cellular_biomass/spacevines.dm
index f477f040f5e7..dce232f1e8c9 100644
--- a/code/modules/events/cellular_biomass/spacevines.dm
+++ b/code/modules/events/cellular_biomass/spacevines.dm
@@ -169,7 +169,7 @@
if(isfloorturf(step))
var/turf/simulated/floor/F = step
if(!locate(/obj/structure/spacevine,F))
- if(F.Enter(src))
+ if(can_enter_turf(src, F))
if(master)
master.spawn_spacevine_piece( F )
diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm
index f82cd965e77c..6614113a047b 100644
--- a/code/modules/goonchat/browserOutput.dm
+++ b/code/modules/goonchat/browserOutput.dm
@@ -1,4 +1,4 @@
-var/global/savefile/iconCache = new /savefile("data/iconCache.sav")
+var/global/savefile/iconCache = new /savefile("cache/iconCache.sav")
var/global/list/bicon_cache = list()
@@ -23,7 +23,8 @@ var/global/list/bicon_cache = list()
var/iconData = iconCache.ExportText(iconKey)
var/list/partial = splittext(iconData, "{")
var/list/almost_partial = splittext(partial[2], "}")
- return replacetext(copytext(almost_partial[1], 3, -5), "\n", "")
+ var/base64 = copytext(almost_partial[1], 3, -2)
+ return replacetext(base64, "\n", "")
/proc/bicon(obj, css = "class='icon'", time_stamp = -1) // if you don't want any styling just pass null to css
if (!obj)
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index ae712940e61d..566661609bbd 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -436,9 +436,7 @@
new_character.add_language(client.prefs.language, LANGUAGE_NATIVE)
if(SSticker.random_players)
- new_character.gender = pick(MALE, FEMALE)
- client.prefs.real_name = random_name(new_character.gender)
- client.prefs.randomize_appearance_for(new_character)
+ new_character.randomize_appearance()
else
client.prefs.copy_to(new_character)
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index 8de5efb57547..137759de8d7a 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -32,48 +32,11 @@
b_facial = b_hair
return
- var/red
- var/green
- var/blue
-
- var/col = pick ("blonde", "black", "chestnut", "copper", "brown", "wheat", "old", "punk")
- switch(col)
- if("blonde")
- red = 255
- green = 255
- blue = 0
- if("black")
- red = 0
- green = 0
- blue = 0
- if("chestnut")
- red = 153
- green = 102
- blue = 51
- if("copper")
- red = 255
- green = 153
- blue = 0
- if("brown")
- red = 102
- green = 51
- blue = 0
- if("wheat")
- red = 255
- green = 255
- blue = 153
- if("old")
- red = rand (100, 255)
- green = red
- blue = red
- if("punk")
- red = rand (0, 255)
- green = rand (0, 255)
- blue = rand (0, 255)
-
- red = max(min(red + rand (-25, 25), 255), 0)
- green = max(min(green + rand (-25, 25), 255), 0)
- blue = max(min(blue + rand (-25, 25), 255), 0)
+ var/list/colors_rgb = random_hair_color()
+
+ var/red = colors_rgb[1]
+ var/green = colors_rgb[2]
+ var/blue = colors_rgb[3]
switch(target)
if("hair")
@@ -90,101 +53,18 @@
b_grad = blue
/datum/preferences/proc/randomize_eyes_color()
- var/red
- var/green
- var/blue
-
- var/col = pick ("black", "grey", "brown", "chestnut", "blue", "lightblue", "green", "albino")
- switch(col)
- if("black")
- red = 0
- green = 0
- blue = 0
- if("grey")
- red = rand (100, 200)
- green = red
- blue = red
- if("brown")
- red = 102
- green = 51
- blue = 0
- if("chestnut")
- red = 153
- green = 102
- blue = 0
- if("blue")
- red = 51
- green = 102
- blue = 204
- if("lightblue")
- red = 102
- green = 204
- blue = 255
- if("green")
- red = 0
- green = 102
- blue = 0
- if("albino")
- red = rand (200, 255)
- green = rand (0, 150)
- blue = rand (0, 150)
-
- red = max(min(red + rand (-25, 25), 255), 0)
- green = max(min(green + rand (-25, 25), 255), 0)
- blue = max(min(blue + rand (-25, 25), 255), 0)
-
- r_eyes = red
- g_eyes = green
- b_eyes = blue
+ var/list/colors_rgb = random_eye_color()
+
+ r_eyes = colors_rgb[1]
+ g_eyes = colors_rgb[2]
+ b_eyes = colors_rgb[3]
/datum/preferences/proc/randomize_skin_color()
- var/red
- var/green
- var/blue
-
- var/col = pick ("black", "grey", "brown", "chestnut", "blue", "lightblue", "green", "albino")
- switch(col)
- if("black")
- red = 0
- green = 0
- blue = 0
- if("grey")
- red = rand (100, 200)
- green = red
- blue = red
- if("brown")
- red = 102
- green = 51
- blue = 0
- if("chestnut")
- red = 153
- green = 102
- blue = 0
- if("blue")
- red = 51
- green = 102
- blue = 204
- if("lightblue")
- red = 102
- green = 204
- blue = 255
- if("green")
- red = 0
- green = 102
- blue = 0
- if("albino")
- red = rand (200, 255)
- green = rand (0, 150)
- blue = rand (0, 150)
-
- red = max(min(red + rand (-25, 25), 255), 0)
- green = max(min(green + rand (-25, 25), 255), 0)
- blue = max(min(blue + rand (-25, 25), 255), 0)
-
- r_skin = red
- g_skin = green
- b_skin = blue
+ var/list/colors_rgb = random_skin_color()
+ r_skin = colors_rgb[1]
+ g_skin = colors_rgb[2]
+ b_skin = colors_rgb[3]
/datum/preferences/proc/update_preview_icon() //seriously. This is horrendous.
// Determine what job is marked as 'High' priority, and dress them up as such.
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index e85c61287d78..03a6c0b1b88a 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -231,6 +231,7 @@
// Enough to make us sleep as well
if(SA_pp > SA_sleep_min)
Sleeping(10 SECONDS)
+ analgesic = clamp(analgesic + 5, 0, 10)
// There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
else if(SA_pp > SA_giggle_min)
@@ -841,6 +842,9 @@
if(IsSleeping())
to_chat(src, "You are already sleeping")
return
+ if(traumatic_shock >= TRAUMATIC_SHOCK_SERIOUS)
+ to_chat(src, "The pain keeps you from sleeping.")
+ return
if(tgui_alert(src, "You sure you want to sleep for a while?","Sleep", list("Yes","No")) == "Yes")
SetSleeping(40 SECONDS) //Short nap
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 5b523fbf5ce9..0e8eb2d68c2f 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1403,7 +1403,6 @@
maxHealth = species.total_health
if(species.flags[NO_PAIN])
- shock_stage = 0
traumatic_shock = 0
if(species.base_color && default_colour)
@@ -2233,3 +2232,46 @@
continue
F.attackby(B, src)
break
+
+/mob/living/carbon/human/proc/randomize_appearance()
+ gender = pick(MALE, FEMALE)
+
+ name = random_name(gender, species.name)
+ real_name = name
+
+ s_tone = random_skin_tone()
+
+ h_style = random_hair_style(gender, species)
+ var/list/hair_color = random_hair_color()
+ r_hair = hair_color[1]
+ g_hair = hair_color[2]
+ b_hair = hair_color[3]
+
+ if(prob(25))
+ grad_style = random_gradient_style()
+ var/list/grad_color = random_hair_color()
+ r_grad = grad_color[1]
+ g_grad = grad_color[2]
+ b_grad = grad_color[3]
+
+ f_style = random_facial_hair_style(gender, species.name)
+ r_facial = r_hair
+ g_facial = g_hair
+ b_facial = b_hair
+
+ var/list/eye_color = random_eye_color()
+ r_eyes = eye_color[1]
+ g_eyes = eye_color[2]
+ b_eyes = eye_color[3]
+
+ underwear = rand(1,underwear_m.len)
+ undershirt = rand(1,undershirt_t.len)
+ socks = rand(1, socks_t.len)
+ backbag = rand(2, backbaglist.len)
+
+ use_skirt = pick(TRUE, FALSE)
+
+ var/datum/species/S = all_species[species.name]
+ age = rand(S.min_age, S.max_age)
+
+ regenerate_icons()
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index d0e18bdf9408..9987e3703cc3 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -40,7 +40,7 @@
/mob/living/carbon/human/helpReaction(mob/living/carbon/human/attacker, show_message = TRUE)
var/target_zone = attacker.get_targetzone()
var/obj/item/organ/internal/heart/Heart = organs_by_name[O_HEART]
- if(health < (config.health_threshold_crit - 30) && target_zone == O_MOUTH)
+ if(health < (config.health_threshold_crit) && target_zone == O_MOUTH)
INVOKE_ASYNC(src, PROC_REF(perform_av), attacker)
return TRUE
if(Heart && Heart.parent_bodypart == target_zone && Heart.heart_status != HEART_NORMAL)
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 4eef91fd6e2e..c5a9fb7d0854 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -214,18 +214,6 @@
else
..()
-
-//========== Shock Stage =========
-/mob/living/carbon/human/SetShockStage(amount)
- if(species.flags[NO_PAIN])
- return
- shock_stage = max(amount, 0)
-
-/mob/living/carbon/human/AdjustShockStage(amount)
- if(species.flags[NO_PAIN])
- return
- shock_stage = max(shock_stage + amount, 0)
-
////////////////////////////////////////////
//Returns a list of damaged bodyparts
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index f6fe2ce7e3e1..a5d8a7bf3f34 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -35,17 +35,13 @@
if(embedded_flag)
handle_embedded_objects() // Moving with objects stuck in you can cause bad times.
- var/health_deficiency = (100 - health + halloss)
- if(health_deficiency >= 40)
- tally += health_deficiency / 25
+ if(traumatic_shock >= TRAUMATIC_SHOCK_INTENSE)
+ tally += traumatic_shock * 0.05
var/hungry = NUTRITION_LEVEL_FULL - get_satiation()
if(hungry >= NUTRITION_LEVEL_NORMAL) // Slow down if nutrition <= 40%
tally += hungry / 250 // 1,4 - 2
- if(shock_stage >= 10)
- tally += round(log(3.5, shock_stage), 0.1) // (40 = ~3.0) and (starts at ~1.83)
-
if(bodytemperature < species.cold_level_1)
tally += 1.75 * (species.cold_level_1 - bodytemperature) / 10
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 4d533c1c1c18..cc31588d6b68 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -911,7 +911,11 @@ var/global/list/tourette_bad_words= list(
else
icon_num = 5
- healthdoll.add_overlay(image('icons/hud/screen_gen.dmi',"[BP.body_zone][icon_num]"))
+ if(get_painkiller_effect() <= PAINKILLERS_EFFECT_VERY_HEAVY)
+ healthdoll.icon_state = "health_numb"
+ healthdoll.cut_overlays()
+ else
+ healthdoll.add_overlay(image('icons/hud/screen_gen.dmi',"[BP.body_zone][icon_num]"))
if(!healths)
return
@@ -977,7 +981,7 @@ var/global/list/tourette_bad_words= list(
clear_fullscreen("oxy")
//Fire and Brute damage overlay (BSSR)
- var/hurtdamage = getBruteLoss() + getFireLoss() + damageoverlaytemp
+ var/hurtdamage = ((getBruteLoss() + getFireLoss() + damageoverlaytemp) * get_painkiller_effect())
damageoverlaytemp = 0 // We do this so we can detect if someone hits us or not.
if(hurtdamage)
var/severity = 0
@@ -1097,6 +1101,11 @@ var/global/list/tourette_bad_words= list(
else
animate(client, color = null, time = 5)
+ if(painkiller_overlay_time)
+ animate(client, color = PAINKILLERS_FILTER, time = 5)
+ else
+ animate(client, color = null, time = 5)
+
return TRUE
/mob/living/carbon/human/proc/handle_random_events()
@@ -1155,68 +1164,52 @@ var/global/list/tourette_bad_words= list(
/mob/living/carbon/human/handle_shock()
..()
- if(status_flags & GODMODE) return 0 //godmode
+ if(status_flags & GODMODE) return FALSE //godmode
if(species && species.flags[NO_PAIN])
return
if(analgesic && !reagents.has_reagent("prismaline"))
return // analgesic avoids all traumatic shock temporarily
- if(health < config.health_threshold_softcrit)// health 0 makes you immediately collapse
- shock_stage = max(shock_stage, 61)
+ var/message
- if(traumatic_shock >= 80 && shock_stage <= 150)
- shock_stage += 1
- else if(health < config.health_threshold_softcrit)
- shock_stage = max(shock_stage, 61)
- else
- shock_stage = min(shock_stage, 160)
- shock_stage = max(shock_stage-1, 0)
- return
-
- if(shock_stage == 10)
- to_chat(src, "[pick("It hurts so much!", "You really need some painkillers..", "Dear god, the pain!")]")
+ if(traumatic_shock >= TRAUMATIC_SHOCK_MINOR)
+ message = "[pick("You feel slight pain.", "Ow... That hurts.")]"
- if(shock_stage >= 30)
- if(shock_stage == 30) me_emote("is having trouble keeping their eyes open.")
+ if(traumatic_shock >= TRAUMATIC_SHOCK_SERIOUS)
+ message = "[pick("Ughhh... When will it end?", "You're wincing in pain!", "You really need some painkillers!")]"
blurEyes(2)
stuttering = max(stuttering, 5)
- if(shock_stage == 40)
- to_chat(src, "[pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")]")
-
- if (shock_stage >= 60)
- if(shock_stage == 60)
- visible_message("[src]'s body becomes limp.")
- if (prob(2))
- to_chat(src, "[pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")]")
- Stun(10)
- Weaken(20)
-
- if(shock_stage >= 80)
- if (prob(5))
- to_chat(src, "[pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")]")
- Stun(10)
- Weaken(20)
-
- if(shock_stage >= 120)
- if (prob(2))
+ if(traumatic_shock >= TRAUMATIC_SHOCK_INTENSE)
+ message = "[pick("Stop this pain!", "This pain is unbearable!", "Your whole body is going numb!")]"
+
+ if(traumatic_shock >= TRAUMATIC_SHOCK_MIND_SHATTERING)
+ message = "[pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!")]"
+ if(prob(10) && !crawling)
+ Weaken(1)
+
+ if(traumatic_shock >= TRAUMATIC_SHOCK_CRITICAL)
+ if(!crawling)
+ addtimer(CALLBACK(src, PROC_REF(knockdown_by_pain)), 7.5 SECOND)
+ if(prob(10))
to_chat(src, "[pick("You black out!", "You feel like you could die any moment now.", "You're about to lose consciousness.")]")
- Paralyse(5)
+ AdjustSleeping(10)
- if(shock_stage == 150)
- me_emote("can no longer stand, collapsing!")
- Stun(10)
- Weaken(20)
+ if(prob(15) && message)
+ to_chat(src, message)
- if(shock_stage >= 150)
- Stun(10)
- Weaken(20)
+/mob/living/carbon/human/proc/knockdown_by_pain()
+ if(crawling || traumatic_shock <= TRAUMATIC_SHOCK_CRITICAL)
+ return
+ SetCrawling(TRUE)
+ drop_from_inventory(l_hand)
+ drop_from_inventory(r_hand)
/mob/living/carbon/human/proc/handle_heart_beat()
if(pulse == PULSE_NONE) return
- if(pulse == PULSE_2FAST || shock_stage >= 10 || isspaceturf(get_turf(src)))
+ if(pulse == PULSE_2FAST || traumatic_shock >= TRAUMATIC_SHOCK_INTENSE || isspaceturf(get_turf(src)))
var/temp = (5 - pulse)/2
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 4261919ba7c4..27cd8e96bc66 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -375,6 +375,7 @@ Please contact me on #coderbus IRC. ~Carn x
return
update_hair()
update_mutations()
+ apply_recolor()
update_body()
update_inv_w_uniform()
update_inv_wear_id()
diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm
index 90d546547665..6c056292ffd8 100644
--- a/code/modules/mob/living/carbon/shock.dm
+++ b/code/modules/mob/living/carbon/shock.dm
@@ -1,57 +1,15 @@
/mob/living/carbon
var/traumatic_shock = 0
- var/shock_stage = 0
+ var/painkiller_overlay_time = 0
// proc to find out in how much pain the mob is at the moment
/mob/living/carbon/proc/updateshock()
traumatic_shock = \
- 1 * getOxyLoss() + \
- 0.7 * getToxLoss() + \
+ 0.5 * getToxLoss() + \
1.5 * getFireLoss() + \
- 1.2 * getBruteLoss() + \
- 1.7 * getCloneLoss() + \
- 2 * halloss
-
- var/painkiller_effectiveness = 1.0
- if(reagents.has_reagent("prismaline"))
- painkiller_effectiveness = 0.3
-
- if(reagents.has_reagent("alkysine"))
- traumatic_shock -= 10 * painkiller_effectiveness
- shock_stage -= 1 * painkiller_effectiveness
- if(reagents.has_reagent("dextromethorphan"))
- traumatic_shock -= 10 * painkiller_effectiveness
- shock_stage -= 1 * painkiller_effectiveness
- if(reagents.has_reagent("jenkem"))
- traumatic_shock -= 15 * painkiller_effectiveness
- shock_stage -= 1.5 * painkiller_effectiveness
- if(reagents.has_reagent("inaprovaline"))
- traumatic_shock -= 25 * painkiller_effectiveness
- shock_stage -= 2.5 * painkiller_effectiveness
- if(reagents.has_reagent("ambrosium"))
- traumatic_shock -= 30 * painkiller_effectiveness
- shock_stage -= 3 * painkiller_effectiveness
- if(reagents.has_reagent("synaptizine"))
- traumatic_shock -= 40 * painkiller_effectiveness
- shock_stage -= 4 * painkiller_effectiveness
- if(reagents.has_reagent("paracetamol"))
- traumatic_shock -= 50 * painkiller_effectiveness
- shock_stage -= 5 * painkiller_effectiveness
- if(reagents.has_reagent("space_drugs"))
- traumatic_shock -= 60 * painkiller_effectiveness
- shock_stage -= 6 * painkiller_effectiveness
- if(reagents.has_reagent("tramadol") || reagents.has_reagent("endorphine"))
- traumatic_shock -= 80 * painkiller_effectiveness
- shock_stage -= 8 * painkiller_effectiveness
- if(reagents.has_reagent("oxycodone"))
- traumatic_shock -= 200 * painkiller_effectiveness
- shock_stage -= 20 * painkiller_effectiveness
- if(slurring && drunkenness > DRUNKENNESS_SLUR)
- traumatic_shock -= min(drunkenness - DRUNKENNESS_SLUR, 40)
- shock_stage -= min(drunkenness - DRUNKENNESS_SLUR, 40)
- if(analgesic && !reagents.has_reagent("prismaline"))
- traumatic_shock = 0
- shock_stage = 0
+ 1.0 * getBruteLoss() + \
+ 1.0 * getCloneLoss() + \
+ 1.0 * halloss
// broken or ripped off bodyparts will add quite a bit of pain
if(ishuman(src))
@@ -64,8 +22,12 @@
if(BP.status & ORGAN_SPLINTED)
traumatic_shock -= 25
+ traumatic_shock *= get_painkiller_effect()
+
if(traumatic_shock < 0)
traumatic_shock = 0
+ if(painkiller_overlay_time > 0)
+ painkiller_overlay_time--
play_pain_sound()
@@ -93,7 +55,7 @@
return
var/pain_sound_name
- var/current_health = round(100 - (traumatic_shock - (getOxyLoss() + 0.7 * getToxLoss()))) // don't consider suffocation and toxins
+ var/current_health = round(100 - traumatic_shock)
switch(current_health)
if(80 to 99)
if(HAS_TRAIT(src, TRAIT_LOW_PAIN_THRESHOLD) && prob(20))
@@ -116,3 +78,43 @@
last_pain_emote_sound = world.time + (HAS_TRAIT(src, TRAIT_LOW_PAIN_THRESHOLD) ? rand(15 SECONDS, 30 SECONDS) : rand(30 SECONDS, 60 SECONDS))
if(pain_sound_name == "scream") // don't cry out in pain too often
last_pain_emote_sound += (HAS_TRAIT(src, TRAIT_LOW_PAIN_THRESHOLD) ? rand(5 SECONDS, 10 SECONDS) : rand(10 SECONDS, 20 SECONDS))
+
+/mob/living/carbon/proc/painkiller_byeffect(chance, yawn_chance)
+ if(stat != CONSCIOUS)
+ return
+ if(traumatic_shock >= TRAUMATIC_SHOCK_MINOR)
+ return
+ if(!prob(chance))
+ return
+ adjustBlurriness(3)
+ painkiller_overlay_time += 3
+ to_chat(src, "[pick("Вы невольно закрываете глаза.", "Вы чувствуете себя подавленным.", "Вы чувствуете себя расслабленным.", "Вы чувствуете себя размякшим.", "Вы ощущаете сонливость.", "Вы чувствуете себя уставшим.", "Вы чувствуете, как силы покидают вас.", "Вам сложно держаться на ногах.")]")
+ if(dizziness <= 5)
+ make_dizzy(150)
+ if(prob(yawn_chance))
+ emote("yawn")
+
+/mob/living/carbon/proc/get_painkiller_effect()
+ var/painkiller_effect = 1.0
+ var/painkiller_multiplier = 1.0
+ if(reagents.has_reagent("prismaline"))
+ painkiller_multiplier = 3
+
+ if(reagents.has_reagent("stimulants"))
+ painkiller_effect *= min(0.1 * painkiller_multiplier, 1)
+ else if(reagents.has_reagent("oxycodone"))
+ painkiller_effect *= min(0.3 * painkiller_multiplier, 1)
+ else if(reagents.has_reagent("tramadol") || reagents.has_reagent("endorphine"))
+ painkiller_effect *= min(0.5 * painkiller_multiplier, 1)
+ else if(druggy)
+ painkiller_effect *= min(0.6 * painkiller_multiplier, 1)
+ else if(reagents.has_reagent("paracetamol") || reagents.has_reagent("synaptizine"))
+ painkiller_effect *= min(0.75 * painkiller_multiplier, 1)
+ else if(reagents.has_reagent("inaprovaline"))
+ painkiller_effect *= min(0.8 * painkiller_multiplier, 1)
+ if(slurring && drunkenness > DRUNKENNESS_SLUR)
+ painkiller_effect *= min((DRUNKENNESS_PASS_OUT - drunkenness) / 1000, 1)
+ if(analgesic && !reagents.has_reagent("prismaline"))
+ painkiller_effect = 0
+
+ return painkiller_effect
diff --git a/code/modules/mob/living/carbon/xenomorph/special/facehugger/facehugger_playable.dm b/code/modules/mob/living/carbon/xenomorph/special/facehugger/facehugger_playable.dm
index 5a1986a76e72..5664706afae1 100644
--- a/code/modules/mob/living/carbon/xenomorph/special/facehugger/facehugger_playable.dm
+++ b/code/modules/mob/living/carbon/xenomorph/special/facehugger/facehugger_playable.dm
@@ -245,7 +245,7 @@ This is chestburster mechanic for damaging
last_bite = world.time
playsound(src, 'sound/weapons/bite.ogg', VOL_EFFECTS_MASTER)
H.apply_damage(rand(7, 14), BRUTE, BP_CHEST)
- H.SetShockStage(20)
+ H.setHalLoss(20)
H.Stun(1)
H.Weaken(1)
H.emote("scream")
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 49eff1197eea..e90ff9d4bf9c 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -576,16 +576,12 @@
SetDrunkenness(0)
- if(iscarbon(src))
- var/mob/living/carbon/C = src
- C.shock_stage = 0
-
- if(ishuman(src))
- var/mob/living/carbon/human/H = src
- H.restore_blood()
- H.full_prosthetic = null
- var/obj/item/organ/internal/heart/Heart = H.organs_by_name[O_HEART]
- Heart?.heart_normalize()
+ if(ishuman(src))
+ var/mob/living/carbon/human/H = src
+ H.restore_blood()
+ H.full_prosthetic = null
+ var/obj/item/organ/internal/heart/Heart = H.organs_by_name[O_HEART]
+ Heart?.heart_normalize()
restore_all_bodyparts()
restore_all_organs()
@@ -1060,6 +1056,11 @@
return
if(crawling)
+ if(iscarbon(src))
+ var/mob/living/carbon/C = src
+ if(C.traumatic_shock >= TRAUMATIC_SHOCK_CRITICAL)
+ to_chat(C, "I'm in so much pain! I can not get up!")
+ return
crawl_getup = TRUE
if(do_after(src, 10, target = src))
crawl_getup = FALSE
diff --git a/code/modules/mob/living/simple_animal/bees.dm b/code/modules/mob/living/simple_animal/bees.dm
index 630373509b18..5db70dede246 100644
--- a/code/modules/mob/living/simple_animal/bees.dm
+++ b/code/modules/mob/living/simple_animal/bees.dm
@@ -126,10 +126,8 @@
qdel(src)
return
src.icon_state = "bees[B.strength]"
- var/turf/simulated/floor/T = get_turf(get_step(src, pick(1,2,4,8)))
density = TRUE
- if(T.Enter(src, get_turf(src)))
- src.loc = T
+ step(src, pick(NORTH,SOUTH,EAST,WEST))
density = FALSE
break
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 084f7a88ba8f..3299899d139f 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -882,13 +882,6 @@ note dizziness decrements automatically in the mob's Life() proc.
return
stuttering = max(amount, 0)
-//========== Shock Stage =========
-/mob/proc/AdjustShockStage(amount)
- return
-
-/mob/proc/SetShockStage(amount)
- return
-
//======= Bodytemperature =======
/mob/proc/adjust_bodytemperature(amount, min_temp=0, max_temp=INFINITY)
if(amount > 0)
@@ -971,7 +964,7 @@ note dizziness decrements automatically in the mob's Life() proc.
for(var/datum/wound/wound in BP.wounds)
wound.embedded_objects -= selection
- H.AdjustShockStage(20)
+ H.adjustHalLoss(20)
BP.take_damage((selection.w_class * 3), null, DAM_EDGE, "Embedded object extraction")
if(prob(selection.w_class * 5) && BP.sever_artery()) // I'M SO ANEMIC I COULD JUST -DIE-.
diff --git a/code/modules/organs/external/flesh.dm b/code/modules/organs/external/flesh.dm
index 00fdf6d786d9..222af999b0a3 100644
--- a/code/modules/organs/external/flesh.dm
+++ b/code/modules/organs/external/flesh.dm
@@ -130,7 +130,7 @@
var/spillover = cur_damage + damage_amt + BP.burn_dam + burn - BP.max_damage // excess damage goes off into shock_stage, this var also can prevent dismemberment, if result is negative.
if(spillover > 0 && !BP.species.flags[IS_SYNTHETIC])
- BP.owner.shock_stage += spillover * ORGAN_DAMAGE_SPILLOVER_MULTIPLIER
+ BP.owner.halloss += spillover * ORGAN_DAMAGE_SPILLOVER_MULTIPLIER
// sync the organ's damage with its wounds
BP.update_damages()
diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm
index 36efb449d376..bac59de50bd0 100644
--- a/code/modules/organs/pain.dm
+++ b/code/modules/organs/pain.dm
@@ -6,14 +6,10 @@
// partname is the name of a body part
// amount is a num from 1 to 100
-/mob/living/carbon/proc/on_painkillers()
- return reagents.has_reagent("paracetamol") || reagents.has_reagent("tramadol") || reagents.has_reagent("oxycodone") || reagents.has_reagent("endorphine")
-
/mob/living/carbon/proc/pain(partname, amount, force, burning = 0)
- if(stat >= DEAD) return
- if(on_painkillers())
+ if(stat >= DEAD)
return
- if(analgesic)
+ if(get_painkiller_effect() <= PAINKILLERS_EFFECT_MEDIUM)
return
if(world.time < next_pain_time && !force)
return
@@ -50,13 +46,9 @@
/mob/living/carbon/human/proc/custom_pain(message, flash_strength)
if(stat != CONSCIOUS)
return
-
if(species && species.flags[NO_PAIN])
return
-
- if(on_painkillers())
- return
- if(analgesic)
+ if(get_painkiller_effect() <= PAINKILLERS_EFFECT_HEAVY)
return
var/msg = "[message]"
if(flash_strength >= 1)
@@ -70,15 +62,11 @@
/mob/living/carbon/human/proc/handle_pain()
// not when sleeping
-
if(species && species.flags[NO_PAIN])
return
-
if(stat >= DEAD)
return
- if(on_painkillers())
- return
- if(analgesic)
+ if(get_painkiller_effect() <= PAINKILLERS_EFFECT_HEAVY)
return
var/maxdam = 0
var/obj/item/organ/external/damaged_organ = null
diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm
index 77bae69382c4..dac26949c934 100644
--- a/code/modules/projectiles/ammunition/bullets.dm
+++ b/code/modules/projectiles/ammunition/bullets.dm
@@ -27,6 +27,13 @@
projectile_type = /obj/item/projectile/bullet/midbullet2
m_amt = 300
+/obj/item/ammo_casing/pea
+ name = "Pea bullet casing"
+ cases = list("гороховый патрон", "горохового патрона", "гороховому патрону", "гороховый патрон", "гороховым патроном", "гороховом патроне")
+ desc = "Гороховый патрон"
+ caliber = "Pea"
+ projectile_type = /obj/item/projectile/bullet/peabullet
+
/obj/item/ammo_casing/c9mmr
desc = "Патрон от резиновой пули калибра 9мм."
icon_state = "casing_rubber"
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index 258b30de1a90..dc095251e28c 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -637,3 +637,12 @@
icon_state = "38"
ammo_type = /obj/item/ammo_casing/c45r
max_ammo = 6
+
+/obj/item/ammo_box/magazine/pea
+ name = "pealoader"
+ cases = list("гороховый зарядник", "горохового зарядника", "гороховому заряднику", "гороховый зарядник", "гороховым зарядником", "гороховом заряднике")
+ desc = "Гороховый зарядник для горохового пистолета."
+ caliber = "Pea"
+ ammo_type = /obj/item/ammo_casing/pea
+ max_ammo = 6
+ origin_tech = "combat=2"
diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm
index a883e0d71aa7..1525ed64b7ce 100644
--- a/code/modules/projectiles/guns/projectile/pistol.dm
+++ b/code/modules/projectiles/guns/projectile/pistol.dm
@@ -117,3 +117,18 @@
fire_sound = 'sound/weapons/guns/gunshot_light.ogg'
can_be_holstered = TRUE
recoil = 1.5
+
+/obj/item/weapon/gun/projectile/automatic/pistol/peashooter
+ name = "Peashooter"
+ desc = "Горохострел. Стреляет горохом."
+ cases = list("горохострел", "горохострела", "горохострелу", "горохострел", "горохострелом", "горохостреле")
+ icon_state = "peashooter"
+ item_state = "peashooter"
+ origin_tech = "combat=1;materials=1"
+ initial_mag = /obj/item/ammo_box/magazine/pea
+ suitable_mags = /obj/item/ammo_box/magazine/pea
+ can_be_holstered = TRUE
+
+/obj/item/weapon/gun/projectile/automatic/pistol/peashooter/attack_self(mob/living/user)
+ to_chat(user, "Вы не можете вынуть горох из [CASE(src, GENITIVE_CASE)].")
+ return
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index d525b3d9ee53..19f1150e5ca6 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -70,6 +70,11 @@
hitscan = 1
armor_multiplier = 0.7
+/obj/item/projectile/bullet/peabullet
+ name = "pea bullet"
+ damage = 5
+ agony = 5
+
/obj/item/projectile/bullet/midbullet2 // 9x19
damage = 25
diff --git a/code/modules/reagents/reagent_containers/food/snacks/grown.dm b/code/modules/reagents/reagent_containers/food/snacks/grown.dm
index 5c56feb88963..e86172483e03 100644
--- a/code/modules/reagents/reagent_containers/food/snacks/grown.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks/grown.dm
@@ -1179,16 +1179,17 @@
reagents.add_reagent("nutriment", 1 + round(potency / 5))
bitesize = 1 + round(reagents.total_volume / 2, 1)
-/obj/item/weapon/reagent_containers/food/snacks/grown/gatfruit
- seed_type = /obj/item/seeds/gatfruit
- name = "gatfruit"
- desc = "It smells like burning."
- icon_state = "gatfruit"
+/obj/item/weapon/reagent_containers/food/snacks/grown/peashooter
+ seed_type = /obj/item/seeds/peashooter
+ name = "peashooter"
+ cases = list("горохострел", "горохострела", "горохострелу", "горохострел", "горохострелом", "горохостреле")
+ desc = "Нераскрывшийся плод горохострела, подозрительно напоминающий пистолет"
+ icon_state = "peashooter"
potency = 25
filling_color = "#020108"
- trash = /obj/item/weapon/gun/projectile/revolver
+ trash = /obj/item/weapon/gun/projectile/automatic/pistol/peashooter
-/obj/item/weapon/reagent_containers/food/snacks/grown/gatfruit/atom_init()
+/obj/item/weapon/reagent_containers/food/snacks/grown/peashooter/atom_init()
. = ..()
reagents.add_reagent("potassium", 1 + round(potency / 25, 1))
reagents.add_reagent("carbon", 1 + round(potency / 10, 1))
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 23a05df4c643..ecb5540cb8e2 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -47,6 +47,24 @@
/obj/item/weapon/reagent_containers/hypospray/cmo
list_reagents = list("tricordrazine" = 30)
+/obj/item/weapon/reagent_containers/hypospray/cmo/afterattack(atom/target, mob/user, proximity, params)
+ if(!proximity)
+ return
+ if(istype(target, /obj/item/weapon/reagent_containers/glass))
+ if(reagents.total_volume >= reagents.maximum_volume)
+ to_chat(user, "The hypospray is full.")
+ return
+ if(!target.reagents.total_volume)
+ to_chat(user, "[target] is empty.")
+ return
+
+ if(!target.is_open_container())
+ to_chat(user, "Container is closed.")
+ return
+
+ var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
+
+ to_chat(user, "You fill the syringe with [trans] units of the solution.")
/obj/item/weapon/reagent_containers/hypospray/autoinjector
name = "inaprovaline autoinjector"
diff --git a/code/modules/reagents/reagent_types/Chemistry-Medicine.dm b/code/modules/reagents/reagent_types/Chemistry-Medicine.dm
index 6988cbaf5c7b..e912208a51ad 100644
--- a/code/modules/reagents/reagent_types/Chemistry-Medicine.dm
+++ b/code/modules/reagents/reagent_types/Chemistry-Medicine.dm
@@ -111,6 +111,9 @@
M.adjustHalLoss(-4)
if(volume > overdose)
M.hallucination = max(M.hallucination, 2)
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ C.painkiller_byeffect(5, 15)
/datum/reagent/oxycodone
name = "Oxycodone"
@@ -128,6 +131,9 @@
if(volume > overdose)
M.adjustDrugginess(1)
M.hallucination = max(M.hallucination, 3)
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ C.painkiller_byeffect(10, 25)
/datum/reagent/endorphine
name = "Endorphine"
@@ -560,7 +566,6 @@
M.AdjustWeakened(-3)
var/mob/living/carbon/human/H = M
H.adjustHalLoss(-30)
- H.shock_stage -= 20
if(M.bodytemperature < 310) //standard body temperature
M.adjustHalLoss(15)
@@ -773,7 +778,6 @@
M.AdjustWeakened(-3)
var/mob/living/carbon/human/H = M
H.adjustHalLoss(-30)
- H.shock_stage -= 20
/datum/reagent/nanocalcium
name = "Nano-Calcium"
diff --git a/code/modules/reagents/reagent_types/Chemistry-Toxic.dm b/code/modules/reagents/reagent_types/Chemistry-Toxic.dm
index a6577f3c85b3..6ce2dabf75db 100644
--- a/code/modules/reagents/reagent_types/Chemistry-Toxic.dm
+++ b/code/modules/reagents/reagent_types/Chemistry-Toxic.dm
@@ -723,7 +723,7 @@
return
to_chat(H,"You grit your teeth in pain as your body rapidly mutates!")
H.visible_message("[H] suddenly transforms!")
- randomize_human(H)
+ H.randomize_appearance()
/datum/reagent/slimetoxin
name = "Mutation Toxin"
diff --git a/code/modules/religion/building_agent.dm b/code/modules/religion/building_agent.dm
index c2b41d0bb7fc..19e91aa3850a 100644
--- a/code/modules/religion/building_agent.dm
+++ b/code/modules/religion/building_agent.dm
@@ -158,6 +158,14 @@
favor_cost = 600
piety_cost = 50
+/datum/building_agent/tech/cult/cooldown_reduction
+ name = "Быстрая Телепортация"
+ icon = 'icons/obj/rune.dmi'
+ icon_state = "6"
+ building_type = /datum/religion_tech/cult/cooldown_reduction
+ favor_cost = 330
+ piety_cost = 130
+
/datum/building_agent/tech/cult/build_everywhere
name = "Строительство Везде"
icon = 'icons/obj/cult.dmi'
diff --git a/code/modules/religion/tech.dm b/code/modules/religion/tech.dm
index f50079c9def6..24e6d2449b8c 100644
--- a/code/modules/religion/tech.dm
+++ b/code/modules/religion/tech.dm
@@ -27,6 +27,9 @@
RegisterSignal(R, list(COMSIG_REL_ADD_MEMBER), PROC_REF(give_spell))
RegisterSignal(R, list(COMSIG_REL_REMOVE_MEMBER), PROC_REF(remove_spell))
+/datum/religion_tech/cult/cooldown_reduction
+ id = RTECH_COOLDOWN_REDUCTION
+
/datum/religion_tech/cult/reusable_runes
id = RTECH_REUSABLE_RUNE
diff --git a/code/modules/scrap/scrap_people.dm b/code/modules/scrap/scrap_people.dm
index a4f67c78c269..2193644828cb 100644
--- a/code/modules/scrap/scrap_people.dm
+++ b/code/modules/scrap/scrap_people.dm
@@ -38,7 +38,7 @@
equip_to_slot_or_del(new /obj/item/weapon/shovel(src), SLOT_L_HAND)
for(var/obj/item/loot in contents)
loot.make_old()
- randomize_human(src)
+ randomize_appearance()
sight |= SEE_BLACKNESS
/mob/proc/make_bum()
diff --git a/code/modules/skills/skillsets/civilian.dm b/code/modules/skills/skillsets/civilian.dm
index 032b6568255d..88a48d2fc042 100644
--- a/code/modules/skills/skillsets/civilian.dm
+++ b/code/modules/skills/skillsets/civilian.dm
@@ -113,8 +113,8 @@
/datum/skill/firearms = SKILL_LEVEL_NOVICE
)
-/datum/skillset/assistant/reporter
- name = "Reporter"
+/datum/skillset/assistant/journalist
+ name = "Journalist"
initial_skills = list(
/datum/skill/command = SKILL_LEVEL_NOVICE
)
diff --git a/code/modules/statistic/stat_dto.dm b/code/modules/statistic/stat_dto.dm
index b0ef15118f8e..6fc8786ae10f 100644
--- a/code/modules/statistic/stat_dto.dm
+++ b/code/modules/statistic/stat_dto.dm
@@ -28,6 +28,18 @@
// string, anything
var/desc
+/datum/stat/medal
+ // string, anything
+ var/key
+ // string, anything
+ var/target_name
+ // string, anything
+ var/medal_name
+ // string, anything
+ var/parent_name // person who awarded medal
+ //string, anything
+ var/reason
+
/datum/stat/score
// int, [0...]
var/crewscore = 0 // this is the overall var/score for the whole round
diff --git a/code/modules/statistic/statistics.dm b/code/modules/statistic/statistics.dm
index f3261b4b886e..d7e0287b5e30 100644
--- a/code/modules/statistic/statistics.dm
+++ b/code/modules/statistic/statistics.dm
@@ -64,6 +64,8 @@ var/global/datum/stat_collector/SSStatistics = new /datum/stat_collector
// array of objects
var/list/datum/stat/achievement/achievements = list()
// array of objects
+ var/list/datum/stat/medal/medals = list()
+ // array of objects
var/list/datum/stat/communication_log/communication_logs = list()
// New data
diff --git a/code/modules/statistic/statistics_helpers.dm b/code/modules/statistic/statistics_helpers.dm
index 58b31c04ebb4..a280e6ebdf17 100644
--- a/code/modules/statistic/statistics_helpers.dm
+++ b/code/modules/statistic/statistics_helpers.dm
@@ -15,6 +15,15 @@
stat.desc = desc
achievements += stat
+/datum/stat_collector/proc/add_medal(key, name, medal_name, parent_name, reason)
+ var/datum/stat/medal/stat = new
+ stat.key = key
+ stat.target_name = name
+ stat.medal_name = medal_name
+ stat.parent_name = parent_name
+ stat.reason = reason
+ medals += stat
+
/datum/stat_collector/proc/add_death_stat(mob/living/H)
if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING)
return
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index c36efca15577..c60f139aee9a 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -167,7 +167,7 @@
var/mob/living/carbon/human/H = M
if(!H.species.flags[NO_PAIN] && !HAS_TRAIT(H, TRAIT_IMMOBILIZED))
H.adjustHalLoss(25)
- if(prob(H.halloss) && !H.incapacitated(NONE))
+ if(prob(H.traumatic_shock) && !H.incapacitated(NONE))
to_chat(user, "The patient is writhing in pain, this interferes with the operation!")
S.fail_step(user, H, target_zone, tool) //patient movements due to pain interfere with surgery
if(prob(S.tool_quality(tool)) && tool.use_tool(M,user, step_duration, volume=100, required_skills_override = S.required_skills, skills_speed_bonus = S.skills_speed_bonus) && user.get_targetzone() && target_zone == user.get_targetzone())
diff --git a/config/example/game_options.txt b/config/example/game_options.txt
index 941e8b3f5548..43534530db24 100644
--- a/config/example/game_options.txt
+++ b/config/example/game_options.txt
@@ -53,9 +53,9 @@ ANIMAL_DELAY 0
### CRAFTING ###
## Controls if players can see recipes in menu, even if they don't have required components (this does not affect crafting itself, just visibility).
-#CRAFT_RECIPES_VISIBILITY
+CRAFT_RECIPES_VISIBILITY
### ETC ###
## If server time is beetween 11 pm and 8 am, lights will become more dim and easy on the eyes, comment to disable
-NIGHTSHIFT
+#NIGHTSHIFT
diff --git a/icons/hud/screen_gen.dmi b/icons/hud/screen_gen.dmi
index 802a3c4de53f..8385d0da9f8c 100644
Binary files a/icons/hud/screen_gen.dmi and b/icons/hud/screen_gen.dmi differ
diff --git a/icons/misc/logos.dmi b/icons/misc/logos.dmi
index d394141d74f5..dd085c6e5573 100644
Binary files a/icons/misc/logos.dmi and b/icons/misc/logos.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index fe5dda1f1f0c..e0fe840d8a3d 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi
index a4500394eaba..5c958d13d597 100644
Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ
diff --git a/icons/mob/human_races/r_lizard.dmi b/icons/mob/human_races/r_lizard.dmi
index 6a3ba8e3eb1c..dbf5c07e40f9 100644
Binary files a/icons/mob/human_races/r_lizard.dmi and b/icons/mob/human_races/r_lizard.dmi differ
diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi
index 12ed4dc36b3e..6e98a76fc04d 100644
Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi
index e625bc93d928..6e32e2664b22 100644
Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ
diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi
index 58ec84aa0437..4ee8b4fdc8d6 100644
Binary files a/icons/mob/inhands/guns_lefthand.dmi and b/icons/mob/inhands/guns_lefthand.dmi differ
diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi
index 85d95134bb9f..988040dcb905 100644
Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ
diff --git a/icons/mob/species/vox/uniform.dmi b/icons/mob/species/vox/uniform.dmi
index 1722aa90c5d8..071e8a292f79 100644
Binary files a/icons/mob/species/vox/uniform.dmi and b/icons/mob/species/vox/uniform.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index fd6b6af2bab5..fd95ed81ce03 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/mob/uniform_fat.dmi b/icons/mob/uniform_fat.dmi
index f55e4eb235b8..71df0feacb8b 100644
Binary files a/icons/mob/uniform_fat.dmi and b/icons/mob/uniform_fat.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 1369a7221beb..29188c0a9646 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index f3da4c6de8a1..bbc37434b585 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi
index e45adf6adf2b..fbebe8417bd3 100644
Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ
diff --git a/icons/obj/hydroponics/growing.dmi b/icons/obj/hydroponics/growing.dmi
index 76a6081e1882..097548696859 100644
Binary files a/icons/obj/hydroponics/growing.dmi and b/icons/obj/hydroponics/growing.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index f7b14f43e56f..58e3ac8704f7 100644
Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi
index 08b37bb2ac85..b7f53223caff 100755
Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ
diff --git a/maps/boxstation/boxstation.dmm b/maps/boxstation/boxstation.dmm
index aef01e5a2db1..7d2a39a1bd19 100644
--- a/maps/boxstation/boxstation.dmm
+++ b/maps/boxstation/boxstation.dmm
@@ -7948,6 +7948,11 @@
pixel_y = 10
},
/obj/item/weapon/reagent_containers/food/drinks/flask/detflask,
+/obj/machinery/windowtint{
+ id = "Detective";
+ pixel_x = -28;
+ pixel_y = -15
+ },
/turf/simulated/floor/carpet/red,
/area/station/security/detectives_office)
"anb" = (
@@ -59174,8 +59179,7 @@
"ciY" = (
/obj/machinery/door/airlock/external{
dir = 4;
- dock_tag = "pod4";
- name = "Escape Pod 4"
+ dock_tag = "pod4"
},
/turf/simulated/floor/grid_floor,
/area/station/maintenance/engineering)
@@ -60853,9 +60857,7 @@
},
/area/station/aisat)
"cnM" = (
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
+/obj/machinery/ai_slipper,
/turf/simulated/floor/whitegreed,
/area/station/aisat/ai_chamber)
"cnN" = (
@@ -61578,13 +61580,9 @@
/turf/simulated/floor/whitegreed,
/area/station/aisat/ai_chamber)
"cpC" = (
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
/obj/machinery/light/small{
dir = 8
},
-/obj/machinery/hologram/holopad,
/turf/simulated/floor/whitegreed,
/area/station/aisat/ai_chamber)
"cpD" = (
@@ -61784,13 +61782,9 @@
},
/area/station/aisat/ai_chamber)
"cpQ" = (
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
/obj/machinery/light/small{
dir = 4
},
-/obj/machinery/hologram/holopad,
/turf/simulated/floor/whitegreed,
/area/station/aisat/ai_chamber)
"cpR" = (
@@ -62349,9 +62343,7 @@
/obj/machinery/power/terminal{
dir = 1
},
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
+/obj/machinery/ai_slipper,
/obj/structure/cable{
d1 = 1;
d2 = 4;
@@ -66671,9 +66663,7 @@
},
/area/station/engineering/drone_fabrication)
"cDj" = (
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
+/obj/machinery/ai_slipper,
/obj/structure/cable{
d1 = 2;
d2 = 8;
@@ -70182,8 +70172,7 @@
/area/shuttle/escape_pod4/station)
"dAo" = (
/obj/machinery/door/airlock/external{
- dir = 4;
- name = "Escape Pod 5"
+ dir = 4
},
/obj/machinery/door/firedoor{
dir = 4
@@ -76246,6 +76235,10 @@
},
/turf/simulated/floor,
/area/station/engineering/atmos)
+"jTz" = (
+/obj/machinery/hologram/holopad,
+/turf/simulated/floor/whitegreed,
+/area/station/aisat/ai_chamber)
"jUd" = (
/obj/machinery/atmospherics/pipe/simple/visible/cyan{
dir = 5
@@ -128032,9 +128025,9 @@ cCW
cFP
cFP
cGa
-cGa
+cnM
cpC
-cGa
+jTz
cpr
cFP
cFP
@@ -130602,9 +130595,9 @@ cFJ
cFP
cFP
cGa
-cGa
+cnM
cpQ
-cGa
+jTz
cqI
cFP
cFP
diff --git a/maps/centcom/centcom.dmm b/maps/centcom/centcom.dmm
index bafdb389eceb..c8f3f5f20100 100644
--- a/maps/centcom/centcom.dmm
+++ b/maps/centcom/centcom.dmm
@@ -4550,9 +4550,16 @@
/turf/environment/space,
/area/shuttle/vox/arkship)
"alx" = (
-/obj/item/weapon/reagent_containers/glass/bucket/full,
-/obj/item/weapon/reagent_containers/spray/cleaner,
-/obj/item/weapon/mop,
+/obj/effect/decal/turf_decal/metal{
+ dir = 4;
+ icon_state = "siding_thinplating_line"
+ },
+/obj/machinery/door_control{
+ id = "smindicate";
+ name = "external blast doors control";
+ pixel_x = 27;
+ req_access = list(150)
+ },
/turf/simulated/shuttle/floor{
icon_state = "floor6"
},
@@ -4638,6 +4645,7 @@
dir = 4;
icon_state = "siding_thinplating_line"
},
+/obj/item/weapon/reagent_containers/spray/cleaner,
/turf/simulated/shuttle/floor{
icon_state = "floor6"
},
@@ -14512,6 +14520,9 @@
dir = 4;
icon_state = "siding_thinplating_line"
},
+/obj/structure/rack,
+/obj/item/weapon/mop,
+/obj/item/weapon/reagent_containers/glass/bucket,
/turf/simulated/shuttle/floor{
icon_state = "floor6"
},
@@ -22894,6 +22905,13 @@
/obj/machinery/atmospherics/pipe/simple/visible{
dir = 4
},
+/obj/machinery/door/poddoor{
+ id = "smindicate";
+ name = "Security Door";
+ density = 0;
+ icon_state = "pdoor0";
+ opacity = 0
+ },
/obj/machinery/door/airlock/external{
dir = 4;
frequency = 1331;
@@ -22915,6 +22933,13 @@
/turf/environment/space,
/area/shuttle/escape/centcom)
"bRb" = (
+/obj/machinery/door/poddoor{
+ id = "smindicate";
+ name = "Security Door";
+ density = 0;
+ icon_state = "pdoor0";
+ opacity = 0
+ },
/obj/machinery/door/airlock/external{
dir = 4;
frequency = 1331;
@@ -86834,7 +86859,7 @@ aHP
akM
akM
akM
-alx
+akM
akM
akM
aJR
@@ -87349,7 +87374,7 @@ akM
akN
aGs
aGx
-aGx
+alx
anx
aKv
als
diff --git a/maps/delta/delta.dmm b/maps/delta/delta.dmm
index 77f7dbec909a..f7e40e007411 100644
--- a/maps/delta/delta.dmm
+++ b/maps/delta/delta.dmm
@@ -4106,7 +4106,7 @@
/obj/structure/closet/secure_closet/medical_wall{
pixel_x = 32;
req_access = list();
- req_one_access = list(1, 5)
+ req_one_access = list(1,5)
},
/turf/simulated/floor{
dir = 4;
@@ -27982,9 +27982,7 @@
},
/area/station/hallway/primary/port)
"dgm" = (
-/obj/machinery/ai_slipper{
- uses = 10
- },
+/obj/machinery/ai_slipper,
/obj/structure/cable{
d1 = 1;
d2 = 2;
@@ -44914,9 +44912,7 @@
},
/area/station/engineering/atmos)
"hnX" = (
-/obj/machinery/ai_slipper{
- uses = 10
- },
+/obj/machinery/ai_slipper,
/obj/structure/cable{
d1 = 2;
d2 = 8;
@@ -55064,9 +55060,7 @@
},
/area/station/engineering/atmos)
"jFu" = (
-/obj/machinery/ai_slipper{
- uses = 10
- },
+/obj/machinery/ai_slipper,
/obj/structure/cable{
d1 = 1;
d2 = 2;
@@ -62865,7 +62859,7 @@
desc = "Used to monitor areas of the Security Division.";
dir = 1;
name = "Security Monitor";
- network = list("Security", "Prison");
+ network = list("Security","Prison");
pixel_y = -27
},
/turf/simulated/floor{
@@ -79029,9 +79023,7 @@
},
/area/station/hallway/secondary/mine_sci_shuttle)
"pwl" = (
-/obj/machinery/ai_slipper{
- uses = 10
- },
+/obj/machinery/ai_slipper,
/obj/structure/cable{
d1 = 1;
d2 = 4;
@@ -79536,9 +79528,7 @@
},
/area/station/engineering/atmos/supermatter)
"pAH" = (
-/obj/machinery/ai_slipper{
- uses = 10
- },
+/obj/machinery/ai_slipper,
/obj/structure/cable{
d1 = 2;
d2 = 4;
@@ -85563,9 +85553,7 @@
/turf/simulated/floor,
/area/station/engineering/engine)
"qYF" = (
-/obj/machinery/ai_slipper{
- uses = 10
- },
+/obj/machinery/ai_slipper,
/obj/structure/cable{
d1 = 2;
d2 = 4;
@@ -99276,9 +99264,7 @@
},
/area/station/engineering/atmos)
"uty" = (
-/obj/machinery/ai_slipper{
- uses = 10
- },
+/obj/machinery/ai_slipper,
/obj/structure/cable{
d1 = 2;
d2 = 4;
@@ -99452,9 +99438,7 @@
/turf/simulated/floor/plating,
/area/station/maintenance/science)
"uvR" = (
-/obj/machinery/ai_slipper{
- uses = 10
- },
+/obj/machinery/ai_slipper,
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
dir = 8
},
diff --git a/maps/falcon/falcon.dmm b/maps/falcon/falcon.dmm
index ac7a67c5d1d8..3f7526ba2e50 100644
--- a/maps/falcon/falcon.dmm
+++ b/maps/falcon/falcon.dmm
@@ -1647,9 +1647,7 @@
/turf/simulated/floor/whitegreed,
/area/station/aisat/ai_chamber)
"acY" = (
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
+/obj/machinery/ai_slipper,
/obj/machinery/light/smart{
dir = 1
},
@@ -1866,9 +1864,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
dir = 4
},
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
+/obj/machinery/ai_slipper,
/turf/simulated/floor{
icon_state = "dark"
},
@@ -2070,9 +2066,6 @@
/turf/simulated/floor/plating,
/area/station/maintenance/science)
"adF" = (
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
/obj/machinery/porta_turret/station_default{
dir = 4
},
@@ -2090,9 +2083,7 @@
/turf/simulated/floor/whitegreed,
/area/station/aisat/ai_chamber)
"adG" = (
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
+/obj/machinery/ai_slipper,
/obj/structure/window/thin/reinforced{
dir = 4
},
@@ -2448,9 +2439,7 @@
d2 = 8;
icon_state = "1-8"
},
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
+/obj/machinery/ai_slipper,
/turf/simulated/floor{
icon_state = "dark"
},
@@ -2496,9 +2485,7 @@
},
/area/station/aisat/ai_chamber)
"aeg" = (
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
+/obj/machinery/ai_slipper,
/obj/machinery/light/smart,
/turf/simulated/floor/whitegreed,
/area/station/aisat/ai_chamber)
diff --git a/maps/gamma/gamma.dmm b/maps/gamma/gamma.dmm
index c6c0c04480fb..9177d1e1c8e0 100644
--- a/maps/gamma/gamma.dmm
+++ b/maps/gamma/gamma.dmm
@@ -22228,9 +22228,7 @@
},
/area/station/rnd/mixing)
"dGY" = (
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
+/obj/machinery/ai_slipper,
/obj/structure/cable{
d1 = 2;
d2 = 8;
@@ -69593,9 +69591,7 @@
name = "AI Core Door";
req_access = list(16)
},
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
+/obj/machinery/ai_slipper,
/obj/structure/cable{
d1 = 1;
d2 = 2;
@@ -84204,9 +84200,7 @@
name = "AI Core Door";
req_access = list(16)
},
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
+/obj/machinery/ai_slipper,
/obj/structure/cable/yellow{
d1 = 1;
d2 = 2;
@@ -86960,9 +86954,7 @@
},
/area/station/security/seclunch)
"qsw" = (
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
+/obj/machinery/ai_slipper,
/turf/simulated/floor/whitegreed,
/area/station/aisat/ai_chamber)
"qsG" = (
diff --git a/maps/prometheus/prometheus.dmm b/maps/prometheus/prometheus.dmm
index da23b8bc9697..6b75d2378372 100644
--- a/maps/prometheus/prometheus.dmm
+++ b/maps/prometheus/prometheus.dmm
@@ -8878,9 +8878,7 @@
/obj/structure/window/thin/reinforced{
dir = 1
},
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
+/obj/machinery/ai_slipper,
/turf/simulated/floor/whitegreed,
/area/station/aisat/ai_chamber)
"bDC" = (
@@ -16136,6 +16134,12 @@
/obj/effect/decal/turf_decal/set_damaged,
/turf/simulated/floor/wood,
/area/station/civilian/bar)
+"dwK" = (
+/obj/machinery/hologram/holopad,
+/turf/simulated/floor{
+ icon_state = "dark"
+ },
+/area/station/aisat/ai_chamber)
"dwL" = (
/obj/effect/decal/turf_decal{
dir = 6;
@@ -19935,6 +19939,17 @@
icon_state = "brown"
},
/area/station/cargo/miningoffice)
+"epM" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/machinery/hologram/holopad,
+/turf/simulated/floor/whitegreed,
+/area/station/bridge/ai_upload)
"epO" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/blood/oil,
@@ -36162,9 +36177,7 @@
/area/station/security/brig)
"icf" = (
/obj/structure/window/thin/reinforced,
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
+/obj/machinery/ai_slipper,
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 5
},
@@ -38130,10 +38143,6 @@
},
/area/station/medical/virology)
"iCe" = (
-/obj/machinery/hologram/holopad,
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
/obj/item/device/radio/intercom{
name = "Station Intercom (General)";
pixel_x = 28;
@@ -46199,9 +46208,7 @@
},
/area/station/medical/reception)
"kIr" = (
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
+/obj/machinery/ai_slipper,
/turf/simulated/floor/whitegreed,
/area/station/aisat/ai_chamber)
"kIB" = (
@@ -50233,6 +50240,7 @@
/turf/simulated/floor/plating,
/area/station/storage/tech)
"lFP" = (
+/obj/machinery/ai_slipper,
/turf/simulated/floor{
icon_state = "dark"
},
@@ -80735,10 +80743,7 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 10
},
-/obj/machinery/hologram/holopad,
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
+/obj/machinery/ai_slipper,
/turf/simulated/floor/whitegreed,
/area/station/bridge/ai_upload)
"tkT" = (
@@ -82502,10 +82507,6 @@
/turf/simulated/floor/plating,
/area/station/maintenance/science)
"tJu" = (
-/obj/machinery/hologram/holopad,
-/obj/machinery/ai_slipper{
- icon_state = "motion0"
- },
/obj/item/device/radio/intercom{
name = "Station Intercom (General)";
pixel_x = -28;
@@ -133660,7 +133661,7 @@ fpz
eTw
tkS
upy
-uHZ
+epM
uHZ
pQf
kSZ
@@ -146324,7 +146325,7 @@ hiU
hiU
lFP
tJu
-lFP
+dwK
hiU
hiU
hiU
@@ -149408,7 +149409,7 @@ hiU
hiU
lFP
iCe
-lFP
+dwK
hiU
hiU
hiU
diff --git a/maps/templates/space_structures/satellite.dmm b/maps/templates/space_structures/satellite.dmm
index 1bda2c9a03b2..648f718ae7ab 100644
--- a/maps/templates/space_structures/satellite.dmm
+++ b/maps/templates/space_structures/satellite.dmm
@@ -167,8 +167,7 @@
dir = 8
},
/obj/structure/survivor_cryopod/nasa{
- dir = 4;
- fixed_name = "Major Tom"
+ dir = 4
},
/turf/simulated/shuttle/floor,
/area/space_structures/nasa_satellite)
diff --git a/taucetistation.dme b/taucetistation.dme
index 9f52f8c16bba..924bf9c46aab 100644
--- a/taucetistation.dme
+++ b/taucetistation.dme
@@ -776,6 +776,7 @@
#include "code\game\gamemodes\roles\slave.dm"
#include "code\game\gamemodes\roles\strike_teams.dm"
#include "code\game\gamemodes\roles\syndicate.dm"
+#include "code\game\gamemodes\roles\thief.dm"
#include "code\game\gamemodes\roles\traitor.dm"
#include "code\game\gamemodes\roles\traitorchan.dm"
#include "code\game\gamemodes\roles\wild_animal.dm"