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 += "" - 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+="
  1. [voterName]
  2. " + dat+="
" + if(dislikes > 0) + dat+="Дизлайки" + dat+="
    " + for(var/voterName in MESSAGE.voters) + if(MESSAGE.voters[voterName] < 0) + dat+="
  1. [voterName]
  2. " + 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+="Содержание:
" + if(isemptylist(news_content)) + if(important_message) + dat+="Содержание:
" else dat+="[return_funny_title()]" else 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"