diff --git a/_maps/RandomRuins/LavaRuins/miningbase.dmm b/_maps/RandomRuins/LavaRuins/miningbase.dmm index 33d38be9ae..636d5fb3fd 100644 --- a/_maps/RandomRuins/LavaRuins/miningbase.dmm +++ b/_maps/RandomRuins/LavaRuins/miningbase.dmm @@ -2533,20 +2533,20 @@ ab ab ab ab -ac -ac -ac -ac +ab +ab +ab +ab ak ak ak ak -ac -ac -ac -ac -ac -ac +ab +ab +ab +ab +ab +ab "} (2,1,1) = {" aP @@ -2565,9 +2565,9 @@ ab ab ab ab -ac -ac -ac +ab +ab +ab ak ak ak @@ -2576,9 +2576,9 @@ ak ak ak ak -ac -ac -ac +ab +ab +ab "} (3,1,1) = {" aP @@ -2597,8 +2597,8 @@ ab ab ab ab -ac -ac +ab +ab ak ak ak @@ -2609,8 +2609,8 @@ ak ak ak ak -ac -ac +ab +ab "} (4,1,1) = {" aP @@ -2629,8 +2629,8 @@ ab ab ab ab -ac -ac +ab +ab ak ak ak @@ -2661,7 +2661,7 @@ ab ab ab ab -ac +ab ak ak ak @@ -2693,7 +2693,7 @@ ab ab ab ab -ac +ab ak ak ak @@ -2725,7 +2725,7 @@ ab ab ab ab -ac +ab ak ak ak @@ -2770,7 +2770,7 @@ ak ak ak ac -ac +ab "} (9,1,1) = {" ab @@ -2802,7 +2802,7 @@ ak ak ak ac -ac +ab "} (10,1,1) = {" ab @@ -2834,7 +2834,7 @@ ak ak ak ac -ac +ab "} (11,1,1) = {" ab @@ -2866,7 +2866,7 @@ ak ak ac ac -ac +ab "} (12,1,1) = {" ab @@ -2927,7 +2927,7 @@ et vr eu ac -ab +ac ab ab ab @@ -3440,7 +3440,7 @@ LK pN bQ ac -ab +ac ab ab "} @@ -3472,7 +3472,7 @@ FI jQ bQ ac -ab +ac ab ab "} @@ -3630,8 +3630,8 @@ ac ac ac ac -ac -ac +ab +ab ab ab ab @@ -3660,10 +3660,10 @@ ac ac ac ac -ac -ac -ac -ac +ab +ab +ab +ab ab ab ab @@ -3690,12 +3690,12 @@ ac ac ac ac -ac -ac -ac -ac -ac -ac +ab +ab +ab +ab +ab +ab ab ab ab @@ -3722,12 +3722,12 @@ ac ac ac ac -ac -ac -ac -ac -ac -ac +ab +ab +ab +ab +ab +ab ab ab ab @@ -3755,17 +3755,17 @@ ac ac ac ac -ac -ac -ac -ac -ac +ab +ab +ab +ab +ab ab ab ab "} (40,1,1) = {" -ac +ab ac ac ak @@ -3788,17 +3788,17 @@ ac ac ac ac -ac -ac -ac -ac +ab +ab +ab +ab ab ab ab "} (41,1,1) = {" -ac -ac +ab +ab ac ac ak @@ -3821,16 +3821,16 @@ ac ac ac ac -ac -ac -ac +ab +ab +ab ab ab ab "} (42,1,1) = {" -ac -ac +ab +ab ac ac eM @@ -3853,15 +3853,15 @@ ac ac ac ac -ac -ac -ac +ab +ab +ab ab ab ab "} (43,1,1) = {" -ac +ab ac ac aw @@ -3886,8 +3886,8 @@ ac ac ac ac -ac -ac +ab +ab ab ab ab @@ -3919,7 +3919,7 @@ ac ac ac ac -ac +ab ab ab ab @@ -3951,7 +3951,7 @@ ak ac ac ac -ac +ab ab ab ab @@ -4176,7 +4176,7 @@ ak ak ak ac -ab +ac ab ab "} @@ -4208,7 +4208,7 @@ ak ak ac ac -ab +ac ab ab "} @@ -4240,7 +4240,7 @@ ak ak ak ac -ab +ac ab ab "} @@ -4272,8 +4272,8 @@ ak ak ak ak -ab -ab +ac +ac ab "} (56,1,1) = {" @@ -4304,8 +4304,8 @@ ak ak ak ac -ab -ab +ac +ac ab "} (57,1,1) = {" @@ -4336,7 +4336,7 @@ ak ak ac ac -ab +ac ab ab "} diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 7e385638c5..9693d46d00 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -41,7 +41,7 @@ //Individual logging panel pages #define INDIVIDUAL_ATTACK_LOG (LOG_ATTACK) #define INDIVIDUAL_SAY_LOG (LOG_SAY | LOG_WHISPER | LOG_DSAY) -#define INDIVIDUAL_EMOTE_LOG (LOG_EMOTE) +#define INDIVIDUAL_EMOTE_LOG (LOG_EMOTE | LOG_SUBTLER) #define INDIVIDUAL_COMMS_LOG (LOG_PDA | LOG_CHAT | LOG_COMMENT | LOG_TELECOMMS) #define INDIVIDUAL_OOC_LOG (LOG_OOC | LOG_ADMIN) #define INDIVIDUAL_OWNERSHIP_LOG (LOG_OWNERSHIP) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index d1bd7e7191..166f930e33 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -6,7 +6,7 @@ SUBSYSTEM_DEF(garbage) runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY init_order = INIT_ORDER_GARBAGE - var/list/collection_timeout = list(0, 2 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level + var/list/collection_timeout = list(15 SECONDS, 30 SECONDS) // deciseconds to wait before moving something up in the queue to the next level //Stat tracking var/delslasttick = 0 // number of del()'s we've done this tick diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 5d960964a0..2ef9608a96 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -701,6 +701,7 @@ SUBSYSTEM_DEF(ticker) round_end_sound = pick(\ 'sound/roundend/newroundsexy.ogg', 'sound/roundend/apcdestroyed.ogg', + 'sound/roundend/seeyoulaterokay.ogg', 'sound/roundend/bangindonk.ogg', 'sound/roundend/leavingtg.ogg', 'sound/roundend/its_only_game.ogg', diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index 0b6d4e3404..a7a61802d3 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -21,7 +21,7 @@ return FALSE - if(!(type in D.viable_mobtypes)) + if(!D.viable_mobtypes[type]) return FALSE return TRUE diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 940b61c9fe..9145a53642 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -18,7 +18,7 @@ var/stage_prob = 4 //Other - var/list/viable_mobtypes = list() //typepaths of viable mobs + var/list/viable_mobtypes = list() //typecache of viable mobs var/mob/living/carbon/affected_mob = null var/list/cures = list() //list of cures if the disease has the CURABLE flag, these are reagent ids var/infectivity = 65 @@ -34,6 +34,10 @@ var/process_dead = FALSE //if this ticks while the host is dead var/copy_type = null //if this is null, copies will use the type of the instance being copied +/datum/disease/New(make_typecache = TRUE) + if(make_typecache && length(viable_mobtypes)) + viable_mobtypes = typecacheof(viable_mobtypes) + /datum/disease/Destroy() . = ..() if(affected_mob) diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 1c21fb9528..330a3494d9 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -80,7 +80,8 @@ */ -/datum/disease/advance/New() +/datum/disease/advance/New(make_typecache = TRUE) + ..() Refresh() /datum/disease/advance/Destroy() diff --git a/code/datums/diseases/advance/presets.dm b/code/datums/diseases/advance/presets.dm index 68c3ceffea..b12b657101 100644 --- a/code/datums/diseases/advance/presets.dm +++ b/code/datums/diseases/advance/presets.dm @@ -2,7 +2,7 @@ /datum/disease/advance/cold copy_type = /datum/disease/advance -/datum/disease/advance/cold/New() +/datum/disease/advance/cold/New(make_typecache = TRUE) name = "Cold" symptoms = list(new/datum/symptom/sneeze) ..() @@ -11,7 +11,7 @@ /datum/disease/advance/flu copy_type = /datum/disease/advance -/datum/disease/advance/flu/New() +/datum/disease/advance/flu/New(make_typecache = TRUE) name = "Flu" symptoms = list(new/datum/symptom/cough) ..() @@ -21,7 +21,7 @@ name = "Experimental Disease" copy_type = /datum/disease/advance -/datum/disease/advance/random/New(max_symptoms, max_level = 8) +/datum/disease/advance/random/New(make_typecache = TRUE, max_symptoms, max_level = 8) if(!max_symptoms) max_symptoms = rand(1, VIRUS_SYMPTOM_LIMIT) var/list/datum/symptom/possible_symptoms = list() @@ -37,6 +37,6 @@ if(chosen_symptom) var/datum/symptom/S = new chosen_symptom symptoms += S - Refresh() - name = "Sample #[rand(1,10000)]" \ No newline at end of file + name = "Sample #[rand(1,10000)]" + ..() \ No newline at end of file diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/retrovirus.dm index 160a9f98ad..5a638fcf1b 100644 --- a/code/datums/diseases/retrovirus.dm +++ b/code/datums/diseases/retrovirus.dm @@ -13,7 +13,7 @@ stage_prob = 2 var/restcure = 0 -/datum/disease/dna_retrovirus/New() +/datum/disease/dna_retrovirus/New(make_typecache = TRUE) ..() agent = "Virus class [pick("A","B","C","D","E","F")][pick("A","B","C","D","E","F")]-[rand(50,300)]" if(prob(40)) diff --git a/code/datums/martial/rising_bass.dm b/code/datums/martial/rising_bass.dm index 779428669c..fd7b580470 100644 --- a/code/datums/martial/rising_bass.dm +++ b/code/datums/martial/rising_bass.dm @@ -1,6 +1,8 @@ -#define SIDE_KICK_COMBO "DH" +#define REPULSE_PUNCH_COMBO "HDHD" #define SHOULDER_FLIP_COMBO "GHDGHH" #define FOOT_SMASH_COMBO "HH" +#define SIDE_KICK_COMBO "skick" +#define DEFT_SWITCH_COMBO "deft" /datum/martial_art/the_rising_bass name = "The Rising Bass" @@ -8,7 +10,7 @@ dodge_chance = 100 allow_temp_override = FALSE help_verb = /mob/living/carbon/human/proc/rising_bass_help - var/datum/action/risingbassmove/repulsepunch = new/datum/action/risingbassmove/repulsepunch() + var/datum/action/risingbassmove/sidekick = new/datum/action/risingbassmove/sidekick() var/datum/action/risingbassmove/deftswitch = new/datum/action/risingbassmove/deftswitch() var/repulsecool = 0 @@ -21,7 +23,7 @@ streak = "" shoulderFlip(A,D) return 1 - if(findtext(streak,"rplse")) + if(findtext(streak,REPULSE_PUNCH_COMBO)) streak = "" repulsePunch(A,D) return 1 @@ -29,7 +31,7 @@ streak = "" footSmash(A,D) return 1 - if(findtext(streak,"deft")) + if(findtext(streak,DEFT_SWITCH_COMBO)) streak = "" deftSwitch(A,D) return 1 @@ -58,42 +60,46 @@ to_chat(H,"You get ready to use the [name] maneuver!") H.mind.martial_art.streak = "[movestreak]" -/datum/action/risingbassmove/repulsepunch - name = "Repulse Punch" - button_icon_state = "repulsepunch" - movestreak = "rplse" +/datum/action/risingbassmove/sidekick + name = "Side Kick" + button_icon_state = "sidekick" + movestreak = "skick" /datum/action/risingbassmove/deftswitch name = "Deft Switch" button_icon_state = "deftswitch" movestreak = "deft" +/datum/martial_art/the_rising_bass/proc/checkfordensity(turf/T,mob/M) + if (T.density) + return FALSE + for(var/obj/O in T) + if(!O.CanPass(M,T)) + return FALSE + return TRUE /datum/martial_art/the_rising_bass/proc/sideKick(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!D.IsKnockdown() || D.lying == 0) - var/turf/H = get_step(D, A.dir & (NORTH | SOUTH) ? pick(EAST, WEST) : pick(NORTH, SOUTH)) + var/dir = A.dir & (NORTH | SOUTH) ? pick(EAST, WEST) : pick(NORTH, SOUTH) + var/oppdir = dir == NORTH ? SOUTH : dir == SOUTH ? NORTH : dir == EAST ? WEST : EAST + var/turf/H = get_step(D, dir) + var/turf/K = get_step(D, oppdir) A.do_attack_animation(D, ATTACK_EFFECT_KICK) D.visible_message("[A] kicks [D] in the side, sliding them over!", \ "[A] kicks you in the side, forcing you to step away!") playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1) D.apply_damage(5, BRUTE, BODY_ZONE_CHEST) D.Knockdown(60) - var/L = H - for(var/obj/i in H.contents) - if(!istype(i,/mob) && i.density == 1) - L = D.loc + var/L = !checkfordensity(H,D) ? (!checkfordensity(K,D) ? D.loc : K) : H D.forceMove(L) log_combat(A, D, "side kicked (Rising Bass)") - return 1 + return TRUE return basic_hit(A,D) /datum/martial_art/the_rising_bass/proc/shoulderFlip(mob/living/carbon/human/A, mob/living/carbon/human/D) if(!D.IsKnockdown() || !D.lying) var/turf/H = get_step(A, get_dir(D,A)) - var/L = H - for(var/obj/i in H.contents) - if(!istype(i,/mob) && i.density == 1)//(i.anchored == 1 && i.density == 1) || istype(i,/obj/structure) || istype(i,/turf/closed) - L = A.loc + var/L = checkfordensity(H,D) ? H : A.loc A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) D.visible_message("[A] flips [D] over their shoulder, slamming them into the ground!", \ "[A] flips you over their shoulder, slamming you into the ground!") @@ -105,11 +111,11 @@ D.Knockdown(300) D.forceMove(L) log_combat(A, D, "shoulder flipped (Rising Bass)") - return 1 + return TRUE return basic_hit(A,D) /datum/martial_art/the_rising_bass/proc/repulsePunch(mob/living/carbon/human/A, mob/living/carbon/human/D) - if(!D.IsKnockdown() || !D.lying || repulsecool > world.time) + if((!D.IsKnockdown() || !D.lying) && repulsecool > world.time) A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) D.visible_message("[A] smashes [D] in the chest, throwing them away!", \ "[A] smashes you in the chest, repelling you away!") @@ -120,7 +126,7 @@ D.Knockdown(90) log_combat(A, D, "repulse punched (Rising Bass)") repulsecool = world.time + 3 SECONDS - return 1 + return TRUE return basic_hit(A,D) /datum/martial_art/the_rising_bass/proc/footSmash(mob/living/carbon/human/A, mob/living/carbon/human/D) @@ -132,7 +138,7 @@ D.apply_damage(5, BRUTE, pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) D.dropItemToGround(D.get_active_held_item()) log_combat(A, D, "foot smashed (Rising Bass)") - return 1 + return TRUE return basic_hit(A,D) /datum/martial_art/the_rising_bass/proc/deftSwitch(mob/living/carbon/human/A, mob/living/carbon/human/D) @@ -144,10 +150,10 @@ D.visible_message("[A] slaps [D]'s hands, taking [G] from them!", \ "[A] slaps you, taking [G] from you!") log_combat(A, D, "deft switched (Rising Bass)") - return 1 + return TRUE else to_chat(A, "[G] can't be taken out of [D]'s hands!") - return 0 + return FALSE /datum/martial_art/the_rising_bass/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) add_to_streak("D",D) @@ -168,7 +174,7 @@ return ..() /datum/martial_art/the_rising_bass/add_to_streak(element,mob/living/carbon/human/D) - if (streak == "deft" || streak == "rplse") + if (streak == DEFT_SWITCH_COMBO || streak == SIDE_KICK_COMBO) return . = ..() @@ -179,24 +185,24 @@ to_chat(usr, "You retreat inward and recall the teachings of the Rising Bass...") - to_chat(usr, "Side Kick: Disarm Harm. Forces opponent to step to the side.") + to_chat(usr, "Side Kick: Forces opponent to step to the side.") to_chat(usr, "Shoulder Flip: Grab Harm Disarm Grab Harm Harm. Flips opponent over your shoulder and stuns.") - to_chat(usr, "Repulse Punch: Grab Harm Grab Harm. Slams the opponent far away from you.") + to_chat(usr, "Repulse Punch: Harm Disarm Harm Disarm. Slams the opponent far away from you.") to_chat(usr, "Foot Smash: Harm Harm. Stuns opponent, minor damage.") - to_chat(usr, "Deft Switch: Grab Disarm Disarm. Switches the opponent's held item for your own. Most useful with nothing in your hand.") + to_chat(usr, "Deft Switch: Switches the opponent's held item for your own. Most useful with nothing in your hand.") /datum/martial_art/the_rising_bass/teach(mob/living/carbon/human/H, make_temporary = FALSE) . = ..() if(!.) return deftswitch.Grant(H) - repulsepunch.Grant(H) + sidekick.Grant(H) ADD_TRAIT(H, TRAIT_NOGUNS, RISING_BASS_TRAIT) ADD_TRAIT(H, TRAIT_AUTO_CATCH_ITEM, RISING_BASS_TRAIT) /datum/martial_art/the_rising_bass/on_remove(mob/living/carbon/human/H) . = ..() deftswitch.Remove(H) - repulsepunch.Remove(H) + sidekick.Remove(H) REMOVE_TRAIT(H, TRAIT_NOGUNS, RISING_BASS_TRAIT) REMOVE_TRAIT(H, TRAIT_AUTO_CATCH_ITEM, RISING_BASS_TRAIT) \ No newline at end of file diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 81ee5c3989..1464927c3a 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -243,6 +243,11 @@ description = "I have been scorched by the unforgiving rays of the sun.\n" mood_change = -6 timeout = 15 MINUTES + +/datum/mood_event/bloodsucker_disgust + description = "Something I recently ate was horrifyingly disgusting.\n" + mood_change = -5 + timeout = 5 MINUTES /datum/mood_event/nanite_sadness description = "+++++++HAPPINESS SUPPRESSION+++++++\n" diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index be2dce91a2..7a0203be7b 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -849,6 +849,10 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Medbay Treatment Center" icon_state = "exam_room" +/area/medical/paramedic + name = "Paramedic Station" + icon_state = "paramedic" + //Security diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index f8dac1b100..d8a5f856f1 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -145,7 +145,7 @@ if(5) dat += "
Virus Database
" for(var/Dt in typesof(/datum/disease/)) - var/datum/disease/Dis = new Dt(0) + var/datum/disease/Dis = new Dt(FALSE) if(istype(Dis, /datum/disease/advance)) continue // TODO (tm): Add advance diseases to the virus database which no one uses. if(!Dis.desc) @@ -248,7 +248,7 @@ else if(href_list["vir"]) var/type = href_list["vir"] - var/datum/disease/Dis = new type(0) + var/datum/disease/Dis = new type(FALSE) var/AfS = "" for(var/mob/M in Dis.viable_mobtypes) AfS += " [initial(M.name)];" diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 14fd7fbb6d..cf6b2b4bf4 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -75,6 +75,12 @@ suit_type = /obj/item/clothing/suit/space/hardsuit/medical mask_type = /obj/item/clothing/mask/breath +/obj/machinery/suit_storage_unit/paramedic + name = "paramedic suit storage unit" + suit_type = /obj/item/clothing/suit/space/eva/paramedic + helmet_type = /obj/item/clothing/head/helmet/space/eva/paramedic + mask_type = /obj/item/clothing/mask/breath + /obj/machinery/suit_storage_unit/rd suit_type = /obj/item/clothing/suit/space/hardsuit/rd mask_type = /obj/item/clothing/mask/breath diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm new file mode 100644 index 0000000000..18b9d40346 --- /dev/null +++ b/code/game/objects/effects/contraband.dm @@ -0,0 +1,613 @@ +// This is synced up to the poster placing animation. +#define PLACE_SPEED 37 + +// The poster item + +/obj/item/poster + name = "poorly coded poster" + desc = "You probably shouldn't be holding this." + icon = 'icons/obj/contraband.dmi' + force = 0 + resistance_flags = FLAMMABLE + var/poster_type + var/obj/structure/sign/poster/poster_structure + +/obj/item/poster/Initialize(mapload, obj/structure/sign/poster/new_poster_structure) + . = ..() + poster_structure = new_poster_structure + if(!new_poster_structure && poster_type) + poster_structure = new poster_type(src) + + // posters store what name and description they would like their + // rolled up form to take. + if(poster_structure) + name = poster_structure.poster_item_name + desc = poster_structure.poster_item_desc + icon_state = poster_structure.poster_item_icon_state + + name = "[name] - [poster_structure.original_name]" + +/obj/item/poster/Destroy() + poster_structure = null + . = ..() + +// These icon_states may be overridden, but are for mapper's convinence +/obj/item/poster/random_contraband + name = "random contraband poster" + poster_type = /obj/structure/sign/poster/contraband/random + icon_state = "rolled_poster" + +/obj/item/poster/random_official + name = "random official poster" + poster_type = /obj/structure/sign/poster/official/random + icon_state = "rolled_legit" + +// The poster sign/structure + +/obj/structure/sign/poster + name = "poster" + var/original_name + desc = "A large piece of space-resistant printed paper." + icon = 'icons/obj/contraband.dmi' + anchored = TRUE + var/ruined = FALSE + var/random_basetype + var/never_random = FALSE // used for the 'random' subclasses. + + var/poster_item_name = "hypothetical poster" + var/poster_item_desc = "This hypothetical poster item should not exist, let's be honest here." + var/poster_item_icon_state = "rolled_poster" + var/poster_item_type = /obj/item/poster + +/obj/structure/sign/poster/Initialize() + . = ..() + if(random_basetype) + randomise(random_basetype) + if(!ruined) + original_name = name // can't use initial because of random posters + name = "poster - [name]" + desc = "A large piece of space-resistant printed paper. [desc]" + +/obj/structure/sign/poster/proc/randomise(base_type) + var/list/poster_types = subtypesof(base_type) + var/list/approved_types = list() + for(var/t in poster_types) + var/obj/structure/sign/poster/T = t + if(initial(T.icon_state) && !initial(T.never_random)) + approved_types |= T + + var/obj/structure/sign/poster/selected = pick(approved_types) + + name = initial(selected.name) + desc = initial(selected.desc) + icon_state = initial(selected.icon_state) + poster_item_name = initial(selected.poster_item_name) + poster_item_desc = initial(selected.poster_item_desc) + poster_item_icon_state = initial(selected.poster_item_icon_state) + ruined = initial(selected.ruined) + + +/obj/structure/sign/poster/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/wirecutters)) + I.play_tool_sound(src, 100) + if(ruined) + to_chat(user, "You remove the remnants of the poster.") + qdel(src) + else + to_chat(user, "You carefully remove the poster from the wall.") + roll_and_drop(user.loc) + +/obj/structure/sign/poster/attack_hand(mob/user) + . = ..() + if(.) + return + if(ruined) + return + visible_message("[user] rips [src] in a single, decisive motion!" ) + playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, 1) + + var/obj/structure/sign/poster/ripped/R = new(loc) + R.pixel_y = pixel_y + R.pixel_x = pixel_x + R.add_fingerprint(user) + qdel(src) + +/obj/structure/sign/poster/proc/roll_and_drop(loc) + pixel_x = 0 + pixel_y = 0 + var/obj/item/poster/P = new poster_item_type(loc, src) + forceMove(P) + return P + +//separated to reduce code duplication. Moved here for ease of reference and to unclutter r_wall/attackby() +/turf/closed/wall/proc/place_poster(obj/item/poster/P, mob/user) + if(!P.poster_structure) + to_chat(user, "[P] has no poster... inside it? Inform a coder!") + return + + // Deny placing posters on currently-diagonal walls, although the wall may change in the future. + if (smooth & SMOOTH_DIAGONAL) + for (var/O in overlays) + var/image/I = O + if(copytext(I.icon_state, 1, 3) == "d-") //3 == length("d-") + 1 + return + + var/stuff_on_wall = 0 + for(var/obj/O in contents) //Let's see if it already has a poster on it or too much stuff + if(istype(O, /obj/structure/sign/poster)) + to_chat(user, "The wall is far too cluttered to place a poster!") + return + stuff_on_wall++ + if(stuff_on_wall == 3) + to_chat(user, "The wall is far too cluttered to place a poster!") + return + + to_chat(user, "You start placing the poster on the wall..." ) + + var/obj/structure/sign/poster/D = P.poster_structure + + var/temp_loc = get_turf(user) + flick("poster_being_set",D) + D.forceMove(src) + qdel(P) //delete it now to cut down on sanity checks afterwards. Agouri's code supports rerolling it anyway + playsound(D.loc, 'sound/items/poster_being_created.ogg', 100, 1) + + if(do_after(user, PLACE_SPEED, target=src)) + if(!D || QDELETED(D)) + return + + if(iswallturf(src) && user && user.loc == temp_loc) //Let's check if everything is still there + to_chat(user, "You place the poster!") + return + + to_chat(user, "The poster falls down!") + D.roll_and_drop(temp_loc) + +// Various possible posters follow + +/obj/structure/sign/poster/ripped + ruined = TRUE + icon_state = "poster_ripped" + name = "ripped poster" + desc = "You can't make out anything from the poster's original print. It's ruined." + +/obj/structure/sign/poster/random + name = "random poster" // could even be ripped + icon_state = "random_anything" + never_random = TRUE + random_basetype = /obj/structure/sign/poster + +/obj/structure/sign/poster/contraband + poster_item_name = "contraband poster" + poster_item_desc = "This poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as contraband aboard Nanotrasen space facilities." + poster_item_icon_state = "rolled_poster" + +/obj/structure/sign/poster/contraband/random + name = "random contraband poster" + icon_state = "random_contraband" + never_random = TRUE + random_basetype = /obj/structure/sign/poster/contraband + +/obj/structure/sign/poster/contraband/free_tonto + name = "Free Tonto" + desc = "A salvaged shred of a much larger flag, colors bled together and faded from age." + icon_state = "poster1" + +/obj/structure/sign/poster/contraband/atmosia_independence + name = "Atmosia Declaration of Independence" + desc = "A relic of a failed rebellion." + icon_state = "poster2" + +/obj/structure/sign/poster/contraband/fun_police + name = "Fun Police" + desc = "A poster condemning the station's security forces." + icon_state = "poster3" + +/obj/structure/sign/poster/contraband/lusty_xenomorph + name = "Lusty Xenomorph" + desc = "A heretical poster depicting the titular star of an equally heretical book." + icon_state = "poster4" + +/obj/structure/sign/poster/contraband/syndicate_recruitment + name = "Syndicate Recruitment" + desc = "See the galaxy! Shatter corrupt megacorporations! Join today!" + icon_state = "poster5" + +/obj/structure/sign/poster/contraband/clown + name = "Clown" + desc = "Honk." + icon_state = "poster6" + +/obj/structure/sign/poster/contraband/smoke + name = "Smoke" + desc = "A poster advertising a rival corporate brand of cigarettes." + icon_state = "poster7" + +/obj/structure/sign/poster/contraband/grey_tide + name = "Grey Tide" + desc = "A rebellious poster symbolizing assistant solidarity." + icon_state = "poster8" + +/obj/structure/sign/poster/contraband/missing_gloves + name = "Missing Gloves" + desc = "This poster references the uproar that followed Nanotrasen's financial cuts toward insulated-glove purchases." + icon_state = "poster9" + +/obj/structure/sign/poster/contraband/hacking_guide + name = "Hacking Guide" + desc = "This poster details the internal workings of the common Nanotrasen airlock. Sadly, it appears out of date." + icon_state = "poster10" + +/obj/structure/sign/poster/contraband/rip_badger + name = "RIP Badger" + desc = "This seditious poster references Nanotrasen's genocide of a space station full of badgers." + icon_state = "poster11" + +/obj/structure/sign/poster/contraband/ambrosia_vulgaris + name = "Ambrosia Vulgaris" + desc = "This poster is lookin' pretty trippy man." + icon_state = "poster12" + +/obj/structure/sign/poster/contraband/donut_corp + name = "Donut Corp." + desc = "This poster is an unauthorized advertisement for Donut Corp." + icon_state = "poster13" + +/obj/structure/sign/poster/contraband/eat + name = "EAT." + desc = "This poster promotes rank gluttony." + icon_state = "poster14" + +/obj/structure/sign/poster/contraband/tools + name = "Tools" + desc = "This poster looks like an advertisement for tools, but is in fact a subliminal jab at the tools at CentCom." + icon_state = "poster15" + +/obj/structure/sign/poster/contraband/power + name = "Power" + desc = "A poster that positions the seat of power outside Nanotrasen." + icon_state = "poster16" + +/obj/structure/sign/poster/contraband/space_cube + name = "Space Cube" + desc = "Ignorant of Nature's Harmonic 6 Side Space Cube Creation, the Spacemen are Dumb, Educated Singularity Stupid and Evil." + icon_state = "poster17" + +/obj/structure/sign/poster/contraband/communist_state + name = "Communist State" + desc = "All hail the Communist party!" + icon_state = "poster18" + +/obj/structure/sign/poster/contraband/lamarr + name = "Lamarr" + desc = "This poster depicts Lamarr. Probably made by a traitorous Research Director." + icon_state = "poster19" + +/obj/structure/sign/poster/contraband/borg_fancy_1 + name = "Borg Fancy" + desc = "Being fancy can be for any borg, just need a suit." + icon_state = "poster20" + +/obj/structure/sign/poster/contraband/borg_fancy_2 + name = "Borg Fancy v2" + desc = "Borg Fancy, Now only taking the most fancy." + icon_state = "poster21" + +/obj/structure/sign/poster/contraband/kss13 + name = "Kosmicheskaya Stantsiya 13 Does Not Exist" + desc = "A poster mocking CentCom's denial of the existence of the derelict station near Space Station 13." + icon_state = "poster22" + +/obj/structure/sign/poster/contraband/rebels_unite + name = "Rebels Unite" + desc = "A poster urging the viewer to rebel against Nanotrasen." + icon_state = "poster23" + +/obj/structure/sign/poster/contraband/c20r + // have fun seeing this poster in "spawn 'c20r'", admins... + name = "C-20r" + desc = "A poster advertising the Scarborough Arms C-20r." + icon_state = "poster24" + +/obj/structure/sign/poster/contraband/have_a_puff + name = "Have a Puff" + desc = "Who cares about lung cancer when you're high as a kite?" + icon_state = "poster25" + +/obj/structure/sign/poster/contraband/revolver + name = "Revolver" + desc = "Because seven shots are all you need." + icon_state = "poster26" + +/obj/structure/sign/poster/contraband/d_day_promo + name = "D-Day Promo" + desc = "A promotional poster for some rapper." + icon_state = "poster27" + +/obj/structure/sign/poster/contraband/syndicate_pistol + name = "Syndicate Pistol" + desc = "A poster advertising syndicate pistols as being 'classy as fuck'. It is covered in faded gang tags." + icon_state = "poster28" + +/obj/structure/sign/poster/contraband/energy_swords + name = "Energy Swords" + desc = "All the colors of the bloody murder rainbow." + icon_state = "poster29" + +/obj/structure/sign/poster/contraband/red_rum + name = "Red Rum" + desc = "Looking at this poster makes you want to kill." + icon_state = "poster30" + +/obj/structure/sign/poster/contraband/cc64k_ad + name = "CC 64K Ad" + desc = "The latest portable computer from Comrade Computing, with a whole 64kB of ram!" + icon_state = "poster31" + +/obj/structure/sign/poster/contraband/punch_shit + name = "Punch Shit" + desc = "Fight things for no reason, like a man!" + icon_state = "poster32" + +/obj/structure/sign/poster/contraband/the_griffin + name = "The Griffin" + desc = "The Griffin commands you to be the worst you can be. Will you?" + icon_state = "poster33" + +/obj/structure/sign/poster/contraband/lizard + name = "Lizard" + desc = "This lewd poster depicts a lizard preparing to mate." + icon_state = "poster34" + +/obj/structure/sign/poster/contraband/free_drone + name = "Free Drone" + desc = "This poster commemorates the bravery of the rogue drone; once exiled, and then ultimately destroyed by CentCom." + icon_state = "poster35" + +/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6 + name = "Busty Backdoor Xeno Babes 6" + desc = "Get a load, or give, of these all natural Xenos!" + icon_state = "poster36" + +/obj/structure/sign/poster/contraband/robust_softdrinks + name = "Robust Softdrinks" + desc = "Robust Softdrinks: More robust than a toolbox to the head!" + icon_state = "poster37" + +/obj/structure/sign/poster/contraband/shamblers_juice + name = "Shambler's Juice" + desc = "~Shake me up some of that Shambler's Juice!~" + icon_state = "poster38" + +/obj/structure/sign/poster/contraband/pwr_game + name = "Pwr Game" + desc = "The POWER that gamers CRAVE! In partnership with Vlad's Salad." + icon_state = "poster39" + +/obj/structure/sign/poster/contraband/sun_kist + name = "Sun-kist" + desc = "Drink the stars!" + icon_state = "poster40" + +/obj/structure/sign/poster/contraband/space_cola + name = "Space Cola" + desc = "Your favorite cola, in space." + icon_state = "poster41" + +/obj/structure/sign/poster/contraband/space_up + name = "Space-Up!" + desc = "Sucked out into space by the FLAVOR!" + icon_state = "poster42" + +/obj/structure/sign/poster/contraband/kudzu + name = "Kudzu" + desc = "A poster advertising a movie about plants. How dangerous could they possibly be?" + icon_state = "poster43" + +/obj/structure/sign/poster/contraband/masked_men + name = "Masked Men" + desc = "A poster advertising a movie about some masked men." + icon_state = "poster44" + +/obj/structure/sign/poster/contraband/buzzfuzz + name = "Buzz Fuzz" + desc = "A poster advertising the newest drink \"Buzz Fuzz\" with its iconic slogan of ~A Hive of Flavour~." + icon_state = "poster45" + +/obj/structure/sign/poster/official + poster_item_name = "motivational poster" + poster_item_desc = "An official Nanotrasen-issued poster to foster a compliant and obedient workforce. It comes with state-of-the-art adhesive backing, for easy pinning to any vertical surface." + poster_item_icon_state = "rolled_legit" + +/obj/structure/sign/poster/official/random + name = "random official poster" + random_basetype = /obj/structure/sign/poster/official + icon_state = "random_official" + never_random = TRUE + +/obj/structure/sign/poster/official/here_for_your_safety + name = "Here For Your Safety" + desc = "A poster glorifying the station's security force." + icon_state = "poster1_legit" + +/obj/structure/sign/poster/official/nanotrasen_logo + name = "Nanotrasen Logo" + desc = "A poster depicting the Nanotrasen logo." + icon_state = "poster2_legit" + +/obj/structure/sign/poster/official/cleanliness + name = "Cleanliness" + desc = "A poster warning of the dangers of poor hygiene." + icon_state = "poster3_legit" + +/obj/structure/sign/poster/official/help_others + name = "Help Others" + desc = "A poster encouraging you to help fellow crewmembers." + icon_state = "poster4_legit" + +/obj/structure/sign/poster/official/build + name = "Build" + desc = "A poster glorifying the engineering team." + icon_state = "poster5_legit" + +/obj/structure/sign/poster/official/bless_this_spess + name = "Bless This Spess" + desc = "A poster blessing this area." + icon_state = "poster6_legit" + +/obj/structure/sign/poster/official/science + name = "Science" + desc = "A poster depicting an atom." + icon_state = "poster7_legit" + +/obj/structure/sign/poster/official/ian + name = "Ian" + desc = "Arf arf. Yap." + icon_state = "poster8_legit" + +/obj/structure/sign/poster/official/obey + name = "Obey" + desc = "A poster instructing the viewer to obey authority." + icon_state = "poster9_legit" + +/obj/structure/sign/poster/official/walk + name = "Walk" + desc = "A poster instructing the viewer to walk instead of running." + icon_state = "poster10_legit" + +/obj/structure/sign/poster/official/state_laws + name = "State Laws" + desc = "A poster instructing cyborgs to state their laws." + icon_state = "poster11_legit" + +/obj/structure/sign/poster/official/love_ian + name = "Love Ian" + desc = "Ian is love, Ian is life." + icon_state = "poster12_legit" + +/obj/structure/sign/poster/official/space_cops + name = "Space Cops." + desc = "A poster advertising the television show Space Cops." + icon_state = "poster13_legit" + +/obj/structure/sign/poster/official/ue_no + name = "Ue No." + desc = "This thing is all in Japanese." + icon_state = "poster14_legit" + +/obj/structure/sign/poster/official/get_your_legs + name = "Get Your LEGS" + desc = "LEGS: Leadership, Experience, Genius, Subordination." + icon_state = "poster15_legit" + +/obj/structure/sign/poster/official/do_not_question + name = "Do Not Question" + desc = "A poster instructing the viewer not to ask about things they aren't meant to know." + icon_state = "poster16_legit" + +/obj/structure/sign/poster/official/work_for_a_future + name = "Work For A Future" + desc = " A poster encouraging you to work for your future." + icon_state = "poster17_legit" + +/obj/structure/sign/poster/official/soft_cap_pop_art + name = "Soft Cap Pop Art" + desc = "A poster reprint of some cheap pop art." + icon_state = "poster18_legit" + +/obj/structure/sign/poster/official/safety_internals + name = "Safety: Internals" + desc = "A poster instructing the viewer to wear internals in the rare environments where there is no oxygen or the air has been rendered toxic." + icon_state = "poster19_legit" + +/obj/structure/sign/poster/official/safety_eye_protection + name = "Safety: Eye Protection" + desc = "A poster instructing the viewer to wear eye protection when dealing with chemicals, smoke, or bright lights." + icon_state = "poster20_legit" + +/obj/structure/sign/poster/official/safety_report + name = "Safety: Report" + desc = "A poster instructing the viewer to report suspicious activity to the security force." + icon_state = "poster21_legit" + +/obj/structure/sign/poster/official/report_crimes + name = "Report Crimes" + desc = "A poster encouraging the swift reporting of crime or seditious behavior to station security." + icon_state = "poster22_legit" + +/obj/structure/sign/poster/official/ion_rifle + name = "Ion Rifle" + desc = "A poster displaying an Ion Rifle." + icon_state = "poster23_legit" + +/obj/structure/sign/poster/official/foam_force_ad + name = "Foam Force Ad" + desc = "Foam Force, it's Foam or be Foamed!" + icon_state = "poster24_legit" + +/obj/structure/sign/poster/official/cohiba_robusto_ad + name = "Cohiba Robusto Ad" + desc = "Cohiba Robusto, the classy cigar." + icon_state = "poster25_legit" + +/obj/structure/sign/poster/official/anniversary_vintage_reprint + name = "50th Anniversary Vintage Reprint" + desc = "A reprint of a poster from 2505, commemorating the 50th Anniversary of Nanoposters Manufacturing, a subsidiary of Nanotrasen." + icon_state = "poster26_legit" + +/obj/structure/sign/poster/official/fruit_bowl + name = "Fruit Bowl" + desc = " Simple, yet awe-inspiring." + icon_state = "poster27_legit" + +/obj/structure/sign/poster/official/pda_ad + name = "PDA Ad" + desc = "A poster advertising the latest PDA from Nanotrasen suppliers." + icon_state = "poster28_legit" + +/obj/structure/sign/poster/official/enlist + name = "Enlist" // but I thought deathsquad was never acknowledged + desc = "Enlist in the Nanotrasen Deathsquadron reserves today!" + icon_state = "poster29_legit" + +/obj/structure/sign/poster/official/nanomichi_ad + name = "Nanomichi Ad" + desc = " A poster advertising Nanomichi brand audio cassettes." + icon_state = "poster30_legit" + +/obj/structure/sign/poster/official/twelve_gauge + name = "12 Gauge" + desc = "A poster boasting about the superiority of 12 gauge shotgun shells." + icon_state = "poster31_legit" + +/obj/structure/sign/poster/official/high_class_martini + name = "High-Class Martini" + desc = "I told you to shake it, no stirring." + icon_state = "poster32_legit" + +/obj/structure/sign/poster/official/the_owl + name = "The Owl" + desc = "The Owl would do his best to protect the station. Will you?" + icon_state = "poster33_legit" + +/obj/structure/sign/poster/official/no_erp + name = "No ERP" + desc = "This poster reminds the crew that Eroticism, Rape and Pornography are banned on Nanotrasen stations." + icon_state = "poster34_legit" + +/obj/structure/sign/poster/official/wtf_is_co2 + name = "Carbon Dioxide" + desc = "This informational poster teaches the viewer what carbon dioxide is." + icon_state = "poster35_legit" + +/obj/structure/sign/poster/official/spiderlings + name = "Spiderlings" + desc = "This poster informs the crew of the dangers of spiderlings." + icon_state = "poster36_legit" + +/obj/structure/sign/poster/official/duelshotgun + name = "Cycler Shotgun Ad" + desc = "A poster advertising an advanced dual magazine tubes shotgun, boasting about how easy it is to swap between the two tubes." + icon_state = "poster37_legit" + +#undef PLACE_SPEED diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index a28166606e..b1e86d6643 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -242,10 +242,8 @@ if(slot == user.getBeltSlot()) return TRUE -/obj/item/defibrillator/compact/loaded/Initialize() - . = ..() - cell = new(src) - update_power() +/obj/item/defibrillator/compact/loaded + cell = /obj/item/stock_parts/cell/high /obj/item/defibrillator/compact/combat name = "combat defibrillator" diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index a5857029f5..fae3625ccc 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -216,7 +216,7 @@ for(var/i in 1 to 3) new /obj/item/clothing/suit/toggle/labcoat(src) for(var/i in 1 to 3) - new /obj/item/clothing/suit/toggle/labcoat/emt(src) + new /obj/item/clothing/suit/toggle/labcoat/paramedic(src) for(var/i in 1 to 3) new /obj/item/clothing/shoes/sneakers/white(src) for(var/i in 1 to 3) diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index 3a474f339c..dd2b9dfa18 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -23,6 +23,10 @@ /turf/open/lava/MakeSlippery(wet_setting, min_wet_time, wet_time_to_add, max_wet_time, permanent) return +/turf/open/lava/Melt() + to_be_destroyed = FALSE + return src + /turf/open/lava/acid_act(acidpwr, acid_volume) return diff --git a/code/game/turfs/simulated/river.dm b/code/game/turfs/simulated/river.dm index 83fade33b2..c8ea60c712 100644 --- a/code/game/turfs/simulated/river.dm +++ b/code/game/turfs/simulated/river.dm @@ -6,7 +6,7 @@ #define RIVERGEN_SAFETY_LOCK 1000000 -/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/open/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors/unexplored, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y) +/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/open/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors/unexplored, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y, new_baseturfs) var/list/river_nodes = list() var/num_spawned = 0 var/list/possible_locs = block(locate(min_x, min_y, target_z), locate(max_x, max_y, target_z)) @@ -28,7 +28,7 @@ continue W.connected = 1 var/turf/cur_turf = get_turf(W) - cur_turf.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR) + cur_turf.ChangeTurf(turf_type, new_baseturfs, CHANGETURF_IGNORE_AIR) var/turf/target_turf = get_turf(pick(river_nodes - W)) if(!target_turf) break @@ -57,7 +57,7 @@ cur_turf = get_step(cur_turf, cur_dir) continue else - var/turf/river_turf = cur_turf.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR) + var/turf/river_turf = cur_turf.ChangeTurf(turf_type, new_baseturfs, CHANGETURF_IGNORE_AIR) river_turf.Spread(25, 11, whitelist_area) for(var/WP in river_nodes) @@ -93,16 +93,16 @@ for(var/F in cardinal_turfs) //cardinal turfs are always changed but don't always spread var/turf/T = F - if(!istype(T, logged_turf_type) && T.ChangeTurf(type, null, CHANGETURF_IGNORE_AIR) && prob(probability)) + if(!istype(T, logged_turf_type) && T.ChangeTurf(type, baseturfs, CHANGETURF_IGNORE_AIR) && prob(probability)) T.Spread(probability - prob_loss, prob_loss, whitelisted_area) for(var/F in diagonal_turfs) //diagonal turfs only sometimes change, but will always spread if changed var/turf/T = F - if(!istype(T, logged_turf_type) && prob(probability) && T.ChangeTurf(type, null, CHANGETURF_IGNORE_AIR)) + if(!istype(T, logged_turf_type) && prob(probability) && T.ChangeTurf(type, baseturfs, CHANGETURF_IGNORE_AIR)) T.Spread(probability - prob_loss, prob_loss, whitelisted_area) else if(ismineralturf(T)) var/turf/closed/mineral/M = T - M.ChangeTurf(M.turf_type, null, CHANGETURF_IGNORE_AIR) + M.ChangeTurf(M.turf_type, M.baseturfs, CHANGETURF_IGNORE_AIR) #undef RANDOM_UPPER_X diff --git a/code/modules/antagonists/blob/blob/overmind.dm b/code/modules/antagonists/blob/blob/overmind.dm index fe1c700014..18e13118fe 100644 --- a/code/modules/antagonists/blob/blob/overmind.dm +++ b/code/modules/antagonists/blob/blob/overmind.dm @@ -157,6 +157,9 @@ GLOBAL_LIST_EMPTY(blob_nodes) BM.overmind = null BM.update_icons() GLOB.overminds -= src + blob_mobs = null + resource_blobs = null + blobs_legit = null SSshuttle.clearHostileEnvironment(src) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 0179c60ef1..e774cf4250 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -315,7 +315,7 @@ bloodsuckerdatum.handle_eat_human_food(food_nutrition) -/datum/antagonist/bloodsucker/proc/handle_eat_human_food(var/food_nutrition) // Called from snacks.dm and drinks.dm +/datum/antagonist/bloodsucker/proc/handle_eat_human_food(food_nutrition, puke_blood = TRUE, masquerade_override) // Called from snacks.dm and drinks.dm set waitfor = FALSE if(!owner.current || !iscarbon(owner.current)) return @@ -324,14 +324,14 @@ C.nutrition -= food_nutrition foodInGut += food_nutrition // Already ate some bad clams? Then we can back out, because we're already sick from it. - if (foodInGut != food_nutrition) + if(foodInGut != food_nutrition) return // Haven't eaten, but I'm in a Human Disguise. - else if (poweron_masquerade) + else if(poweron_masquerade && !masquerade_override) to_chat(C, "Your stomach turns, but your \"human disguise\" keeps the food down...for now.") // Keep looping until we purge. If we have activated our Human Disguise, we ignore the food. But it'll come up eventually... var/sickphase = 0 - while (foodInGut) + while(foodInGut) sleep(50) C.adjust_disgust(10 * sickphase) // Wait an interval... @@ -340,24 +340,29 @@ if(C.stat == DEAD) return // Put up disguise? Then hold off the vomit. - if(poweron_masquerade) + if(poweron_masquerade && !masquerade_override) if(sickphase > 0) to_chat(C, "Your stomach settles temporarily. You regain your composure...for now.") sickphase = 0 continue switch(sickphase) - if (1) + if(1) to_chat(C, "You feel unwell. You can taste ash on your tongue.") C.Stun(10) - if (2) + if(2) to_chat(C, "Your stomach turns. Whatever you ate tastes of grave dirt and brimstone.") C.Dizzy(15) C.Stun(13) - if (3) + if(3) to_chat(C, "You purge the food of the living from your viscera! You've never felt worse.") - C.vomit(foodInGut * 4, foodInGut * 2, 0) // (var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1, var/toxic = 0) - C.blood_volume = max(0, C.blood_volume - foodInGut * 2) + //Puke blood only if puke_blood is true, and loose some blood, else just puke normally. + if(puke_blood) + C.blood_volume = max(0, C.blood_volume - foodInGut * 2) + C.vomit(foodInGut * 4, foodInGut * 2, 0) + else + C.vomit(foodInGut * 4, FALSE, 0) C.Stun(30) //C.Dizzy(50) foodInGut = 0 + SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "vampdisgust", /datum/mood_event/bloodsucker_disgust) sickphase ++ diff --git a/code/modules/antagonists/bloodsucker/powers/cloak.dm b/code/modules/antagonists/bloodsucker/powers/cloak.dm index 23b35d1eaa..1bb7b02357 100644 --- a/code/modules/antagonists/bloodsucker/powers/cloak.dm +++ b/code/modules/antagonists/bloodsucker/powers/cloak.dm @@ -10,6 +10,7 @@ amToggle = TRUE warn_constant_cost = TRUE var/moveintent_was_run + var/runintent var/walk_threshold = 0.4 // arbitrary number, to be changed. edit in last commit: this is fine after testing on box station for a bit var/lum @@ -31,23 +32,25 @@ var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) var/mob/living/user = owner + moveintent_was_run = (user.m_intent == MOVE_INTENT_RUN) + while(bloodsuckerdatum && ContinueActive(user)) // Pay Blood Toll (if awake) owner.alpha = max(35, owner.alpha - min(75, 10 + 5 * level_current)) bloodsuckerdatum.AddBloodVolume(-0.2) - moveintent_was_run = (user.m_intent == MOVE_INTENT_RUN) + runintent = (user.m_intent == MOVE_INTENT_RUN) var/turf/T = get_turf(user) lum = T.get_lumcount() if(istype(owner.loc)) if(lum > walk_threshold) - if(moveintent_was_run) + if(runintent) user.toggle_move_intent() ADD_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness") if(lum < walk_threshold) - if(!moveintent_was_run) + if(!runintent) user.toggle_move_intent() REMOVE_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness") @@ -65,5 +68,8 @@ ..() REMOVE_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness") user.alpha = 255 - if(!moveintent_was_run) + + runintent = (user.m_intent == MOVE_INTENT_RUN) + + if(!runintent && moveintent_was_run) user.toggle_move_intent() diff --git a/code/modules/antagonists/bloodsucker/powers/lunge.dm b/code/modules/antagonists/bloodsucker/powers/lunge.dm index c3a3090d55..12fc51d300 100644 --- a/code/modules/antagonists/bloodsucker/powers/lunge.dm +++ b/code/modules/antagonists/bloodsucker/powers/lunge.dm @@ -7,7 +7,7 @@ button_icon_state = "power_lunge" bloodcost = 10 cooldown = 120 - target_range = 5 + target_range = 3 power_activates_immediately = TRUE message_Trigger = "Whom will you ensnare within your grasp?" must_be_capacitated = TRUE @@ -61,7 +61,7 @@ addtimer(CALLBACK(owner, .proc/_walk, 0), 2 SECONDS) target.playsound_local(get_turf(owner), 'sound/bloodsucker/lunge_warn.ogg', 60, FALSE, pressure_affected = FALSE) // target-only telegraphing owner.playsound_local(owner, 'sound/bloodsucker/lunge_warn.ogg', 60, FALSE, pressure_affected = FALSE) // audio feedback to the user - if(do_mob(owner, owner, 6, TRUE, TRUE)) + if(do_mob(owner, owner, 7, TRUE, TRUE)) walk_towards(owner, T, 0.1, 10) // yes i know i shouldn't use this but i don't know how to work in anything better if(get_turf(owner) != T && !(isliving(target) && target.Adjacent(owner)) && owner.incapacitated() && owner.resting) var/send_dir = get_dir(owner, T) @@ -80,7 +80,7 @@ target.grabbedby(owner) // Taken from mutations.dm under changelings target.grippedby(owner, instant = TRUE) //instant aggro grab break - sleep(i*3) + sleep(3) /datum/action/bloodsucker/targeted/lunge/DeactivatePower(mob/living/user = owner, mob/living/target) ..() // activate = FALSE diff --git a/code/modules/antagonists/bloodsucker/powers/mesmerize.dm b/code/modules/antagonists/bloodsucker/powers/mesmerize.dm index b238c5ba36..8699e43854 100644 --- a/code/modules/antagonists/bloodsucker/powers/mesmerize.dm +++ b/code/modules/antagonists/bloodsucker/powers/mesmerize.dm @@ -11,7 +11,7 @@ button_icon_state = "power_mez" bloodcost = 30 cooldown = 300 - target_range = 3 + target_range = 2 power_activates_immediately = TRUE message_Trigger = "Whom will you subvert to your will?" must_be_capacitated = TRUE @@ -73,7 +73,7 @@ to_chat(owner, "You're too far outside your victim's view.") return FALSE - if(target.has_status_effect(STATUS_EFFECT_MESMERIZE)) // ? + if(target.has_status_effect(STATUS_EFFECT_MESMERIZE)) // ignores facing once the windup has started return TRUE // Check: Facing target? @@ -88,39 +88,53 @@ return FALSE return TRUE +/datum/action/bloodsucker/targeted/mesmerize/proc/ContinueTarget(atom/A) + var/mob/living/carbon/target = A + var/mob/living/user = owner + + var/cancontinue=CheckCanTarget(target) + if(!cancontinue) + success = FALSE + target.remove_status_effect(STATUS_EFFECT_MESMERIZE) + user.remove_status_effect(STATUS_EFFECT_MESMERIZE) + DeactivatePower() + DeactivateRangedAbility() + StartCooldown() + to_chat(user, "[target] has escaped your gaze!") + UnregisterSignal(target, COMSIG_MOVABLE_MOVED) + /datum/action/bloodsucker/targeted/mesmerize/FireTargetedPower(atom/A) // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done. var/mob/living/carbon/target = A var/mob/living/user = owner if(istype(target)) + success = TRUE var/power_time = 138 + level_current * 12 target.apply_status_effect(STATUS_EFFECT_MESMERIZE, 30) user.apply_status_effect(STATUS_EFFECT_MESMERIZE, 30) - if(do_mob(user, target, 30, TRUE, TRUE)) // 3 seconds windup - success = CheckCanTarget(target) - if(success) // target just has to be out of view when it is fully charged in order to avoid - PowerActivatedSuccessfully() // blood & cooldown only altered if power activated successfully - less "fuck you"-y - target.face_atom(user) - target.apply_status_effect(STATUS_EFFECT_MESMERIZE, power_time) // pretty much purely cosmetic - target.Stun(power_time) - to_chat(user, "[target] is fixed in place by your hypnotic gaze.") - target.next_move = world.time + power_time // <--- Use direct change instead. We want an unmodified delay to their next move // target.changeNext_move(power_time) // check click.dm - target.notransform = TRUE // <--- Fuck it. We tried using next_move, but they could STILL resist. We're just doing a hard freeze. - else - to_chat(user, "[target] has escaped your gaze!") - DeactivatePower() - DeactivateRangedAbility() - StartCooldown() - // oops! if they knew how they could just spam stun the victim and themselves. + + RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/ContinueTarget) - spawn(power_time) - if(istype(target) && success) - target.notransform = FALSE - // They Woke Up! (Notice if within view) - if(istype(user) && target.stat == CONSCIOUS && (target in view(10, get_turf(user))) ) + // 3 second windup + sleep(30) + if(success) + PowerActivatedSuccessfully() // blood & cooldown only altered if power activated successfully - less "fuck you"-y + target.face_atom(user) + target.apply_status_effect(STATUS_EFFECT_MESMERIZE, power_time) // pretty much purely cosmetic + target.Stun(power_time) + to_chat(user, "[target] is fixed in place by your hypnotic gaze.") + target.next_move = world.time + power_time // <--- Use direct change instead. We want an unmodified delay to their next move // target.changeNext_move(power_time) // check click.dm + target.notransform = TRUE // <--- Fuck it. We tried using next_move, but they could STILL resist. We're just doing a hard freeze. + + UnregisterSignal(target, COMSIG_MOVABLE_MOVED) + + spawn(power_time) + if(istype(target) && success) + target.notransform = FALSE + // They Woke Up! (Notice if within view) + if(istype(user) && target.stat == CONSCIOUS && (target in view(10, get_turf(user))) ) to_chat(user, "[target] has snapped out of their trance.") - /datum/action/bloodsucker/targeted/mesmerize/ContinueActive(mob/living/user, mob/living/target) return ..() && CheckCanUse() && CheckCanTarget(target) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 1acb7628a3..59747d59ba 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -58,6 +58,12 @@ /obj/item/clothing/shoes/magboots/advance/debug/Initialize() attack_self(src) +/obj/item/clothing/shoes/magboots/paramedic + desc = "A pair of magboots decked in colors matching the equipment of an emergency medical technician." + name = "paramedic magboots" + icon_state = "para_magboots0" + magboot_state = "para_magboots" + /obj/item/clothing/shoes/magboots/syndie desc = "Reverse-engineered magnetic boots that have a heavy magnetic pull. Property of Gorlex Marauders." name = "blood-red magboots" diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index f9e35ca37f..8c39427c49 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -465,3 +465,16 @@ Contains: torn = TRUE playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1) playsound(loc, 'sound/effects/refill.ogg', 50, 1) + +/obj/item/clothing/suit/space/eva/paramedic + name = "paramedic EVA suit" + icon_state = "paramedic-eva" + item_state = "paramedic-eva" + desc = "A deep blue space suit decorated with red and white crosses to indicate that the wearer is trained emergency medical personnel." + allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/roller) + +/obj/item/clothing/head/helmet/space/eva/paramedic + name = "paramedic EVA helmet" + desc = "A deep blue space helmet with a large red cross on the faceplate to designate the wearer as trained emergency medical personnel." + icon_state = "paramedic-eva-helmet" + item_state = "paramedic-eva-helmet" \ No newline at end of file diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 48fd8ccf1c..efadb8a035 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -195,3 +195,18 @@ body_parts_covered = HEAD flags_inv = HIDEHAIR|HIDEEARS mutantrace_variation = STYLE_MUZZLE + + +//Paramedic + +/obj/item/clothing/suit/toggle/labcoat/paramedic + name = "paramedic vest" + desc = "A dark blue vest with reflective strips for emergency medical technicians." + icon_state = "paramedic-vest" + item_state = "paramedic-vest" + +/obj/item/clothing/suit/toggle/labcoat/emt + name = "emt vest" + desc = "A dark blue vest with reflective strips for emergency medical technicians." + icon_state = "labcoat_emt" + item_state = "labcoat_emt" \ No newline at end of file diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 022bc7c95c..195712b814 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -37,12 +37,6 @@ icon_state = "labcoat_cmo" item_state = "labcoat_cmo" -/obj/item/clothing/suit/toggle/labcoat/emt - name = "\improper EMT's jacket" - desc = "A dark blue jacket with reflective strips for emergency medical technicians." - icon_state = "labcoat_emt" - item_state = "labcoat_cmo" - /obj/item/clothing/suit/toggle/labcoat/mad name = "\proper The Mad's labcoat" desc = "It makes you look capable of konking someone on the noggin and shooting them into space." diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 4d3e8acb28..6f61bf56cb 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -480,8 +480,6 @@ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT allowed = list(/obj/item/clothing/mask/facehugger/toy) - - // WINTER COATS /obj/item/clothing/suit/hooded/wintercoat @@ -521,6 +519,7 @@ /obj/item/clothing/suit/hooded/wintercoat/captain name = "captain's winter coat" + desc = "A luxuriant winter coat, stuffed with the down of the endangered Uka bird and trimmed with genuine sable. The fabric is an indulgently soft micro-fiber, and the deep ultramarine color is only one that could be achieved with minute amounts of crystalline bluespace dust woven into the thread between the plectrums. Extremely lavish, and extremely durable. The tiny flakes of protective material make it nothing short of extremely light lamellar armor." icon_state = "coatcaptain" item_state = "coatcaptain" armor = list("melee" = 25, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50) @@ -531,20 +530,24 @@ allowed = GLOB.security_wintercoat_allowed /obj/item/clothing/head/hooded/winterhood/captain + desc = "A blue and yellow hood attached to a heavy winter jacket." icon_state = "winterhood_captain" /obj/item/clothing/suit/hooded/wintercoat/hop name = "head of personnel's winter coat" + desc = "A cozy winter coat, covered in thick fur. The breast features a proud yellow chevron, reminding everyone that you're the second banana." icon_state = "coathop" item_state = "coathop" armor = list("melee" = 5, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 5, "bio" = 5, "rad" = 0, "fire" = 0, "acid" = 5) hoodtype = /obj/item/clothing/head/hooded/winterhood/hop /obj/item/clothing/head/hooded/winterhood/hop + desc = "A cozy winter hood attached to a heavy winter jacket." icon_state = "winterhood_hop" /obj/item/clothing/suit/hooded/wintercoat/security name = "security winter coat" + desc = "A red, armor-padded winter coat. It glitters with a mild ablative coating and a robust air of authority. The zipper tab is a pair of jingly little handcuffs and got annoying after the first ten seconds." icon_state = "coatsecurity" item_state = "coatsecurity" armor = list("melee" = 25, "bullet" = 15, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 45) @@ -555,10 +558,12 @@ allowed = GLOB.security_wintercoat_allowed /obj/item/clothing/head/hooded/winterhood/security + desc = "A red, armor-padded winter hood." icon_state = "winterhood_security" /obj/item/clothing/suit/hooded/wintercoat/hos name = "head of security's winter coat" + desc = "A red, armor-padded winter coat, lovingly woven with a Kevlar interleave and reinforced with semi-ablative polymers and a silver azide fill material. The zipper tab looks like a tiny replica of Beepsky." icon_state = "coathos" item_state = "coathos" armor = list("melee" = 35, "bullet" = 35, "laser" = 35, "energy" = 15, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 55) @@ -569,10 +574,12 @@ allowed = GLOB.security_wintercoat_allowed /obj/item/clothing/head/hooded/winterhood/hos + desc = "A red, armor-padded winter hood, lovingly woven with a Kevlar interleave. Definitely not bulletproof, especially not the part where your face goes." icon_state = "winterhood_hos" /obj/item/clothing/suit/hooded/wintercoat/medical name = "medical winter coat" + desc = "An arctic white winter coat with a small blue caduceus instead of a plastic zipper tab. Snazzy." icon_state = "coatmedical" item_state = "coatmedical" allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) @@ -580,10 +587,12 @@ hoodtype = /obj/item/clothing/head/hooded/winterhood/medical /obj/item/clothing/head/hooded/winterhood/medical + desc = "A white winter coat hood." icon_state = "winterhood_medical" /obj/item/clothing/suit/hooded/wintercoat/cmo name = "chief medical officer's winter coat" + desc = "An arctic white winter coat with a small blue caduceus instead of a plastic zipper tab. The normal liner is replaced with an exceptionally thick, soft layer of fur." icon_state = "coatcmo" item_state = "coatcmo" allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) @@ -591,10 +600,12 @@ hoodtype = /obj/item/clothing/head/hooded/winterhood/cmo /obj/item/clothing/head/hooded/winterhood/cmo + desc = "A white winter coat hood." icon_state = "winterhood_cmo" /obj/item/clothing/suit/hooded/wintercoat/chemistry name = "chemistry winter coat" + desc = "A lab-grade winter coat made with acid resistant polymers. For the enterprising chemist who was exiled to a frozen wasteland on the go." icon_state = "coatchemistry" item_state = "coatchemistry" allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) @@ -602,10 +613,12 @@ hoodtype = /obj/item/clothing/head/hooded/winterhood/chemistry /obj/item/clothing/head/hooded/winterhood/chemistry + desc = "A white winter coat hood." icon_state = "winterhood_chemistry" /obj/item/clothing/suit/hooded/wintercoat/viro name = "virology winter coat" + desc = "A white winter coat with green markings. Warm, but wont fight off the common cold or any other disease. Might make people stand far away from you in the hallway. The zipper tab looks like an oversized bacteriophage." icon_state = "coatviro" item_state = "coatviro" allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) @@ -613,10 +626,12 @@ hoodtype = /obj/item/clothing/head/hooded/winterhood/viro /obj/item/clothing/head/hooded/winterhood/viro + desc = "A white winter coat hood with green markings." icon_state = "winterhood_viro" /obj/item/clothing/suit/hooded/wintercoat/science name = "science winter coat" + desc = "A white winter coat with an outdated atomic model instead of a plastic zipper tab." icon_state = "coatscience" item_state = "coatscience" allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) @@ -624,10 +639,12 @@ hoodtype = /obj/item/clothing/head/hooded/winterhood/science /obj/item/clothing/head/hooded/winterhood/science + desc = "A white winter coat hood. This one will keep your brain warm. About as much as the others, really." icon_state = "winterhood_science" /obj/item/clothing/suit/hooded/wintercoat/robotics name = "robotics winter coat" + desc = "A black winter coat with a badass flaming robotic skull for the zipper tab. This one has bright red designs and a few useless buttons." icon_state = "coatrobotics" item_state = "coatrobotics" allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/screwdriver, /obj/item/crowbar, /obj/item/wrench, /obj/item/stack/cable_coil, /obj/item/weldingtool, /obj/item/multitool) @@ -635,20 +652,24 @@ hoodtype = /obj/item/clothing/head/hooded/winterhood/robotics /obj/item/clothing/head/hooded/winterhood/robotics + desc = "A black winter coat hood. You can pull it down over your eyes and pretend that you're an outdated, late 1980s interpretation of a futuristic mechanized police force. They'll fix you. They fix everything." icon_state = "winterhood_robotics" /obj/item/clothing/suit/hooded/wintercoat/genetics name = "genetics winter coat" + desc = "A white winter coat with a DNA helix for the zipper tab. " icon_state = "coatgenetics" item_state = "coatgenetics" allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) hoodtype = /obj/item/clothing/head/hooded/winterhood/genetics /obj/item/clothing/head/hooded/winterhood/genetics + desc = "A white winter coat hood. It's warm." icon_state = "winterhood_genetics" /obj/item/clothing/suit/hooded/wintercoat/rd name = "research director's winter coat" + desc = "A thick arctic winter coat with an outdated atomic model instead of a plastic zipper tab. Most in the know are heavily aware that Bohr's model of the atom was outdated by the time of the 1930s when the Heisenbergian and Schrodinger models were generally accepted for true. Nevertheless, we still see its use in anachronism, roleplaying, and, in this case, as a zipper tab. At least it should keep you warm on your ivory pillar." icon_state = "coatrd" item_state = "coatrd" allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) @@ -656,10 +677,12 @@ hoodtype = /obj/item/clothing/head/hooded/winterhood/rd /obj/item/clothing/head/hooded/winterhood/rd + desc = "A white winter coat hood. It smells faintly of hair gel." icon_state = "winterhood_rd" /obj/item/clothing/suit/hooded/wintercoat/ce name = "chief engineer's winter coat" + desc = "A white winter coat with reflective green and yellow stripes. Stuffed with asbestos, treated with fire retardant PBDE, lined with a micro thin sheet of lead foil and snugly fitted to your body's measurements. This baby's ready to save you from anything except the thyroid cancer and systemic fibrosis you'll get from wearing it. The zipper tab is a tiny golden wrench." icon_state = "coatce" item_state = "coatce" armor = list("melee" = 0, "bullet" = 0, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 30, "fire" = 35, "acid" = 45) @@ -667,10 +690,12 @@ hoodtype = /obj/item/clothing/head/hooded/winterhood/ce /obj/item/clothing/head/hooded/winterhood/ce + desc = "A white winter coat hood. Feels surprisingly heavy. The tag says that it's not child safe." icon_state = "winterhood_ce" /obj/item/clothing/suit/hooded/wintercoat/engineering name = "engineering winter coat" + desc = "A surprisingly heavy yellow winter coat with reflective orange stripes. It has a small wrench for its zipper tab, and the inside layer is covered with a radiation-resistant silver-nylon blend. Because you're worth it." icon_state = "coatengineer" item_state = "coatengineer" armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 20, "fire" = 30, "acid" = 45) @@ -678,29 +703,35 @@ hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering /obj/item/clothing/head/hooded/winterhood/engineering + desc = "A yellow winter coat hood. Definitely not a replacement for a hard hat." icon_state = "winterhood_engineer" /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos name = "atmospherics winter coat" + desc = "A yellow and blue winter coat. The zipper pull-tab is made to look like a miniature breath mask." icon_state = "coatatmos" item_state = "coatatmos" hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering/atmos /obj/item/clothing/head/hooded/winterhood/engineering/atmos + desc = "A yellow and blue winter coat hood." icon_state = "winterhood_atmos" /obj/item/clothing/suit/hooded/wintercoat/hydro name = "hydroponics winter coat" + desc = "A green and blue winter coat. The zipper tab looks like the flower from a member of Rosa Hesperrhodos, a pretty pink-and-white rose. The colors absolutely clash." icon_state = "coathydro" item_state = "coathydro" allowed = list(/obj/item/reagent_containers/spray/plantbgone, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/cultivator, /obj/item/reagent_containers/spray/pestspray, /obj/item/hatchet, /obj/item/storage/bag/plants, /obj/item/toy, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) hoodtype = /obj/item/clothing/head/hooded/winterhood/hydro /obj/item/clothing/head/hooded/winterhood/hydro + desc = "A green winter coat hood." icon_state = "winterhood_hydro" /obj/item/clothing/suit/hooded/wintercoat/cosmic name = "cosmic winter coat" + desc = "A starry winter coat that even glows softly." icon_state = "coatcosmic" item_state = "coatcosmic" hoodtype = /obj/item/clothing/head/hooded/winterhood/cosmic @@ -708,48 +739,58 @@ light_range = 1.2 /obj/item/clothing/head/hooded/winterhood/cosmic + desc = "A starry winter hood." icon_state = "winterhood_cosmic" /obj/item/clothing/suit/hooded/wintercoat/janitor name = "janitors winter coat" + desc = "A purple-and-beige winter coat that smells of space cleaner." icon_state = "coatjanitor" item_state = "coatjanitor" allowed = list(/obj/item/toy, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/storage/fancy/cigarettes, /obj/item/lighter,/obj/item/grenade/chem_grenade,/obj/item/lightreplacer,/obj/item/flashlight,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/spray,/obj/item/soap,/obj/item/holosign_creator,/obj/item/key/janitor,/obj/item/melee/flyswatter,/obj/item/paint/paint_remover,/obj/item/storage/bag/trash,/obj/item/reagent_containers/glass/bucket) hoodtype = /obj/item/clothing/head/hooded/winterhood/janitor /obj/item/clothing/head/hooded/winterhood/janitor + desc = "A purple hood that smells of space cleaner." icon_state = "winterhood_janitor" /obj/item/clothing/suit/hooded/wintercoat/cargo name = "cargo winter coat" + desc = "A tan-and-grey winter coat that has a crate for its zipper pull tab. It fills you with the warmth of a fierce independence." icon_state = "coatcargo" item_state = "coatcargo" hoodtype = /obj/item/clothing/head/hooded/winterhood/cargo /obj/item/clothing/head/hooded/winterhood/cargo + desc = "A grey hood for a winter coat." icon_state = "winterhood_cargo" /obj/item/clothing/suit/hooded/wintercoat/qm name = "quartermaster's winter coat" + desc = "A dark brown winter coat that has a golden crate pin for its zipper pully." icon_state = "coatqm" item_state = "coatqm" hoodtype = /obj/item/clothing/head/hooded/winterhood/qm /obj/item/clothing/head/hooded/winterhood/qm + desc = "A dark brown winter hood" icon_state = "winterhood_qm" /obj/item/clothing/suit/hooded/wintercoat/aformal name = "assistant's formal winter coat" + desc = "A black button up winter coat." icon_state = "coataformal" item_state = "coataformal" allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter,/obj/item/clothing/gloves/color/yellow) hoodtype = /obj/item/clothing/head/hooded/winterhood/aformal /obj/item/clothing/head/hooded/winterhood/aformal + desc = "A black winter coat hood." icon_state = "winterhood_aformal" /obj/item/clothing/suit/hooded/wintercoat/miner name = "mining winter coat" + desc = "A dusty button up winter coat. The zipper tab looks like a tiny pickaxe." icon_state = "coatminer" item_state = "coatminer" allowed = list(/obj/item/pickaxe, /obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) @@ -757,10 +798,12 @@ hoodtype = /obj/item/clothing/head/hooded/winterhood/miner /obj/item/clothing/head/hooded/winterhood/miner + desc = "A dusty winter coat hood." icon_state = "winterhood_miner" /obj/item/clothing/suit/hooded/wintercoat/ratvar name = "ratvarian winter coat" + desc = "A brass-plated button up winter coat. Instead of a zipper tab, it has a brass cog with a tiny red gemstone inset." icon_state = "coatratvar" item_state = "coatratvar" armor = list("melee" = 30, "bullet" = 45, "laser" = -10, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) @@ -770,6 +813,7 @@ /obj/item/clothing/head/hooded/winterhood/ratvar icon_state = "winterhood_ratvar" + desc = "A brass-plated winter hood that glows softly, hinting at its divinity." light_range = 3 light_power = 1 light_color = "#B18B25" //clockwork slab background top color @@ -788,6 +832,7 @@ /obj/item/clothing/suit/hooded/wintercoat/narsie name = "narsian winter coat" + desc = "A somber button-up in tones of grey entropy and a wicked crimson zipper. When pulled all the way up, the zipper looks like a bloody gash. The zipper pull looks like a single drop of blood." icon_state = "coatnarsie" item_state = "coatnarsie" armor = list("melee" = 30, "bullet" = 20, "laser" = 30,"energy" = 10, "bomb" = 30, "bio" = 10, "rad" = 10, "fire" = 30, "acid" = 30) @@ -808,10 +853,12 @@ user.adjustBruteLoss(rand(10,16)) /obj/item/clothing/head/hooded/winterhood/narsie + desc = "A black winter hood full of whispering secrets that only She shall ever know." icon_state = "winterhood_narsie" /obj/item/clothing/suit/hooded/wintercoat/ratvar/fake name = "brass winter coat" + desc = "A brass-plated button up winter coat. Instead of a zipper tab, it has a brass cog with a tiny red piece of plastic as an inset." icon_state = "coatratvar" item_state = "coatratvar" allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) @@ -820,6 +867,7 @@ /obj/item/clothing/suit/hooded/wintercoat/narsie/fake name = "runed winter coat" + desc = "A dusty button up winter coat in the tones of oblivion and ash. The zipper pull looks like a single drop of blood." icon_state = "coatnarsie" item_state = "coatnarsie" allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter) @@ -842,7 +890,6 @@ icon_state = "winterhood_durathread" armor = list("melee" = 20, "bullet" = 8, "laser" = 15, "energy" = 8, "bomb" = 25, "bio" = 10, "rad" = 15, "fire" = 75, "acid" = 37) - /obj/item/clothing/suit/spookyghost name = "spooky ghost" desc = "This is obviously just a bedsheet, but maybe try it on?" diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index 971112ac38..3f31fb4717 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -159,22 +159,36 @@ fitted = FEMALE_UNIFORM_TOP /obj/item/clothing/under/rank/medical/paramedic - desc = "It's made of a special fiber that provides minor protection against biohazards. It has a dark blue cross on the chest denoting that the wearer is a trained paramedic." + desc = "It's made of a special fiber that provides minor protection against biohazards. It has a white cross on the chest denoting that the wearer is a trained paramedic." name = "paramedic jumpsuit" - icon_state = "paramedic" + icon_state = "paramedic-dark" item_state = "w_suit" + item_color = "paramedic-dark" permeability_coefficient = 0.5 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) + can_adjust = FALSE + +/obj/item/clothing/under/rank/medical/paramedic/light + desc = "It's made of a special fiber that provides minor protection against biohazards. It has a dark blue cross on the chest denoting that the wearer is a trained paramedic." + icon_state = "paramedic-light" + item_color = "paramedic-light" + can_adjust = TRUE /obj/item/clothing/under/rank/medical/paramedic/skirt name = "paramedic jumpskirt" - desc = "It's made of a special fiber that provides minor protection against biohazards. It has a dark blue cross on the chest denoting that the wearer is a trained paramedic." - icon_state = "paramedic_skirt" + desc = "It's made of a special fiber that provides minor protection against biohazards. It has a white cross on the chest denoting that the wearer is a trained paramedic." + icon_state = "paramedic-dark_skirt" item_state = "w_suit" + item_color = "paramedic-dark_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP +/obj/item/clothing/under/rank/medical/paramedic/skirt/light + desc = "It's made of a special fiber that provides minor protection against biohazards. It has a dark blue cross on the chest denoting that the wearer is a trained paramedic." + icon_state = "paramedic_skirt" + item_color = "paramedic_skirt" + /obj/item/clothing/under/rank/nursesuit desc = "It's a jumpsuit commonly worn by nursing staff in the medical department." name = "nurse's suit" @@ -186,6 +200,7 @@ body_parts_covered = CHEST|GROIN|ARMS fitted = NO_FEMALE_UNIFORM can_adjust = FALSE + /obj/item/clothing/under/rank/medical desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel." name = "medical doctor's jumpsuit" @@ -194,18 +209,21 @@ item_color = "medical" permeability_coefficient = 0.5 armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0) + /obj/item/clothing/under/rank/medical/blue name = "blue medical scrubs" desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue." icon_state = "scrubsblue" item_color = "scrubsblue" can_adjust = FALSE + /obj/item/clothing/under/rank/medical/green name = "green medical scrubs" desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in dark green." icon_state = "scrubsgreen" item_color = "scrubsgreen" can_adjust = FALSE + /obj/item/clothing/under/rank/medical/purple name = "purple medical scrubs" desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple." @@ -221,4 +239,4 @@ item_color = "medical_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE - fitted = FEMALE_UNIFORM_TOP + fitted = FEMALE_UNIFORM_TOP \ No newline at end of file diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 7df089d49c..68c5d8c5c8 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -63,7 +63,7 @@ else D = new virus_type() else - D = new /datum/disease/advance/random(max_severity, max_severity) + D = new /datum/disease/advance/random(TRUE, max_severity, max_severity) D.carrier = TRUE H.ForceContractDisease(D, FALSE, TRUE) diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index 53c3389695..d3525c951d 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -36,7 +36,7 @@ plantname = "Blood-Tomato Plants" product = /obj/item/reagent_containers/food/snacks/grown/tomato/blood mutatelist = list() - reagents_add = list(/datum/reagent/blood = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) + reagents_add = list(/datum/reagent/blood/tomato = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) rarity = 20 /obj/item/reagent_containers/food/snacks/grown/tomato/blood @@ -47,7 +47,7 @@ splat_type = /obj/effect/gibspawner/generic filling_color = "#FF0000" foodtype = FRUIT | GROSS - grind_results = list(/datum/reagent/consumable/ketchup = 0, /datum/reagent/blood = 0) + grind_results = list(/datum/reagent/consumable/ketchup = 0, /datum/reagent/blood/tomato = 0) distill_reagent = /datum/reagent/consumable/ethanol/bloody_mary // Blue Tomato diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index 1ad836f01c..b74f1a1c18 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -12,6 +12,7 @@ outfit = /datum/outfit/job/paramedic access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS) + minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM, ACCESS_MAINT_TUNNELS) display_order = JOB_DISPLAY_ORDER_PARAMEDIC @@ -23,10 +24,10 @@ ears = /obj/item/radio/headset/headset_med gloves = /obj/item/clothing/gloves/color/latex/nitrile uniform = /obj/item/clothing/under/rank/medical/paramedic - mask = /obj/item/clothing/mask/surgical + mask = /obj/item/clothing/mask/cigarette shoes = /obj/item/clothing/shoes/jackboots head = /obj/item/clothing/head/soft/emt - suit = /obj/item/clothing/suit/toggle/labcoat/emt + suit = /obj/item/clothing/suit/toggle/labcoat/paramedic belt = /obj/item/storage/belt/medical l_hand = /obj/item/storage/firstaid/regular suit_store = /obj/item/flashlight/pen @@ -40,6 +41,4 @@ satchel = /obj/item/storage/backpack/satchel/med duffelbag = /obj/item/storage/backpack/duffelbag/med - backpack_contents = list(/obj/item/storage/hypospraykit/regular) - chameleon_extras = /obj/item/gun/syringe diff --git a/code/modules/mob/living/carbon/alien/damage_procs.dm b/code/modules/mob/living/carbon/alien/damage_procs.dm index f5d210b94b..66738b2208 100644 --- a/code/modules/mob/living/carbon/alien/damage_procs.dm +++ b/code/modules/mob/living/carbon/alien/damage_procs.dm @@ -5,11 +5,9 @@ /mob/living/carbon/alien/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) //alien immune to tox damage return FALSE -/* CIT CHANGE - Pffffffffffffhahahahahhaha-- No. //aliens are immune to stamina damage. -/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_health = 1) +/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_health = TRUE, forced = FALSE) return -/mob/living/carbon/alien/setStaminaLoss(amount, updating_health = 1) +/mob/living/carbon/alien/setStaminaLoss(amount, updating_health = TRUE, forced = FALSE) return -*/ diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 637178ffe6..54c4842127 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -52,7 +52,12 @@ . = ..() if(!HAS_TRAIT(src, TRAIT_AUTO_CATCH_ITEM) && !skip_throw_mode_check && !in_throw_mode) return - if(get_active_held_item() || restrained()) + if(incapacitated()) + return + if (get_active_held_item()) + if (HAS_TRAIT_FROM(src, TRAIT_AUTO_CATCH_ITEM,RISING_BASS_TRAIT)) + visible_message("[src] chops [I] out of the air!") + return TRUE return I.attack_hand(src) if(get_active_held_item() == I) //if our attack_hand() picks up the item... diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index 4a99e9c89e..7413e84196 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -9,8 +9,6 @@ . += 6 - 3*get_num_arms() //crawling is harder with fewer arms if(legcuffed) . += legcuffed.slowdown - if(stat == SOFT_CRIT) - . += SOFTCRIT_ADD_SLOWDOWN /mob/living/carbon/slip(knockdown_amount, obj/O, lube) if(movement_type & FLYING && !(lube & FLYING_DOESNT_HELP)) diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index 8c5dc6aa0b..e3512e3929 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -49,6 +49,7 @@ message = "moans!" message_mime = "appears to moan!" emote_type = EMOTE_AUDIBLE + stat_allowed = SOFT_CRIT /datum/emote/living/carbon/roll key = "roll" diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 57b8f59780..78a38aa7fa 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -49,9 +49,14 @@ if (mind.martial_art && mind.martial_art.dodge_chance) if(!lying && dna && !dna.check_mutation(HULK)) if(prob(mind.martial_art.dodge_chance)) - var/dodgemessage = pick("dodges under the projectile!","dodges to the right of the projectile!","jumps over the projectile!") - visible_message("[src] [dodgemessage]", "You dodge the projectile!") - return BULLET_ACT_BLOCK + var/static/dodgemessages = list("dodges under",0,-4,"dodges to the right of",-4,0,"dodges to the left of",4,0,"jumps over",0,4) + var/pick = pick(1,4,7,10) + var/oldx = pixel_x + var/oldy = pixel_y + animate(src,pixel_x = pixel_x + dodgemessages[pick+1],pixel_y = pixel_y + dodgemessages[pick+2],time=3) + animate(src,pixel_x = oldx,pixel_y = oldy,time=2) + visible_message("[src] [dodgemessages[pick]] the projectile!", "You dodge the projectile!") + return BULLET_ACT_FORCE_PIERCE if(mind.martial_art && !incapacitated(FALSE, TRUE) && mind.martial_art.can_use(src) && mind.martial_art.deflection_chance) //Some martial arts users can deflect projectiles! if(prob(mind.martial_art.deflection_chance)) if(!lying && dna && !dna.check_mutation(HULK)) //But only if they're not lying down, and hulks can't do it diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index 71f5aaa8e2..ee4ef83a44 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -24,7 +24,7 @@ H.vomit(0, FALSE, FALSE, 2, TRUE) var/obj/effect/decal/cleanable/vomit/V = locate() in pos if(V) - H.reagents.trans_id_to(V, chem, chem.volume) + H.reagents.trans_id_to(V, chem.type, chem.volume) playsound(pos, 'sound/effects/splat.ogg', 50, 1) H.visible_message("[H] vomits on the floor!", \ "You throw up on the floor!") diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index ccca90807b..0460819c4b 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -280,7 +280,7 @@ if(miasma_partialpressure > MINIMUM_MOLES_DELTA_TO_MOVE) if(prob(0.05 * miasma_partialpressure)) - var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3) + var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(TRUE, 2,3) miasma_disease.name = "Unknown" ForceContractDisease(miasma_disease, TRUE, TRUE) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index e8cf0225e6..df6257e38b 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -249,7 +249,7 @@ var/current_dir if(isliving(AM)) current_dir = AM.dir - if(step(AM, t)) + if(step(AM, t) && Process_Spacemove(t)) step(src, t) if(current_dir) AM.setDir(current_dir) diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index ce8ab9659c..1f19cf64ff 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -19,7 +19,6 @@ var/start_open = TRUE // unless this var is set to 1 var/icon_state_closed = "laptop-closed" var/w_class_open = WEIGHT_CLASS_BULKY - var/slowdown_open = TRUE /obj/item/modular_computer/laptop/examine(mob/user) . = ..() @@ -92,11 +91,9 @@ /obj/item/modular_computer/laptop/proc/toggle_open(mob/living/user=null) if(screen_on) to_chat(user, "You close \the [src].") - slowdown = initial(slowdown) w_class = initial(w_class) else to_chat(user, "You open \the [src].") - slowdown = slowdown_open w_class = w_class_open screen_on = !screen_on diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 858adc0d66..67cc371c3b 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -328,12 +328,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(power) soundloop.volume = min(40, (round(power/100)/50)+1) // 5 +1 volume per 20 power. 2500 power is max - if(isclosedturf(T)) - var/turf/did_it_melt = T.Melt() - if(!isclosedturf(did_it_melt)) //In case some joker finds way to place these on indestructible walls - visible_message("[src] melts through [T]!") - return - //Ok, get the air from the turf var/datum/gas_mixture/env = T.return_air() @@ -345,9 +339,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) else // Pass all the gas related code an empty gas container removed = new() - damage_archived = min(damage_archived + (DAMAGE_HARDCAP * explosion_point),damage) - matter_power += damage - damage_archived - damage = damage_archived + damage = min(damage_archived + (DAMAGE_HARDCAP * explosion_point),damage) + damage_archived = damage if(!removed || !removed.total_moles() || isspaceturf(T)) //we're in space or there is no gas to process if(takes_damage) damage += max((power / 1000) * DAMAGE_INCREASE_MULTIPLIER, 0.1) // always does at least some damage @@ -531,7 +524,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) message_admins("[src] has been powered for the first time [ADMIN_JMP(src)].") has_been_powered = TRUE else if(takes_damage) - damage += Proj.damage * config_bullet_energy + matter_power += Proj.damage * config_bullet_energy return BULLET_ACT_HIT /obj/machinery/power/supermatter_crystal/singularity_act() diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 4aabd82d6a..bd6c37973f 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -221,3 +221,13 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) rs += "[R.name], [R.volume]" return rs.Join(" | ") + +//For easy bloodsucker disgusting and blood removal +/datum/reagent/proc/disgust_bloodsucker(mob/living/carbon/C, disgust, blood_change, blood_puke = TRUE, force) + if(isvamp(C)) + var/datum/antagonist/bloodsucker/bloodsuckerdatum = C.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if(disgust) + bloodsuckerdatum.handle_eat_human_food(disgust, blood_puke, force) + if(blood_change) + bloodsuckerdatum.AddBloodVolume(blood_change) + diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 4b65776ce9..e22f8caf89 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -579,8 +579,8 @@ All effects don't start immediately, but rather get worse over time; the rate is value = 1.3 /datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/C) - if((HAS_TRAIT(C, TRAIT_NOMARROW))) - return + if(isvamp(C)) + disgust_bloodsucker(FALSE, 1) //Bloodsuckers get SOME blood from it, for style reasons. if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio)) C.blood_volume = min((BLOOD_VOLUME_NORMAL*C.blood_ratio), C.blood_volume + 3) //Bloody Mary quickly restores blood loss. ..() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index adc30ecdc9..9794b58112 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -13,7 +13,7 @@ shot_glass_icon_state = "shotglassred" pH = 7.4 -/datum/reagent/blood/reaction_mob(mob/living/L, method=TOUCH, reac_volume) +/datum/reagent/blood/reaction_mob(mob/living/L, method = TOUCH, reac_volume) if(data && data["viruses"]) for(var/thing in data["viruses"]) var/datum/disease/D = thing @@ -26,6 +26,18 @@ else //ingest, patch or inject L.ForceContractDisease(D) + if(data["blood_type"] == "SY") + //Synthblood is very disgusting to bloodsuckers. They will puke it out to expel it, unless they have masquarade on + switch(reac_volume) + if(0 to 3) + disgust_bloodsucker(L, 3, FALSE, FALSE, FALSE) + if(3 to 6) + //If theres more than 8 units, they will start expelling it, even if they are masquarading. + disgust_bloodsucker(L, 5, FALSE, FALSE, TRUE) + else + //If they have too much in them, they will also puke out their blood. + disgust_bloodsucker(L, 7, -5, TRUE, TRUE) + if(iscarbon(L)) var/mob/living/carbon/C = L var/blood_id = C.get_blood_id() @@ -37,10 +49,8 @@ L.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) /datum/reagent/blood/on_mob_life(mob/living/carbon/C) //Because lethals are preferred over stamina. damnifino. - if((HAS_TRAIT(C, TRAIT_NOMARROW))) - return //We dont want vampires getting toxed from blood var/blood_id = C.get_blood_id() - if((blood_id == /datum/reagent/blood || blood_id == /datum/reagent/blood/jellyblood)) + if((blood_id in GLOB.blood_reagent_types) && !HAS_TRAIT(C, TRAIT_NOMARROW)) if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) //we only care about bloodtype here because this is where the poisoning should be C.adjustToxLoss(rand(2,8)*REM, TRUE, TRUE) //forced to ensure people don't use it to gain beneficial toxin as slime person ..() @@ -117,7 +127,7 @@ if(!istype(D, /datum/disease/advance)) preserve += D data["viruses"] = preserve - return 1 + return TRUE /datum/reagent/blood/proc/get_diseases() . = list() @@ -142,6 +152,13 @@ taste_mult = 1.3 pH = 4 +/datum/reagent/blood/tomato + data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + name = "Tomato Blood" + description = "This highly resembles blood, but it doesnt actually function like it, resembling more ketchup, with a more blood-like consistency." + taste_description = "sap" //Like tree sap? + pH = 7.45 + /datum/reagent/blood/jellyblood/on_mob_life(mob/living/carbon/M) if(prob(10)) if(M.dna?.species?.exotic_bloodtype != "GEL") diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 2f5fb067ea..3296586c94 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -89,7 +89,7 @@ blood_type = "BUG" /obj/item/reagent_containers/blood/attackby(obj/item/I, mob/user, params) - if (istype(I, /obj/item/pen) || istype(I, /obj/item/toy/crayon)) + if(istype(I, /obj/item/pen) || istype(I, /obj/item/toy/crayon)) if(!user.is_literate()) to_chat(user, "You scribble illegibly on the label of [src]!") return @@ -107,25 +107,31 @@ else return ..() -/obj/item/reagent_containers/blood/attack(mob/M, mob/user, def_zone) - if(user.a_intent == INTENT_HELP && reagents.total_volume > 0) - if (user != M) - to_chat(user, "You force [M] to drink from the [src]") - user.visible_message("[user] forces [M] to drink from the [src].") - if(!do_mob(user, M, 50)) +/obj/item/reagent_containers/blood/attack(mob/living/carbon/C, mob/user, def_zone) + if(user.a_intent == INTENT_HELP && reagents.total_volume > 0 && iscarbon(C) && user.a_intent == INTENT_HELP) + if(C.is_mouth_covered()) + to_chat(user, "You cant drink from the [src] while your mouth is covered.") + return + if(user != C) + user.visible_message("[user] forces [C] to drink from the [src].", \ + "You force [C] to drink from the [src]") + if(!do_mob(user, C, 50)) return else - if(!do_mob(user, M, 10)) + if(!do_mob(user, C, 10)) return + to_chat(user, "You take a sip from the [src].") user.visible_message("[user] puts the [src] up to their mouth.") if(reagents.total_volume <= 0) // Safety: In case you spam clicked the blood bag on yourself, and it is now empty (below will divide by zero) return - var/gulp_size = 5 + var/gulp_size = 3 var/fraction = min(gulp_size / reagents.total_volume, 1) - reagents.reaction(M, INGEST, fraction) //checkLiked(fraction, M) // Blood isn't food, sorry. - reagents.trans_to(M, gulp_size) - playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) + reagents.reaction(C, INGEST, fraction) //checkLiked(fraction, M) // Blood isn't food, sorry. + reagents.trans_to(C, gulp_size) + reagents.remove_reagent(src, 2) //Inneficency, so hey, IVs are usefull. + playsound(C.loc,'sound/items/drink.ogg', rand(10, 50), TRUE) + return ..() /obj/item/reagent_containers/blood/bluespace @@ -133,3 +139,14 @@ desc = "Contains blood used for transfusion, this one has been made with bluespace technology to hold much more blood. Must be attached to an IV drip." icon_state = "bsbloodpack" volume = 600 //its a blood bath! + +/obj/item/reagent_containers/blood/bluespace/attack(mob/living/carbon/C, mob/user, def_zone) + if(user.a_intent == INTENT_HELP) + if(user != C) + to_chat(user, "You can't force people to drink from the [src]. Nothing comes out from it.") + return + else + to_chat(user, "You try to suck on the [src], but nothing comes out.") + return + else + ..() diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index b774aaf793..ac2b34b855 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -350,7 +350,7 @@ //Miasma sickness if(prob(0.05 * miasma_pp)) - var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3) + var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(TRUE, 2,3) miasma_disease.name = "Unknown" miasma_disease.try_infect(owner) diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index d368a9bbca..ba5e511612 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -32,24 +32,29 @@ icon_state = "medidrobe" product_ads = "Make those blood stains look fashionable!!" vend_reply = "Thank you for using the MediDrobe!" - products = list(/obj/item/clothing/accessory/pocketprotector = 3, - /obj/item/clothing/head/beret/med = 3, - /obj/item/storage/backpack/duffelbag/med = 3, - /obj/item/storage/backpack/medic = 3, - /obj/item/storage/backpack/satchel/med = 3, - /obj/item/clothing/suit/hooded/wintercoat/medical = 3, - /obj/item/clothing/under/rank/nursesuit = 3, - /obj/item/clothing/head/nursehat = 3, + products = list(/obj/item/clothing/accessory/pocketprotector = 5, + /obj/item/clothing/head/beret/med = 5, + /obj/item/storage/backpack/duffelbag/med = 5, + /obj/item/storage/backpack/medic = 5, + /obj/item/storage/backpack/satchel/med = 5, + /obj/item/clothing/suit/hooded/wintercoat/medical = 5, + /obj/item/clothing/under/rank/nursesuit = 5, + /obj/item/clothing/head/nursehat = 5, /obj/item/clothing/under/rank/medical/skirt= 5, - /obj/item/clothing/under/rank/medical/blue = 2, - /obj/item/clothing/under/rank/medical/green = 2, - /obj/item/clothing/under/rank/medical/purple = 2, + /obj/item/clothing/under/rank/medical/blue = 5, + /obj/item/clothing/under/rank/medical/green = 5, + /obj/item/clothing/under/rank/medical/purple = 5, /obj/item/clothing/under/rank/medical = 5, + /obj/item/clothing/under/rank/medical/paramedic = 5, + /obj/item/clothing/under/rank/medical/paramedic/light = 5, + /obj/item/clothing/under/rank/medical/paramedic/skirt = 5, + /obj/item/clothing/under/rank/medical/paramedic/skirt/light = 5, /obj/item/clothing/suit/toggle/labcoat = 5, + /obj/item/clothing/suit/toggle/labcoat/paramedic = 5, /obj/item/clothing/suit/toggle/labcoat/emt = 5, /obj/item/clothing/shoes/sneakers/white = 5, /obj/item/clothing/head/soft/emt = 5, - /obj/item/clothing/suit/apron/surgical = 3, + /obj/item/clothing/suit/apron/surgical = 5, /obj/item/clothing/mask/surgical = 5) refill_canister = /obj/item/vending_refill/wardrobe/medi_wardrobe diff --git a/html/changelogs/AutoChangeLog-pr-11041.yml b/html/changelogs/AutoChangeLog-pr-11041.yml new file mode 100644 index 0000000000..b9d9a993a2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11041.yml @@ -0,0 +1,4 @@ +author: "Arturlang" +delete-after: True +changes: + - balance: "Bloodsuckers can no longer get usable blood from blood tomatoes." diff --git a/html/changelogs/AutoChangeLog-pr-11203.yml b/html/changelogs/AutoChangeLog-pr-11203.yml new file mode 100644 index 0000000000..aa685ef522 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11203.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "Three new posters have been issued to the printing press" diff --git a/html/changelogs/AutoChangeLog-pr-11250.yml b/html/changelogs/AutoChangeLog-pr-11250.yml new file mode 100644 index 0000000000..8ed1ea85ba --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11250.yml @@ -0,0 +1,5 @@ +author: "Seris02" +delete-after: True +changes: + - balance: "rebalanced rising bass's buttom actions from repulse to side kick" + - bugfix: "projectiles and rising bass and items and rising bass" diff --git a/html/changelogs/AutoChangeLog-pr-11268.yml b/html/changelogs/AutoChangeLog-pr-11268.yml new file mode 100644 index 0000000000..f8f33cfdd2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11268.yml @@ -0,0 +1,6 @@ +author: "raspyosu" +delete-after: True +changes: + - bugfix: "cloak sometimes not restoring initial move intent" + - tweak: "mesmerize (line of sight checking system and remove progress bar)" + - balance: "nerf: lunge, mesmerize" diff --git a/html/changelogs/AutoChangeLog-pr-11270.yml b/html/changelogs/AutoChangeLog-pr-11270.yml new file mode 100644 index 0000000000..86a4df8fc2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11270.yml @@ -0,0 +1,5 @@ +author: "ancientpower" +delete-after: True +changes: + - imageadd: "Snazzier sprites for paramedic gear." + - rscadd: "Unused paramedic gear added for future use." diff --git a/html/changelogs/AutoChangeLog-pr-11271.yml b/html/changelogs/AutoChangeLog-pr-11271.yml new file mode 100644 index 0000000000..382144298a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11271.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - tweak: "Pushing is no longer free space movement." diff --git a/html/changelogs/AutoChangeLog-pr-11279.yml b/html/changelogs/AutoChangeLog-pr-11279.yml new file mode 100644 index 0000000000..5f4aa506f2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11279.yml @@ -0,0 +1,5 @@ +author: "Dennok, ported by Hatterhat" +delete-after: True +changes: + - bugfix: "Lava rivers no longer burn into basalt." + - code_imp: "The river generator can now specify baseturfs." diff --git a/html/changelogs/AutoChangeLog-pr-11283.yml b/html/changelogs/AutoChangeLog-pr-11283.yml new file mode 100644 index 0000000000..ae0d2706da --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11283.yml @@ -0,0 +1,4 @@ +author: "Ragolution" +delete-after: True +changes: + - rscadd: "All winter coats and hoods might be different if slightly from one a other." diff --git a/html/changelogs/AutoChangeLog-pr-11287.yml b/html/changelogs/AutoChangeLog-pr-11287.yml new file mode 100644 index 0000000000..5a1939e90c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11287.yml @@ -0,0 +1,4 @@ +author: "monster860" +delete-after: True +changes: + - tweak: "You can now moan in soft crit" diff --git a/html/changelogs/AutoChangeLog-pr-11291.yml b/html/changelogs/AutoChangeLog-pr-11291.yml new file mode 100644 index 0000000000..829de0f341 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11291.yml @@ -0,0 +1,4 @@ +author: "YakumoChen" +delete-after: True +changes: + - bugfix: "Mining base looks more natural where it's spawned." diff --git a/html/changelogs/AutoChangeLog-pr-11296.yml b/html/changelogs/AutoChangeLog-pr-11296.yml new file mode 100644 index 0000000000..3c255ee7de --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11296.yml @@ -0,0 +1,5 @@ +author: "Putnam3145" +delete-after: True +changes: + - bugfix: "Actually made things work as intended." + - code_imp: "Removed a redundant turf melting check from the supermatter." diff --git a/html/changelogs/AutoChangeLog-pr-11299.yml b/html/changelogs/AutoChangeLog-pr-11299.yml new file mode 100644 index 0000000000..a0c29184d0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11299.yml @@ -0,0 +1,4 @@ +author: "Linzolle" +delete-after: True +changes: + - bugfix: "flypeople being unable to gain nutrition from eating vomit" diff --git a/html/changelogs/AutoChangeLog-pr-11300.yml b/html/changelogs/AutoChangeLog-pr-11300.yml new file mode 100644 index 0000000000..362127bdb6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11300.yml @@ -0,0 +1,4 @@ +author: "kappa-sama" +delete-after: True +changes: + - rscdel: "removed laptops giving slowdown when open" diff --git a/html/changelogs/AutoChangeLog-pr-11302.yml b/html/changelogs/AutoChangeLog-pr-11302.yml new file mode 100644 index 0000000000..b4012bd269 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11302.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - bugfix: "compact defibs have 10k cells again" diff --git a/icons/mob/actions/actions_items.dmi b/icons/mob/actions/actions_items.dmi index f5ba86c0fa..8b21c32d6b 100644 Binary files a/icons/mob/actions/actions_items.dmi and b/icons/mob/actions/actions_items.dmi differ diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index 1a4b8019cd..b3960f4db6 100644 Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ diff --git a/icons/mob/feet_digi.dmi b/icons/mob/feet_digi.dmi index ddc5ff0c5f..78f50519fa 100644 Binary files a/icons/mob/feet_digi.dmi and b/icons/mob/feet_digi.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 01e9f2ac2c..05cb49e38f 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/head_muzzled.dmi b/icons/mob/head_muzzled.dmi index 5430f07726..4b8263469f 100644 Binary files a/icons/mob/head_muzzled.dmi and b/icons/mob/head_muzzled.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 41f2693800..5b501cc1aa 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/suit_digi.dmi b/icons/mob/suit_digi.dmi index da51f9e621..8bea32eca4 100644 Binary files a/icons/mob/suit_digi.dmi and b/icons/mob/suit_digi.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index bcde4d84f7..e675a8d647 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/mob/uniform_digi.dmi b/icons/mob/uniform_digi.dmi index 0b8c495c5a..82dc09e43e 100644 Binary files a/icons/mob/uniform_digi.dmi and b/icons/mob/uniform_digi.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index d5f3be5fdd..3d384b71d6 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 3c8a1332a9..1105e30ae7 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 470f2a9d69..a98e745c40 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 0881a2c289..090003011b 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi new file mode 100644 index 0000000000..1e429754f0 Binary files /dev/null and b/icons/obj/contraband.dmi differ diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi index a35837eedd..4856eefa3e 100644 Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ diff --git a/sound/roundend/seeyoulaterokay.ogg b/sound/roundend/seeyoulaterokay.ogg new file mode 100644 index 0000000000..8d08103a73 Binary files /dev/null and b/sound/roundend/seeyoulaterokay.ogg differ