diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index 182b05ccb6a..27f46f2458d 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -219,11 +219,11 @@ /obj/structure/stone_tile/surrounding_tile{ dir = 8 }, -/turf/open/lava/smooth, +/turf/open/lava/smooth/lava_land_surface, /area/ruin/unpowered/ash_walkers) "aI" = ( /obj/structure/stone_tile/block/cracked, -/turf/open/lava/smooth, +/turf/open/lava/smooth/lava_land_surface, /area/ruin/unpowered/ash_walkers) "aJ" = ( /obj/structure/stone_tile/surrounding_tile/cracked, @@ -234,7 +234,7 @@ /obj/structure/stone_tile/surrounding_tile{ dir = 8 }, -/turf/open/lava/smooth, +/turf/open/lava/smooth/lava_land_surface, /area/ruin/unpowered/ash_walkers) "aK" = ( /obj/structure/stone_tile/block/cracked{ @@ -304,17 +304,17 @@ /obj/structure/stone_tile/block/cracked{ dir = 4 }, -/turf/open/lava/smooth, +/turf/open/lava/smooth/lava_land_surface, /area/ruin/unpowered/ash_walkers) "aU" = ( /obj/structure/lavaland/ash_walker, -/turf/open/lava/smooth, +/turf/open/lava/smooth/lava_land_surface, /area/ruin/unpowered/ash_walkers) "aV" = ( /obj/structure/stone_tile/block{ dir = 8 }, -/turf/open/lava/smooth, +/turf/open/lava/smooth/lava_land_surface, /area/ruin/unpowered/ash_walkers) "aW" = ( /obj/structure/stone_tile/block{ @@ -383,13 +383,13 @@ /obj/structure/stone_tile/surrounding_tile{ dir = 1 }, -/turf/open/lava/smooth, +/turf/open/lava/smooth/lava_land_surface, /area/ruin/unpowered/ash_walkers) "be" = ( /obj/structure/stone_tile/block{ dir = 1 }, -/turf/open/lava/smooth, +/turf/open/lava/smooth/lava_land_surface, /area/ruin/unpowered/ash_walkers) "bf" = ( /obj/structure/stone_tile/surrounding_tile/cracked{ @@ -402,7 +402,7 @@ /obj/structure/stone_tile/surrounding_tile{ dir = 4 }, -/turf/open/lava/smooth, +/turf/open/lava/smooth/lava_land_surface, /area/ruin/unpowered/ash_walkers) "bg" = ( /obj/structure/stone_tile/block{ diff --git a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm index fea17a38cc5..433eea818a3 100644 --- a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm @@ -2875,7 +2875,7 @@ }, /area/ruin/space/derelict/atmospherics) "lO" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector, +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste, /turf/open/floor/engine/air{ initial_gas_mix = "o2=20000;n2=80000;TEMP=293.15" }, @@ -3667,7 +3667,8 @@ "ES" = ( /obj/effect/spawner/structure/window/plasma/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plasteel/airless, +/obj/structure/grille, +/turf/open/floor/plating/airless, /area/ruin/space/derelict/atmospherics) "Gu" = ( /obj/structure/grille, @@ -3817,6 +3818,7 @@ "Qt" = ( /obj/effect/spawner/structure/window/plasma/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/visible, +/obj/structure/grille, /turf/open/floor/plating/airless, /area/ruin/space/derelict/atmospherics) "Rd" = ( diff --git a/_maps/map_files/Donutstation/Donutstation.dmm b/_maps/map_files/Donutstation/Donutstation.dmm index 592a091dc41..8166d0b03b1 100644 --- a/_maps/map_files/Donutstation/Donutstation.dmm +++ b/_maps/map_files/Donutstation/Donutstation.dmm @@ -19263,7 +19263,7 @@ /area/security/main) "baM" = ( /obj/machinery/door/airlock/maintenance{ - req_access_txt = "12;1" + req_access_txt = "63" }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -21300,7 +21300,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/maintenance{ - req_access_txt = "12;63" + req_access_txt = "63" }, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index b4145ce3dee..d1cbcd04c50 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -186,6 +186,7 @@ #define COMPONENT_ITEM_NO_ATTACK 1 #define COMSIG_MOB_APPLY_DAMGE "mob_apply_damage" //from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone) #define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters) +#define COMSIG_MOB_ITEM_ATTACK_QDELETED "mob_item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, proxiumity_flag, click_parameters) #define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //from base of mob/RangedAttack(): (atom/A, params) #define COMSIG_MOB_THROW "mob_throw" //from base of /mob/throw_item(): (atom/target) #define COMSIG_MOB_EXAMINATE "mob_examinate" //from base of /mob/verb/examinate(): (atom/target) @@ -250,6 +251,7 @@ #define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" //from base of obj/item/pre_attack(): (atom/target, mob/user, params) #define COMPONENT_NO_ATTACK 1 #define COMSIG_ITEM_AFTERATTACK "item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, params) +#define COMSIG_ITEM_ATTACK_QDELETED "item_attack_qdeleted" //from base of obj/item/attack_qdeleted(): (atom/target, mob/user, params) #define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot) #define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (mob/user) #define COMSIG_ITEM_PICKUP "item_pickup" //from base of obj/item/pickup(): (/mob/taker) diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 1d6d64efb2a..a9a1955ad2d 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -85,10 +85,14 @@ //randomised elements #define RANDOM_NAME "random_name" +#define RANDOM_NAME_ANTAG "random_name_antag" #define RANDOM_BODY "random_body" +#define RANDOM_BODY_ANTAG "random_body_antag" #define RANDOM_SPECIES "random_species" #define RANDOM_GENDER "random_gender" +#define RANDOM_GENDER_ANTAG "random_gender_antag" #define RANDOM_AGE "random_age" +#define RANDOM_AGE_ANTAG "random_age_antag" #define RANDOM_UNDERWEAR "random_underwear" #define RANDOM_UNDERWEAR_COLOR "random_underwear_color" #define RANDOM_UNDERSHIRT "random_undershirt" @@ -100,4 +104,4 @@ #define RANDOM_FACIAL_HAIR_COLOR "random_facial_hair_color" #define RANDOM_FACIAL_HAIRSTYLE "random_facial_hairstyle" #define RANDOM_SKIN_TONE "random_skin_tone" -#define RANDOM_EYE_COLOR "random_eye_color" \ No newline at end of file +#define RANDOM_EYE_COLOR "random_eye_color" diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 8026afae47b..5635cd7b3e7 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -18,6 +18,7 @@ GLOBAL_LIST_EMPTY(drones_list) GLOBAL_LIST_EMPTY(dead_mob_list) //all dead mobs, including clientless. Excludes /mob/dead/new_player GLOBAL_LIST_EMPTY(joined_player_list) //all clients that have joined the game at round-start or as a latejoin. GLOBAL_LIST_EMPTY(new_player_list) //all /mob/dead/new_player, in theory all should have clients and those that don't are in the process of spawning and get deleted when done. +GLOBAL_LIST_EMPTY(pre_setup_antags) //minds that have been picked as antag by the gamemode. removed as antag datums are set. GLOBAL_LIST_EMPTY(silicon_mobs) //all silicon mobs GLOBAL_LIST_EMPTY(mob_living_list) //all instances of /mob/living and subtypes GLOBAL_LIST_EMPTY(carbon_list) //all instances of /mob/living/carbon and subtypes, notably does not contain brains or simple animals diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 51872d06120..99194a4f52a 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -15,6 +15,7 @@ if(target.attackby(src,user, params)) return if(QDELETED(src) || QDELETED(target)) + attack_qdeleted(target, user, TRUE, params) return afterattack(target, user, TRUE, params) @@ -117,6 +118,10 @@ SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target, user, proximity_flag, click_parameters) SEND_SIGNAL(user, COMSIG_MOB_ITEM_AFTERATTACK, target, user, proximity_flag, click_parameters) +// Called if the target gets deleted by our attack +/obj/item/proc/attack_qdeleted(atom/target, mob/user, proximity_flag, click_parameters) + SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_QDELETED, target, user, proximity_flag, click_parameters) + SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK_QDELETED, target, user, proximity_flag, click_parameters) /obj/item/proc/get_clamped_volume() if(w_class) diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index 86492048baa..bbe83b18ee0 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -23,7 +23,13 @@ /datum/brain_trauma/severe/split_personality/proc/make_backseats() stranger_backseat = new(owner, src) + var/obj/effect/proc_holder/spell/targeted/personality_commune/stranger_spell = new(src) + stranger_backseat.AddSpell(stranger_spell) + owner_backseat = new(owner, src) + var/obj/effect/proc_holder/spell/targeted/personality_commune/owner_spell = new(src) + owner_backseat.AddSpell(owner_spell) + /datum/brain_trauma/severe/split_personality/proc/get_ghost() set waitfor = FALSE diff --git a/code/datums/components/slippery.dm b/code/datums/components/slippery.dm index 93ee54ca9c2..245b7556e0d 100644 --- a/code/datums/components/slippery.dm +++ b/code/datums/components/slippery.dm @@ -21,5 +21,5 @@ /datum/component/slippery/proc/Slip_on_wearer(datum/source, atom/movable/AM, mob/living/crossed) - if(crossed.lying) + if(crossed.lying && !crossed.buckle_lying) Slip(source, AM) diff --git a/code/datums/components/soulstoned.dm b/code/datums/components/soulstoned.dm new file mode 100644 index 00000000000..6e87e7f9fe8 --- /dev/null +++ b/code/datums/components/soulstoned.dm @@ -0,0 +1,31 @@ +//adds godmode while in the container, prevents moving, and clears these effects up after leaving the stone +/datum/component/soulstoned + var/atom/movable/container + +/datum/component/soulstoned/Initialize(atom/movable/container) + if(!isanimal(parent)) + return COMPONENT_INCOMPATIBLE + var/mob/living/simple_animal/S = parent + + src.container = container + + S.forceMove(container) + + S.status_flags |= GODMODE + S.mobility_flags = NONE + S.health = S.maxHealth + S.bruteloss = 0 + + RegisterSignal(S, COMSIG_MOVABLE_MOVED, .proc/free_prisoner) + +/datum/component/soulstoned/proc/free_prisoner() + var/mob/living/simple_animal/S = parent + if(S.loc != container) + qdel(src) + +/datum/component/soulstoned/UnregisterFromParent() + var/mob/living/simple_animal/S = parent + S.status_flags &= ~GODMODE + S.mobility_flags = MOBILITY_FLAGS_DEFAULT + + diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 67a1ccb39ea..976462490c1 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -554,10 +554,11 @@ status_type = STATUS_EFFECT_REFRESH /datum/status_effect/good_music/tick() - owner.dizziness = max(0, owner.dizziness - 2) - owner.jitteriness = max(0, owner.jitteriness - 2) - owner.confused = max(0, owner.confused - 1) - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "goodmusic", /datum/mood_event/goodmusic) + if(owner.can_hear()) + owner.dizziness = max(0, owner.dizziness - 2) + owner.jitteriness = max(0, owner.jitteriness - 2) + owner.confused = max(0, owner.confused - 1) + SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "goodmusic", /datum/mood_event/goodmusic) /obj/screen/alert/status_effect/regenerative_core name = "Regenerative Core Tendrils" diff --git a/code/game/gamemodes/brother/traitor_bro.dm b/code/game/gamemodes/brother/traitor_bro.dm index e25c4f7716f..5405133e4f0 100644 --- a/code/game/gamemodes/brother/traitor_bro.dm +++ b/code/game/gamemodes/brother/traitor_bro.dm @@ -45,7 +45,12 @@ bro.restricted_roles = restricted_jobs log_game("[key_name(bro)] has been selected as a Brother") pre_brother_teams += team - return ..() + . = ..() + if(.) //To ensure the game mode is going ahead + for(var/teams in pre_brother_teams) + for(var/antag in teams) + GLOB.pre_setup_antags += antag + return /datum/game_mode/traitor/bros/post_setup() for(var/datum/team/brother_team/team in pre_brother_teams) @@ -53,6 +58,7 @@ team.forge_brother_objectives() for(var/datum/mind/M in team.members) M.add_antag_datum(/datum/antagonist/brother, team) + GLOB.pre_setup_antags -= M team.update_name() brother_teams += pre_brother_teams return ..() diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index e6524309d92..da872601855 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -51,10 +51,11 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th changelings += changeling changeling.special_role = ROLE_CHANGELING changeling.restricted_roles = restricted_jobs - return 1 + GLOB.pre_setup_antags += changeling + return TRUE else setup_error = "Not enough changeling candidates" - return 0 + return FALSE /datum/game_mode/changeling/post_setup() //Decide if it's ok for the lings to have a team objective @@ -75,6 +76,7 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th var/datum/antagonist/changeling/new_antag = new() new_antag.team_mode = TRUE changeling.add_antag_datum(new_antag) + GLOB.pre_setup_antags -= changeling ..() /datum/game_mode/changeling/make_antag_chance(mob/living/carbon/human/character) //Assigns changeling to latejoiners diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index ef9b710d7b0..96ed649251d 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -51,13 +51,18 @@ changeling.special_role = ROLE_CHANGELING changelings += changeling changeling.restricted_roles = restricted_jobs - return ..() + . = ..() + if(.) //To ensure the game mode is going ahead + for(var/antag in changelings) + GLOB.pre_setup_antags += antag + return else - return 0 + return FALSE /datum/game_mode/traitor/changeling/post_setup() for(var/datum/mind/changeling in changelings) changeling.add_antag_datum(/datum/antagonist/changeling) + GLOB.pre_setup_antags -= changeling return ..() /datum/game_mode/traitor/changeling/make_antag_chance(mob/living/carbon/human/character) //Assigns changeling to latejoiners diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 00e77dc0cfc..5f9d3649010 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -174,9 +174,10 @@ Credit where due: servant.assigned_role = ROLE_SERVANT_OF_RATVAR servant.special_role = ROLE_SERVANT_OF_RATVAR starter_servants-- + GLOB.pre_setup_antags += servant ark_time = 30 + round((roundstart_player_count / 5)) //In minutes, how long the Ark will wait before activation ark_time = min(ark_time, 35) //35 minute maximum for the activation timer - return 1 + return TRUE /datum/game_mode/clockwork_cult/post_setup() var/list/spread_out_spawns = GLOB.servant_spawns.Copy() @@ -191,20 +192,21 @@ Credit where due: greet_servant(L) equip_servant(L) add_servant_of_ratvar(L, TRUE) + GLOB.pre_setup_antags -= S var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar //that's a mouthful G.final_countdown(ark_time) ..() - return 1 + return TRUE /datum/game_mode/clockwork_cult/proc/greet_servant(mob/M) //Description of their role if(!M) - return 0 + return FALSE to_chat(M, "You are a servant of Ratvar, the Clockwork Justiciar!") to_chat(M, "You have approximately [ark_time] minutes until the Ark activates.") to_chat(M, "Unlock Script scripture by converting a new servant.") to_chat(M, "Application scripture will be unlocked halfway until the Ark's activation.") M.playsound_local(get_turf(M), 'sound/ambience/antag/clockcultalr.ogg', 100, FALSE, pressure_affected = FALSE) - return 1 + return TRUE /datum/game_mode/proc/equip_servant(mob/living/M) //Grants a clockwork slab to the mob, with one of each component if(!M || !ishuman(M)) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 091f40cda08..202bc0faafe 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -83,6 +83,8 @@ log_game("[key_name(cultist)] has been selected as a cultist") if(cultists_to_cult.len>=required_enemies) + for(var/antag in cultists_to_cult) + GLOB.pre_setup_antags += antag return TRUE else setup_error = "Not enough cultist candidates" @@ -94,6 +96,7 @@ for(var/datum/mind/cult_mind in cultists_to_cult) add_cultist(cult_mind, 0, equip=TRUE, cult_team = main_cult) + GLOB.pre_setup_antags -= cult_mind main_cult.setup_objectives() //Wait until all cultists are assigned to make sure none will be chosen as sacrifice. diff --git a/code/game/gamemodes/devil/devil_game_mode.dm b/code/game/gamemodes/devil/devil_game_mode.dm index 024fe24a63b..09b8326d5c2 100644 --- a/code/game/gamemodes/devil/devil_game_mode.dm +++ b/code/game/gamemodes/devil/devil_game_mode.dm @@ -47,15 +47,17 @@ if(devils.len < required_enemies) setup_error = "Not enough devil candidates" - return 0 - return 1 + return FALSE + for(var/antag in devils) + GLOB.pre_setup_antags += antag + return TRUE /datum/game_mode/devil/post_setup() for(var/datum/mind/devil in devils) post_setup_finalize(devil) ..() - return 1 + return TRUE /datum/game_mode/devil/generate_report() return "Infernal creatures have been seen nearby offering great boons in exchange for souls. This is considered theft against Nanotrasen, as all employment contracts contain a lien on the \ @@ -63,6 +65,7 @@ /datum/game_mode/devil/proc/post_setup_finalize(datum/mind/devil) add_devil(devil.current, ascendable = TRUE) //Devil gamemode devils are ascendable. + GLOB.pre_setup_antags -= devil add_devil_objectives(devil,2) /proc/is_devil(mob/living/M) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/code/game/gamemodes/dynamic/dynamic_rulesets.dm index fe4aa64304c..3445d0ee1bb 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets.dm @@ -110,6 +110,7 @@ /datum/dynamic_ruleset/proc/execute() for(var/datum/mind/M in assigned) M.add_antag_datum(antag_datum) + GLOB.pre_setup_antags -= M return TRUE /// Here you can perform any additional checks you want. (such as checking the map etc) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index cd839214057..532100547f9 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -28,6 +28,7 @@ assigned += M.mind M.mind.special_role = ROLE_TRAITOR M.mind.restricted_roles = restricted_roles + GLOB.pre_setup_antags += M.mind return TRUE /datum/dynamic_ruleset/roundstart/traitor/rule_process() @@ -77,6 +78,7 @@ team.add_member(bro.mind) bro.mind.special_role = "brother" bro.mind.restricted_roles = restricted_roles + GLOB.pre_setup_antags += bro.mind pre_brother_teams += team return TRUE @@ -86,6 +88,7 @@ team.forge_brother_objectives() for(var/datum/mind/M in team.members) M.add_antag_datum(/datum/antagonist/brother, team) + GLOB.pre_setup_antags -= M team.update_name() mode.brother_teams += pre_brother_teams return TRUE @@ -116,6 +119,7 @@ assigned += M.mind M.mind.restricted_roles = restricted_roles M.mind.special_role = ROLE_CHANGELING + GLOB.pre_setup_antags += M.mind return TRUE /datum/dynamic_ruleset/roundstart/changeling/execute() @@ -135,6 +139,7 @@ var/datum/antagonist/changeling/new_antag = new antag_datum() new_antag.team_mode = team_mode changeling.add_antag_datum(new_antag) + GLOB.pre_setup_antags -= changeling return TRUE ////////////////////////////////////////////// @@ -173,7 +178,7 @@ assigned += M.mind M.mind.assigned_role = ROLE_WIZARD M.mind.special_role = ROLE_WIZARD - + return TRUE /datum/dynamic_ruleset/roundstart/wizard/execute() @@ -218,6 +223,7 @@ assigned += M.mind M.mind.special_role = ROLE_CULTIST M.mind.restricted_roles = restricted_roles + GLOB.pre_setup_antags += M.mind return TRUE /datum/dynamic_ruleset/roundstart/bloodcult/execute() @@ -227,6 +233,7 @@ new_cultist.cult_team = main_cult new_cultist.give_equipment = TRUE M.add_antag_datum(new_cultist) + GLOB.pre_setup_antags -= M main_cult.setup_objectives() return TRUE @@ -361,6 +368,7 @@ assigned += M.mind M.mind.restricted_roles = restricted_roles M.mind.special_role = antag_flag + GLOB.pre_setup_antags += M.mind return TRUE /datum/dynamic_ruleset/roundstart/revs/execute() @@ -371,6 +379,7 @@ new_head.give_hud = TRUE new_head.remove_clumsy = TRUE M.add_antag_datum(new_head,revolution) + GLOB.pre_setup_antags -= M revolution.update_objectives() revolution.update_heads() SSshuttle.registerHostileEnvironment(src) @@ -480,6 +489,7 @@ assigned += servant.mind servant.mind.assigned_role = ROLE_SERVANT_OF_RATVAR servant.mind.special_role = ROLE_SERVANT_OF_RATVAR + GLOB.pre_setup_antags += servant.mind ark_time = 30 + round((number_players / 5)) ark_time = min(ark_time, 35) return TRUE @@ -496,6 +506,7 @@ greet_servant(S) equip_servant(S) add_servant_of_ratvar(S, TRUE) + GLOB.pre_setup_antags -= S.mind var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar //that's a mouthful G.final_countdown(ark_time) return TRUE @@ -601,6 +612,7 @@ assigned += devil.mind devil.mind.special_role = ROLE_DEVIL devil.mind.restricted_roles = restricted_roles + GLOB.pre_setup_antags += devil.mind log_game("[key_name(devil)] has been selected as a devil") return TRUE @@ -608,6 +620,7 @@ /datum/dynamic_ruleset/roundstart/devil/execute() for(var/datum/mind/devil in assigned) add_devil(devil.current, ascendable = TRUE) + GLOB.pre_setup_antags -= devil add_devil_objectives(devil,2) return TRUE diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 23924107fa9..cca64be11d8 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -55,6 +55,8 @@ setup_error = "Not enough headrev candidates" return FALSE + for(var/antag in headrev_candidates) + GLOB.pre_setup_antags += antag return TRUE /datum/game_mode/revolution/post_setup() @@ -97,6 +99,7 @@ new_head.give_hud = TRUE new_head.remove_clumsy = TRUE rev_mind.add_antag_datum(new_head,revolution) + GLOB.pre_setup_antags -= rev_mind revolution.update_objectives() revolution.update_heads() diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index fe8948ed0d6..81813188f32 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -63,6 +63,9 @@ setup_error = "Not enough traitor candidates" return FALSE else + for(var/antag in pre_traitors) + GLOB.pre_setup_antags += antag + to_chat(world, "Added [antag] to pre-antag list") return TRUE @@ -70,6 +73,7 @@ for(var/datum/mind/traitor in pre_traitors) var/datum/antagonist/traitor/new_antag = new antag_datum() addtimer(CALLBACK(traitor, /datum/mind.proc/add_antag_datum, new_antag), rand(10,100)) + GLOB.pre_setup_antags -= traitor if(!exchange_blue) exchange_blue = -1 //Block latejoiners from getting exchange objectives ..() diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index b6f9e242010..03f27ff6bfb 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -303,9 +303,10 @@ var/temp = "rune" - if(is_alpha(drawing)) + var/ascii = (length(drawing) == 1) + if(ascii && is_alpha(drawing)) temp = "letter" - else if(is_digit(drawing)) + else if(ascii && is_digit(drawing)) temp = "number" else if(drawing in punctuation) temp = "punctuation mark" diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 84750a65a3e..6a86522e0bc 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -925,6 +925,33 @@ GLOBAL_LIST_EMPTY(PDAs) //AI verb and proc for sending PDA messages. +/obj/item/pda/ai/verb/cmd_toggle_pda_receiver() + set category = "AI Commands" + set name = "PDA - Toggle Sender/Receiver" + + if(usr.stat == DEAD) + return //won't work if dead + var/mob/living/silicon/S = usr + if(istype(S) && !isnull(S.aiPDA)) + S.aiPDA.toff = !S.aiPDA.toff + to_chat(usr, "PDA sender/receiver toggled [(S.aiPDA.toff ? "Off" : "On")]!") + else + to_chat(usr, "You do not have a PDA. You should make an issue report about this.") + +/obj/item/pda/ai/verb/cmd_toggle_pda_silent() + set category = "AI Commands" + set name = "PDA - Toggle Ringer" + + if(usr.stat == DEAD) + return //won't work if dead + var/mob/living/silicon/S = usr + if(istype(S) && !isnull(S.aiPDA)) + //0 + S.aiPDA.silent = !S.aiPDA.silent + to_chat(usr, "PDA ringer toggled [(S.aiPDA.silent ? "Off" : "On")]!") + else + to_chat(usr, "You do not have a PDA. You should make an issue report about this.") + /mob/living/silicon/proc/cmd_send_pdamesg(mob/user) var/list/plist = list() var/list/namecounts = list() @@ -959,30 +986,6 @@ GLOBAL_LIST_EMPTY(PDAs) aiPDA.create_message(src, selected) - -/mob/living/silicon/verb/cmd_toggle_pda_receiver() - set category = "AI Commands" - set name = "PDA - Toggle Sender/Receiver" - if(usr.stat == DEAD) - return //won't work if dead - if(!isnull(aiPDA)) - aiPDA.toff = !aiPDA.toff - to_chat(usr, "PDA sender/receiver toggled [(aiPDA.toff ? "Off" : "On")]!") - else - to_chat(usr, "You do not have a PDA! You should make an issue report about this.") - -/mob/living/silicon/verb/cmd_toggle_pda_silent() - set category = "AI Commands" - set name = "PDA - Toggle Ringer" - if(usr.stat == DEAD) - return //won't work if dead - if(!isnull(aiPDA)) - //0 - aiPDA.silent = !aiPDA.silent - to_chat(usr, "PDA ringer toggled [(aiPDA.silent ? "Off" : "On")]!") - else - to_chat(usr, "You do not have a PDA! You should make an issue report about this.") - /mob/living/silicon/proc/cmd_show_message_log(mob/user) if(incapacitated()) return @@ -992,7 +995,6 @@ GLOBAL_LIST_EMPTY(PDAs) else to_chat(user, "You do not have a PDA! You should make an issue report about this.") - // Pass along the pulse to atoms in contents, largely added so pAIs are vulnerable to EMP /obj/item/pda/emp_act(severity) . = ..() diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 93ca8884fe1..d8b2c6953bd 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -1131,7 +1131,7 @@ name = "box of materials" illustration = "implant" -/obj/item/storage/box/material/PopulateContents() +/obj/item/storage/box/material/PopulateContents() //less uranium because radioactive var/static/items_inside = list( /obj/item/stack/sheet/metal/fifty=1,\ /obj/item/stack/sheet/glass/fifty=1,\ @@ -1144,8 +1144,8 @@ /obj/item/stack/sheet/mineral/titanium=50,\ /obj/item/stack/sheet/mineral/gold=50,\ /obj/item/stack/sheet/mineral/silver=50,\ - /obj/item/stack/sheet/mineral/uranium=50,\ /obj/item/stack/sheet/mineral/plasma=50,\ + /obj/item/stack/sheet/mineral/uranium=20,\ /obj/item/stack/sheet/mineral/diamond=50,\ /obj/item/stack/sheet/bluespace_crystal=50,\ /obj/item/stack/sheet/mineral/bananium=50,\ @@ -1162,6 +1162,7 @@ /obj/item/storage/box/debugtools/PopulateContents() var/static/items_inside = list( /obj/item/flashlight/emp/debug=1,\ + /obj/item/geiger_counter=1,\ /obj/item/pipe_dispenser=1,\ /obj/item/card/emag=1,\ /obj/item/card/id/syndicate/nuke_leader=1,\ diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 98a649ecedc..7b6d451c0f9 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -34,8 +34,7 @@ /obj/item/stack/medical/gauze = 1, /obj/item/stack/medical/bruise_pack = 2, /obj/item/stack/medical/ointment = 2, - /obj/item/reagent_containers/hypospray/medipen = 1, - /obj/item/healthanalyzer = 1) + /obj/item/reagent_containers/hypospray/medipen = 1) generate_items_inside(items_inside,src) /obj/item/storage/firstaid/medical @@ -107,11 +106,11 @@ /obj/item/stack/medical/bruise_pack = 2, /obj/item/stack/medical/ointment = 2, /obj/item/reagent_containers/hypospray/medipen = 1, - /obj/item/healthanalyzer = 1, /obj/item/surgical_drapes = 1, /obj/item/scalpel = 1, /obj/item/hemostat = 1, - /obj/item/cautery = 1) + /obj/item/cautery = 1, + /obj/item/healthanalyzer = 1) generate_items_inside(items_inside,src) /obj/item/storage/firstaid/ancient @@ -149,8 +148,7 @@ /obj/item/reagent_containers/pill/patch/aiuri = 3, /obj/item/reagent_containers/spray/rhigoxane = 1, /obj/item/reagent_containers/hypospray/medipen/oxandrolone = 1, - /obj/item/reagent_containers/hypospray/medipen = 1, - /obj/item/healthanalyzer = 1) + /obj/item/reagent_containers/hypospray/medipen = 1) generate_items_inside(items_inside,src) /obj/item/storage/firstaid/toxin @@ -175,8 +173,7 @@ /obj/item/storage/pill_bottle/multiver/less = 1, /obj/item/reagent_containers/syringe/syriniver = 3, /obj/item/storage/pill_bottle/potassiodide = 1, - /obj/item/reagent_containers/hypospray/medipen/penacid = 1, - /obj/item/healthanalyzer = 1) + /obj/item/reagent_containers/hypospray/medipen/penacid = 1) generate_items_inside(items_inside,src) /obj/item/storage/firstaid/o2 @@ -201,8 +198,7 @@ /obj/item/reagent_containers/syringe/convermol = 3, /obj/item/reagent_containers/hypospray/medipen/salbutamol = 1, /obj/item/reagent_containers/hypospray/medipen = 1, - /obj/item/storage/pill_bottle/iron = 1, - /obj/item/healthanalyzer = 1) + /obj/item/storage/pill_bottle/iron = 1) generate_items_inside(items_inside,src) /obj/item/storage/firstaid/brute @@ -227,8 +223,7 @@ /obj/item/reagent_containers/pill/patch/libital = 3, /obj/item/stack/medical/gauze = 1, /obj/item/storage/pill_bottle/trophazole = 1, - /obj/item/reagent_containers/hypospray/medipen/salacid = 1, - /obj/item/healthanalyzer = 1) + /obj/item/reagent_containers/hypospray/medipen/salacid = 1) generate_items_inside(items_inside,src) /obj/item/storage/firstaid/advanced diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 3fc45c867fb..5dbf03e7859 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -120,28 +120,38 @@ else return ..() - /obj/item/weldingtool/afterattack(atom/O, mob/user, proximity) . = ..() if(!proximity) return - if(!status && O.is_refillable()) - reagents.trans_to(O, reagents.total_volume, transfered_by = user) - to_chat(user, "You empty [src]'s fuel tank into [O].") - update_icon() + if(isOn()) - use(1) - var/turf/location = get_turf(user) - location.hotspot_expose(700, 50, 1) - if(get_fuel() <= 0) - set_light(0) - - if(isliving(O)) + handle_fuel_and_temps(1, user) + + if(!QDELETED(O) && isliving(O)) // can't ignite something that doesn't exist var/mob/living/L = O if(L.IgniteMob()) message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(L)] on fire with [src] at [AREACOORD(user)]") log_game("[key_name(user)] set [key_name(L)] on fire with [src] at [AREACOORD(user)]") + if(!status && O.is_refillable()) + reagents.trans_to(O, reagents.total_volume, transfered_by = user) + to_chat(user, "You empty [src]'s fuel tank into [O].") + update_icon() + +/obj/item/weldingtool/attack_qdeleted(atom/O, mob/user, proximity) + . = ..() + if(!proximity) + return + + if(isOn()) + handle_fuel_and_temps(1, user) + + if(!QDELETED(O) && isliving(O)) // can't ignite something that doesn't exist + var/mob/living/L = O + if(L.IgniteMob()) + message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(L)] on fire with [src] at [AREACOORD(user)]") + log_game("[key_name(user)] set [key_name(L)] on fire with [src] at [AREACOORD(user)]") /obj/item/weldingtool/attack_self(mob/user) if(src.reagents.has_reagent(/datum/reagent/toxin/plasma)) @@ -153,6 +163,11 @@ update_icon() +// Ah fuck, I can't believe you've done this +/obj/item/weldingtool/proc/handle_fuel_and_temps(used = 0, mob/living/user) + use(used) + var/turf/location = get_turf(user) + location.hotspot_expose(700, 50, 1) // Returns the amount of fuel in the welder /obj/item/weldingtool/proc/get_fuel() @@ -177,6 +192,7 @@ //Turns off the welder if there is no more fuel (does this really need to be its own proc?) /obj/item/weldingtool/proc/check_fuel(mob/user) if(get_fuel() <= 0 && welding) + set_light(0) switched_on(user) update_icon() //mob icon update diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 7eae06b4d5c..25653fa774c 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -108,8 +108,6 @@ /obj/item/soulstone/proc/release_shades(mob/user) for(var/mob/living/simple_animal/shade/A in src) - A.status_flags &= ~GODMODE - A.mobility_flags = MOBILITY_FLAGS_DEFAULT A.forceMove(get_turf(user)) A.cancel_camera() if(purified) @@ -205,10 +203,7 @@ if(contents.len) to_chat(user, "Capture failed!: The soulstone is full! Free an existing soul to make room.") else - T.forceMove(src) //put shade in stone - T.status_flags |= GODMODE - T.mobility_flags = NONE - T.health = T.maxHealth + T.AddComponent(/datum/component/soulstoned, src) if(purified) icon_state = "purified_soulstone2" if(iscultist(T)) @@ -294,8 +289,7 @@ T.invisibility = INVISIBILITY_ABSTRACT T.dust_animation() var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade(src) - S.status_flags |= GODMODE //So they won't die inside the stone somehow - S.mobility_flags = NONE //Can't move out of the soul stone + S.AddComponent(/datum/component/soulstoned, src) S.name = "Shade of [T.real_name]" S.real_name = "Shade of [T.real_name]" S.key = shade_controller.key diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 9b49eee1537..67ee93422b3 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -343,7 +343,7 @@ min_requirements = list( /datum/gas/oxygen = 20, /datum/gas/nitrogen = 20, - /datum/gas/nitrous_oxide = 5, + /datum/gas/pluoxium = 5, "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST*60 ) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index ca4478a6b4b..feb29d1e51a 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -48,6 +48,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/uses_glasses_colour = 0 //character preferences + var/slot_randomized //keeps track of round-to-round randomization of the character slot, prevents overwriting var/real_name //our character's name var/gender = MALE //gender of character (well duh) var/age = 30 //age of character @@ -137,6 +138,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) /datum/preferences/proc/ShowChoices(mob/user) if(!user || !user.client) return + if(slot_randomized) + load_character(default_slot) // Reloads the character slot. Prevents random features from overwriting the slot if saved. + slot_randomized = FALSE update_preview_icon() var/list/dat = list("
| "
@@ -1561,15 +1571,17 @@ GLOBAL_LIST_EMPTY(preferences_datums)
ShowChoices(user)
return 1
-/datum/preferences/proc/copy_to(mob/living/carbon/human/character, icon_updates = 1, roundstart_checks = TRUE, character_setup = FALSE)
+/datum/preferences/proc/copy_to(mob/living/carbon/human/character, icon_updates = 1, roundstart_checks = TRUE, character_setup = FALSE, antagonist = FALSE)
if(randomise[RANDOM_SPECIES] && !character_setup)
random_species()
- if(randomise[RANDOM_BODY] && !character_setup)
- random_character(gender)
+ if((randomise[RANDOM_BODY] || randomise[RANDOM_BODY_ANTAG] && antagonist) && !character_setup)
+ slot_randomized = TRUE
+ random_character(gender, antagonist)
- if(randomise[RANDOM_NAME] && !character_setup)
+ if((randomise[RANDOM_NAME] || randomise[RANDOM_NAME_ANTAG] && antagonist) && !character_setup)
+ slot_randomized = TRUE
real_name = pref_species.random_name(gender)
if(roundstart_checks)
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index 1c4b6262745..6d55b96c070 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -422,7 +422,7 @@
/datum/outfit/debug //Debug objs plus hardsuit
name = "Debug outfit"
uniform = /obj/item/clothing/under/misc/patriotsuit
- suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite
+ suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite/debug
glasses = /obj/item/clothing/glasses/meson/night
ears = /obj/item/radio/headset/headset_cent/commander
mask = /obj/item/clothing/mask/gas/welding/up
@@ -439,5 +439,6 @@
/obj/item/melee/transforming/energy/axe=1,\
/obj/item/storage/part_replacer/bluespace/tier4=1,\
/obj/item/gun/magic/wand/resurrection/debug=1,\
+ /obj/item/gun/magic/wand/death/debug=1,\
/obj/item/debug/human_spawner=1
)
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 4f9eeaf2059..55da8c28b1c 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -364,6 +364,12 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
+/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/debug
+
+/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/debug/Initialize()
+ . = ..()
+ soundloop.volume = 0
+
/obj/item/clothing/suit/space/hardsuit/syndi/elite
name = "elite syndicate hardsuit"
desc = "An elite version of the syndicate hardsuit, with improved armour and fireproofing. It is in travel mode."
@@ -376,6 +382,9 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF | ACID_PROOF
+/obj/item/clothing/suit/space/hardsuit/syndi/elite/debug
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/debug
+
//The Owl Hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/syndi/owl
name = "owl hardsuit helmet"
diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm
index feacd4713e4..59dd003d356 100644
--- a/code/modules/food_and_drinks/food/condiment.dm
+++ b/code/modules/food_and_drinks/food/condiment.dm
@@ -30,7 +30,7 @@
/datum/reagent/consumable/capsaicin = list("icon_state" = "hotsauce", "item_state" = "", "icon_empty" = "", "name" = "hotsauce bottle", "desc" = "You can almost TASTE the stomach ulcers!"),
/datum/reagent/consumable/frostoil = list("icon_state" = "coldsauce", "item_state" = "", "icon_empty" = "", "name" = "coldsauce bottle", "desc" = "Leaves the tongue numb from its passage."),
/datum/reagent/consumable/cornoil = list("icon_state" = "oliveoil", "item_state" = "", "icon_empty" = "", "name" = "corn oil bottle", "desc" = "A delicious oil used in cooking. Made from corn."),
-
+ /datum/reagent/consumable/bbqsauce = list("icon_state" = "bbqsauce", "item_state" = "", "icon_empty" = "", "name" = "bbq sauce bottle", "desc" = "Hand wipes not included."),
)
var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters.
var/icon_empty = ""
@@ -248,6 +248,7 @@
/datum/reagent/consumable/cornoil = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"),
/datum/reagent/consumable/sugar = list("condi_sugar", "Sugar", "Tasty spacey sugar!"),
/datum/reagent/consumable/astrotame = list("condi_astrotame", "Astrotame", "The sweetness of a thousand sugars but none of the calories."),
+ /datum/reagent/consumable/bbqsauce = list("condi_bbq", "BBQ sauce", "Hand wipes not included."),
)
/obj/item/reagent_containers/food/condiment/pack/update_icon()
@@ -306,3 +307,8 @@
name = "astrotame pack"
originalname = "astrotame"
list_reagents = list(/datum/reagent/consumable/astrotame = 5)
+
+/obj/item/reagent_containers/food/condiment/pack/bbqsauce
+ name = "bbq sauce pack"
+ originalname = "bbq sauce"
+ list_reagents = list(/datum/reagent/consumable/bbqsauce = 10)
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm
index 814768a2098..2169deed036 100644
--- a/code/modules/food_and_drinks/food/snacks_meat.dm
+++ b/code/modules/food_and_drinks/food/snacks_meat.dm
@@ -312,3 +312,13 @@
icon_state = "doubleratkebab"
tastes = list("rat meat" = 2, "metal" = 1)
bonus_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/nutriment/vitamin = 2)
+
+/obj/item/reagent_containers/food/snacks/bbqribs
+ name = "bbq ribs"
+ desc = "BBQ ribs, slathered in a healthy coating of BBQ sauce. The least vegan thing to ever exist."
+ icon_state = "ribs"
+ w_class = WEIGHT_CLASS_NORMAL
+ list_reagents = list(/datum/reagent/consumable/nutriment = 8, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/bbqsauce = 5)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
+ tastes = list("meat" = 3, "smokey sauce" = 1)
+ foodtype = MEAT
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm
index 5e510fd3e0c..1ab9ccfae97 100644
--- a/code/modules/food_and_drinks/recipes/food_mixtures.dm
+++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm
@@ -184,3 +184,9 @@
results = list(/datum/reagent/consumable/nutriment/peptides = 0.5)
required_reagents = list(/datum/reagent/consumable/nutriment/ = 0.5)
required_catalysts = list(/datum/reagent/medicine/metafactor = 0.5)
+
+/datum/chemical_reaction/bbqsauce
+ name = "BBQ Sauce"
+ id = /datum/reagent/consumable/bbqsauce
+ results = list(/datum/reagent/consumable/bbqsauce = 5)
+ required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/medicine/salglu_solution = 3, /datum/reagent/consumable/blackpepper = 1)
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
index 3a458fae75e..8f748201fa8 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
@@ -198,3 +198,13 @@
)
result = /obj/item/reagent_containers/food/snacks/salad/ricepork
subcategory = CAT_MEAT
+
+/datum/crafting_recipe/food/ribs
+ name = "BBQ Ribs"
+ reqs = list(
+ /datum/reagent/consumable/bbqsauce = 5,
+ /obj/item/reagent_containers/food/snacks/meat/steak/plain = 2,
+ /obj/item/stack/rods = 2
+ )
+ result = /obj/item/reagent_containers/food/snacks/bbqribs
+ subcategory = CAT_MEAT
\ No newline at end of file
diff --git a/code/modules/mining/equipment/goliath_hide.dm b/code/modules/mining/equipment/goliath_hide.dm
deleted file mode 100644
index 48f0ca0be51..00000000000
--- a/code/modules/mining/equipment/goliath_hide.dm
+++ /dev/null
@@ -1,12 +0,0 @@
-/**********************Goliath Hide**********************/
-/obj/item/stack/sheet/animalhide/goliath_hide
- name = "goliath hide plates"
- desc = "Pieces of a goliath's rocky hide, these might be able to make your suit a bit more durable to attack from the local fauna."
- icon = 'icons/obj/mining.dmi'
- icon_state = "goliath_hide"
- singular_name = "hide plate"
- max_amount = 6
- novariants = FALSE
- item_flags = NOBLUDGEON
- w_class = WEIGHT_CLASS_NORMAL
- layer = MOB_LAYER
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index cc5c7d1adf1..764aac497d6 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -122,7 +122,7 @@
new_player_panel()
if(href_list["late_join"])
- if(!SSticker || !SSticker.IsRoundInProgress())
+ if(!SSticker?.IsRoundInProgress())
to_chat(usr, "The round is either not ready, or has already finished...")
return
@@ -148,6 +148,9 @@
ViewManifest()
if(href_list["SelectedJob"])
+ if(!SSticker?.IsRoundInProgress())
+ to_chat(usr, "The round is either not ready, or has already finished...")
+ return
if(!GLOB.enter_allowed)
to_chat(usr, "There is an administrative lock on entering the game!")
@@ -478,7 +481,12 @@
if(frn)
client.prefs.random_character()
client.prefs.real_name = client.prefs.pref_species.random_name(gender,1)
- client.prefs.copy_to(H)
+
+ var/is_antag
+ if(mind in GLOB.pre_setup_antags)
+ is_antag = TRUE
+
+ client.prefs.copy_to(H, antagonist = is_antag)
H.dna.update_dna_identity()
if(mind)
if(transfer_after)
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index 547918295d8..7dd7a596c25 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -1,15 +1,15 @@
//The mob should have a gender you want before running this proc. Will run fine without H
-/datum/preferences/proc/random_character(gender_override)
+/datum/preferences/proc/random_character(gender_override, antag_override = FALSE)
if(randomise[RANDOM_SPECIES])
random_species()
else if(randomise[RANDOM_NAME])
real_name = pref_species.random_name(gender,1)
- if(gender_override && !(randomise[RANDOM_GENDER]))
+ if(gender_override && !(randomise[RANDOM_GENDER] || randomise[RANDOM_GENDER_ANTAG] && antag_override))
gender = gender_override
else
- gender = pick(MALE,FEMALE)
- if(randomise[RANDOM_AGE])
+ gender = pick(MALE,FEMALE,PLURAL)
+ if(randomise[RANDOM_AGE] || randomise[RANDOM_AGE_ANTAG] && antag_override)
age = rand(AGE_MIN,AGE_MAX)
if(randomise[RANDOM_UNDERWEAR])
underwear = random_underwear(gender)
@@ -74,4 +74,4 @@
COMPILE_OVERLAYS(mannequin)
parent.show_character_previews(new /mutable_appearance(mannequin))
- unset_busy_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES)
\ No newline at end of file
+ unset_busy_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 57002fc7f90..6abb63ed852 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -140,6 +140,7 @@
stop_pulling()
if(HAS_TRAIT(src, TRAIT_PACIFISM))
to_chat(src, "You gently let go of [throwable_mob].")
+ return
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
var/turf/end_T = get_turf(target)
if(start_T && end_T)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index c6aa35da193..733161dd2bf 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -344,6 +344,9 @@
/mob/living/carbon/human/mech_melee_attack(obj/mecha/M)
if(M.occupant.a_intent == INTENT_HARM)
+ if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM))
+ to_chat(M.occupant, "You don't want to harm other living beings!")
+ return
M.do_attack_animation(src)
if(M.damtype == "brute")
step_away(src,M,15)
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 3d3c8f86269..8d75521f80f 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -88,6 +88,9 @@
/mob/living/mech_melee_attack(obj/mecha/M)
if(M.occupant.a_intent == INTENT_HARM)
+ if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM))
+ to_chat(M.occupant, "You don't want to harm other living beings!")
+ return
M.do_attack_animation(src)
if(M.damtype == "brute")
step_away(src,M,15)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index af71f611f3b..4b05de7dacc 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -45,7 +45,7 @@
var/hack_software = FALSE //Will be able to use hacking actions
var/interaction_range = 7 //wireless control range
- var/obj/item/pda/aiPDA
+ var/obj/item/pda/ai/aiPDA
/mob/living/silicon/Initialize()
. = ..()
@@ -68,6 +68,7 @@
QDEL_NULL(radio)
QDEL_NULL(aicamera)
QDEL_NULL(builtInCamera)
+ QDEL_NULL(aiPDA)
GLOB.silicon_mobs -= src
return ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index dd97f4f8050..38b87eae38c 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -86,6 +86,16 @@
if(!beehome)
. += "This bee is homeless!"
+/mob/living/simple_animal/hostile/poison/bees/ListTargets() // Bee processing is expessive, so we override them finding targets here.
+ if(!search_objects) //In case we want to have purely hostile bees
+ return ..()
+ else
+ . = list() // The following code is only very slightly slower than just returning oview(vision_range, targets_from), but it saves us much more work down the line
+ var/list/searched_for = oview(vision_range, targets_from)
+ for(var/obj/A in searched_for)
+ . += A
+ for(var/mob/A in searched_for)
+ . += A
/mob/living/simple_animal/hostile/poison/bees/proc/generate_bee_visuals()
cut_overlays()
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index ca0a96a8dee..2f1a51cd09d 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -127,7 +127,7 @@
//////////////HOSTILE MOB TARGETTING AND AGGRESSION////////////
-/mob/living/simple_animal/hostile/proc/ListTargets()//Step 1, find out what we can see
+/mob/living/simple_animal/hostile/proc/ListTargets() //Step 1, find out what we can see
if(!search_objects)
. = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide
@@ -137,11 +137,7 @@
if(can_see(targets_from, HM, vision_range))
. += HM
else
- . = list() // The following code is only very slightly slower than just returning oview(vision_range, targets_from), but it saves us much more work down the line, particularly when bees are involved
- for (var/obj/A in oview(vision_range, targets_from))
- . += A
- for (var/mob/A in oview(vision_range, targets_from))
- . += A
+ . = oview(vision_range, targets_from)
/mob/living/simple_animal/hostile/proc/FindTarget(list/possible_targets, HasTargetsList = 0)//Step 2, filter down possible targets to things we actually care about
. = list()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index c35aafaec39..e9d2c97f02d 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -72,13 +72,6 @@ Difficulty: Hard
/datum/action/innate/megafauna_attack/blood_warp)
small_sprite_type = /datum/action/small_sprite/megafauna/bubblegum
-/mob/living/simple_animal/hostile/megafauna/bubblegum/Initialize()
- . = ..()
- if(true_spawn)
- for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in GLOB.mob_living_list)
- if(B != src)
- return INITIALIZE_HINT_QDEL //There can be only one
-
/datum/action/innate/megafauna_attack/triple_charge
name = "Triple Charge"
icon_icon = 'icons/mob/actions/actions_items.dmi'
diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm
index 7019ba8ab98..0561641318f 100644
--- a/code/modules/mob/status_procs.dm
+++ b/code/modules/mob/status_procs.dm
@@ -32,7 +32,7 @@
*/
/mob/proc/adjust_blindness(amount)
var/old_eye_blind = eye_blind
- eye_blind += amount
+ eye_blind = max(0, eye_blind + amount)
if(!old_eye_blind || !eye_blind && !HAS_TRAIT(src, TRAIT_BLIND))
update_blindness()
/**
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 617ef3bd8eb..cd10fe3c46b 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -216,7 +216,7 @@
/obj/item/gun/ballistic/shotgun/doublebarrel/improvised/sawn
name = "sawn-off improvised shotgun"
desc = "A single-shot shotgun. Better not miss."
- icon_state = "ishotgun" //_sawn
+ icon_state = "ishotgun_sawn"
item_state = "ishotgun_sawn"
w_class = WEIGHT_CLASS_NORMAL
sawn_off = TRUE
diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
index e6a8f7ce578..ef5e6a22ab5 100644
--- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
@@ -179,47 +179,47 @@
/******TOXIN******/
/*Suffix: -iver*/
-/datum/reagent/medicine/C2/fiziver //fiz = phys ok?
- name = "Fiziver"
- description = "An antitoxin that temporarily weakens the user, making them susceptible to other forms of damage. Weakness and toxin healing scales with length of exposure."
- overdose_threshold = 11
- metabolization_rate = 0.25 * REAGENTS_METABOLISM //so that the weakness from a 10u pill will last for around 3 minutes or so
- var/weak_mod = 1
+/datum/reagent/medicine/C2/seiver //a bit of a gray joke
+ name = "Seiver"
+ description = "A medicine that shifts functionality based on temperature. Colder temperatures incurs radiation removal while hotter temperatures promote antitoxicity. Damages the heart." //CHEM HOLDER TEMPS, NOT AIR TEMPS
+ var/radbonustemp = (T0C - 100) //being below this number gives you 10% off rads.
-/datum/reagent/medicine/C2/fiziver/on_mob_life(mob/living/carbon/human/M)
- var/datum/physiology/phis = M.physiology
- phis.brute_mod /= weak_mod
- phis.burn_mod /= weak_mod
- phis.oxy_mod /= weak_mod
- phis.stamina_mod /= weak_mod
- weak_mod = min(3, (1+(current_cycle*0.04)))
- phis.brute_mod *= weak_mod
- phis.burn_mod *= weak_mod
- phis.oxy_mod *= weak_mod
- phis.stamina_mod *= weak_mod
- M.adjustToxLoss(-0.3*weak_mod) //Math is fun if you your PR doesn't accidentally get testmerged before you can test the effects of your equations!
+/datum/reagent/medicine/C2/seiver/on_mob_metabolize(mob/living/carbon/human/M)
+ . = ..()
+ radbonustemp = rand(radbonustemp - 50, radbonustemp + 50) // Basically this means 50K and below will always give the percent heal, and upto 150K could. Calculated once.
+
+/datum/reagent/medicine/C2/seiver/on_mob_life(mob/living/carbon/human/M)
+ var/chemtemp = min(M.reagents?.chem_temp, 1000)
+ chemtemp = chemtemp ? chemtemp : 273 //why do you have null sweaty
+ var/healypoints = 0 //5 healypoints = 1 heart damage; 5 rads = 1 tox damage healed for the purpose of healypoints
+
+ //you're hot
+ var/toxcalc = min(round((chemtemp-1000)/175+5,0.1),5) //max 5 tox healing a tick
+ if(toxcalc > 0)
+ M.adjustToxLoss(toxcalc*-1)
+ healypoints += toxcalc
+
+ //and you're cold
+ var/radcalc = round((T0C-chemtemp)/6,0.1) //max ~45 rad loss unless you've hit below 0K. if so, wow.
+ if(radcalc > 0)
+ //no cost percent healing if you are SUPER cold (on top of cost healing)
+ if(chemtemp < radbonustemp*0.1) //if you're super chilly, it takes off 25% of your current rads
+ M.radiation = round(M.radiation * 0.75)
+ else if(chemtemp < radbonustemp)//else if you're under the chill-zone, it takes off 10% of your current rads
+ M.radiation = round(M.radiation * 0.25)
+ M.radiation -= radcalc
+ healypoints += (radcalc/5)
+
+
+ //you're yes and... oh no!
+ healypoints = round(healypoints,0.1)
+ M.adjustOrganLoss(ORGAN_SLOT_HEART, healypoints/5)
..()
return TRUE
-/datum/reagent/medicine/C2/fiziver/on_mob_delete(mob/living/carbon/human/M) //I was considering adding an on_mob_add counterpart to this, but it shouldn't ever be needed... right?
- var/datum/physiology/phis = M.physiology
- phis.brute_mod /= weak_mod //apparently, physiology stats are independent of species stats, so nothing bad should happen if someone changes race or something while this chem is in their system... hopefully
- phis.burn_mod /= weak_mod
- phis.oxy_mod /= weak_mod
- phis.stamina_mod /= weak_mod
- return ..()
-
-/datum/reagent/medicine/C2/fiziver/overdose_process(mob/living/carbon/human/M)
- if(prob(50))
- M.adjustBruteLoss(0.2) //the damage from these will, of course, be increased by the brute_mod and burn_mod adjustments
- M.adjustFireLoss(0.2)
- ..()
- return TRUE
-
-
-/datum/reagent/medicine/C2/multiver //amplified with MULTIple medicines
+/datum/reagent/medicine/C2/multiver //enhanced with MULTIple medicines
name = "Multiver"
- description = "An antitoxin that scales with the more unique medicines in the body as well as purges chems (including itself). Causes lung damage."
+ description = "A chem-purger that becomes more effective the more unique medicines present. Slightly heals toxicity but causes lung damage (mitigatable by unique medicines)."
/datum/reagent/medicine/C2/multiver/on_mob_life(mob/living/carbon/human/M)
var/medibonus = 0 //it will always have itself which makes it REALLY start @ 1
@@ -227,13 +227,22 @@
var/datum/reagent/the_reagent = r
if(istype(the_reagent, /datum/reagent/medicine))
medibonus += 1
- M.adjustToxLoss(-0.5 * medibonus)
- M.adjustOrganLoss(ORGAN_SLOT_LUNGS, medibonus)
- for(var/datum/reagent/R in M.reagents.reagent_list)
- M.reagents.remove_reagent(R.type, medibonus*0.5)
+ M.adjustToxLoss(-0.2 * medibonus)
+ M.adjustOrganLoss(ORGAN_SLOT_LUNGS, medibonus ? 2.5/medibonus : 1)
+ for(var/datum/reagent/the_reagent2 in M.reagents.reagent_list)
+ if(the_reagent2 == src)
+ continue
+ var/amount2purge = medibonus*0.1
+ if(istype(the_reagent2,/datum/reagent/toxin))
+ amount2purge *= 5 //very good antitox (well just removing them) for roundstart availability
+ else if(medibonus >= 5 && istype(the_reagent2, /datum/reagent/medicine)) //5 unique meds (4+multiver) will make it not purge medicines
+ continue
+ M.reagents.remove_reagent(the_reagent2.type, amount2purge)
..()
return TRUE
+#define issyrinormusc(A) (istype(A,/datum/reagent/medicine/C2/syriniver) || istype(A,/datum/reagent/medicine/C2/musiver)) //musc is metab of syrin so let's make sure we're not purging either
+
/datum/reagent/medicine/C2/syriniver //Inject >> SYRINge
name = "Syriniver"
description = "A potent antidote for intravenous use with a narrow therapeutic index, it is considered an active prodrug of musiver."
@@ -260,8 +269,10 @@
/datum/reagent/medicine/C2/syriniver/on_mob_life(mob/living/carbon/M)
M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.8)
M.adjustToxLoss(-1*REM, 0)
- for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
- M.reagents.remove_reagent(R.type,1)
+ for(var/datum/reagent/R in M.reagents.reagent_list)
+ if(issyrinormusc(R))
+ continue
+ M.reagents.remove_reagent(R.type,0.4)
..()
. = 1
@@ -285,8 +296,10 @@
/datum/reagent/medicine/C2/musiver/on_mob_life(mob/living/carbon/M)
M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.1)
M.adjustToxLoss(-1*REM, 0)
- for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
- M.reagents.remove_reagent(R.type,1)
+ for(var/datum/reagent/R in M.reagents.reagent_list)
+ if(issyrinormusc(R))
+ continue
+ M.reagents.remove_reagent(R.type,0.2)
..()
. = 1
@@ -306,6 +319,7 @@
..()
. = 1
+#undef issyrinormusc
/******COMBOS******/
/*Suffix: Combo of healing, prob gonna get wack REAL fast*/
/datum/reagent/medicine/C2/instabitaluri
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 5df92e3f573..d519ce255c5 100755
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -748,4 +748,13 @@
/datum/reagent/consumable/char/overdose_process(mob/living/carbon/M)
if(prob(10))
M.say(pick("I hate my wife.", "I just want to grill for God's sake.", "I wish I could just go on my lawnmower and cut the grass.", "Yep, Quake. That was a good game...", "Yeah, my PDA has wi-fi. A wife I hate."), forced = /datum/reagent/consumable/char)
- ..()
\ No newline at end of file
+ ..()
+
+
+/datum/reagent/consumable/bbqsauce
+ name = "BBQ Sauce"
+ description = "Sweet, Smokey, Savory, and gets everywhere. Perfect for Grilling."
+ nutriment_factor = 5 * REAGENTS_METABOLISM
+ color = "#78280A" // rgb: 120 40, 10
+ taste_mult = 2.5 //sugar's 1.5, capsacin's 1.5, so a good middle ground.
+ taste_description = "smokey sweetness"
diff --git a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm
index f8a88ee5799..be3f08b6d86 100644
--- a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm
+++ b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm
@@ -48,10 +48,10 @@
/*****TOX*****/
-/datum/chemical_reaction/fiziver
+/datum/chemical_reaction/seiver
name = "Fiziver"
- id = /datum/reagent/medicine/C2/fiziver
- results = list(/datum/reagent/medicine/C2/fiziver = 3)
+ id = /datum/reagent/medicine/C2/seiver
+ results = list(/datum/reagent/medicine/C2/seiver = 3)
required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/potassium = 1, /datum/reagent/aluminium = 1)
/datum/chemical_reaction/multiver
diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
index 763261d2d02..d2f03cb8ea1 100644
--- a/code/modules/reagents/reagent_containers/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -57,6 +57,11 @@
desc = "A small bottle of multiver, which removes toxins and other chemicals from the bloodstream but causes shortness of breath. All effects scale with the amount of reagents in the patient."
list_reagents = list(/datum/reagent/medicine/C2/multiver = 30)
+/obj/item/reagent_containers/glass/bottle/syriniver
+ name = "syriniver bottle"
+ desc = "A small bottle of syriniver."
+ list_reagents = list(/datum/reagent/medicine/C2/syriniver = 30)
+
/obj/item/reagent_containers/glass/bottle/mutagen
name = "unstable mutagen bottle"
desc = "A small bottle of unstable mutagen. Randomly changes the DNA structure of whoever comes in contact."
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 58731c49994..6deece3441a 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -488,15 +488,6 @@
category = list("initial", "Medical", "Medical Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SERVICE
-/datum/design/healthanalyzer
- name = "Health Analyzer"
- id = "healthanalyzer"
- build_type = AUTOLATHE | PROTOLATHE
- materials = list(/datum/material/iron = 500, /datum/material/glass = 50)
- build_path = /obj/item/healthanalyzer
- category = list("initial", "Medical", "Medical Designs")
- departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
-
/datum/design/pillbottle
name = "Pill Bottle"
id = "pillbottle"
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 1b45d34d47a..ad41674f246 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -2,6 +2,15 @@
////////////Medical Tools////////////////
/////////////////////////////////////////
+/datum/design/healthanalyzer
+ name = "Health Analyzer"
+ id = "healthanalyzer"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/iron = 500, /datum/material/glass = 50)
+ build_path = /obj/item/healthanalyzer
+ category = list("Medical Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
+
/datum/design/mmi
name = "Man-Machine Interface"
desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity."
diff --git a/code/modules/spells/spell_types/personality_commune.dm b/code/modules/spells/spell_types/personality_commune.dm
new file mode 100644
index 00000000000..d7005b65107
--- /dev/null
+++ b/code/modules/spells/spell_types/personality_commune.dm
@@ -0,0 +1,32 @@
+/obj/effect/proc_holder/spell/targeted/personality_commune
+ name = "Personality Commune"
+ desc = "Sends thoughts to your alternate consciousness."
+ charge_max = 0
+ clothes_req = FALSE
+ range = -1
+ include_user = TRUE
+ action_icon_state = "telepathy"
+ action_background_icon_state = "bg_spell"
+ var/datum/brain_trauma/severe/split_personality/trauma
+ var/flufftext = "You hear an echoing voice in the back of your head..."
+
+/obj/effect/proc_holder/spell/targeted/personality_commune/New(datum/brain_trauma/severe/split_personality/T)
+ . = ..()
+ trauma = T
+
+// Pillaged and adapted from telepathy code
+/obj/effect/proc_holder/spell/targeted/personality_commune/cast(list/targets, mob/user)
+ if(!istype(trauma))
+ to_chat(user, "Something is wrong; Either due a bug or admemes, you are trying to cast this spell without a split personality!")
+ return
+ var/msg = stripped_input(usr, "What would you like to tell your other self?", null , "")
+ if(!msg)
+ charge_counter = charge_max
+ return
+ to_chat(user, "You concentrate and send thoughts to your other self: [msg]")
+ to_chat(trauma.owner, "[flufftext] [msg]")
+ log_directed_talk(user, trauma.owner, msg, LOG_SAY ,"[name]")
+ for(var/ded in GLOB.dead_mob_list)
+ if(!isobserver(ded))
+ continue
+ to_chat(ded, "[FOLLOW_LINK(ded, user)] [user] [name]: \"[msg]\" to[trauma]")
diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm
index 63e71bdd5d7..29dd3193fca 100644
--- a/code/modules/spells/spell_types/wizard.dm
+++ b/code/modules/spells/spell_types/wizard.dm
@@ -259,7 +259,9 @@
/obj/effect/proc_holder/spell/targeted/genetic/blind
mutations = list(BLINDMUT)
duration = 300
+ charge_max = 400 // needs to be higher than the duration or it'll be permanent
sound = 'sound/magic/blind.ogg'
+
/obj/effect/proc_holder/spell/aoe_turf/repulse
name = "Repulse"
desc = "This spell throws everything around the user away."
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index 042290f9997..e1401e01222 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -271,6 +271,7 @@
icon_state = "scalpel_a"
/obj/item/scalpel/advanced/examine()
+ . = ..()
. += " It's set to [tool_behaviour == TOOL_SCALPEL ? "scalpel" : "saw"] mode."
/obj/item/retractor/advanced
@@ -292,7 +293,8 @@
icon_state = "retractor_a"
/obj/item/retractor/advanced/examine()
- . += " It resembles a retractor[tool_behaviour == TOOL_RETRACTOR ? "retractor" : "hemostat"]."
+ . = ..()
+ . += " It resembles a [tool_behaviour == TOOL_RETRACTOR ? "retractor" : "hemostat"]."
/obj/item/surgicaldrill/advanced
name = "searing tool"
@@ -319,4 +321,5 @@
icon_state = "surgicaldrill_a"
/obj/item/surgicaldrill/advanced/examine()
+ . = ..()
. += " It's set to [tool_behaviour == TOOL_DRILL ? "drilling" : "mending"] mode."
diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm
index 56b5aaf83c2..8b28899bc98 100644
--- a/code/modules/vending/medical.dm
+++ b/code/modules/vending/medical.dm
@@ -13,7 +13,8 @@
/obj/item/reagent_containers/pill/patch/aiuri = 5,
/obj/item/reagent_containers/syringe/convermol = 2,
/obj/item/reagent_containers/pill/insulin = 5,
- /obj/item/reagent_containers/glass/bottle/multiver = 4,
+ /obj/item/reagent_containers/glass/bottle/multiver = 2,
+ /obj/item/reagent_containers/glass/bottle/syriniver = 2,
/obj/item/reagent_containers/glass/bottle/epinephrine = 3,
/obj/item/reagent_containers/glass/bottle/morphine = 4,
/obj/item/reagent_containers/glass/bottle/potass_iodide = 1,
diff --git a/html/changelog.html b/html/changelog.html
index 722ba7db5c3..1e58bd1af17 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -51,7 +51,125 @@
-->
- 09 October 2019+13 October 2019+4dplanner updated:+
ArcaneMusic updated:+
Arkatos updated:+
Bald People updated:+
Couls updated:+
Fox McCloud updated:+
Ghommie updated:+
MCterra10 updated:+
Skoglol updated:+
Toxicby updated:+
bobbahbrown updated:+
carlarctg updated:+
nemvar updated:+
willox updated:+
12 October 2019+Anonmare updated:+
Fikou updated:+
SynnGraffkin updated:+
YPOQ updated:+
YoYoBatty updated:+
imsxz updated:+
kingofkosmos updated:+
loserXD updated:+
nemvar updated:+
willox updated:+
10 October 2019ArcaneMusic updated:
|