From 3af0aa2489a9af4dbdab09812185317fe3341358 Mon Sep 17 00:00:00 2001 From: XDTM Date: Mon, 18 Dec 2017 22:20:07 +0100 Subject: [PATCH 01/86] [Ready Again]Refactors disabilities into lists, allowing for independent disability sources --- code/__DEFINES/stat.dm | 25 +++ code/_onclick/item_attack.dm | 5 + code/datums/antagonists/changeling.dm | 2 +- code/datums/brain_damage/mild.dm | 4 +- code/datums/brain_damage/severe.dm | 44 +++--- .../diseases/advance/symptoms/vision.dm | 15 +- code/datums/martial/sleeping_carp.dm | 2 +- code/datums/mutations.dm | 1 - code/datums/mutations/body.dm | 8 +- code/datums/mutations/sight.dm | 8 +- code/datums/mutations/speech.dm | 4 +- .../gamemodes/changeling/powers/tiny_prick.dm | 16 +- .../clock_items/wraith_spectacles.dm | 25 +-- .../clock_structures/ocular_warden.dm | 2 +- code/game/gamemodes/cult/runes.dm | 2 +- code/game/machinery/computer/cloning.dm | 2 +- code/game/machinery/computer/dna_console.dm | 4 +- code/game/machinery/dna_scanner.dm | 2 +- code/game/objects/items.dm | 10 +- code/game/objects/items/defib.dm | 4 +- code/game/objects/items/devices/flashlight.dm | 4 +- code/game/objects/items/devices/scanners.dm | 11 +- code/game/objects/items/dna_injector.dm | 4 +- code/game/objects/items/grenades/grenade.dm | 2 +- code/game/objects/items/handcuffs.dm | 2 +- code/game/objects/items/kitchen.dm | 4 +- code/game/objects/items/melee/misc.dm | 2 +- code/game/objects/items/melee/transforming.dm | 2 +- code/game/objects/items/pneumaticCannon.dm | 2 +- code/game/objects/items/shields.dm | 145 ++++++++++++++++++ code/game/objects/items/storage/book.dm | 2 +- code/game/objects/items/stunbaton.dm | 2 +- code/game/objects/items/teleprod.dm | 2 +- code/game/objects/items/tools/screwdriver.dm | 4 +- code/game/objects/items/twohanded.dm | 2 +- .../objects/structures/petrified_statue.dm | 4 +- code/modules/assembly/flash.dm | 2 +- code/modules/assembly/mousetrap.dm | 145 ++++++++++++++++++ code/modules/clothing/glasses/_glasses.dm | 2 +- code/modules/events/disease_outbreak.dm | 14 ++ .../mining/lavaland/necropolis_chests.dm | 2 +- code/modules/mob/living/blood.dm | 8 +- code/modules/mob/living/brain/brain_item.dm | 4 +- code/modules/mob/living/carbon/carbon.dm | 16 +- .../mob/living/carbon/carbon_defense.dm | 8 +- code/modules/mob/living/carbon/human/death.dm | 4 +- .../mob/living/carbon/human/human_defense.dm | 5 + .../mob/living/carbon/human/interactive.dm | 2 +- .../mob/living/carbon/human/inventory.dm | 2 +- .../mob/living/carbon/human/species.dm | 20 ++- .../carbon/human/species_types/golems.dm | 2 +- .../mob/living/carbon/human/status_procs.dm | 4 +- .../mob/living/carbon/human/update_icons.dm | 2 +- .../mob/living/carbon/monkey/combat.dm | 7 + .../mob/living/carbon/monkey/update_icons.dm | 2 +- .../modules/mob/living/carbon/status_procs.dm | 37 +---- .../modules/mob/living/carbon/update_icons.dm | 2 +- code/modules/mob/living/life.dm | 8 +- code/modules/mob/living/living.dm | 7 +- code/modules/mob/living/living_defense.dm | 45 +++++- code/modules/mob/living/living_defines.dm | 2 + code/modules/mob/living/say.dm | 2 +- .../hostile/megafauna/colossus.dm | 6 +- code/modules/mob/living/status_procs.dm | 73 +++++++++ code/modules/mob/mob_defines.dm | 1 - code/modules/mob/status_procs.dm | 37 ++--- code/modules/paperwork/paper.dm | 4 +- code/modules/paperwork/paperplane.dm | 2 +- code/modules/projectiles/gun.dm | 2 +- .../projectiles/guns/ballistic/revolver.dm | 2 +- code/modules/projectiles/pins.dm | 2 +- .../chemistry/reagents/drink_reagents.dm | 2 +- .../chemistry/reagents/medicine_reagents.dm | 14 +- .../chemistry/reagents/toxin_reagents.dm | 2 +- .../spells/spell_types/construct_spells.dm | 6 +- code/modules/spells/spell_types/genetic.dm | 32 +++- code/modules/surgery/bodyparts/bodyparts.dm | 2 +- code/modules/surgery/bodyparts/head.dm | 2 +- code/modules/surgery/eye_surgery.dm | 4 +- code/modules/surgery/lipoplasty.dm | 2 +- code/modules/surgery/organs/ears.dm | 4 +- 81 files changed, 711 insertions(+), 221 deletions(-) diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm index 331bc6765f..208970ff9f 100644 --- a/code/__DEFINES/stat.dm +++ b/code/__DEFINES/stat.dm @@ -10,6 +10,7 @@ //mob disabilities stat +<<<<<<< HEAD #define BLIND 1 #define MUTE 2 #define DEAF 4 @@ -20,6 +21,30 @@ #define CLUMSY 256 #define DUMB 512 #define MONKEYLIKE 1024 //sets IsAdvancedToolUser to FALSE +======= +#define BLIND "blind" +#define MUTE "mute" +#define DEAF "deaf" +#define NEARSIGHT "nearsighted" +#define FAT "fat" +#define HUSK "husk" +#define NOCLONE "noclone" +#define CLUMSY "clumsy" +#define DUMB "dumb" +#define MONKEYLIKE "monkeylike" //sets IsAdvancedToolUser to FALSE +#define PACIFISM "pacifism" + +// common disability sources +#define EYE_DAMAGE "eye_damage" +#define GENETIC_MUTATION "genetic" +#define STATUE_MUTE "statue" +#define CHANGELING_DRAIN "drain" +#define OBESITY "obesity" +#define MAGIC_DISABILITY "magic" +#define STASIS_MUTE "stasis" +#define GENETICS_SPELL "genetics_spell" +#define TRAUMA_DISABILITY "trauma" +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) // bitflags for machine stat variable #define BROKEN 1 diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 859c957a43..134e33224f 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -58,6 +58,11 @@ SendSignal(COMSIG_ITEM_ATTACK, M, user) if(flags_1 & NOBLUDGEON_1) return +<<<<<<< HEAD +======= + if(user.has_disability(PACIFISM)) + return +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) if(!force) playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), 1, -1) else if(hitsound) diff --git a/code/datums/antagonists/changeling.dm b/code/datums/antagonists/changeling.dm index e98bfed782..1eddc725d2 100644 --- a/code/datums/antagonists/changeling.dm +++ b/code/datums/antagonists/changeling.dm @@ -223,7 +223,7 @@ if(verbose) to_chat(user, "[target] is not compatible with our biology.") return - if((target.disabilities & NOCLONE) || (target.disabilities & HUSK)) + if((target.has_disability(NOCLONE)) || (target.has_disability(NOCLONE))) if(verbose) to_chat(user, "DNA of [target] is ruined beyond usability!") return diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index 6bfa149aa7..29d08b4ce1 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -42,7 +42,7 @@ lose_text = "You feel smart again." /datum/brain_trauma/mild/dumbness/on_gain() - owner.disabilities |= DUMB + owner.add_disability(DUMB, TRAUMA_DISABILITY) ..() /datum/brain_trauma/mild/dumbness/on_life() @@ -54,7 +54,7 @@ ..() /datum/brain_trauma/mild/dumbness/on_lose() - owner.disabilities &= ~DUMB + owner.remove_disability(DUMB, TRAUMA_DISABILITY) owner.derpspeech = 0 ..() diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 08cee65085..a36d4b9fb8 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -12,17 +12,11 @@ lose_text = "You suddenly remember how to speak." /datum/brain_trauma/severe/mute/on_gain() - owner.disabilities |= MUTE - ..() - -//no fiddling with genetics to get out of this one -/datum/brain_trauma/severe/mute/on_life() - if(!(owner.disabilities & MUTE)) - on_gain() + owner.add_disability(MUTE, TRAUMA_DISABILITY) ..() /datum/brain_trauma/severe/mute/on_lose() - owner.disabilities &= ~MUTE + owner.remove_disability(MUTE, TRAUMA_DISABILITY) ..() /datum/brain_trauma/severe/blindness @@ -33,17 +27,11 @@ lose_text = "Your vision returns." /datum/brain_trauma/severe/blindness/on_gain() - owner.become_blind() - ..() - -//no fiddling with genetics to get out of this one -/datum/brain_trauma/severe/blindness/on_life() - if(!(owner.disabilities & BLIND)) - on_gain() + owner.become_blind(TRAUMA_DISABILITY) ..() /datum/brain_trauma/severe/blindness/on_lose() - owner.cure_blind() + owner.cure_blind(TRAUMA_DISABILITY) ..() /datum/brain_trauma/severe/paralysis @@ -109,7 +97,7 @@ stress -= 4 /datum/brain_trauma/severe/monophobia/proc/check_alone() - if(owner.disabilities & BLIND) + if(owner.has_disability(BLIND)) return TRUE for(var/mob/M in oview(owner, 7)) if(!isliving(M)) //ghosts ain't people @@ -171,9 +159,27 @@ lose_text = "You feel in control of your hands again." /datum/brain_trauma/severe/discoordination/on_gain() - owner.disabilities |= MONKEYLIKE + owner.add_disability(MONKEYLIKE, TRAUMA_DISABILITY) ..() /datum/brain_trauma/severe/discoordination/on_lose() - owner.disabilities &= ~MONKEYLIKE + owner.remove_disability(MONKEYLIKE, TRAUMA_DISABILITY) ..() +<<<<<<< HEAD +======= + +/datum/brain_trauma/severe/pacifism + name = "Traumatic Non-Violence" + desc = "Patient is extremely unwilling to harm others in violent ways." + scan_desc = "pacific syndrome" + gain_text = "You feel oddly peaceful." + lose_text = "You no longer feel compelled to not harm." + +/datum/brain_trauma/severe/pacifism/on_gain() + owner.add_disability(PACIFISM, TRAUMA_DISABILITY) + ..() + +/datum/brain_trauma/severe/pacifism/on_lose() + owner.remove_disability(PACIFISM, TRAUMA_DISABILITY) + ..() +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) diff --git a/code/datums/diseases/advance/symptoms/vision.dm b/code/datums/diseases/advance/symptoms/vision.dm index 728dfa01d0..39d853a758 100644 --- a/code/datums/diseases/advance/symptoms/vision.dm +++ b/code/datums/diseases/advance/symptoms/vision.dm @@ -58,11 +58,12 @@ Bonus M.blur_eyes(20) M.adjust_eye_damage(5) if(eyes.eye_damage >= 10) - M.become_nearsighted() + M.become_nearsighted(EYE_DAMAGE) if(prob(eyes.eye_damage - 10 + 1)) if(!remove_eyes) - if(M.become_blind()) + if(!M.has_disability(BLIND)) to_chat(M, "You go blind!") + M.become_blind(EYE_DAMAGE) else M.visible_message("[M]'s eyes fall off their sockets!", "Your eyes fall off their sockets!") eyes.Remove(M) @@ -111,16 +112,16 @@ Bonus return switch(A.stage) if(4, 5) //basically oculine - if(M.disabilities & BLIND) + if(M.has_disability(BLIND, EYE_DAMAGE)) if(prob(20)) to_chat(M, "Your vision slowly returns...") - M.cure_blind() - M.cure_nearsighted() + M.cure_blind(EYE_DAMAGE) + M.cure_nearsighted(EYE_DAMAGE) M.blur_eyes(35) - else if(M.disabilities & NEARSIGHT) + else if(M.has_disability(NEARSIGHT, EYE_DAMAGE)) to_chat(M, "The blackness in your peripheral vision fades.") - M.cure_nearsighted() + M.cure_nearsighted(EYE_DAMAGE) M.blur_eyes(10) else if(M.eye_blind || M.eye_blurry) diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index f3a1f53dd2..0a4309e708 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -197,7 +197,7 @@ /obj/item/twohanded/bostaff/attack(mob/target, mob/living/user) add_fingerprint(user) - if((CLUMSY in user.disabilities) && prob(50)) + if((user.has_disability(CLUMSY)) && prob(50)) to_chat(user, "You club yourself over the head with [src].") user.Knockdown(60) if(ishuman(user)) diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index 170c0a2a7f..a171cf91da 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -8,7 +8,6 @@ GLOBAL_LIST_EMPTY(mutations_list) GLOB.mutations_list[name] = src /datum/mutation/human - var/dna_block var/quality var/get_chance = 100 diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index 23b91add58..015004eef6 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -85,12 +85,12 @@ /datum/mutation/human/clumsy/on_acquiring(mob/living/carbon/human/owner) if(..()) return - owner.disabilities |= CLUMSY + owner.add_disability(CLUMSY, GENETIC_MUTATION) /datum/mutation/human/clumsy/on_losing(mob/living/carbon/human/owner) if(..()) return - owner.disabilities &= ~CLUMSY + owner.remove_disability(CLUMSY, GENETIC_MUTATION) //Tourettes causes you to randomly stand in place and shout. @@ -124,12 +124,12 @@ /datum/mutation/human/deaf/on_acquiring(mob/living/carbon/human/owner) if(..()) return - owner.disabilities |= DEAF + owner.add_disability(DEAF, GENETIC_MUTATION) /datum/mutation/human/deaf/on_losing(mob/living/carbon/human/owner) if(..()) return - owner.disabilities &= ~DEAF + owner.remove_disability(DEAF, GENETIC_MUTATION) //Monified turns you into a monkey. diff --git a/code/datums/mutations/sight.dm b/code/datums/mutations/sight.dm index dee26166dd..60f5d75c5e 100644 --- a/code/datums/mutations/sight.dm +++ b/code/datums/mutations/sight.dm @@ -7,12 +7,12 @@ /datum/mutation/human/nearsight/on_acquiring(mob/living/carbon/human/owner) if(..()) return - owner.become_nearsighted() + owner.become_nearsighted(GENETIC_MUTATION) /datum/mutation/human/nearsight/on_losing(mob/living/carbon/human/owner) if(..()) return - owner.cure_nearsighted() + owner.cure_nearsighted(GENETIC_MUTATION) //Blind makes you blind. Who knew? @@ -24,12 +24,12 @@ /datum/mutation/human/blind/on_acquiring(mob/living/carbon/human/owner) if(..()) return - owner.become_blind() + owner.become_blind(GENETIC_MUTATION) /datum/mutation/human/blind/on_losing(mob/living/carbon/human/owner) if(..()) return - owner.cure_blind() + owner.cure_blind(GENETIC_MUTATION) //X-Ray Vision lets you see through walls. diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm index 3b4b38bbcc..dc1333024a 100644 --- a/code/datums/mutations/speech.dm +++ b/code/datums/mutations/speech.dm @@ -30,12 +30,12 @@ /datum/mutation/human/mute/on_acquiring(mob/living/carbon/human/owner) if(..()) return - owner.disabilities |= MUTE + owner.add_disability(MUTE, GENETIC_MUTATION) /datum/mutation/human/mute/on_losing(mob/living/carbon/human/owner) if(..()) return - owner.disabilities &= ~MUTE + owner.remove_disability(MUTE, GENETIC_MUTATION) /datum/mutation/human/smile diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index 4fdd84040e..e3f486a2f1 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -20,7 +20,7 @@ to_chat(user, "We prepare our sting, use alt+click or middle mouse button on target to sting them.") var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) changeling.chosen_sting = src - + user.hud_used.lingstingdisplay.icon_state = sting_icon user.hud_used.lingstingdisplay.invisibility = 0 @@ -28,7 +28,7 @@ to_chat(user, "We retract our sting, we can't sting anyone for now.") var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) changeling.chosen_sting = null - + user.hud_used.lingstingdisplay.icon_state = null user.hud_used.lingstingdisplay.invisibility = INVISIBILITY_ABSTRACT @@ -90,7 +90,7 @@ /obj/effect/proc_holder/changeling/sting/transformation/can_sting(mob/user, mob/living/carbon/target) if(!..()) return - if((target.disabilities & HUSK) || !iscarbon(target) || (NOTRANSSTING in target.dna.species.species_traits)) + if((target.has_disability(HUSK)) || !iscarbon(target) || (NOTRANSSTING in target.dna.species.species_traits)) to_chat(user, "Our sting appears ineffective against its DNA.") return 0 return 1 @@ -129,9 +129,11 @@ /obj/effect/proc_holder/changeling/sting/false_armblade/can_sting(mob/user, mob/target) if(!..()) return - if((target.disabilities & HUSK) || !target.has_dna()) - to_chat(user, "Our sting appears ineffective against its DNA.") - return 0 + if(isliving(target)) + var/mob/living/L = target + if((L.has_disability(HUSK)) || !L.has_dna()) + to_chat(user, "Our sting appears ineffective against its DNA.") + return 0 return 1 /obj/effect/proc_holder/changeling/sting/false_armblade/sting_action(mob/user, mob/target) @@ -207,7 +209,7 @@ /obj/effect/proc_holder/changeling/sting/blind/sting_action(mob/user, mob/living/carbon/target) add_logs(user, target, "stung", "blind sting") to_chat(target, "Your eyes burn horrifically!") - target.become_nearsighted() + target.become_nearsighted(EYE_DAMAGE) target.blind_eyes(20) target.blur_eyes(40) return TRUE diff --git a/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm b/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm index fc734ac426..b579326fcc 100644 --- a/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm +++ b/code/game/gamemodes/clock_cult/clock_items/wraith_spectacles.dm @@ -32,7 +32,7 @@ if(ishuman(loc)) var/mob/living/carbon/human/H = loc if(src == H.glasses && !up) - if(H.disabilities & BLIND) + if(H.has_disability(BLIND)) to_chat(H, "\"You're blind, idiot. Stop embarrassing yourself.\"") return if(blind_cultist(H)) @@ -51,7 +51,7 @@ to_chat(victim, "\"It looks like Nar-Sie's dogs really don't value their eyes.\"") to_chat(victim, "Your eyes explode with horrific pain!") victim.emote("scream") - victim.become_blind() + victim.become_blind(EYE_DAMAGE) victim.adjust_blurriness(30) victim.adjust_blindness(30) return TRUE @@ -76,7 +76,7 @@ ..() if(slot != slot_glasses || up) return - if(user.disabilities & BLIND) + if(user.has_disability(BLIND)) to_chat(user, "\"You're blind, idiot. Stop embarrassing yourself.\"" ) return if(blind_cultist(user)) //Cultists instantly go blind @@ -115,11 +115,11 @@ var/obj/item/clothing/glasses/wraith_spectacles/WS = L.glasses desc = "[glasses_right && !WS.up ? "":""]You are [glasses_right ? "":"not "]wearing wraith spectacles[glasses_right && !WS.up ? "!":"."]
\ You have taken [W.eye_damage_done] eye damage from them.
" - if(L.disabilities & NEARSIGHT) + if(L.has_disability(NEARSIGHT)) desc += "You are nearsighted!
" else if(glasses_right && !WS.up) desc += "You will become nearsighted at [W.nearsight_breakpoint] eye damage.
" - if(L.disabilities & BLIND) + if(L.has_disability(BLIND)) desc += "You are blind!" else if(glasses_right && !WS.up) desc += "You will become blind at [W.blind_breakpoint] eye damage." @@ -142,8 +142,8 @@ apply_eye_damage(H) else if(GLOB.ratvar_awakens) - H.cure_nearsighted() - H.cure_blind() + H.cure_nearsighted(list(EYE_DAMAGE)) + H.cure_blind(list(EYE_DAMAGE)) H.adjust_eye_damage(-eye_damage_done) eye_damage_done = 0 else if(prob(50) && eye_damage_done) @@ -153,17 +153,20 @@ qdel(src) /datum/status_effect/wraith_spectacles/proc/apply_eye_damage(mob/living/carbon/human/H) - if(H.disabilities & BLIND) + if(H.has_disability(BLIND)) return H.adjust_eye_damage(0.5) eye_damage_done += 0.5 if(eye_damage_done >= 20) H.adjust_blurriness(2) if(eye_damage_done >= nearsight_breakpoint) - if(H.become_nearsighted()) - to_chat(H, "Your vision doubles, then trebles. Darkness begins to close in. You can't keep this up!") + if(!H.has_disability(NEARSIGHT)) + to_chat(H, "Your vision doubles, then trembles. Darkness begins to close in. You can't keep this up!") + H.become_nearsighted(EYE_DAMAGE) if(eye_damage_done >= blind_breakpoint) - if(H.become_blind()) + if(!H.has_disability(BLIND)) to_chat(H, "A piercing white light floods your vision. Suddenly, all goes dark!") + H.become_blind(EYE_DAMAGE) + if(prob(min(20, 5 + eye_damage_done))) to_chat(H, "Your eyes continue to burn.") diff --git a/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm b/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm index c7aea3df7e..76e942037c 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/ocular_warden.dm @@ -110,7 +110,7 @@ if(!(BI.resistance_flags & ON_FIRE)) BI.fire_act() continue - if(is_servant_of_ratvar(L) || (L.disabilities & BLIND) || L.null_rod_check()) + if(is_servant_of_ratvar(L) || (L.has_disability(BLIND)) || L.null_rod_check()) continue if(L.stat || L.restrained() || L.buckled || L.lying) continue diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 33d5f49661..8472c6c7cf 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -115,7 +115,7 @@ structure_check() searches for nearby cultist structures required for the invoca continue if(ishuman(L)) var/mob/living/carbon/human/H = L - if((H.disabilities & MUTE) || H.silent) + if((H.has_disability(MUTE)) || H.silent) continue if(L.stat) continue diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 7814e05138..c4a4d118b3 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -449,7 +449,7 @@ scantemp = "Subject's brain is not responding to scanning stimuli." playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, 0) return - if((mob_occupant.disabilities & NOCLONE) && (src.scanner.scan_level < 2)) + if((mob_occupant.has_disability(NOCLONE)) && (src.scanner.scan_level < 2)) scantemp = "Subject no longer contains the fundamental materials required to create a living clone." playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0) return diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index 9fa196bd46..e5bd141d05 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -81,7 +81,7 @@ if(connected && connected.is_operational()) if(connected.occupant) //set occupant_status message viable_occupant = connected.occupant - if(viable_occupant.has_dna() && (!(RADIMMUNE in viable_occupant.dna.species.species_traits)) && (!(viable_occupant.disabilities & NOCLONE) || (connected.scan_level == 3))) //occupant is viable for dna modification + if(viable_occupant.has_dna() && (!(RADIMMUNE in viable_occupant.dna.species.species_traits)) && (!(viable_occupant.has_disability(NOCLONE)) || (connected.scan_level == 3))) //occupant is viable for dna modification occupant_status += "[viable_occupant.name] => " switch(viable_occupant.stat) if(CONSCIOUS) @@ -527,7 +527,7 @@ var/mob/living/carbon/viable_occupant = null if(connected) viable_occupant = connected.occupant - if(!istype(viable_occupant) || !viable_occupant.dna || (viable_occupant.disabilities & NOCLONE)) + if(!istype(viable_occupant) || !viable_occupant.dna || (viable_occupant.has_disability(NOCLONE))) viable_occupant = null return viable_occupant diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index d1189ff8b8..29df5e4949 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -100,7 +100,7 @@ var/mob/living/mob_occupant = get_mob_or_brainmob(occupant) if(istype(mob_occupant)) if(locate_computer(/obj/machinery/computer/cloning)) - if(!mob_occupant.suiciding && !(mob_occupant.disabilities & NOCLONE) && !mob_occupant.hellbound) + if(!mob_occupant.suiciding && !(mob_occupant.has_disability(NOCLONE)) && !mob_occupant.hellbound) mob_occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!", source = src) // DNA manipulators cannot operate on severed heads or brains diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index a74b246282..52933c4fbe 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -536,9 +536,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) M.adjust_blurriness(15) if(M.stat != DEAD) to_chat(M, "Your eyes start to bleed profusely!") - if(!(M.disabilities & (NEARSIGHT | BLIND))) - if(M.become_nearsighted()) - to_chat(M, "You become nearsighted!") + if(!(M.has_disability(BLIND) || M.has_disability(NEARSIGHT))) + to_chat(M, "You become nearsighted!") + M.become_nearsighted(EYE_DAMAGE) if(prob(50)) if(M.stat != DEAD) if(M.drop_all_held_items()) @@ -547,8 +547,8 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) M.Unconscious(20) M.Knockdown(40) if (prob(eyes.eye_damage - 10 + 1)) - if(M.become_blind()) - to_chat(M, "You go blind!") + M.become_blind(EYE_DAMAGE) + to_chat(M, "You go blind!") /obj/item/clean_blood() . = ..() diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index e501e24c6a..22cd62a962 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -393,7 +393,7 @@ /obj/item/twohanded/shockpaddles/proc/can_defib(mob/living/carbon/human/H) var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain) - return (!H.suiciding && !(H.disabilities & NOCLONE) && !H.hellbound && ((world.time - H.timeofdeath) < tlimit) && (H.getBruteLoss() < 180) && (H.getFireLoss() < 180) && H.getorgan(/obj/item/organ/heart) && BR && !BR.damaged_brain) + return (!H.suiciding && !(H.has_disability(NOCLONE)) && !H.hellbound && ((world.time - H.timeofdeath) < tlimit) && (H.getBruteLoss() < 180) && (H.getFireLoss() < 180) && H.getorgan(/obj/item/organ/heart) && BR && !BR.damaged_brain) /obj/item/twohanded/shockpaddles/proc/shock_touching(dmg, mob/H) if(isliving(H.pulledby)) //CLEAR! @@ -514,7 +514,7 @@ shock_touching(30, H) var/failed - if (H.suiciding || (H.disabilities & NOCLONE)) + if (H.suiciding || (H.has_disability(NOCLONE))) failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Recovery of patient impossible. Further attempts futile." else if (H.hellbound) failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's soul appears to be on another plane of existence. Further attempts futile." diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index f656d55afd..7a40d8f3a2 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -48,7 +48,7 @@ add_fingerprint(user) if(istype(M) && on && user.zone_selected in list("eyes", "mouth")) - if((user.disabilities & (CLUMSY | DUMB)) && prob(50)) //too dumb to use flashlight properly + if((user.has_disability(CLUMSY) || user.has_disability(DUMB)) && prob(50)) //too dumb to use flashlight properly return ..() //just hit them in the head if(!user.IsAdvancedToolUser()) @@ -82,7 +82,7 @@ else user.visible_message("[user] directs [src] to [M]'s eyes.", \ "You direct [src] to [M]'s eyes.") - if(M.stat == DEAD || (M.disabilities & BLIND) || !M.flash_act(visual = 1)) //mob is dead or fully blind + if(M.stat == DEAD || (M.has_disability(BLIND)) || !M.flash_act(visual = 1)) //mob is dead or fully blind to_chat(user, "[M]'s pupils don't react to the light!") else if(M.dna && M.dna.check_mutation(XRAY)) //mob has X-RAY vision to_chat(user, "[M]'s pupils give an eerie glow!") diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 9a60bb0edb..6e67ca886b 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -85,7 +85,7 @@ GAS ANALYZER /obj/item/device/healthanalyzer/attack(mob/living/M, mob/living/carbon/human/user) // Clumsiness/brain damage check - if ((user.disabilities & (CLUMSY | DUMB)) && prob(50)) + if ((user.has_disability(CLUMSY) || user.has_disability(DUMB)) && prob(50)) to_chat(user, "You stupidly try to analyze the floor's vitals!") user.visible_message("[user] has analyzed the floor's vitals!") to_chat(user, "Analyzing results for The floor:\n\tOverall status: Healthy") @@ -181,9 +181,12 @@ GAS ANALYZER to_chat(user, "\t==EAR STATUS==") if(istype(ears)) var/healthy = TRUE - if(C.disabilities & DEAF) + if(C.has_disability(DEAF, GENETIC_MUTATION)) healthy = FALSE to_chat(user, "\tSubject is genetically deaf.") + else if(C.has_disability(DEAF)) + healthy = FALSE + to_chat(user, "\tSubject is deaf.") else if(ears.ear_damage) to_chat(user, "\tSubject has [ears.ear_damage > UNHEALING_EAR_DAMAGE? "permanent ": "temporary "]hearing damage.") @@ -199,10 +202,10 @@ GAS ANALYZER to_chat(user, "\t==EYE STATUS==") if(istype(eyes)) var/healthy = TRUE - if(C.disabilities & BLIND) + if(C.has_disability(BLIND)) to_chat(user, "\tSubject is blind.") healthy = FALSE - if(C.disabilities & NEARSIGHT) + if(C.has_disability(NEARSIGHT)) to_chat(user, "\tSubject is nearsighted.") healthy = FALSE if(eyes.eye_damage > 30) diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index 9644d827ea..19008b43a6 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -31,7 +31,7 @@ /obj/item/dnainjector/proc/inject(mob/living/carbon/M, mob/user) prepare() - if(M.has_dna() && !(RADIMMUNE in M.dna.species.species_traits) && !(M.disabilities & NOCLONE)) + if(M.has_dna() && !(RADIMMUNE in M.dna.species.species_traits) && !(M.has_disability(NOCLONE))) M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2)) var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]" for(var/datum/mutation/human/HM in remove_mutations) @@ -313,7 +313,7 @@ to_chat(user, "You can't modify [M]'s DNA while [M.p_theyre()] dead.") return FALSE - if(M.has_dna() && !(M.disabilities & NOCLONE)) + if(M.has_dna() && !(M.has_disability(NOCLONE))) M.radiation += rand(20/(damage_coeff ** 2),50/(damage_coeff ** 2)) var/log_msg = "[key_name(user)] injected [key_name(M)] with the [name]" var/endtime = world.time+duration diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm index e444ecce25..257007aba9 100644 --- a/code/game/objects/items/grenades/grenade.dm +++ b/code/game/objects/items/grenades/grenade.dm @@ -24,7 +24,7 @@ qdel(src) /obj/item/grenade/proc/clown_check(mob/living/carbon/human/user) - if(user.disabilities & CLUMSY && prob(50)) + if(user.has_disability(CLUMSY) && prob(50)) to_chat(user, "Huh? How does this thing work?") preprime(user, 5, FALSE) return FALSE diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 886a248c8c..1dd2b1b1de 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -26,7 +26,7 @@ /obj/item/restraints/handcuffs/attack(mob/living/carbon/C, mob/living/carbon/human/user) if(!istype(C)) return - if(user.disabilities & CLUMSY && prob(50)) + if(user.has_disability(CLUMSY) && prob(50)) to_chat(user, "Uh... how do those things work?!") apply_cuffs(user,user) return diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index 5a8fcda09b..0a9e356014 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -44,7 +44,7 @@ forkload = null else if(user.zone_selected == "eyes") - if(user.disabilities & CLUMSY && prob(50)) + if(user.has_disability(CLUMSY) && prob(50)) M = user return eyestab(M,user) else @@ -70,7 +70,7 @@ /obj/item/kitchen/knife/attack(mob/living/carbon/M, mob/living/carbon/user) if(user.zone_selected == "eyes") - if(user.disabilities & CLUMSY && prob(50)) + if(user.has_disability(CLUMSY) && prob(50)) M = user return eyestab(M,user) else diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 6e21251b6e..6fb173b905 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -99,7 +99,7 @@ return ..() add_fingerprint(user) - if((CLUMSY in user.disabilities) && prob(50)) + if((user.has_disability(CLUMSY)) && prob(50)) to_chat(user, "You club yourself over the head.") user.Knockdown(60 * force) if(ishuman(user)) diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm index b63c5bcefa..94f7de09bc 100644 --- a/code/game/objects/items/melee/transforming.dm +++ b/code/game/objects/items/melee/transforming.dm @@ -72,6 +72,6 @@ to_chat(user, "[src] [active ? "is now active":"can now be concealed"].") /obj/item/melee/transforming/proc/clumsy_transform_effect(mob/living/user) - if(user.disabilities & CLUMSY && prob(50)) + if(user.has_disability(CLUMSY) && prob(50)) to_chat(user, "You accidentally cut yourself with [src], like a doofus!") user.take_bodypart_damage(5,5) diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 9bf0b949c0..b901d04815 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -147,7 +147,7 @@ if(tank && !tank.air_contents.remove(gasPerThrow * pressureSetting)) to_chat(user, "\The [src] lets out a weak hiss and doesn't react!") return - if(user.disabilities & CLUMSY && prob(75) && clumsyCheck) + if(user.has_disability(CLUMSY) && prob(75) && clumsyCheck) user.visible_message("[user] loses their grip on [src], causing it to go off!", "[src] slips out of your hands and goes off!") user.dropItemToGround(src, TRUE) if(prob(10)) diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 57306f498c..a746ed1778 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/item/shield name = "shield" block_chance = 50 @@ -140,3 +141,147 @@ slot_flags = null to_chat(user, "[src] can now be concealed.") add_fingerprint(user) +======= +/obj/item/shield + name = "shield" + block_chance = 50 + armor = list(melee = 50, bullet = 50, laser = 50, energy = 0, bomb = 30, bio = 0, rad = 0, fire = 80, acid = 70) + +/obj/item/shield/riot + name = "riot shield" + desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder." + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "riot" + lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' + slot_flags = SLOT_BACK + force = 10 + throwforce = 5 + throw_speed = 2 + throw_range = 3 + w_class = WEIGHT_CLASS_BULKY + materials = list(MAT_GLASS=7500, MAT_METAL=1000) + attack_verb = list("shoved", "bashed") + var/cooldown = 0 //shield bash cooldown. based on world.time + + +/obj/item/shield/riot/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/melee/baton)) + if(cooldown < world.time - 25) + user.visible_message("[user] bashes [src] with [W]!") + playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1) + cooldown = world.time + else + return ..() + +/obj/item/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + if(attack_type == THROWN_PROJECTILE_ATTACK) + final_block_chance += 30 + if(attack_type == LEAP_ATTACK) + final_block_chance = 100 + return ..() + +/obj/item/shield/riot/roman + name = "roman shield" + desc = "Bears an inscription on the inside: \"Romanes venio domus\"." + icon_state = "roman_shield" + item_state = "roman_shield" + lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' + +/obj/item/shield/riot/buckler + name = "wooden buckler" + desc = "A medieval wooden buckler." + icon_state = "buckler" + item_state = "buckler" + lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' + materials = list() + resistance_flags = FLAMMABLE + block_chance = 30 + +/obj/item/shield/energy + name = "energy combat shield" + desc = "A shield capable of stopping most melee attacks. Protects user from almost all energy projectiles. It can be retracted, expanded, and stored anywhere." + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "eshield0" // eshield1 for expanded + lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' + force = 3 + throwforce = 3 + throw_speed = 3 + throw_range = 5 + w_class = WEIGHT_CLASS_TINY + attack_verb = list("shoved", "bashed") + var/active = 0 + +/obj/item/shield/energy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + return 0 + +/obj/item/shield/energy/IsReflect() + return (active) + +/obj/item/shield/energy/attack_self(mob/living/carbon/human/user) + if(user.has_disability(CLUMSY) && prob(50)) + to_chat(user, "You beat yourself in the head with [src].") + user.take_bodypart_damage(5) + active = !active + icon_state = "eshield[active]" + + if(active) + force = 10 + throwforce = 8 + throw_speed = 2 + w_class = WEIGHT_CLASS_BULKY + playsound(user, 'sound/weapons/saberon.ogg', 35, 1) + to_chat(user, "[src] is now active.") + else + force = 3 + throwforce = 3 + throw_speed = 3 + w_class = WEIGHT_CLASS_TINY + playsound(user, 'sound/weapons/saberoff.ogg', 35, 1) + to_chat(user, "[src] can now be concealed.") + add_fingerprint(user) + +/obj/item/shield/riot/tele + name = "telescopic shield" + desc = "An advanced riot shield made of lightweight materials that collapses for easy storage." + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "teleriot0" + lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' + slot_flags = null + force = 3 + throwforce = 3 + throw_speed = 3 + throw_range = 4 + w_class = WEIGHT_CLASS_NORMAL + var/active = 0 + +/obj/item/shield/riot/tele/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + if(active) + return ..() + return 0 + +/obj/item/shield/riot/tele/attack_self(mob/living/user) + active = !active + icon_state = "teleriot[active]" + playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, 1) + + if(active) + force = 8 + throwforce = 5 + throw_speed = 2 + w_class = WEIGHT_CLASS_BULKY + slot_flags = SLOT_BACK + to_chat(user, "You extend \the [src].") + else + force = 3 + throwforce = 3 + throw_speed = 3 + w_class = WEIGHT_CLASS_NORMAL + slot_flags = null + to_chat(user, "[src] can now be concealed.") + add_fingerprint(user) +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index ef04fc48f5..a06d1a509e 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -94,7 +94,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", to_chat(user, "You don't have the dexterity to do this!") return - if (user.disabilities & CLUMSY && prob(50)) + if (user.has_disability(CLUMSY) && prob(50)) to_chat(user, "[src] slips out of your hand and hits your head.") user.take_bodypart_damage(10) user.Unconscious(400) diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index ab82f92c2d..128a313525 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -108,7 +108,7 @@ add_fingerprint(user) /obj/item/melee/baton/attack(mob/M, mob/living/carbon/human/user) - if(status && user.disabilities & CLUMSY && prob(50)) + if(status && user.has_disability(CLUMSY) && prob(50)) user.visible_message("[user] accidentally hits themself with [src]!", \ "You accidentally hit yourself with [src]!") user.Knockdown(stunforce*3) diff --git a/code/game/objects/items/teleprod.dm b/code/game/objects/items/teleprod.dm index 92e7a8e9ba..c780d32917 100644 --- a/code/game/objects/items/teleprod.dm +++ b/code/game/objects/items/teleprod.dm @@ -8,7 +8,7 @@ /obj/item/melee/baton/cattleprod/teleprod/attack(mob/living/carbon/M, mob/living/carbon/user)//handles making things teleport when hit ..() - if(status && user.disabilities & CLUMSY && prob(50)) + if(status && user.has_disability(CLUMSY) && prob(50)) user.visible_message("[user] accidentally hits themself with [src]!", \ "You accidentally hit yourself with [src]!") if(do_teleport(user, get_turf(user), 50))//honk honk diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 08f22b7e46..8fd37a3b38 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -75,7 +75,7 @@ return ..() if(user.zone_selected != "eyes" && user.zone_selected != "head") return ..() - if(user.disabilities & CLUMSY && prob(50)) + if(user.has_disability(CLUMSY) && prob(50)) M = user return eyestab(M,user) @@ -105,7 +105,7 @@ item_state = "drill" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25) //done for balance reasons, making them high value for research, but harder to get + materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25) //done for balance reasons, making them high value for research, but harder to get force = 8 //might or might not be too high, subject to change w_class = WEIGHT_CLASS_SMALL throwforce = 8 diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index c11d41eaa8..dc61944b4f 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -302,7 +302,7 @@ unwield() return ..() - if(user.disabilities & CLUMSY && (wielded) && prob(40)) + if(user.has_disability(CLUMSY) && (wielded) && prob(40)) impale(user) return if((wielded) && prob(50)) diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index 36233bc155..d2bee1af36 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -17,7 +17,7 @@ L.buckled.unbuckle_mob(L,force=1) L.visible_message("[L]'s skin rapidly turns to marble!", "Your body freezes up! Can't... move... can't... think...") L.forceMove(src) - L.disabilities |= MUTE + L.add_disability(MUTE, STATUE_MUTE) L.faction += "mimic" //Stops mimics from instaqdeling people in statues L.status_flags |= GODMODE obj_integrity = L.health + 100 //stoning damaged mobs will result in easier to shatter statues @@ -59,7 +59,7 @@ if(petrified_mob) petrified_mob.status_flags &= ~GODMODE petrified_mob.forceMove(loc) - petrified_mob.disabilities &= ~MUTE + petrified_mob.remove_disability(MUTE, STATUE_MUTE) petrified_mob.take_overall_damage((petrified_mob.health - obj_integrity + 100)) //any new damage the statue incurred is transfered to the mob petrified_mob.faction -= "mimic" petrified_mob = null diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 81f2c75660..8feff99df4 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -30,7 +30,7 @@ holder.update_icon() /obj/item/device/assembly/flash/proc/clown_check(mob/living/carbon/human/user) - if(user.disabilities & CLUMSY && prob(50)) + if(user.has_disability(CLUMSY) && prob(50)) flash_carbon(user, user, 15, 0) return 0 return 1 diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index e8ee742e56..ca697cdbf6 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/item/device/assembly/mousetrap name = "mousetrap" desc = "A handy little spring-loaded trap for catching pesty rodents." @@ -140,3 +141,147 @@ /obj/item/device/assembly/mousetrap/armed icon_state = "mousetraparmed" armed = TRUE +======= +/obj/item/device/assembly/mousetrap + name = "mousetrap" + desc = "A handy little spring-loaded trap for catching pesty rodents." + icon_state = "mousetrap" + materials = list(MAT_METAL=100) + attachable = 1 + var/armed = 0 + + +/obj/item/device/assembly/mousetrap/examine(mob/user) + ..() + if(armed) + to_chat(user, "The mousetrap is armed!") + else + to_chat(user, "The mousetrap is not armed.") + +/obj/item/device/assembly/mousetrap/activate() + if(..()) + armed = !armed + if(!armed) + if(ishuman(usr)) + var/mob/living/carbon/human/user = usr + if((user.has_disability(DUMB) || user.has_disability(CLUMSY)) && prob(50)) + to_chat(user, "Your hand slips, setting off the trigger!") + pulse(0) + update_icon() + if(usr) + playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) + +/obj/item/device/assembly/mousetrap/describe() + return "The pressure switch is [armed?"primed":"safe"]." + +/obj/item/device/assembly/mousetrap/update_icon() + if(armed) + icon_state = "mousetraparmed" + else + icon_state = "mousetrap" + if(holder) + holder.update_icon() + +/obj/item/device/assembly/mousetrap/proc/triggered(mob/target, type = "feet") + if(!armed) + return + var/obj/item/bodypart/affecting = null + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(PIERCEIMMUNE in H.dna.species.species_traits) + playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) + armed = 0 + update_icon() + pulse(0) + return 0 + switch(type) + if("feet") + if(!H.shoes) + affecting = H.get_bodypart(pick("l_leg", "r_leg")) + H.Knockdown(60) + if("l_hand", "r_hand") + if(!H.gloves) + affecting = H.get_bodypart(type) + H.Stun(60) + if(affecting) + if(affecting.receive_damage(1, 0)) + H.update_damage_overlays() + else if(ismouse(target)) + var/mob/living/simple_animal/mouse/M = target + visible_message("SPLAT!") + M.splat() + playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) + armed = 0 + update_icon() + pulse(0) + + +/obj/item/device/assembly/mousetrap/attack_self(mob/living/carbon/human/user) + if(!armed) + to_chat(user, "You arm [src].") + else + if((user.has_disability(DUMB) || user.has_disability(CLUMSY)) && prob(50)) + var/which_hand = "l_hand" + if(!(user.active_hand_index % 2)) + which_hand = "r_hand" + triggered(user, which_hand) + user.visible_message("[user] accidentally sets off [src], breaking their fingers.", \ + "You accidentally trigger [src]!") + return + to_chat(user, "You disarm [src].") + armed = !armed + update_icon() + playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) + + +/obj/item/device/assembly/mousetrap/attack_hand(mob/living/carbon/human/user) + if(armed) + if((user.has_disability(DUMB) || user.has_disability(CLUMSY)) && prob(50)) + var/which_hand = "l_hand" + if(!(user.active_hand_index % 2)) + which_hand = "r_hand" + triggered(user, which_hand) + user.visible_message("[user] accidentally sets off [src], breaking their fingers.", \ + "You accidentally trigger [src]!") + return + ..() + + +/obj/item/device/assembly/mousetrap/Crossed(atom/movable/AM as mob|obj) + if(armed) + if(ismob(AM)) + var/mob/MM = AM + if(!(MM.movement_type & FLYING)) + if(ishuman(AM)) + var/mob/living/carbon/H = AM + if(H.m_intent == MOVE_INTENT_RUN) + triggered(H) + H.visible_message("[H] accidentally steps on [src].", \ + "You accidentally step on [src]") + else if(ismouse(MM)) + triggered(MM) + else if(AM.density) // For mousetrap grenades, set off by anything heavy + triggered(AM) + ..() + + +/obj/item/device/assembly/mousetrap/on_found(mob/finder) + if(armed) + finder.visible_message("[finder] accidentally sets off [src], breaking their fingers.", \ + "You accidentally trigger [src]!") + triggered(finder, (finder.active_hand_index % 2 == 0) ? "r_hand" : "l_hand") + return 1 //end the search! + return 0 + + +/obj/item/device/assembly/mousetrap/hitby(A as mob|obj) + if(!armed) + return ..() + visible_message("[src] is triggered by [A].") + triggered(null) + + +/obj/item/device/assembly/mousetrap/armed + icon_state = "mousetraparmed" + armed = 1 +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 29990a299b..ddb1cf5545 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -41,7 +41,7 @@ /obj/item/clothing/glasses/proc/thermal_overload() if(ishuman(src.loc)) var/mob/living/carbon/human/H = src.loc - if(!(H.disabilities & BLIND)) + if(!(H.has_disability(BLIND))) if(H.glasses == src) to_chat(H, "[src] overloads and blinds you!") H.flash_act(visual = 1) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index eb7625e08c..db2b1ee561 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -41,6 +41,7 @@ continue var/datum/disease/D +<<<<<<< HEAD if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work. if(!H.dna || (H.disabilities & BLIND)) //A blindness disease would be the worst. continue @@ -49,6 +50,19 @@ DS.strain_data["name"] = H.real_name DS.strain_data["UI"] = H.dna.uni_identity DS.strain_data["SE"] = H.dna.struc_enzymes +======= + if(!advanced_virus) + if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work. + if(!H.dna || (H.has_disability(BLIND))) //A blindness disease would be the worst. + continue + D = new virus_type() + var/datum/disease/dnaspread/DS = D + DS.strain_data["name"] = H.real_name + DS.strain_data["UI"] = H.dna.uni_identity + DS.strain_data["SE"] = H.dna.struc_enzymes + else + D = new virus_type() +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) else D = new virus_type() D.carrier = TRUE diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 9d6d522c11..c8c042e30b 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -656,7 +656,7 @@ playsound(user, 'sound/magic/clockwork/fellowship_armory.ogg', 35, TRUE, frequency = 90000 - (active * 30000)) /obj/item/melee/transforming/cleaving_saw/clumsy_transform_effect(mob/living/user) - if(user.disabilities & CLUMSY && prob(50)) + if(user.has_disability(CLUMSY) && prob(50)) to_chat(user, "You accidentally cut yourself with [src], like a doofus!") user.take_bodypart_damage(10) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 45f26d55c3..c1ea547b34 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -16,7 +16,7 @@ /mob/living/carbon/monkey/handle_blood() - if(bodytemperature >= 225 && !(disabilities & NOCLONE)) //cryosleep or husked people do not pump the blood. + if(bodytemperature >= 225 && !(has_disability(NOCLONE))) //cryosleep or husked people do not pump the blood. //Blood regeneration if there is some space if(blood_volume < BLOOD_VOLUME_NORMAL) blood_volume += 0.1 // regenerate blood VERY slowly @@ -28,7 +28,7 @@ bleed_rate = 0 return - if(bodytemperature >= 225 && !(disabilities & NOCLONE)) //cryosleep or husked people do not pump the blood. + if(bodytemperature >= 225 && !(has_disability(NOCLONE))) //cryosleep or husked people do not pump the blood. //Blood regeneration if there is some space if(blood_volume < BLOOD_VOLUME_NORMAL && !(NOHUNGER in dna.species.species_traits)) @@ -201,13 +201,13 @@ return "blood" /mob/living/carbon/monkey/get_blood_id() - if(!(disabilities & NOCLONE)) + if(!(has_disability(NOCLONE))) return "blood" /mob/living/carbon/human/get_blood_id() if(dna.species.exotic_blood) return dna.species.exotic_blood - else if((NOBLOOD in dna.species.species_traits) || (disabilities & NOCLONE)) + else if((NOBLOOD in dna.species.species_traits) || (has_disability(NOCLONE))) return return "blood" diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index db48302f49..c745de747e 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -79,8 +79,8 @@ if(!brainmob.stored_dna) brainmob.stored_dna = new /datum/dna/stored(brainmob) C.dna.copy_dna(brainmob.stored_dna) - if(L.disabilities & NOCLONE) - brainmob.disabilities |= NOCLONE //This is so you can't just decapitate a husked guy and clone them without needing to get a new body + if(L.has_disability(NOCLONE)) + brainmob.disabilities[NOCLONE] = L.disabilities[NOCLONE] var/obj/item/organ/zombie_infection/ZI = L.getorganslot(ORGAN_SLOT_ZOMBIE) if(ZI) brainmob.set_species(ZI.old_species) //For if the brain is cloned diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index edb82e7ad4..4b2a6f64d5 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -157,6 +157,11 @@ if(!throwable_mob.buckled) thrown_thing = throwable_mob stop_pulling() +<<<<<<< HEAD +======= + if(has_disability(PACIFISM)) + to_chat(src, "You gently let go of [throwable_mob].") +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors var/turf/end_T = get_turf(target) if(start_T && end_T) @@ -168,6 +173,13 @@ thrown_thing = I dropItemToGround(I) +<<<<<<< HEAD +======= + if(has_disability(PACIFISM) && I.throwforce) + to_chat(src, "You set [I] down gently on the ground.") + return + +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) if(thrown_thing) visible_message("[src] has thrown [thrown_thing].") add_logs(src, thrown_thing, "has thrown") @@ -403,7 +415,7 @@ dropItemToGround(I) var/modifier = 0 - if(disabilities & CLUMSY) + if(has_disability(CLUMSY)) modifier -= 40 //Clumsy people are more likely to hit themselves -Honk! switch(rand(1,100)+modifier) //91-100=Nothing special happens @@ -512,7 +524,7 @@ health = maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute update_stat() if(((maxHealth - total_burn) < HEALTH_THRESHOLD_DEAD) && stat == DEAD ) - become_husk() + become_husk("burn") med_hud_set_health() /mob/living/carbon/update_sight() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 0bfa287a09..a6d4f3536b 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -306,11 +306,15 @@ if(eyes.eye_damage > 20) if(prob(eyes.eye_damage - 20)) - if(become_nearsighted()) + if(!has_disability(NEARSIGHT)) to_chat(src, "Your eyes start to burn badly!") + become_nearsighted(EYE_DAMAGE) + else if(prob(eyes.eye_damage - 25)) - if(become_blind()) + if(!has_disability(BLIND)) to_chat(src, "You can't see anything!") + become_blind(EYE_DAMAGE) + else to_chat(src, "Your eyes are really starting to hurt. This can't be good for you!") if(has_bane(BANE_LIGHT)) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 4b1afe0780..4453c33436 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -48,7 +48,7 @@ /mob/living/carbon/proc/Drain() - become_husk() - disabilities |= NOCLONE + become_husk(CHANGELING_DRAIN) + add_disability(NOCLONE, CHANGELING_DRAIN) blood_volume = 0 return 1 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index a515ef23b1..7cdcad35bb 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -140,8 +140,13 @@ return ..() /mob/living/carbon/human/grabbedby(mob/living/carbon/user, supress_message = 0) +<<<<<<< HEAD if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && isliving(pulling)) vore_attack(user, pulling) +======= + if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && (has_disability(FAT)) && ismonkey(pulling)) + devour_mob(pulling) +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) else ..() diff --git a/code/modules/mob/living/carbon/human/interactive.dm b/code/modules/mob/living/carbon/human/interactive.dm index 38dfad5787..8c913349c5 100644 --- a/code/modules/mob/living/carbon/human/interactive.dm +++ b/code/modules/mob/living/carbon/human/interactive.dm @@ -339,7 +339,7 @@ if(TRAITS & TRAIT_SMART) smartness = 75 else if(TRAITS & TRAIT_DUMB) - disabilities |= CLUMSY + add_disability(CLUMSY, GENETIC_MUTATION) smartness = 25 if(TRAITS & TRAIT_MEAN) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 4f41c2d40c..640447fc4d 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -187,7 +187,7 @@ if(G.tint) update_tint() if(G.vision_correction) - if(disabilities & NEARSIGHT) + if(has_disability(NEARSIGHT)) overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) adjust_eye_damage(0) if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 0b02a2c711..1f30562dcf 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -312,7 +312,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(!HD) //Decapitated return - if(H.disabilities & HUSK) + if(H.has_disability(HUSK)) return var/datum/sprite_accessory/S var/list/standing = list() @@ -453,7 +453,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/obj/item/bodypart/head/HD = H.get_bodypart("head") - if(HD && !(H.disabilities & HUSK)) + if(HD && !(H.has_disability(HUSK))) // lipstick if(H.lip_style && (LIPS in species_traits)) var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/human_face.dmi', "lips_[H.lip_style]", -BODY_LAYER) @@ -724,7 +724,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(S.center) accessory_overlay = center_image(accessory_overlay, S.dimension_x, S.dimension_y) - if(!(H.disabilities & HUSK)) + if(!(H.has_disability(HUSK))) if(!forced_colour) switch(S.color_src) if(MUTCOLORS) @@ -1103,16 +1103,16 @@ GLOBAL_LIST_EMPTY(roundstart_races) /datum/species/proc/handle_digestion(mob/living/carbon/human/H) //The fucking FAT mutation is the dumbest shit ever. It makes the code so difficult to work with - if(H.disabilities & FAT)//I share your pain, past coder. + if(H.has_disability(FAT))//I share your pain, past coder. if(H.overeatduration < 100) to_chat(H, "You feel fit again!") - H.disabilities &= ~FAT + H.remove_disability(FAT, OBESITY) H.update_inv_w_uniform() H.update_inv_wear_suit() else if(H.overeatduration > 500) to_chat(H, "You suddenly feel blubbery!") - H.disabilities |= FAT + H.add_disability(FAT, OBESITY) H.update_inv_w_uniform() H.update_inv_wear_suit() @@ -1269,7 +1269,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) . += (health_deficiency / 25) if((hungry >= 70) && !flight) //Being hungry won't stop you from using flightpack controls/flapping your wings although it probably will in the wing case but who cares. . += hungry / 50 - if(H.disabilities & FAT) + if(H.has_disability(FAT)) . += (1.5 - flight) if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) . += (BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR @@ -1315,6 +1315,12 @@ GLOBAL_LIST_EMPTY(roundstart_races) /datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) +<<<<<<< HEAD +======= + if(user.has_disability(PACIFISM)) + to_chat(user, "You don't want to harm [target]!") + return FALSE +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) if(target.check_block()) target.visible_message("[target] blocks [user]'s attack!") return 0 diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index d2c83fa39f..25be12a0ff 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -725,7 +725,7 @@ /obj/structure/cloth_pile/proc/revive() if(QDELETED(src) || QDELETED(cloth_golem)) //QDELETED also checks for null, so if no cloth golem is set this won't runtime return - if(cloth_golem.suiciding || cloth_golem.disabilities & NOCLONE) + if(cloth_golem.suiciding || cloth_golem.has_disability(NOCLONE)) QDEL_NULL(cloth_golem) return diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm index aca6973355..cf3d676e90 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -11,12 +11,12 @@ amount = dna.species.spec_stun(src,amount) return ..() -/mob/living/carbon/human/cure_husk() +/mob/living/carbon/human/cure_husk(list/sources) . = ..() if(.) update_hair() -/mob/living/carbon/human/become_husk() +/mob/living/carbon/human/become_husk(source) if(istype(dna.species, /datum/species/skeleton)) //skeletons shouldn't be husks. cure_husk() return diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 7264e9ad95..14f294fd90 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -609,7 +609,7 @@ generate/load female uniform sprites matching all previously decided variables if(BP.dmg_overlay_type) . += "-[BP.dmg_overlay_type]" - if(disabilities & HUSK) + if(has_disability(HUSK)) . += "-husk" /mob/living/carbon/human/load_limb_from_cache() diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index d6afdbdbc2..089a242347 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -120,7 +120,14 @@ /mob/living/carbon/monkey/proc/should_target(var/mob/living/L) if(L == src) +<<<<<<< HEAD return 0 +======= + return FALSE + + if(has_disability(PACIFISM)) + return FALSE +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) if(enemies[L]) return 1 diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm index 5a4ba686b2..87058ce76d 100644 --- a/code/modules/mob/living/carbon/monkey/update_icons.dm +++ b/code/modules/mob/living/carbon/monkey/update_icons.dm @@ -19,7 +19,7 @@ if(!HD) //Decapitated return - if(disabilities & HUSK) + if(has_disability(HUSK)) return var/hair_hidden = 0 diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index e46ae2f8e6..74385b895c 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -64,43 +64,8 @@ /mob/living/carbon/set_disgust(amount) disgust = Clamp(amount, 0, DISGUST_LEVEL_MAXEDOUT) -/mob/living/carbon/cure_blind() - if(disabilities & BLIND) - disabilities &= ~BLIND - adjust_blindness(-1) - return 1 -/mob/living/carbon/become_blind() - if(!(disabilities & BLIND)) - disabilities |= BLIND - blind_eyes(1) - return 1 -/mob/living/carbon/cure_nearsighted() - if(disabilities & NEARSIGHT) - disabilities &= ~NEARSIGHT - clear_fullscreen("nearsighted") - return 1 - -/mob/living/carbon/become_nearsighted() - if(!(disabilities & NEARSIGHT)) - disabilities |= NEARSIGHT - overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) - return 1 - -/mob/living/carbon/cure_husk() - if(disabilities & HUSK) - disabilities &= ~HUSK - status_flags &= ~DISFIGURED - update_body() - return 1 - -/mob/living/carbon/become_husk() - if(disabilities & HUSK) - return - disabilities |= HUSK - status_flags |= DISFIGURED //makes them unknown - update_body() - return 1 +////////////////////////////////////////TRAUMAS///////////////////////////////////////// /mob/living/carbon/proc/get_traumas() . = list() diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 701fa0c7bc..5034abfbbe 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -290,7 +290,7 @@ else . += "-robotic" - if(disabilities & HUSK) + if(has_disability(HUSK)) . += "-husk" diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 0aafef753f..b8423cdc46 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -126,7 +126,7 @@ /mob/living/proc/handle_disabilities() //Eyes if(eye_blind) //blindness, heals slowly over time - if(!stat && !(disabilities & BLIND)) + if(!stat && !(has_disability(BLIND))) eye_blind = max(eye_blind-1,0) if(client && !eye_blind) clear_alert("blind") @@ -137,6 +137,12 @@ eye_blurry = max(eye_blurry-1, 0) if(client && !eye_blurry) clear_fullscreen("blurry") +<<<<<<< HEAD +======= + if(has_disability(PACIFISM) && a_intent == INTENT_HARM) + to_chat(src, "You don't feel like harming anybody.") + a_intent_change(INTENT_HELP) +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) /mob/living/proc/update_damage_hud() return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f589ecbb20..24985f54a6 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -406,7 +406,6 @@ cure_nearsighted() cure_blind() cure_husk() - disabilities = 0 hallucination = 0 heal_overall_damage(100000, 100000, 0, 0, 1) //heal brute and burn dmg on both organic and robotic limbs, and update health right away. ExtinguishMob() @@ -812,6 +811,12 @@ if (G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser()) to_chat(src, "You don't have the dexterity to do this!") return FALSE +<<<<<<< HEAD +======= + if(has_disability(PACIFISM)) + to_chat(src, "You don't want to risk harming anyone!") + return FALSE +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) return TRUE /mob/living/carbon/proc/update_stamina() diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index f77c65225f..d99ce1b014 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -134,7 +134,16 @@ if(!(status_flags & CANPUSH)) to_chat(user, "[src] can't be grabbed more aggressively!") +<<<<<<< HEAD return 0 +======= + return FALSE + + if(user.has_disability(PACIFISM)) + to_chat(user, "You don't want to risk hurting [src]!") + return FALSE + +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) grippedby(user) //proc to upgrade a simple pull into a more aggressive grab. @@ -188,6 +197,13 @@ M.Feedstop() return // can't attack while eating! +<<<<<<< HEAD +======= + if(has_disability(PACIFISM)) + to_chat(M, "You don't want to hurt anyone!") + return FALSE + +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) if (stat != DEAD) add_logs(M, src, "attacked") M.do_attack_animation(src) @@ -201,6 +217,13 @@ M.visible_message("\The [M] [M.friendly] [src]!") return 0 else +<<<<<<< HEAD +======= + if(M.has_disability(PACIFISM)) + to_chat(M, "You don't want to hurt anyone!") + return FALSE + +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) if(M.attack_sound) playsound(loc, M.attack_sound, 50, 1, 1) M.do_attack_animation(src) @@ -216,6 +239,13 @@ return 0 if (M.a_intent == INTENT_HARM) +<<<<<<< HEAD +======= + if(M.has_disability(PACIFISM)) + to_chat(M, "You don't want to hurt anyone!") + return FALSE + +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) if(M.is_muzzled() || (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSMOUTH)) to_chat(M, "You can't bite with your mouth covered!") return 0 @@ -238,6 +268,13 @@ return 0 else +<<<<<<< HEAD +======= + if(L.has_disability(PACIFISM)) + to_chat(L, "You don't want to hurt anyone!") + return + +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) L.do_attack_animation(src) if(prob(90)) add_logs(L, src, "attacked") @@ -260,6 +297,12 @@ grabbedby(M) return 0 if("harm") +<<<<<<< HEAD +======= + if(M.has_disability(PACIFISM)) + to_chat(M, "You don't want to hurt anyone!") + return FALSE +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) M.do_attack_animation(src) return 1 if("disarm") @@ -347,7 +390,7 @@ //called when the mob receives a bright flash /mob/living/proc/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash) - if(get_eye_protection() < intensity && (override_blindness_check || !(disabilities & BLIND))) + if(get_eye_protection() < intensity && (override_blindness_check || !(has_disability(BLIND)))) overlay_fullscreen("flash", type) addtimer(CALLBACK(src, .proc/clear_fullscreen, "flash", 25), 25) return 1 diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 50f2ce4db0..6990262409 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -26,6 +26,8 @@ var/incorporeal_move = FALSE //FALSE is off, INCORPOREAL_MOVE_BASIC is normal, INCORPOREAL_MOVE_SHADOW is for ninjas //and INCORPOREAL_MOVE_JAUNT is blocked by holy water/salt + var/list/disabilities = list() + var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them. var/now_pushing = null //used by living/Collide() and living/PushAM() to prevent potential infinite loop. diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index b1d0484086..e21c21453a 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -285,7 +285,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( return 1 /mob/living/proc/can_speak_vocal(message) //Check AFTER handling of xeno and ling channels - if(disabilities & MUTE) + if(has_disability(MUTE)) return 0 if(is_muzzled()) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 58e3e0837b..b8b419087f 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -558,7 +558,7 @@ Difficulty: Very Hard H.regenerate_limbs() H.regenerate_organs() H.revive(1,0) - H.disabilities |= NOCLONE //Free revives, but significantly limits your options for reviving except via the crystal + H.add_disability(NOCLONE, MAGIC_DISABILITY) //Free revives, but significantly limits your options for reviving except via the crystal H.grab_ghost(force = TRUE) /obj/machinery/anomalous_crystal/helpers //Lets ghost spawn as helpful creatures that can only heal people slightly. Incredibly fragile and they can't converse with humans @@ -719,7 +719,7 @@ Difficulty: Very Hard if(isliving(A) && holder_animal) var/mob/living/L = A L.notransform = 1 - L.disabilities |= MUTE + L.add_disability(MUTE, STASIS_MUTE) L.status_flags |= GODMODE L.mind.transfer_to(holder_animal) var/obj/effect/proc_holder/spell/targeted/exit_possession/P = new /obj/effect/proc_holder/spell/targeted/exit_possession @@ -729,7 +729,7 @@ Difficulty: Very Hard /obj/structure/closet/stasis/dump_contents(var/kill = 1) STOP_PROCESSING(SSobj, src) for(var/mob/living/L in src) - L.disabilities &= ~MUTE + L.remove_disability(MUTE, STASIS_MUTE) L.status_flags &= ~GODMODE L.notransform = 0 if(holder_animal) diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 3d50f03e17..0149c98a3e 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -137,3 +137,76 @@ to_chat(src, "[priority_absorb_key["self_message"]]") priority_absorb_key["stuns_absorbed"] += amount return TRUE + +/////////////////////////////////// DISABILITIES //////////////////////////////////// + +/mob/living/proc/add_disability(disability, source) + if(!disabilities[disability]) + disabilities[disability] = list(source) + else + disabilities[disability] |= list(source) + +/mob/living/proc/remove_disability(disability, list/sources) + if(!disabilities[disability]) + return + + if(LAZYLEN(sources)) + for(var/S in sources) + if(S in disabilities[disability]) + disabilities[disability] -= S + else + disabilities[disability] = list() + + if(!LAZYLEN(disabilities[disability])) + disabilities -= disability + +/mob/living/proc/has_disability(disability, list/sources) + if(!disabilities[disability]) + return FALSE + + . = FALSE + + if(LAZYLEN(sources)) + for(var/S in sources) + if(S in disabilities[disability]) + return TRUE + else + if(LAZYLEN(disabilities[disability])) + return TRUE + +/mob/living/proc/remove_all_disabilities() + disabilities = list() + +/////////////////////////////////// DISABILITY PROCS //////////////////////////////////// + +/mob/living/proc/cure_blind(list/sources) + remove_disability(BLIND, sources) + if(!has_disability(BLIND)) + adjust_blindness(-1) + +/mob/living/proc/become_blind(source) + if(!has_disability(BLIND)) + blind_eyes(1) + add_disability(BLIND, source) + +/mob/living/proc/cure_nearsighted(list/sources) + remove_disability(NEARSIGHT, sources) + if(!has_disability(NEARSIGHT)) + clear_fullscreen("nearsighted") + +/mob/living/proc/become_nearsighted(source) + if(!has_disability(NEARSIGHT)) + overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) + add_disability(NEARSIGHT, source) + +/mob/living/proc/cure_husk(list/sources) + remove_disability(HUSK, sources) + if(!has_disability(HUSK)) + status_flags &= ~DISFIGURED + update_body() + +/mob/living/proc/become_husk(source) + if(!has_disability(HUSK)) + status_flags |= DISFIGURED //makes them unknown + update_body() + add_disability(HUSK, source) \ No newline at end of file diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index edbf11654b..ecbaea015f 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -32,7 +32,6 @@ var/obj/machinery/machine = null var/other_mobs = null - var/disabilities = 0 //Carbon var/atom/movable/pulling = null var/grab_state = 0 diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index 80ab6929d5..8dfadf70f5 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -160,8 +160,12 @@ overlay_fullscreen("blind", /obj/screen/fullscreen/blind) else if(eye_blind) var/blind_minimum = 0 - if((stat != CONSCIOUS && stat != SOFT_CRIT) || (disabilities & BLIND)) + if((stat != CONSCIOUS && stat != SOFT_CRIT)) blind_minimum = 1 + if(isliving(src)) + var/mob/living/L = src + if(L.has_disability(BLIND)) + blind_minimum = 1 eye_blind = max(eye_blind+amount, blind_minimum) if(!eye_blind) clear_alert("blind") @@ -177,8 +181,12 @@ overlay_fullscreen("blind", /obj/screen/fullscreen/blind) else if(eye_blind) var/blind_minimum = 0 - if((stat != CONSCIOUS && stat != SOFT_CRIT) || (disabilities & BLIND)) + if(stat != CONSCIOUS && stat != SOFT_CRIT) blind_minimum = 1 + if(isliving(src)) + var/mob/living/L = src + if(L.has_disability(BLIND)) + blind_minimum = 1 eye_blind = blind_minimum if(!eye_blind) clear_alert("blind") @@ -227,31 +235,6 @@ /mob/proc/set_disgust(amount) return -/////////////////////////////////// BLIND DISABILITY //////////////////////////////////// - -/mob/proc/cure_blind() //when we want to cure the BLIND disability only. - return - -/mob/proc/become_blind() - return - -/////////////////////////////////// NEARSIGHT DISABILITY //////////////////////////////////// - -/mob/proc/cure_nearsighted() - return - -/mob/proc/become_nearsighted() - return - - -//////////////////////////////// HUSK DISABILITY ///////////////////////////: - -/mob/proc/cure_husk() - return - -/mob/proc/become_husk() - return - diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 1fb1846f4c..00fbcdc6f7 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -93,7 +93,7 @@ return if(ishuman(usr)) var/mob/living/carbon/human/H = usr - if(H.disabilities & CLUMSY && prob(25)) + if(H.has_disability(CLUMSY) && prob(25)) to_chat(H, "You cut yourself on the paper! Ahhhh! Ahhhhh!") H.damageoverlaytemp = 9001 H.update_damage_hud() @@ -317,7 +317,7 @@ to_chat(user, "You stamp the paper with your rubber stamp.") if(P.is_hot()) - if(user.disabilities & CLUMSY && prob(10)) + if(user.has_disability(CLUMSY) && prob(10)) user.visible_message("[user] accidentally ignites themselves!", \ "You miss the paper and accidentally light yourself on fire!") user.dropItemToGround(P) diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index 2d5fcc6e3a..17e2fe2a00 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -65,7 +65,7 @@ update_icon() else if(P.is_hot()) - if(user.disabilities & CLUMSY && prob(10)) + if(user.has_disability(CLUMSY) && prob(10)) user.visible_message("[user] accidentally ignites themselves!", \ "You miss [src] and accidentally light yourself on fire!") user.dropItemToGround(P) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 42e1352b2d..e93f298999 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -158,7 +158,7 @@ //Exclude lasertag guns from the CLUMSY check. if(clumsy_check) if(istype(user)) - if (user.disabilities & CLUMSY && prob(40)) + if (user.has_disability(CLUMSY) && prob(40)) to_chat(user, "You shoot yourself in the foot with [src]!") var/shot_leg = pick("l_leg", "r_leg") process_fire(user,user,0,params, zone_override = shot_leg) diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 4dafbc3f3c..aeceb041c6 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -351,7 +351,7 @@ clumsy_check = 0 /obj/item/gun/ballistic/revolver/reverse/can_trigger_gun(mob/living/user) - if((user.disabilities & CLUMSY) || (user.mind && user.mind.assigned_role == "Clown")) + if((user.has_disability(CLUMSY)) || (user.mind && user.mind.assigned_role == "Clown")) return ..() if(process_fire(user, user, 0, zone_override = "head")) user.visible_message("[user] somehow manages to shoot [user.p_them()]self in the face!", "You somehow shoot yourself in the face! How the hell?!") diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index faf7de9010..6cbe2de450 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -129,7 +129,7 @@ // A gun with ultra-honk pin is useful for clown and useless for everyone else. /obj/item/device/firing_pin/clown/ultra/pin_auth(mob/living/user) playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1) - if(!(user.disabilities & CLUMSY) && !(user.mind && user.mind.assigned_role == "Clown")) + if(!(user.has_disability(CLUMSY)) && !(user.mind && user.mind.assigned_role == "Clown")) return 0 return 1 diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index b62afb80c0..b164fc0696 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -70,7 +70,7 @@ //nothing if(21 to INFINITY) if(prob(current_cycle-10)) - M.cure_nearsighted() + M.cure_nearsighted(list(EYE_DAMAGE)) ..() return diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index ddb08db032..03134784a4 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -44,7 +44,7 @@ M.adjustToxLoss(-5, 0) M.hallucination = 0 M.setBrainLoss(0) - M.disabilities = 0 + M.remove_all_disabilities() M.set_blurriness(0) M.set_blindness(0) M.SetKnockdown(0, 0) @@ -667,16 +667,16 @@ var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES) if (!eyes) return - if(M.disabilities & BLIND) + if(M.has_disability(BLIND, EYE_DAMAGE)) if(prob(20)) to_chat(M, "Your vision slowly returns...") - M.cure_blind() - M.cure_nearsighted() + M.cure_blind(EYE_DAMAGE) + M.cure_nearsighted(EYE_DAMAGE) M.blur_eyes(35) - else if(M.disabilities & NEARSIGHT) + else if(M.has_disability(NEARSIGHT, EYE_DAMAGE)) to_chat(M, "The blackness in your peripheral vision fades.") - M.cure_nearsighted() + M.cure_nearsighted(EYE_DAMAGE) M.blur_eyes(10) else if(M.eye_blind || M.eye_blurry) M.set_blindness(0) @@ -765,7 +765,7 @@ M.visible_message("[M]'s body convulses a bit, and then falls still once more.") return M.visible_message("[M]'s body convulses a bit.") - if(!M.suiciding && !(M.disabilities & NOCLONE) && !M.hellbound) + if(!M.suiciding && !(M.has_disability(NOCLONE)) && !M.hellbound) if(!M) return if(M.notify_ghost_cloning(source = M)) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 711c333896..13986f5bf8 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -141,7 +141,7 @@ taste_description = "mint" /datum/reagent/toxin/minttoxin/on_mob_life(mob/living/M) - if(M.disabilities & FAT) + if(M.has_disability(FAT)) M.gib() return ..() diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm index ca6a534ee0..8e9b4fb1e4 100644 --- a/code/modules/spells/spell_types/construct_spells.dm +++ b/code/modules/spells/spell_types/construct_spells.dm @@ -209,12 +209,14 @@ to_chat(target, "A freezing darkness surrounds you...") target.playsound_local(get_turf(target), 'sound/hallucinations/i_see_you1.ogg', 50, 1) user.playsound_local(get_turf(user), 'sound/effects/ghost2.ogg', 50, 1) - target.adjust_blindness(5) + target.become_blind("abyssal_gaze") addtimer(CALLBACK(src, .proc/cure_blindness, target), 40) target.bodytemperature -= 200 /obj/effect/proc_holder/spell/targeted/abyssal_gaze/proc/cure_blindness(mob/target) - target.adjust_blindness(-5) + if(isliving(target)) + var/mob/living/L = target + L.cure_blind(BLIND, "abyssal_gaze") /obj/effect/proc_holder/spell/targeted/dominate name = "Dominate" diff --git a/code/modules/spells/spell_types/genetic.dm b/code/modules/spells/spell_types/genetic.dm index c6945dab50..0982f8a01f 100644 --- a/code/modules/spells/spell_types/genetic.dm +++ b/code/modules/spells/spell_types/genetic.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/effect/proc_holder/spell/targeted/genetic name = "Genetic" desc = "This spell inflicts a set of mutations and disabilities upon the target." @@ -23,10 +24,39 @@ for(var/A in mutations) target.dna.add_mutation(A) target.disabilities |= disabilities +======= +/obj/effect/proc_holder/spell/targeted/genetic + name = "Genetic" + desc = "This spell inflicts a set of mutations and disabilities upon the target." + + var/list/disabilities = list() //disabilities + var/list/mutations = list() //mutation strings + var/duration = 100 //deciseconds + /* + Disabilities + 1st bit - ? + 2nd bit - ? + 3rd bit - ? + 4th bit - ? + 5th bit - ? + 6th bit - ? + */ + +/obj/effect/proc_holder/spell/targeted/genetic/cast(list/targets,mob/user = usr) + playMagSound() + for(var/mob/living/carbon/target in targets) + if(!target.dna) + continue + for(var/A in mutations) + target.dna.add_mutation(A) + for(var/A in disabilities) + target.add_disability(A, GENETICS_SPELL) +>>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) addtimer(CALLBACK(src, .proc/remove, target), duration) /obj/effect/proc_holder/spell/targeted/genetic/proc/remove(mob/living/carbon/target) if(!QDELETED(target)) for(var/A in mutations) target.dna.remove_mutation(A) - target.disabilities &= ~disabilities + for(var/A in disabilities) + target.remove_disability(A, GENETICS_SPELL) \ No newline at end of file diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 790942d897..474075591f 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -217,7 +217,7 @@ C = owner no_update = 0 - if(C.disabilities & HUSK) + if(C.has_disability(HUSK)) species_id = "husk" //overrides species_id dmg_overlay_type = "" //no damage overlay shown when husked should_draw_gender = FALSE diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index f631400bee..464da21e44 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -61,7 +61,7 @@ C = owner real_name = C.real_name - if(C.disabilities & HUSK) + if(C.has_disability(HUSK)) real_name = "Unknown" hair_style = "Bald" facial_hair_style = "Shaved" diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index c8a47d2096..00a9a99bb0 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -23,9 +23,9 @@ /datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user] successfully fixes [target]'s eyes!", "You succeed in fixing [target]'s eyes.") - target.cure_blind() + target.cure_blind(list(EYE_DAMAGE)) target.set_blindness(0) - target.cure_nearsighted() + target.cure_nearsighted(list(EYE_DAMAGE)) target.blur_eyes(35) //this will fix itself slowly. target.set_eye_damage(0) return TRUE diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm index 488f2e81b1..ba43a5cc3b 100644 --- a/code/modules/surgery/lipoplasty.dm +++ b/code/modules/surgery/lipoplasty.dm @@ -4,7 +4,7 @@ possible_locs = list("chest") /datum/surgery/lipoplasty/can_start(mob/user, mob/living/carbon/target) - if(target.disabilities & FAT) + if(target.has_disability(FAT)) return 1 return 0 diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 98b2a84ac0..905f9c2e1f 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -25,7 +25,7 @@ return var/mob/living/carbon/C = owner // genetic deafness prevents the body from using the ears, even if healthy - if(C.disabilities & DEAF) + if(C.has_disability(DEAF)) deaf = max(deaf, 1) else if(C.ears && (C.ears.flags_2 & HEALS_EARS_2)) @@ -42,7 +42,7 @@ var/mob/living/carbon/C = owner - if(iscarbon(owner) && C.disabilities & DEAF) + if(iscarbon(owner) && C.has_disability(DEAF)) deaf = 1 /obj/item/organ/ears/proc/adjustEarDamage(ddmg, ddeaf) From 7c282037ba5b3d043f53590600ec295fa02bac98 Mon Sep 17 00:00:00 2001 From: oranges Date: Tue, 19 Dec 2017 10:32:21 +1300 Subject: [PATCH 02/86] Non movement keys pressed while moving no longer stop movement --- code/modules/keybindings/bindings_atom.dm | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 code/modules/keybindings/bindings_atom.dm diff --git a/code/modules/keybindings/bindings_atom.dm b/code/modules/keybindings/bindings_atom.dm new file mode 100644 index 0000000000..9738175d2d --- /dev/null +++ b/code/modules/keybindings/bindings_atom.dm @@ -0,0 +1,18 @@ +// You might be wondering why this isn't client level. If focus is null, we don't want you to move. +// Only way to do that is to tie the behavior into the focus's keyLoop(). + +/atom/movable/keyLoop(client/user) + if(!user.keys_held["Ctrl"]) + var/movement_dir = NONE + for(var/_key in user.keys_held) + movement_dir = movement_dir | GLOB.movement_keys[_key] + if(user.next_move_dir_add) + movement_dir |= user.next_move_dir_add + if(user.next_move_dir_sub) + movement_dir &= ~user.next_move_dir_sub + // Sanity checks in case you hold left and right and up to make sure you only go up + if((movement_dir & NORTH) && (movement_dir & SOUTH)) + movement_dir &= ~(NORTH|SOUTH) + if((movement_dir & EAST) && (movement_dir & WEST)) + movement_dir &= ~(EAST|WEST) + user.Move(get_step(src, movement_dir), movement_dir) \ No newline at end of file From 13dd125e28fd64b8c4610762da05573141fe1cfb Mon Sep 17 00:00:00 2001 From: XDTM Date: Mon, 18 Dec 2017 23:09:48 +0100 Subject: [PATCH 03/86] [HIGH PRIORITY]Hotfix for the monkeylike disability --- code/modules/mob/living/carbon/human/human_helpers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index d1d657652b..386d1f98e6 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -103,7 +103,7 @@ /mob/living/carbon/human/IsAdvancedToolUser() - if(disabilities & MONKEYLIKE) + if(has_disability(MONKEYLIKE)) return FALSE return TRUE//Humans can use guns and such From 9ccdb75e5757eec0ac518c034cf6cf297398641b Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 18 Dec 2017 17:23:52 -0600 Subject: [PATCH 05/86] Update stat.dm --- code/__DEFINES/stat.dm | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm index 208970ff9f..ce84d27765 100644 --- a/code/__DEFINES/stat.dm +++ b/code/__DEFINES/stat.dm @@ -10,18 +10,6 @@ //mob disabilities stat -<<<<<<< HEAD -#define BLIND 1 -#define MUTE 2 -#define DEAF 4 -#define NEARSIGHT 8 -#define FAT 32 -#define HUSK 64 -#define NOCLONE 128 -#define CLUMSY 256 -#define DUMB 512 -#define MONKEYLIKE 1024 //sets IsAdvancedToolUser to FALSE -======= #define BLIND "blind" #define MUTE "mute" #define DEAF "deaf" @@ -44,7 +32,6 @@ #define STASIS_MUTE "stasis" #define GENETICS_SPELL "genetics_spell" #define TRAUMA_DISABILITY "trauma" ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) // bitflags for machine stat variable #define BROKEN 1 From 6c50ca9157c42aee8050b1cf97c2986201cd40a6 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 18 Dec 2017 17:24:02 -0600 Subject: [PATCH 06/86] Update item_attack.dm --- code/_onclick/item_attack.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 134e33224f..8718751d81 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -58,11 +58,8 @@ SendSignal(COMSIG_ITEM_ATTACK, M, user) if(flags_1 & NOBLUDGEON_1) return -<<<<<<< HEAD -======= if(user.has_disability(PACIFISM)) return ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) if(!force) playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), 1, -1) else if(hitsound) From b1669b81798768ac4d59f238c060a76ed180a576 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 18 Dec 2017 17:24:16 -0600 Subject: [PATCH 07/86] Update severe.dm --- code/datums/brain_damage/severe.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index a36d4b9fb8..381515e42e 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -165,8 +165,6 @@ /datum/brain_trauma/severe/discoordination/on_lose() owner.remove_disability(MONKEYLIKE, TRAUMA_DISABILITY) ..() -<<<<<<< HEAD -======= /datum/brain_trauma/severe/pacifism name = "Traumatic Non-Violence" @@ -182,4 +180,3 @@ /datum/brain_trauma/severe/pacifism/on_lose() owner.remove_disability(PACIFISM, TRAUMA_DISABILITY) ..() ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) From 0b7555781657958e5c290a4ac9abc7d114bc8fea Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 18 Dec 2017 17:24:28 -0600 Subject: [PATCH 08/86] Update shields.dm --- code/game/objects/items/shields.dm | 145 ----------------------------- 1 file changed, 145 deletions(-) diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index a746ed1778..113bc9755c 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -1,147 +1,3 @@ -<<<<<<< HEAD -/obj/item/shield - name = "shield" - block_chance = 50 - armor = list(melee = 50, bullet = 50, laser = 50, energy = 0, bomb = 30, bio = 0, rad = 0, fire = 80, acid = 70) - -/obj/item/shield/riot - name = "riot shield" - desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder." - icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "riot" - lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' - slot_flags = SLOT_BACK - force = 10 - throwforce = 5 - throw_speed = 2 - throw_range = 3 - w_class = WEIGHT_CLASS_BULKY - materials = list(MAT_GLASS=7500, MAT_METAL=1000) - attack_verb = list("shoved", "bashed") - var/cooldown = 0 //shield bash cooldown. based on world.time - - -/obj/item/shield/riot/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/melee/baton)) - if(cooldown < world.time - 25) - user.visible_message("[user] bashes [src] with [W]!") - playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1) - cooldown = world.time - else - return ..() - -/obj/item/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(attack_type == THROWN_PROJECTILE_ATTACK) - final_block_chance += 30 - if(attack_type == LEAP_ATTACK) - final_block_chance = 100 - return ..() - -/obj/item/shield/riot/roman - name = "roman shield" - desc = "Bears an inscription on the inside: \"Romanes venio domus\"." - icon_state = "roman_shield" - item_state = "roman_shield" - lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' - -/obj/item/shield/riot/buckler - name = "wooden buckler" - desc = "A medieval wooden buckler." - icon_state = "buckler" - item_state = "buckler" - lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' - materials = list() - resistance_flags = FLAMMABLE - block_chance = 30 - -/obj/item/shield/energy - name = "energy combat shield" - desc = "A shield capable of stopping most melee attacks. Protects user from almost all energy projectiles. It can be retracted, expanded, and stored anywhere." - icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "eshield0" // eshield1 for expanded - lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' - force = 3 - throwforce = 3 - throw_speed = 3 - throw_range = 5 - w_class = WEIGHT_CLASS_TINY - attack_verb = list("shoved", "bashed") - var/active = 0 - -/obj/item/shield/energy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - return 0 - -/obj/item/shield/energy/IsReflect() - return (active) - -/obj/item/shield/energy/attack_self(mob/living/carbon/human/user) - if(user.disabilities & CLUMSY && prob(50)) - to_chat(user, "You beat yourself in the head with [src].") - user.take_bodypart_damage(5) - active = !active - icon_state = "eshield[active]" - - if(active) - force = 10 - throwforce = 8 - throw_speed = 2 - w_class = WEIGHT_CLASS_BULKY - playsound(user, 'sound/weapons/saberon.ogg', 35, 1) - to_chat(user, "[src] is now active.") - else - force = 3 - throwforce = 3 - throw_speed = 3 - w_class = WEIGHT_CLASS_TINY - playsound(user, 'sound/weapons/saberoff.ogg', 35, 1) - to_chat(user, "[src] can now be concealed.") - add_fingerprint(user) - -/obj/item/shield/riot/tele - name = "telescopic shield" - desc = "An advanced riot shield made of lightweight materials that collapses for easy storage." - icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "teleriot0" - lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' - slot_flags = null - force = 3 - throwforce = 3 - throw_speed = 3 - throw_range = 4 - w_class = WEIGHT_CLASS_NORMAL - var/active = 0 - -/obj/item/shield/riot/tele/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(active) - return ..() - return 0 - -/obj/item/shield/riot/tele/attack_self(mob/living/user) - active = !active - icon_state = "teleriot[active]" - playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, 1) - - if(active) - force = 8 - throwforce = 5 - throw_speed = 2 - w_class = WEIGHT_CLASS_BULKY - slot_flags = SLOT_BACK - to_chat(user, "You extend \the [src].") - else - force = 3 - throwforce = 3 - throw_speed = 3 - w_class = WEIGHT_CLASS_NORMAL - slot_flags = null - to_chat(user, "[src] can now be concealed.") - add_fingerprint(user) -======= /obj/item/shield name = "shield" block_chance = 50 @@ -284,4 +140,3 @@ slot_flags = null to_chat(user, "[src] can now be concealed.") add_fingerprint(user) ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) From f650d8bb5ef990649a668e59ea82515d22355b80 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 18 Dec 2017 17:24:42 -0600 Subject: [PATCH 09/86] Update mousetrap.dm --- code/modules/assembly/mousetrap.dm | 145 ----------------------------- 1 file changed, 145 deletions(-) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index ca697cdbf6..d1b88e68e1 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -1,147 +1,3 @@ -<<<<<<< HEAD -/obj/item/device/assembly/mousetrap - name = "mousetrap" - desc = "A handy little spring-loaded trap for catching pesty rodents." - icon_state = "mousetrap" - materials = list(MAT_METAL=100) - attachable = 1 - var/armed = 0 - - -/obj/item/device/assembly/mousetrap/examine(mob/user) - ..() - if(armed) - to_chat(user, "The mousetrap is armed!") - else - to_chat(user, "The mousetrap is not armed.") - -/obj/item/device/assembly/mousetrap/activate() - if(..()) - armed = !armed - if(!armed) - if(ishuman(usr)) - var/mob/living/carbon/human/user = usr - if((user.getBrainLoss() >= 60) || user.disabilities & CLUMSY && prob(50)) - to_chat(user, "Your hand slips, setting off the trigger!") - pulse(0) - update_icon() - if(usr) - playsound(usr.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) - -/obj/item/device/assembly/mousetrap/describe() - return "The pressure switch is [armed?"primed":"safe"]." - -/obj/item/device/assembly/mousetrap/update_icon() - if(armed) - icon_state = "mousetraparmed" - else - icon_state = "mousetrap" - if(holder) - holder.update_icon() - -/obj/item/device/assembly/mousetrap/proc/triggered(mob/target, type = "feet") - if(!armed) - return - var/obj/item/bodypart/affecting = null - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(PIERCEIMMUNE in H.dna.species.species_traits) - playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) - armed = 0 - update_icon() - pulse(0) - return 0 - switch(type) - if("feet") - if(!H.shoes) - affecting = H.get_bodypart(pick("l_leg", "r_leg")) - H.Knockdown(60) - if("l_hand", "r_hand") - if(!H.gloves) - affecting = H.get_bodypart(type) - H.Stun(60) - if(affecting) - if(affecting.receive_damage(1, 0)) - H.update_damage_overlays() - else if(ismouse(target)) - var/mob/living/simple_animal/mouse/M = target - visible_message("SPLAT!") - M.splat() - playsound(src.loc, 'sound/effects/snap.ogg', 50, 1) - armed = 0 - update_icon() - pulse(0) - - -/obj/item/device/assembly/mousetrap/attack_self(mob/living/carbon/human/user) - if(!armed) - to_chat(user, "You arm [src].") - else - if(((user.getBrainLoss() >= 60) || user.disabilities & CLUMSY) && prob(50)) - var/which_hand = "l_hand" - if(!(user.active_hand_index % 2)) - which_hand = "r_hand" - triggered(user, which_hand) - user.visible_message("[user] accidentally sets off [src], breaking their fingers.", \ - "You accidentally trigger [src]!") - return - to_chat(user, "You disarm [src].") - armed = !armed - update_icon() - playsound(user.loc, 'sound/weapons/handcuffs.ogg', 30, 1, -3) - - -/obj/item/device/assembly/mousetrap/attack_hand(mob/living/carbon/human/user) - if(armed) - if(((user.getBrainLoss() >= 60) || user.disabilities & CLUMSY) && prob(50)) - var/which_hand = "l_hand" - if(!(user.active_hand_index % 2)) - which_hand = "r_hand" - triggered(user, which_hand) - user.visible_message("[user] accidentally sets off [src], breaking their fingers.", \ - "You accidentally trigger [src]!") - return - ..() - - -/obj/item/device/assembly/mousetrap/Crossed(atom/movable/AM as mob|obj) - if(armed) - if(ismob(AM)) - var/mob/MM = AM - if(!(MM.movement_type & FLYING)) - if(ishuman(AM)) - var/mob/living/carbon/H = AM - if(H.m_intent == MOVE_INTENT_RUN) - triggered(H) - H.visible_message("[H] accidentally steps on [src].", \ - "You accidentally step on [src]") - else if(ismouse(MM)) - triggered(MM) - else if(AM.density) // For mousetrap grenades, set off by anything heavy - triggered(AM) - ..() - - -/obj/item/device/assembly/mousetrap/on_found(mob/finder) - if(armed) - finder.visible_message("[finder] accidentally sets off [src], breaking their fingers.", \ - "You accidentally trigger [src]!") - triggered(finder, (finder.active_hand_index % 2 == 0) ? "r_hand" : "l_hand") - return 1 //end the search! - return 0 - - -/obj/item/device/assembly/mousetrap/hitby(A as mob|obj) - if(!armed) - return ..() - visible_message("[src] is triggered by [A].") - triggered(null) - - -/obj/item/device/assembly/mousetrap/armed - icon_state = "mousetraparmed" - armed = TRUE -======= /obj/item/device/assembly/mousetrap name = "mousetrap" desc = "A handy little spring-loaded trap for catching pesty rodents." @@ -284,4 +140,3 @@ /obj/item/device/assembly/mousetrap/armed icon_state = "mousetraparmed" armed = 1 ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) From fa0bcde791ac4f5e8883d9c2f236f77f0f47dd64 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 18 Dec 2017 17:24:49 -0600 Subject: [PATCH 10/86] Update disease_outbreak.dm --- code/modules/events/disease_outbreak.dm | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index db2b1ee561..3085f1bcce 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -41,16 +41,6 @@ continue var/datum/disease/D -<<<<<<< HEAD - if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work. - if(!H.dna || (H.disabilities & BLIND)) //A blindness disease would be the worst. - continue - D = new virus_type() - var/datum/disease/dnaspread/DS = D - DS.strain_data["name"] = H.real_name - DS.strain_data["UI"] = H.dna.uni_identity - DS.strain_data["SE"] = H.dna.struc_enzymes -======= if(!advanced_virus) if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work. if(!H.dna || (H.has_disability(BLIND))) //A blindness disease would be the worst. @@ -62,9 +52,8 @@ DS.strain_data["SE"] = H.dna.struc_enzymes else D = new virus_type() ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) else D = new virus_type() D.carrier = TRUE H.AddDisease(D) - break \ No newline at end of file + break From 10eaeed06b7060d6bda2b50db739f196bb1c8b6e Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 18 Dec 2017 17:25:09 -0600 Subject: [PATCH 11/86] Update carbon.dm --- code/modules/mob/living/carbon/carbon.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 4b2a6f64d5..23decdd59f 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -157,11 +157,8 @@ if(!throwable_mob.buckled) thrown_thing = throwable_mob stop_pulling() -<<<<<<< HEAD -======= if(has_disability(PACIFISM)) to_chat(src, "You gently let go of [throwable_mob].") ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors var/turf/end_T = get_turf(target) if(start_T && end_T) @@ -173,13 +170,10 @@ thrown_thing = I dropItemToGround(I) -<<<<<<< HEAD -======= if(has_disability(PACIFISM) && I.throwforce) to_chat(src, "You set [I] down gently on the ground.") return ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) if(thrown_thing) visible_message("[src] has thrown [thrown_thing].") add_logs(src, thrown_thing, "has thrown") From e4d6f4110f8a0b964e9e65a9c24a74bf83c13232 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 18 Dec 2017 17:25:33 -0600 Subject: [PATCH 12/86] Update human_defense.dm --- code/modules/mob/living/carbon/human/human_defense.dm | 5 ----- 1 file changed, 5 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 7cdcad35bb..cdb714156a 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -140,13 +140,8 @@ return ..() /mob/living/carbon/human/grabbedby(mob/living/carbon/user, supress_message = 0) -<<<<<<< HEAD - if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && isliving(pulling)) - vore_attack(user, pulling) -======= if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && (has_disability(FAT)) && ismonkey(pulling)) devour_mob(pulling) ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) else ..() From 078c8744e05c738974e633706791a3a9a1520fe3 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 18 Dec 2017 17:25:47 -0600 Subject: [PATCH 13/86] Update species.dm --- code/modules/mob/living/carbon/human/species.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 1f30562dcf..329e59e305 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1315,12 +1315,9 @@ GLOBAL_LIST_EMPTY(roundstart_races) /datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) -<<<<<<< HEAD -======= if(user.has_disability(PACIFISM)) to_chat(user, "You don't want to harm [target]!") return FALSE ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) if(target.check_block()) target.visible_message("[target] blocks [user]'s attack!") return 0 From 8b56d1ccdd495381b2c45016c90e0605659680bf Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 18 Dec 2017 17:26:01 -0600 Subject: [PATCH 14/86] Update combat.dm --- code/modules/mob/living/carbon/monkey/combat.dm | 5 ----- 1 file changed, 5 deletions(-) diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index 089a242347..bd88714fd4 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -120,15 +120,10 @@ /mob/living/carbon/monkey/proc/should_target(var/mob/living/L) if(L == src) -<<<<<<< HEAD - return 0 -======= return FALSE if(has_disability(PACIFISM)) return FALSE ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) - if(enemies[L]) return 1 From 0d137f82d43fa9464eca46792124c7de1a93c1c3 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 18 Dec 2017 17:26:10 -0600 Subject: [PATCH 15/86] Update life.dm --- code/modules/mob/living/life.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index b8423cdc46..41c4572103 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -137,12 +137,9 @@ eye_blurry = max(eye_blurry-1, 0) if(client && !eye_blurry) clear_fullscreen("blurry") -<<<<<<< HEAD -======= if(has_disability(PACIFISM) && a_intent == INTENT_HARM) to_chat(src, "You don't feel like harming anybody.") a_intent_change(INTENT_HELP) ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) /mob/living/proc/update_damage_hud() return From 64f003d3b1b304a85ee297be34040cc36d60ed19 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 18 Dec 2017 17:26:25 -0600 Subject: [PATCH 16/86] Update living.dm --- code/modules/mob/living/living.dm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 24985f54a6..bd6b00dea7 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -811,12 +811,9 @@ if (G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser()) to_chat(src, "You don't have the dexterity to do this!") return FALSE -<<<<<<< HEAD -======= if(has_disability(PACIFISM)) to_chat(src, "You don't want to risk harming anyone!") return FALSE ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) return TRUE /mob/living/carbon/proc/update_stamina() @@ -1059,4 +1056,4 @@ /mob/living/onTransitZ(old_z,new_z) ..() - update_z(new_z) \ No newline at end of file + update_z(new_z) From 8fef308d0aea3fa00cf3b06853a833a8948395bd Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 18 Dec 2017 17:27:04 -0600 Subject: [PATCH 17/86] Update living_defense.dm --- code/modules/mob/living/living_defense.dm | 24 ----------------------- 1 file changed, 24 deletions(-) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index d99ce1b014..4dc2b6d076 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -134,16 +134,11 @@ if(!(status_flags & CANPUSH)) to_chat(user, "[src] can't be grabbed more aggressively!") -<<<<<<< HEAD - return 0 -======= return FALSE if(user.has_disability(PACIFISM)) to_chat(user, "You don't want to risk hurting [src]!") return FALSE - ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) grippedby(user) //proc to upgrade a simple pull into a more aggressive grab. @@ -197,13 +192,9 @@ M.Feedstop() return // can't attack while eating! -<<<<<<< HEAD -======= if(has_disability(PACIFISM)) to_chat(M, "You don't want to hurt anyone!") return FALSE - ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) if (stat != DEAD) add_logs(M, src, "attacked") M.do_attack_animation(src) @@ -217,13 +208,9 @@ M.visible_message("\The [M] [M.friendly] [src]!") return 0 else -<<<<<<< HEAD -======= if(M.has_disability(PACIFISM)) to_chat(M, "You don't want to hurt anyone!") return FALSE - ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) if(M.attack_sound) playsound(loc, M.attack_sound, 50, 1, 1) M.do_attack_animation(src) @@ -239,13 +226,9 @@ return 0 if (M.a_intent == INTENT_HARM) -<<<<<<< HEAD -======= if(M.has_disability(PACIFISM)) to_chat(M, "You don't want to hurt anyone!") return FALSE - ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) if(M.is_muzzled() || (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSMOUTH)) to_chat(M, "You can't bite with your mouth covered!") return 0 @@ -268,13 +251,9 @@ return 0 else -<<<<<<< HEAD -======= if(L.has_disability(PACIFISM)) to_chat(L, "You don't want to hurt anyone!") return - ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) L.do_attack_animation(src) if(prob(90)) add_logs(L, src, "attacked") @@ -297,12 +276,9 @@ grabbedby(M) return 0 if("harm") -<<<<<<< HEAD -======= if(M.has_disability(PACIFISM)) to_chat(M, "You don't want to hurt anyone!") return FALSE ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) M.do_attack_animation(src) return 1 if("disarm") From cfeea088e8cc1f8af3362ff7a760cdbfaa0304b3 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 18 Dec 2017 17:27:12 -0600 Subject: [PATCH 18/86] Update genetic.dm --- code/modules/spells/spell_types/genetic.dm | 30 +--------------------- 1 file changed, 1 insertion(+), 29 deletions(-) diff --git a/code/modules/spells/spell_types/genetic.dm b/code/modules/spells/spell_types/genetic.dm index 0982f8a01f..1b60800458 100644 --- a/code/modules/spells/spell_types/genetic.dm +++ b/code/modules/spells/spell_types/genetic.dm @@ -1,30 +1,3 @@ -<<<<<<< HEAD -/obj/effect/proc_holder/spell/targeted/genetic - name = "Genetic" - desc = "This spell inflicts a set of mutations and disabilities upon the target." - - var/disabilities = 0 //bits - var/list/mutations = list() //mutation strings - var/duration = 100 //deciseconds - /* - Disabilities - 1st bit - ? - 2nd bit - ? - 3rd bit - ? - 4th bit - ? - 5th bit - ? - 6th bit - ? - */ - -/obj/effect/proc_holder/spell/targeted/genetic/cast(list/targets,mob/user = usr) - playMagSound() - for(var/mob/living/carbon/target in targets) - if(!target.dna) - continue - for(var/A in mutations) - target.dna.add_mutation(A) - target.disabilities |= disabilities -======= /obj/effect/proc_holder/spell/targeted/genetic name = "Genetic" desc = "This spell inflicts a set of mutations and disabilities upon the target." @@ -51,7 +24,6 @@ target.dna.add_mutation(A) for(var/A in disabilities) target.add_disability(A, GENETICS_SPELL) ->>>>>>> 146d167... [Ready Again]Refactors disabilities into lists, allowing for independent disability sources (#33055) addtimer(CALLBACK(src, .proc/remove, target), duration) /obj/effect/proc_holder/spell/targeted/genetic/proc/remove(mob/living/carbon/target) @@ -59,4 +31,4 @@ for(var/A in mutations) target.dna.remove_mutation(A) for(var/A in disabilities) - target.remove_disability(A, GENETICS_SPELL) \ No newline at end of file + target.remove_disability(A, GENETICS_SPELL) From c5485faee7f6196b2b59005111a8c12069f96ad8 Mon Sep 17 00:00:00 2001 From: Ashe Higgs Date: Thu, 21 Dec 2017 07:36:58 -0500 Subject: [PATCH 19/86] Tiles blessed by holy water now block servant warp-in/Eminence snooping (#33584) * Blessing tiles blocks servant warp * Removes the color * Prevents the message from showing on the same turf --- .../gamemodes/clock_cult/clock_mobs/_eminence.dm | 14 +++++++++++++- code/game/machinery/computer/camera_advanced.dm | 3 +++ code/game/turfs/simulated/floor/misc_floor.dm | 3 +++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/clock_cult/clock_mobs/_eminence.dm b/code/game/gamemodes/clock_cult/clock_mobs/_eminence.dm index 8416e4651d..baf149093c 100644 --- a/code/game/gamemodes/clock_cult/clock_mobs/_eminence.dm +++ b/code/game/gamemodes/clock_cult/clock_mobs/_eminence.dm @@ -12,6 +12,7 @@ layer = FLY_LAYER faction = list("ratvar") lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + var/turf/last_failed_turf var/static/superheated_walls = 0 /mob/camera/eminence/CanPass(atom/movable/mover, turf/target) @@ -20,7 +21,18 @@ /mob/camera/eminence/Move(NewLoc, direct) var/OldLoc = loc if(NewLoc && !istype(NewLoc, /turf/open/indestructible/reebe_void)) - forceMove(get_turf(NewLoc)) + var/turf/T = get_turf(NewLoc) + if(T.flags_1 & NOJAUNT_1) + if(last_failed_turf != T) + T.visible_message("[T] suddenly emits a ringing sound!", ignore_mob = src) + playsound(T, 'sound/machines/clockcult/ark_damage.ogg', 75, FALSE) + last_failed_turf = T + to_chat(src, "This turf is consecrated and can't be crossed!") + return + if(istype(get_area(T), /area/chapel)) + to_chat(src, "The Chapel is hallowed ground under a heretical deity, and can't be accessed!") + return + forceMove(T) Moved(OldLoc, direct) if(GLOB.ratvar_awakens) for(var/turf/T in range(5, src)) diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 44d6d5abe4..786deaa56a 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -300,6 +300,9 @@ else if(isspaceturf(T)) to_chat(user, "[prob(1) ? "Servant cannot into space." : "You can't teleport into space."]") return + else if(T.flags_1 & NOJAUNT_1) + to_chat(user, "This tile is blessed by holy water and deflects the warp.") + return var/area/AR = get_area(T) if(!AR.clockwork_warp_allowed) to_chat(user, "[AR.clockwork_warp_fail]") diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index 3e7540cdf6..634767c98b 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -146,6 +146,9 @@ var/uses_overlay = TRUE var/obj/effect/clockwork/overlay/floor/realappearence +/turf/open/floor/clockwork/Bless() //Who needs holy blessings when you have DADDY RATVAR? + return + /turf/open/floor/clockwork/Initialize() . = ..() if(uses_overlay) From f56edf2f1fed1f329636cffe44a69d688fabc025 Mon Sep 17 00:00:00 2001 From: awesine Date: Thu, 21 Dec 2017 20:23:04 -0500 Subject: [PATCH 21/86] adds mining scanners to the gulag (#33711) * Add files via upload * Add files via upload --- _maps/map_files/Mining/Lavaland.dmm | 46 +++++++++++++++-------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index bbf998aaba..7eade308ce 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -111,6 +111,7 @@ /obj/item/pickaxe, /obj/item/device/flashlight, /obj/item/clothing/glasses/meson, +/obj/item/device/mining_scanner, /turf/open/floor/plasteel, /area/mine/laborcamp) "av" = ( @@ -119,6 +120,7 @@ /obj/item/device/flashlight, /obj/item/pickaxe, /obj/item/clothing/glasses/meson, +/obj/item/device/mining_scanner, /turf/open/floor/plasteel, /area/mine/laborcamp) "aw" = ( @@ -21563,7 +21565,7 @@ am am am am -ao +ai ab ab ab @@ -22070,7 +22072,7 @@ am am am am -ao +ai ab ab ai @@ -22854,7 +22856,7 @@ ab ab ab ab -ao +ai ab ab ab @@ -24644,7 +24646,7 @@ am am am am -ao +ai ab ab ab @@ -24901,7 +24903,7 @@ am am am am -ao +ai ab ab ab @@ -25178,7 +25180,7 @@ ab ab ab ab -ao +ai am am ai @@ -25422,7 +25424,7 @@ ab ab ab ai -ao +ai ab ab ab @@ -25672,7 +25674,7 @@ am am am am -ao +ai ab ab ab @@ -25956,7 +25958,7 @@ am am am am -ao +ai ab ab ab @@ -26199,7 +26201,7 @@ ab ab ab ab -ao +ai am am am @@ -26213,7 +26215,7 @@ am am am am -ao +ai ab ab ab @@ -26972,7 +26974,7 @@ ab ab ab ab -ao +ai am am am @@ -28511,7 +28513,7 @@ ab ab ab ai -ao +ai ab ab ab @@ -29021,7 +29023,7 @@ ab ab ab ab -ao +ai ab ab ai @@ -29030,13 +29032,13 @@ am am am am -ao +ai ab ab ab ab -ao -ao +ai +ai ab ab ab @@ -29278,8 +29280,8 @@ ab ab ab ab -ao -ao +ai +ai ab ai am @@ -30060,8 +30062,8 @@ ab ab ab ab -ao -ao +ai +ai ab ab ab @@ -30573,7 +30575,7 @@ ai ai ab ab -ao +ai am am am From 4e8898d55f4a1df30b12a6331caa37cffc83ef4b Mon Sep 17 00:00:00 2001 From: oranges Date: Fri, 22 Dec 2017 14:26:29 +1300 Subject: [PATCH 23/86] Merge pull request #33714 from lzimann/icon Job landmarks now show the mob with the proper job outfit. --- code/game/objects/effects/landmarks.dm | 51 ++++++++++++++++++++----- code/modules/admin/verbs/mapping.dm | 31 ++++++++++++++- icons/mob/landmarks.dmi | Bin 0 -> 25137 bytes 3 files changed, 72 insertions(+), 10 deletions(-) create mode 100644 icons/mob/landmarks.dmi diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index caeb1f168c..2708e78535 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -16,7 +16,7 @@ /obj/effect/landmark/start name = "start" - icon = 'icons/mob/screen_gen.dmi' + icon = 'icons/mob/landmarks.dmi' icon_state = "x" anchored = TRUE var/jobspawn_override = FALSE @@ -40,9 +40,9 @@ // START LANDMARKS FOLLOW. Don't change the names unless // you are refactoring shitty landmark code. - /obj/effect/landmark/start/assistant name = "Assistant" + icon_state = "Assistant" /obj/effect/landmark/start/assistant/override jobspawn_override = TRUE @@ -50,102 +50,135 @@ /obj/effect/landmark/start/janitor name = "Janitor" + icon_state = "Janitor" /obj/effect/landmark/start/cargo_technician name = "Cargo Technician" + icon_state = "Cargo Technician" /obj/effect/landmark/start/bartender name = "Bartender" + icon_state = "Bartender" /obj/effect/landmark/start/clown name = "Clown" + icon_state = "Clown" /obj/effect/landmark/start/mime name = "Mime" + icon_state = "Mime" /obj/effect/landmark/start/quartermaster name = "Quartermaster" + icon_state = "Quartermaster" /obj/effect/landmark/start/atmospheric_technician name = "Atmospheric Technician" + icon_state = "Atmospheric Technician" /obj/effect/landmark/start/cook name = "Cook" + icon_state = "Cook" /obj/effect/landmark/start/shaft_miner name = "Shaft Miner" + icon_state = "Shaft Miner" /obj/effect/landmark/start/security_officer name = "Security Officer" + icon_state = "Security Officer" /obj/effect/landmark/start/botanist name = "Botanist" + icon_state = "Botanist" /obj/effect/landmark/start/head_of_security name = "Head of Security" - -/obj/effect/landmark/start/ai - name = "AI" - delete_after_roundstart = FALSE + icon_state = "Head of Security" /obj/effect/landmark/start/captain name = "Captain" + icon_state = "Captain" /obj/effect/landmark/start/detective name = "Detective" + icon_state = "Detective" /obj/effect/landmark/start/warden name = "Warden" + icon_state = "Warden" /obj/effect/landmark/start/chief_engineer name = "Chief Engineer" - -/obj/effect/landmark/start/cyborg - name = "Cyborg" + icon_state = "Chief Engineer" /obj/effect/landmark/start/head_of_personnel name = "Head of Personnel" + icon_state = "Head of Personnel" /obj/effect/landmark/start/librarian name = "Curator" + icon_state = "Curator" /obj/effect/landmark/start/lawyer name = "Lawyer" + icon_state = "Lawyer" /obj/effect/landmark/start/station_engineer name = "Station Engineer" + icon_state = "Station Engineer" /obj/effect/landmark/start/medical_doctor name = "Medical Doctor" + icon_state = "Medical Doctor" /obj/effect/landmark/start/scientist name = "Scientist" + icon_state = "Scientist" /obj/effect/landmark/start/chemist name = "Chemist" + icon_state = "Chemist" /obj/effect/landmark/start/roboticist name = "Roboticist" + icon_state = "Roboticist" /obj/effect/landmark/start/research_director name = "Research Director" + icon_state = "Research Director" /obj/effect/landmark/start/geneticist name = "Geneticist" + icon_state = "Geneticist" /obj/effect/landmark/start/chief_medical_officer name = "Chief Medical Officer" + icon_state = "Chief Medical Officer" /obj/effect/landmark/start/virologist name = "Virologist" + icon_state = "Virologist" /obj/effect/landmark/start/chaplain name = "Chaplain" + icon_state = "Chaplain" + +/obj/effect/landmark/start/cyborg + name = "Cyborg" + icon_state = "Cyborg" + +/obj/effect/landmark/start/ai + name = "AI" + icon_state = "AI" + delete_after_roundstart = FALSE + //Department Security spawns /obj/effect/landmark/start/depsec name = "department_sec" + icon_state = "Security Officer" /obj/effect/landmark/start/depsec/New() ..() diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 5d0c2fe833..dcb9137416 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -45,7 +45,8 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( /client/proc/manipulate_organs, /client/proc/start_line_profiling, /client/proc/stop_line_profiling, - /client/proc/show_line_profiling + /client/proc/show_line_profiling, + /client/proc/create_mapping_job_icons )) /obj/effect/debugging/mapfix_marker @@ -265,3 +266,31 @@ GLOBAL_VAR_INIT(say_disabled, FALSE) message_admins("[src.ckey] used 'Disable all communication verbs', killing all communication methods.") else message_admins("[src.ckey] used 'Disable all communication verbs', restoring all communication methods.") + +//This generates the icon states for job starting location landmarks. +/client/proc/create_mapping_job_icons() + set name = "Generate job landmarks icons" + set category = "Mapping" + var/icon/final = icon() + var/mob/living/carbon/human/dummy/D = new(locate(1,1,1)) //spawn on 1,1,1 so we don't have runtimes when items are deleted + D.setDir(SOUTH) + for(var/job in subtypesof(/datum/job)) + var/datum/job/JB = new job + switch(JB.title) + if("AI") + final.Insert(icon('icons/mob/ai.dmi', "ai", SOUTH, 1), "AI") + if("Cyborg") + final.Insert(icon('icons/mob/robots.dmi', "robot", SOUTH, 1), "Cyborg") + else + for(var/obj/item/I in D) + qdel(I) + randomize_human(D) + JB.equip(D, TRUE, FALSE) + COMPILE_OVERLAYS(D) + var/icon/I = icon(getFlatIcon(D), frame = 1) + final.Insert(I, JB.title) + qdel(D) + //Also add the x + for(var/x_number in 1 to 4) + final.Insert(icon('icons/mob/screen_gen.dmi', "x[x_number == 1 ? "" : x_number]"), "x[x_number == 1 ? "" : x_number]") + fcopy(final, "icons/mob/landmarks.dmi") \ No newline at end of file diff --git a/icons/mob/landmarks.dmi b/icons/mob/landmarks.dmi new file mode 100644 index 0000000000000000000000000000000000000000..120745ed4437fb81639f00cae0f2399a042748d4 GIT binary patch literal 25137 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
    $V&F`=JW?-QRTYg+v?2bqjpW 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 O2vSqlR;pL9iTED_BLJ@e literal 0 HcmV?d00001 From a89435ac33d34bd295833c9b85db9f65aa638795 Mon Sep 17 00:00:00 2001 From: oranges Date: Fri, 22 Dec 2017 14:32:35 +1300 Subject: [PATCH 25/86] Merge pull request #32433 from kevinz000/vector_projectiles [READY]Refactors projectile trajectories, fixes piercing projectile inaccuracy and beam rifle visual deflections --- code/datums/actions/beam_rifle.dm | 12 + code/datums/actions/flightsuit.dm | 2 - code/datums/position_point_vector.dm | 239 ++++++++++++++++ .../temporary_visuals/projectile_beam.dm | 70 +++++ code/game/objects/structures/reflector.dm | 6 +- code/game/turfs/simulated/walls.dm | 2 +- code/modules/projectiles/gun.dm | 3 +- code/modules/projectiles/guns/beam_rifle.dm | 268 +++++------------- code/modules/projectiles/projectile.dm | 148 ++++++---- .../space_transition/space_transition.dm | 14 +- tgstation.dme | 3 + 11 files changed, 498 insertions(+), 269 deletions(-) create mode 100644 code/datums/actions/beam_rifle.dm create mode 100644 code/datums/position_point_vector.dm create mode 100644 code/game/objects/effects/temporary_visuals/projectile_beam.dm diff --git a/code/datums/actions/beam_rifle.dm b/code/datums/actions/beam_rifle.dm new file mode 100644 index 0000000000..783b93fbdb --- /dev/null +++ b/code/datums/actions/beam_rifle.dm @@ -0,0 +1,12 @@ + +/datum/action/item_action/zoom_speed_action + name = "Toggle Zooming Speed" + icon_icon = 'icons/mob/actions/actions_spells.dmi' + button_icon_state = "projectile" + background_icon_state = "bg_tech" + +/datum/action/item_action/zoom_lock_action + name = "Switch Zoom Mode" + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "zoom_mode" + background_icon_state = "bg_tech" diff --git a/code/datums/actions/flightsuit.dm b/code/datums/actions/flightsuit.dm index 3e78fa5332..cf249fed31 100644 --- a/code/datums/actions/flightsuit.dm +++ b/code/datums/actions/flightsuit.dm @@ -1,5 +1,3 @@ - - /datum/action/item_action/flightsuit icon_icon = 'icons/mob/actions/actions_flightsuit.dmi' diff --git a/code/datums/position_point_vector.dm b/code/datums/position_point_vector.dm new file mode 100644 index 0000000000..635ae0bbec --- /dev/null +++ b/code/datums/position_point_vector.dm @@ -0,0 +1,239 @@ +//Designed for things that need precision trajectories like projectiles. +//Don't use this for anything that you don't absolutely have to use this with (like projectiles!) because it isn't worth using a datum unless you need accuracy down to decimal places in pixels. + +#define RETURN_PRECISE_POSITION(A) new /datum/position(A) +#define RETURN_PRECISE_POINT(A) new /datum/point(A) + +/datum/position //For positions with map x/y/z and pixel x/y so you don't have to return lists. Could use addition/subtraction in the future I guess. + var/x = 0 + var/y = 0 + var/z = 0 + var/pixel_x = 0 + var/pixel_y = 0 + +/datum/position/proc/valid() + return x && y && z && !isnull(pixel_x) && !isnull(pixel_y) + +/datum/position/New(_x = 0, _y = 0, _z = 0, _pixel_x = 0, _pixel_y = 0) //first argument can also be a /datum/point. + if(istype(_x, /datum/point)) + var/datum/point/P = _x + var/turf/T = P.return_turf() + _x = T.x + _y = T.y + _z = T.z + _pixel_x = P.return_px() + _pixel_y = P.return_py() + else if(isatom(_x)) + var/atom/A = _x + _x = A.x + _y = A.y + _z = A.z + _pixel_x = A.pixel_x + _pixel_y = A.pixel_y + x = _x + y = _y + z = _z + pixel_x = _pixel_x + pixel_y = _pixel_y + +/datum/position/proc/return_turf() + return locate(x, y, z) + +/datum/position/proc/return_px() + return pixel_x + +/datum/position/proc/return_py() + return pixel_y + +/datum/position/proc/return_point() + return new /datum/point(src) + +/proc/point_midpoint_points(datum/point/a, datum/point/b) //Obviously will not support multiZ calculations! Same for the two below. + var/datum/point/P = new + P.x = round(a.x + (b.x - a.x) / 2, 1) + P.y = round(a.y + (b.y - a.y) / 2, 1) + P.z = a.z + return P + +/proc/pixel_length_between_points(datum/point/a, datum/point/b) + return sqrt(((b.x - a.x) ** 2) + ((b.y - a.y) ** 2)) + +/proc/angle_between_points(datum/point/a, datum/point/b) + return ATAN2((b.y - a.y), (b.x - a.x)) + +/datum/point //A precise point on the map in absolute pixel locations based on world.icon_size. Pixels are FROM THE EDGE OF THE MAP! + var/x = 0 + var/y = 0 + var/z = 0 + +/datum/point/proc/valid() + return x && y && z + +/datum/point/proc/copy_to(datum/point/p = new) + p.x = x + p.y = y + p.z = z + return p + +/datum/point/New(_x, _y, _z, _pixel_x = 0, _pixel_y = 0) //first argument can also be a /datum/position or /atom. + if(istype(_x, /datum/position)) + var/datum/position/P = _x + _x = P.x + _y = P.y + _z = P.z + _pixel_x = P.pixel_x + _pixel_y = P.pixel_y + else if(istype(_x, /atom)) + var/atom/A = _x + _x = A.x + _y = A.y + _z = A.z + _pixel_x = A.pixel_x + _pixel_y = A.pixel_y + initialize_location(_x, _y, _z, _pixel_x, _pixel_y) + +/datum/point/proc/initialize_location(tile_x, tile_y, tile_z, p_x = 0, p_y = 0) + if(!isnull(tile_x)) + x = ((tile_x - 1) * world.icon_size) + world.icon_size / 2 + p_x + if(!isnull(tile_y)) + y = ((tile_y - 1) * world.icon_size) + world.icon_size / 2+ p_y + if(!isnull(tile_z)) + z = tile_z + +/datum/point/proc/return_turf() + return locate(CEILING(x / world.icon_size, 1), CEILING(y / world.icon_size, 1), z) + +/datum/point/proc/return_coordinates() //[turf_x, turf_y, z] + return list(CEILING(x / world.icon_size, 1), CEILING(y / world.icon_size, 1), z) + +/datum/point/proc/return_position() + return new /datum/position(src) + +/datum/point/proc/return_px() + return MODULUS(x, world.icon_size) - 16 + +/datum/point/proc/return_py() + return MODULUS(y, world.icon_size) - 16 + +/datum/point/proc/mapcheck() + . = FALSE + var/maxx = world.icon_size * world.maxx + var/maxy = world.icon_size * world.maxy + var/move_zx = 0 + var/move_zy = 0 + if(x < 0) + x += maxx + move_zx -= 1 + if(y < 0) + y += maxy + move_zy -= 1 + if(x > maxx) + x -= maxx + move_zx += 1 + if(y > maxy) + y -= maxy + move_zy += 1 + var/datum/space_level/S = GLOB.z_levels_list["[z]"] + if(move_zx != 0) + var/datum/space_level/L = S.neigbours["[move_zx < 0? WEST : EAST]"] + z = L.z_value + . = TRUE + if(move_zy != 0) + var/datum/space_level/L = S.neigbours["[move_zy < 0? SOUTH : NORTH]"] + z = L.z_value + . = TRUE + +/datum/point/vector + var/speed = 32 //pixels per iteration + var/iteration = 0 + var/angle = 0 + var/mpx = 0 //calculated x/y movement amounts to prevent having to do trig every step. + var/mpy = 0 + var/starting_x = 0 //just like before, pixels from EDGE of map! This is set in initialize_location(). + var/starting_y = 0 + var/starting_z = 0 + +/datum/point/vector/New(_x, _y, _z, _pixel_x = 0, _pixel_y = 0, _angle, _speed) + ..() + initialize_trajectory(_speed, _angle) + +/datum/point/vector/initialize_location(tile_x, tile_y, tile_z, p_x = 0, p_y = 0) + . = ..() + starting_x = x + starting_y = y + starting_z = z + +/datum/point/vector/copy_to(datum/point/vector/v = new) + ..(v) + v.speed = speed + v.iteration = iteration + v.angle = angle + v.mpx = mpx + v.mpy = mpy + v.starting_x = starting_x + v.starting_y = starting_y + v.starting_z = starting_z + return v + +/datum/point/vector/proc/initialize_trajectory(pixel_speed, new_angle) + if(!isnull(pixel_speed)) + speed = pixel_speed + set_angle(new_angle) + +/datum/point/vector/proc/set_angle(new_angle) //calculations use "byond angle" where north is 0 instead of 90, and south is 180 instead of 270. + if(isnull(angle)) + return + angle = new_angle + update_offsets() + +/datum/point/vector/proc/update_offsets() + mpx = sin(angle) * speed + mpy = cos(angle) * speed + +/datum/point/vector/proc/set_speed(new_speed) + if(isnull(new_speed) || speed == new_speed) + return + speed = new_speed + update_offsets() + +/datum/point/vector/proc/increment(multiplier = 1) + iteration++ + x += mpx * 1 + y += mpy * 1 + if(mapcheck()) + on_z_change() + +/datum/point/vector/proc/return_vector_after_increments(amount = 7, multiplier = 1, force_simulate = FALSE) + var/datum/point/vector/v = copy_to() + if(force_simulate) + for(var/i in 1 to amount) + v.increment(multiplier) + else + v.increment(multiplier * amount) + return v + +/datum/point/vector/proc/on_z_change() + return + +/datum/point/vector/processed //pixel_speed is per decisecond. + var/last_process = 0 + var/last_move = 0 + var/paused = FALSE + +/datum/point/vector/processed/Destroy() + STOP_PROCESSING(SSprojectiles, src) + +/datum/point/vector/processed/proc/start() + last_process = world.time + last_move = world.time + START_PROCESSING(SSprojectiles, src) + +/datum/point/vector/processed/process() + if(paused) + last_move += world.time - last_process + last_process = world.time + return + var/needed_time = world.time - last_move + last_process = world.time + last_move = world.time + increment(needed_time) diff --git a/code/game/objects/effects/temporary_visuals/projectile_beam.dm b/code/game/objects/effects/temporary_visuals/projectile_beam.dm new file mode 100644 index 0000000000..8918dc8e27 --- /dev/null +++ b/code/game/objects/effects/temporary_visuals/projectile_beam.dm @@ -0,0 +1,70 @@ +/proc/generate_projectile_beam_between_points(datum/point/starting, datum/point/ending, beam_type, color, qdel_in = 5) //Do not pass z-crossing points as that will not be properly (and likely will never be properly until it's absolutely needed) supported! + if(!istype(starting) || !istype(ending) || !ispath(beam_type)) + return + var/datum/point/midpoint = point_midpoint_points(starting, ending) + var/obj/effect/projectile_beam/PB = new beam_type + PB.apply_vars(angle_between_points(starting, ending), midpoint.return_px(), midpoint.return_py(), color, pixel_length_between_points(starting, ending) / world.icon_size, midpoint.return_turf(), 0) + . = PB + if(qdel_in) + QDEL_IN(PB, qdel_in) + +/obj/effect/projectile_beam + icon = 'icons/obj/projectiles.dmi' + layer = ABOVE_MOB_LAYER + anchored = TRUE + light_power = 1 + light_range = 2 + light_color = "#00ffff" + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + flags_1 = ABSTRACT_1 + appearance_flags = 0 + +/obj/effect/projectile_beam/singularity_pull() + return + +/obj/effect/projectile_beam/singularity_act() + return + +/obj/effect/projectile_beam/proc/scale_to(nx,ny,override=TRUE) + var/matrix/M + if(!override) + M = transform + else + M = new + M.Scale(nx,ny) + transform = M + +/obj/effect/projectile_beam/proc/turn_to(angle,override=TRUE) + var/matrix/M + if(!override) + M = transform + else + M = new + M.Turn(angle) + transform = M + +/obj/effect/projectile_beam/New(angle_override, p_x, p_y, color_override, scaling = 1) + if(angle_override && p_x && p_y && color_override && scaling) + apply_vars(angle_override, p_x, p_y, color_override, scaling) + return ..() + +/obj/effect/projectile_beam/proc/apply_vars(angle_override, p_x = 0, p_y = 0, color_override, scaling = 1, new_loc, increment = 0) + var/mutable_appearance/look = new(src) + look.pixel_x = p_x + look.pixel_y = p_y + if(color_override) + look.color = color_override + appearance = look + scale_to(1,scaling, FALSE) + turn_to(angle_override, FALSE) + if(!isnull(new_loc)) //If you want to null it just delete it... + forceMove(new_loc) + for(var/i in 1 to increment) + pixel_x += round((sin(angle_override)+16*sin(angle_override)*2), 1) + pixel_y += round((cos(angle_override)+16*cos(angle_override)*2), 1) + +/obj/effect/projectile_beam/tracer + icon_state = "tracer_beam" + +/obj/effect/projectile_beam/tracer/aiming + icon_state = "gbeam" diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 1ae513f847..a8ca42bff5 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -202,7 +202,7 @@ var/new_angle = WRAP(rotation_angle + norm_inc, 180, -180) if(ISINRANGE_EX(norm_inc, -90, 90)) return FALSE - P.Angle = new_angle + P.setAngle(new_angle) return ..() //DOUBLE @@ -229,7 +229,7 @@ var/new_angle = WRAP(rotation_angle + norm_inc, 180, -180) if(ISINRANGE_EX(norm_inc, -90, 90)) new_angle += 180 - P.Angle = new_angle + P.setAngle(new_angle) return ..() //BOX @@ -251,7 +251,7 @@ anchored = TRUE /obj/structure/reflector/box/auto_reflect(obj/item/projectile/P) - P.Angle = rotation_angle + P.setAngle(rotation_angle) return ..() /obj/structure/reflector/ex_act() diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 00377e4f3f..14b7ef74b5 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -61,7 +61,7 @@ new_angle_s -= 360 while(new_angle_s < -180) new_angle_s += 360 - P.Angle = new_angle_s + P.setAngle(new_angle_s) return TRUE /turf/closed/wall/proc/dismantle_wall(devastated=0, explode=0) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index ff7ed7653e..e9a78f7f6d 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -400,7 +400,8 @@ /obj/item/gun/dropped(mob/user) ..() - zoom(user,FALSE) + if(zoomed) + zoom(user,FALSE) if(azoom) azoom.Remove(user) if(alight) diff --git a/code/modules/projectiles/guns/beam_rifle.dm b/code/modules/projectiles/guns/beam_rifle.dm index ee8036bf44..a2ea7dfb59 100644 --- a/code/modules/projectiles/guns/beam_rifle.dm +++ b/code/modules/projectiles/guns/beam_rifle.dm @@ -4,9 +4,6 @@ #define ZOOM_LOCK_CENTER_VIEW 2 #define ZOOM_LOCK_OFF 3 -#define ZOOM_SPEED_STEP 0 -#define ZOOM_SPEED_INSTANT 1 - #define AUTOZOOM_PIXEL_STEP_FACTOR 48 #define AIMING_BEAM_ANGLE_CHANGE_THRESHOLD 0.1 @@ -45,7 +42,7 @@ var/lastangle = 0 var/aiming_lastangle = 0 var/mob/current_user = null - var/obj/effect/projectile_beam/current_tracer + var/list/obj/effect/projectile_beam/current_tracers var/structure_piercing = 2 //Amount * 2. For some reason structures aren't respecting this unless you have it doubled. Probably with the objects in question's Bump() code instead of this but I'll deal with this later. var/structure_bleed_coeff = 0.7 @@ -69,9 +66,8 @@ //ZOOMING var/zoom_current_view_increase = 0 var/zoom_target_view_increase = 10 - var/zoom_speed = ZOOM_SPEED_STEP var/zooming = FALSE - var/zoom_lock = ZOOM_LOCK_AUTOZOOM_FREEMOVE + var/zoom_lock = ZOOM_LOCK_OFF var/zooming_angle var/current_zoom_x = 0 var/current_zoom_y = 0 @@ -80,7 +76,6 @@ var/static/image/charged_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_charged") var/static/image/drained_overlay = image(icon = 'icons/obj/guns/energy.dmi', icon_state = "esniper_empty") - var/datum/action/item_action/zoom_speed_action/zoom_speed_action var/datum/action/item_action/zoom_lock_action/zoom_lock_action /obj/item/gun/energy/beam_rifle/debug @@ -103,15 +98,6 @@ . = ..() /obj/item/gun/energy/beam_rifle/ui_action_click(owner, action) - if(istype(action, /datum/action/item_action/zoom_speed_action)) - zoom_speed++ - if(zoom_speed > 1) - zoom_speed = ZOOM_SPEED_STEP - switch(zoom_speed) - if(ZOOM_SPEED_STEP) - to_chat(owner, "You switch [src]'s digital zoom to stepper mode.") - if(ZOOM_SPEED_INSTANT) - to_chat(owner, "You switch [src]'s digital zoom to instant mode.") if(istype(action, /datum/action/item_action/zoom_lock_action)) zoom_lock++ if(zoom_lock > 3) @@ -135,8 +121,6 @@ var/total_time = SSfastprocess.wait if(delay_override) total_time = delay_override - if(zoom_speed == ZOOM_SPEED_INSTANT) - total_time = 0 zoom_animating = total_time animate(current_user.client, pixel_x = current_zoom_x, pixel_y = current_zoom_y , total_time, SINE_EASING, ANIMATION_PARALLEL) zoom_animating = 0 @@ -150,18 +134,10 @@ /obj/item/gun/energy/beam_rifle/proc/handle_zooming() if(!zooming || !check_user()) return - if(zoom_speed == ZOOM_SPEED_INSTANT) - current_user.client.change_view(world.view + zoom_target_view_increase) - zoom_current_view_increase = zoom_target_view_increase - set_autozoom_pixel_offsets_immediate(zooming_angle) - smooth_zooming() - return - if(zoom_current_view_increase > zoom_target_view_increase) - return - zoom_current_view_increase++ - current_user.client.change_view(zoom_current_view_increase + world.view) + current_user.client.change_view(world.view + zoom_target_view_increase) + zoom_current_view_increase = zoom_target_view_increase set_autozoom_pixel_offsets_immediate(zooming_angle) - smooth_zooming(SSfastprocess.wait * zoom_target_view_increase * zoom_speed) + smooth_zooming() /obj/item/gun/energy/beam_rifle/proc/start_zooming() if(zoom_lock == ZOOM_LOCK_OFF) @@ -169,8 +145,9 @@ zooming = TRUE /obj/item/gun/energy/beam_rifle/proc/stop_zooming() - zooming = FALSE - reset_zooming() + if(zooming) + zooming = FALSE + reset_zooming() /obj/item/gun/energy/beam_rifle/proc/reset_zooming() if(!check_user(FALSE)) @@ -204,14 +181,14 @@ /obj/item/gun/energy/beam_rifle/Initialize() . = ..() + current_tracers = list() START_PROCESSING(SSprojectiles, src) - zoom_speed_action = new(src) zoom_lock_action = new(src) /obj/item/gun/energy/beam_rifle/Destroy() STOP_PROCESSING(SSfastprocess, src) set_user(null) - QDEL_NULL(current_tracer) + QDEL_LIST(current_tracers) return ..() /obj/item/gun/energy/beam_rifle/emp_act(severity) @@ -245,6 +222,7 @@ /obj/item/gun/energy/beam_rifle/process() if(!aiming) + last_process = world.time return check_user() handle_zooming() @@ -299,7 +277,7 @@ set waitfor = FALSE aiming_time_left = aiming_time aiming = FALSE - QDEL_NULL(current_tracer) + QDEL_LIST(current_tracers) stop_zooming() /obj/item/gun/energy/beam_rifle/proc/set_user(mob/user) @@ -341,7 +319,7 @@ sync_ammo() afterattack(M.client.mouseObject, M, FALSE, M.client.mouseParams, passthrough = TRUE) stop_aiming() - QDEL_NULL(current_tracer) + QDEL_LIST(current_tracers) return ..() /obj/item/gun/energy/beam_rifle/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE) @@ -555,136 +533,103 @@ handle_impact(target) /obj/item/projectile/beam/beam_rifle/Collide(atom/target) - paused = TRUE if(check_pierce(target)) permutated += target return FALSE if(!QDELETED(target)) cached = get_turf(target) - paused = FALSE . = ..() /obj/item/projectile/beam/beam_rifle/on_hit(atom/target, blocked = FALSE) - paused = TRUE if(!QDELETED(target)) cached = get_turf(target) handle_hit(target) - paused = FALSE . = ..() /obj/item/projectile/beam/beam_rifle/hitscan icon_state = "" var/tracer_type = /obj/effect/projectile_beam/tracer - var/starting_z - var/starting_p_x - var/starting_p_y + var/list/beam_segments //assoc list of datum/point or datum/point/vector, start = end. var/constant_tracer = FALSE - var/travelled_p_x = 0 - var/travelled_p_y = 0 - var/tracer_spawned = FALSE + var/beam_index /obj/item/projectile/beam/beam_rifle/hitscan/Destroy() - paused = TRUE //STOP HITTING WHEN YOU'RE ALREADY BEING DELETED! - spawn_tracer(constant_tracer) + if(loc) + var/datum/point/pcache = trajectory.copy_to() + beam_segments[beam_index] = pcache + generate_tracers(constant_tracer) return ..() -/obj/item/projectile/beam/beam_rifle/hitscan/proc/spawn_tracer(put_in_rifle = FALSE) - if(tracer_spawned) - return - tracer_spawned = TRUE - //Remind me to port baystation trajectories so this shit isn't needed... - var/pixels_travelled = round(sqrt(travelled_p_x**2 + travelled_p_y**2),1) - var/scaling = pixels_travelled/world.icon_size - var/midpoint_p_x = round(starting_p_x + (travelled_p_x / 2)) - var/midpoint_p_y = round(starting_p_y + (travelled_p_y / 2)) - var/tracer_px = midpoint_p_x % world.icon_size - var/tracer_py = midpoint_p_y % world.icon_size - var/tracer_lx = (midpoint_p_x - tracer_px) / world.icon_size - var/tracer_ly = (midpoint_p_y - tracer_py) / world.icon_size - var/obj/effect/projectile_beam/PB = new tracer_type(src) - PB.apply_vars(Angle, tracer_px, tracer_py, color, scaling, locate(tracer_lx,tracer_ly,starting_z)) - if(put_in_rifle && istype(gun)) - if(gun.current_tracer) - QDEL_NULL(gun.current_tracer) - gun.current_tracer = PB - else - QDEL_IN(PB, 5) +/obj/item/projectile/beam/beam_rifle/hitscan/Collide(atom/target) + var/datum/point/pcache = trajectory.copy_to() + . = ..() + if(. && !QDELETED(src)) //successful touch and not destroyed. + beam_segments[beam_index] = pcache + beam_index = pcache + beam_segments[beam_index] = null -/obj/item/projectile/beam/beam_rifle/hitscan/proc/check_for_turf_edge(turf/T) - if(!istype(T)) - return TRUE - var/tx = T.x - var/ty = T.y - if(tx < 10 || tx > (world.maxx - 10) || ty < 10 || ty > (world.maxy-10)) - return TRUE - return FALSE +/obj/item/projectile/beam/beam_rifle/hitscan/before_z_change(turf/oldloc, turf/newloc) + var/datum/point/pcache = trajectory.copy_to() + beam_segments[beam_index] = pcache + beam_index = RETURN_PRECISE_POINT(newloc) + beam_segments[beam_index] = null + return ..() + +/obj/item/projectile/beam/beam_rifle/hitscan/proc/generate_tracers(highlander = FALSE, cleanup = TRUE) + set waitfor = FALSE + if(highlander && istype(gun)) + QDEL_LIST(gun.current_tracers) + for(var/datum/point/p in beam_segments) + gun.current_tracers += generate_projectile_beam_between_points(p, beam_segments[p], tracer_type, color, 0) + else + for(var/datum/point/p in beam_segments) + generate_projectile_beam_between_points(p, beam_segments[p], tracer_type, color, 5) + if(cleanup) + QDEL_LIST(beam_segments) + beam_segments = null + QDEL_NULL(beam_index) /obj/item/projectile/beam/beam_rifle/hitscan/fire(setAngle, atom/direct_target) //oranges didn't let me make this a var the first time around so copypasta time - set waitfor = 0 + set waitfor = FALSE + var/turf/starting = get_turf(src) + trajectory = new(starting.x, starting.y, starting.z, 0, 0, setAngle? setAngle : Angle, 33) if(!log_override && firer && original) add_logs(firer, original, "fired at", src, " [get_area(src)]") + fired = TRUE if(setAngle) Angle = setAngle - var/next_run = world.time - var/old_pixel_x = pixel_x - var/old_pixel_y = pixel_y var/safety = 0 //The code works fine, but... just in case... var/turf/c2 - var/starting_x = loc.x - var/starting_y = loc.y - starting_z = loc.z - starting_p_x = starting_x * world.icon_size + pixel_x - starting_p_y = starting_y * world.icon_size + pixel_y + beam_segments = list() //initialize segment list with the list for the first segment + beam_index = RETURN_PRECISE_POINT(src) + beam_segments[beam_index] = null //record start. + if(spread) + Angle += (rand() - 0.5) * spread while(loc) + if(paused || QDELETED(src)) + return if(++safety > (range * 3)) //If it's looping for way, way too long... + qdel(src) + stack_trace("WARNING: [type] projectile encountered infinite recursion in [__FILE__]/[__LINE__]!") return //Kill! - if(spread) - Angle += (rand() - 0.5) * spread var/matrix/M = new M.Turn(Angle) transform = M - var/Pixel_x=sin(Angle)+16*sin(Angle)*2 - var/Pixel_y=cos(Angle)+16*cos(Angle)*2 - travelled_p_x += Pixel_x - travelled_p_y += Pixel_y - var/pixel_x_offset = old_pixel_x + Pixel_x - var/pixel_y_offset = old_pixel_y + Pixel_y - var/new_x = x - var/new_y = y - while(pixel_x_offset > 16) - pixel_x_offset -= 32 - old_pixel_x -= 32 - new_x++// x++ - while(pixel_x_offset < -16) - pixel_x_offset += 32 - old_pixel_x += 32 - new_x-- - while(pixel_y_offset > 16) - pixel_y_offset -= 32 - old_pixel_y -= 32 - new_y++ - while(pixel_y_offset < -16) - pixel_y_offset += 32 - old_pixel_y += 32 - new_y-- - pixel_x = old_pixel_x - pixel_y = old_pixel_y - step_towards(src, locate(new_x, new_y, z)) - next_run += max(world.tick_lag, speed) - var/delay = next_run - world.time - if(delay <= world.tick_lag*2) - pixel_x = pixel_x_offset - pixel_y = pixel_y_offset + trajectory.increment() + var/turf/T = trajectory.return_turf() + if(T.z != loc.z) + before_z_change(loc, T) + trajectory_ignore_forcemove = TRUE + forceMove(T) + trajectory_ignore_forcemove = FALSE else - animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (delay <= 3 ? delay - 1 : delay)), flags = ANIMATION_END_NOW) - old_pixel_x = pixel_x_offset - old_pixel_y = pixel_y_offset + step_towards(src, T) + animate(src, pixel_x = trajectory.return_px(), pixel_y = trajectory.return_py(), time = 1, flags = ANIMATION_END_NOW) + if(can_hit_target(original, permutated)) Collide(original) - c2 = loc Range() - if(check_for_turf_edge(loc)) - spawn_tracer(constant_tracer) + c2 = get_turf(src) if(istype(c2)) cached = c2 @@ -704,76 +649,3 @@ /obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit() qdel(src) return FALSE - -/obj/effect/projectile_beam - icon = 'icons/obj/projectiles.dmi' - layer = ABOVE_MOB_LAYER - anchored = TRUE - light_power = 1 - light_range = 2 - light_color = "#00ffff" - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - flags_1 = ABSTRACT_1 - appearance_flags = 0 - -/obj/effect/projectile_beam/proc/scale_to(nx,ny,override=TRUE) - var/matrix/M - if(!override) - M = transform - else - M = new - M.Scale(nx,ny) - transform = M - -/obj/effect/projectile_beam/proc/turn_to(angle,override=TRUE) - var/matrix/M - if(!override) - M = transform - else - M = new - M.Turn(angle) - transform = M - -/obj/effect/projectile_beam/New(angle_override, p_x, p_y, color_override, scaling = 1) - if(angle_override && p_x && p_y && color_override && scaling) - apply_vars(angle_override, p_x, p_y, color_override, scaling) - return ..() - -/obj/effect/projectile_beam/proc/apply_vars(angle_override, p_x, p_y, color_override, scaling = 1, new_loc, increment = 0) - var/mutable_appearance/look = new(src) - look.pixel_x = p_x - look.pixel_y = p_y - if(color_override) - look.color = color_override - appearance = look - scale_to(1,scaling, FALSE) - turn_to(angle_override, FALSE) - if(!isnull(new_loc)) //If you want to null it just delete it... - forceMove(new_loc) - for(var/i in 1 to increment) - pixel_x += round((sin(angle_override)+16*sin(angle_override)*2), 1) - pixel_y += round((cos(angle_override)+16*cos(angle_override)*2), 1) - -/obj/effect/projectile_beam/tracer - icon_state = "tracer_beam" - -/obj/effect/projectile_beam/tracer/aiming - icon_state = "gbeam" - -/datum/action/item_action/zoom_speed_action - name = "Toggle Zooming Speed" - icon_icon = 'icons/mob/actions/actions_spells.dmi' - button_icon_state = "projectile" - background_icon_state = "bg_tech" - -/datum/action/item_action/zoom_lock_action - name = "Switch Zoom Mode" - icon_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "zoom_mode" - background_icon_state = "bg_tech" - -/obj/effect/projectile_beam/singularity_pull() - return - -/obj/effect/projectile_beam/singularity_act() - return diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 79e2fdf903..08142f1e8d 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -31,16 +31,11 @@ var/last_projectile_move = 0 var/last_process = 0 var/time_offset = 0 - var/old_pixel_x = 0 - var/old_pixel_y = 0 - var/pixel_x_increment = 0 - var/pixel_y_increment = 0 - var/pixel_x_offset = 0 - var/pixel_y_offset = 0 - var/new_x = 0 - var/new_y = 0 + var/datum/point/vector/trajectory + var/trajectory_ignore_forcemove = FALSE //instructs forceMove to NOT reset our trajectory to the new location! var/speed = 0.8 //Amount of deciseconds it takes for projectile to travel + var/pixel_speed = 33 //pixels per move - DO NOT FUCK WITH THIS UNLESS YOU ABSOLUTELY KNOW WHAT YOU ARE DOING OR UNEXPECTED THINGS /WILL/ HAPPEN! var/Angle = 0 var/nondirectional_sprite = FALSE //Set TRUE to prevent projectiles from having their sprites rotated based on firing angle var/spread = 0 //amount (in degrees) of projectile spread @@ -48,6 +43,9 @@ var/ricochets = 0 var/ricochets_max = 2 var/ricochet_chance = 30 + + var/colliding = FALSE //pause processing.. + var/ignore_source_check = FALSE var/damage = 10 @@ -168,20 +166,28 @@ /obj/item/projectile/proc/vol_by_damage() if(src.damage) - return CLAMP((src.damage) * 0.67, 30, 100)// Multiply projectile damage by 0.67, then clamp the value between 30 and 100 + return CLAMP((src.damage) * 0.67, 30, 100)// Multiply projectile damage by 0.67, then CLAMP the value between 30 and 100 else return 50 //if the projectile doesn't do damage, play its hitsound at 50% volume +/obj/item/projectile/proc/on_ricochet(atom/A) + return + /obj/item/projectile/Collide(atom/A) + colliding = TRUE if(check_ricochet(A) && check_ricochet_flag(A) && ricochets < ricochets_max) ricochets++ if(A.handle_ricochet(src)) + on_ricochet(A) ignore_source_check = TRUE range = initial(range) - return FALSE + return TRUE if(firer && !ignore_source_check) if(A == firer || (A == firer.loc && ismecha(A))) //cannot shoot yourself or your mech - loc = A.loc + trajectory_ignore_forcemove = TRUE + forceMove(get_turf(A)) + trajectory_ignore_forcemove = FALSE + colliding = FALSE return FALSE var/distance = get_dist(get_turf(A), starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations. @@ -197,25 +203,32 @@ if(!prehit(A)) if(forcedodge) - loc = target_turf + trajectory_ignore_forcemove = TRUE + forceMove(target_turf) + trajectory_ignore_forcemove = FALSE + colliding = FALSE return FALSE var/permutation = A.bullet_act(src, def_zone) // searches for return value, could be deleted after run so check A isn't null if(permutation == -1 || forcedodge)// the bullet passes through a dense object! - loc = target_turf + trajectory_ignore_forcemove = TRUE + forceMove(target_turf) + trajectory_ignore_forcemove = FALSE if(A) permutated.Add(A) + colliding = FALSE return FALSE else var/atom/alt = select_target(A) if(alt) if(!prehit(alt)) + colliding = FALSE return FALSE alt.bullet_act(src, def_zone) qdel(src) + colliding = FALSE return TRUE - /obj/item/projectile/proc/select_target(atom/A) //Selects another target from a wall if we hit a wall. if(!A || !A.density || (A.flags_1 & ON_BORDER_1) || ismob(A) || A == original) //if we hit a dense non-border obj or dense turf then we also hit one of the mobs or machines/structures on that tile. return @@ -246,12 +259,30 @@ return TRUE return FALSE +/obj/item/projectile/proc/return_predicted_turf_after_moves(moves, forced_angle) //I say predicted because there's no telling that the projectile won't change direction/location in flight. + if(!trajectory && isnull(forced_angle) && isnull(Angle)) + return FALSE + var/datum/point/vector/current = trajectory + if(!current) + var/turf/T = get_turf(src) + current = new(T.x, T.y, T.z, pixel_x, pixel_y, isnull(forced_angle)? Angle : forced_angle, pixel_speed) + var/datum/point/vector/v = current.return_vector_after_increments(moves) + return v.return_turf() + +/obj/item/projectile/proc/return_pathing_turfs_in_moves(moves, forced_angle) + var/turf/current = get_turf(src) + var/turf/ending = return_predicted_turf_after_moves(moves, forced_angle) + return getline(current, ending) + +/obj/item/projectile/proc/before_z_change(turf/oldloc, turf/newloc) + return + /obj/item/projectile/Process_Spacemove(var/movement_dir = 0) return TRUE //Bullets don't drift in space /obj/item/projectile/process() last_process = world.time - if(!loc || !fired) + if(!loc || !fired || !trajectory) fired = FALSE return PROCESS_KILL if(paused || !isturf(loc)) @@ -285,73 +316,70 @@ setAngle(angle) if(spread) setAngle(Angle + ((rand() - 0.5) * spread)) + var/turf/starting = get_turf(src) if(isnull(Angle)) //Try to resolve through offsets if there's no angle set. - var/turf/starting = get_turf(src) + if(isnull(xo) || isnull(yo)) + stack_trace("WARNING: Projectile [type] deleted due to being unable to resolve a target after angle was null!") + qdel(src) + return var/turf/target = locate(CLAMP(starting + xo, 1, world.maxx), CLAMP(starting + yo, 1, world.maxy), starting.z) setAngle(Get_Angle(src, target)) if(!nondirectional_sprite) var/matrix/M = new M.Turn(Angle) transform = M - old_pixel_x = pixel_x - old_pixel_y = pixel_y + trajectory = new(starting.x, starting.y, starting.z, 0, 0, Angle, pixel_speed) last_projectile_move = world.time fired = TRUE if(!isprocessing) START_PROCESSING(SSprojectiles, src) + pixel_move(1) //move it now! /obj/item/projectile/proc/setAngle(new_angle) //wrapper for overrides. Angle = new_angle - return TRUE - -/obj/item/projectile/proc/pixel_move(moves) if(!nondirectional_sprite) var/matrix/M = new M.Turn(Angle) transform = M + if(trajectory) + trajectory.set_angle(new_angle) + return TRUE - pixel_x_increment=round((sin(Angle)+16*sin(Angle)*2), 1) //round() is a floor operation when only one argument is supplied, we don't want that here - pixel_y_increment=round((cos(Angle)+16*cos(Angle)*2), 1) - pixel_x_offset = old_pixel_x + pixel_x_increment - pixel_y_offset = old_pixel_y + pixel_y_increment - new_x = x - new_y = y +/obj/item/projectile/forceMove(atom/target) + . = ..() + if(trajectory && !trajectory_ignore_forcemove && isturf(target)) + trajectory.initialize_location(target.x, target.y, target.z, 0, 0) - while(pixel_x_offset > 16) - pixel_x_offset -= 32 - old_pixel_x -= 32 - new_x++// x++ - while(pixel_x_offset < -16) - pixel_x_offset += 32 - old_pixel_x += 32 - new_x-- - while(pixel_y_offset > 16) - pixel_y_offset -= 32 - old_pixel_y -= 32 - new_y++ - while(pixel_y_offset < -16) - pixel_y_offset += 32 - old_pixel_y += 32 - new_y-- +/obj/item/projectile/proc/pixel_move(moves, trajectory_multiplier = 1) + if(!loc || !trajectory) + return + last_projectile_move = world.time + if(!nondirectional_sprite) + var/matrix/M = new + M.Turn(Angle) + transform = M + trajectory.increment(trajectory_multiplier) + var/turf/T = trajectory.return_turf() + if(T.z != loc.z) + before_z_change(loc, T) + trajectory_ignore_forcemove = TRUE + forceMove(T) + trajectory_ignore_forcemove = FALSE + pixel_x = trajectory.return_px() + pixel_y = trajectory.return_py() + else + step_towards(src, T) + pixel_x = trajectory.return_px() - trajectory.mpx * trajectory_multiplier + pixel_y = trajectory.return_py() - trajectory.mpy * trajectory_multiplier + animate(src, pixel_x = trajectory.return_px(), pixel_y = trajectory.return_py(), time = 1, flags = ANIMATION_END_NOW) - step_towards(src, locate(new_x, new_y, z)) - pixel_x = old_pixel_x - pixel_y = old_pixel_y - animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = 1, flags = ANIMATION_END_NOW) - old_pixel_x = pixel_x_offset - old_pixel_y = pixel_y_offset if(can_hit_target(original, permutated)) Collide(original) Range() - last_projectile_move = world.time //Returns true if the target atom is on our current turf and above the right layer /obj/item/projectile/proc/can_hit_target(atom/target, var/list/passthrough) - if(target && (target.layer >= PROJECTILE_HIT_THRESHHOLD_LAYER) || ismob(target)) - if(loc == get_turf(target)) - if(!(target in passthrough)) - return TRUE - return FALSE + return (target && ((target.layer >= PROJECTILE_HIT_THRESHHOLD_LAYER) || ismob(target)) && (loc == get_turf(target)) && (!(target in passthrough))) /obj/item/projectile/proc/preparePixelProjectile(atom/target, atom/source, params, spread = 0) var/turf/curloc = get_turf(source) @@ -362,7 +390,8 @@ if(targloc || !params) yo = targloc.y - curloc.y xo = targloc.x - curloc.x - + setAngle(Get_Angle(src, targloc)) + if(isliving(source) && params) var/list/calculated = calculate_projectile_angle_and_pixel_offsets(source, params) p_x = calculated[2] @@ -372,8 +401,13 @@ setAngle(calculated[1] + spread) else setAngle(calculated[1]) - else + else if(targloc) + yo = targloc.y - curloc.y + xo = targloc.x - curloc.x setAngle(Get_Angle(src, targloc)) + else + stack_trace("WARNING: Projectile [type] fired without either mouse parameters, or a target atom to aim at!") + qdel(src) /proc/calculate_projectile_angle_and_pixel_offsets(mob/user, params) var/list/mouse_control = params2list(params) diff --git a/code/modules/space_transition/space_transition.dm b/code/modules/space_transition/space_transition.dm index 2a8be8a761..edcad9b620 100644 --- a/code/modules/space_transition/space_transition.dm +++ b/code/modules/space_transition/space_transition.dm @@ -19,7 +19,7 @@ GLOBAL_LIST_EMPTY(z_levels_list) neigbours[A] = src /datum/space_level/proc/set_neigbours(list/L) - for(var/datum/point/P in L) + for(var/datum/space_transition_point/P in L) if(P.x == xi) if(P.y == yi+1) neigbours[TEXT_NORTH] = P.spl @@ -35,13 +35,13 @@ GLOBAL_LIST_EMPTY(z_levels_list) neigbours[TEXT_WEST] = P.spl P.spl.neigbours[TEXT_EAST] = src -/datum/point //this is explicitly utilitarian datum type made specially for the space map generation and are absolutely unusable for anything else +/datum/space_transition_point //this is explicitly utilitarian datum type made specially for the space map generation and are absolutely unusable for anything else var/list/neigbours = list() var/x var/y var/datum/space_level/spl -/datum/point/New(nx, ny, list/point_grid) +/datum/space_transition_point/New(nx, ny, list/point_grid) if(!point_grid) qdel(src) return @@ -55,7 +55,7 @@ GLOBAL_LIST_EMPTY(z_levels_list) return point_grid[x][y] = src -/datum/point/proc/set_neigbours(list/grid) +/datum/space_transition_point/proc/set_neigbours(list/grid) var/max_X = grid.len var/list/max_Y = grid[1] max_Y = max_Y.len @@ -86,13 +86,13 @@ GLOBAL_LIST_EMPTY(z_levels_list) k++ var/list/point_grid[conf_set_len*2+1][conf_set_len*2+1] var/list/grid = list() - var/datum/point/P + var/datum/space_transition_point/P for(var/i = 1, i<=conf_set_len*2+1, i++) for(var/j = 1, j<=conf_set_len*2+1, j++) - P = new/datum/point(i,j, point_grid) + P = new/datum/space_transition_point(i,j, point_grid) point_grid[i][j] = P grid.Add(P) - for(var/datum/point/pnt in grid) + for(var/datum/space_transition_point/pnt in grid) pnt.set_neigbours(point_grid) P = point_grid[conf_set_len+1][conf_set_len+1] var/list/possible_points = list() diff --git a/tgstation.dme b/tgstation.dme index 139d4d00e3..c9e3ef2e0e 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -306,6 +306,7 @@ #include "code\datums\mutable_appearance.dm" #include "code\datums\mutations.dm" #include "code\datums\outfit.dm" +#include "code\datums\position_point_vector.dm" #include "code\datums\profiling.dm" #include "code\datums\progressbar.dm" #include "code\datums\radiation_wave.dm" @@ -318,6 +319,7 @@ #include "code\datums\verbs.dm" #include "code\datums\weakrefs.dm" #include "code\datums\world_topic.dm" +#include "code\datums\actions\beam_rifle.dm" #include "code\datums\actions\flightsuit.dm" #include "code\datums\actions\ninja.dm" #include "code\datums\antagonists\abductor.dm" @@ -851,6 +853,7 @@ #include "code\game\objects\effects\temporary_visuals\clockcult.dm" #include "code\game\objects\effects\temporary_visuals\cult.dm" #include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" +#include "code\game\objects\effects\temporary_visuals\projectile_beam.dm" #include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" #include "code\game\objects\items\AI_modules.dm" #include "code\game\objects\items\airlock_painter.dm" From 6cfd346bddc54ec02544cfdb9a3b5e3cae58a497 Mon Sep 17 00:00:00 2001 From: WJohn Date: Fri, 22 Dec 2017 11:34:24 -0500 Subject: [PATCH 27/86] Tweaks the syndicate infiltrator so it's no longer lopsided. (#33731) --- _maps/map_files/BoxStation/BoxStation.dmm | 10 +- .../map_files/Deltastation/DeltaStation2.dmm | 10 +- _maps/map_files/MetaStation/MetaStation.dmm | 10 +- _maps/map_files/OmegaStation/OmegaStation.dmm | 10 +- _maps/map_files/PubbyStation/PubbyStation.dmm | 10 +- _maps/map_files/generic/CentCom.dmm | 1004 +++++++++-------- code/modules/shuttle/syndicate.dm | 4 +- 7 files changed, 591 insertions(+), 467 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 335393adac..12b9c297fc 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -8973,14 +8973,14 @@ /area/maintenance/port/fore) "avT" = ( /obj/docking_port/stationary{ - dheight = 9; - dir = 2; - dwidth = 5; - height = 24; + dheight = 1; + dir = 8; + dwidth = 12; + height = 17; id = "syndicate_ne"; name = "northeast of station"; turf_type = /turf/open/space; - width = 18 + width = 23 }, /turf/open/space, /area/space/nearstation) diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 2852c76257..05a68f83ac 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -3322,14 +3322,14 @@ /area/construction/mining/aux_base) "agO" = ( /obj/docking_port/stationary{ - dheight = 9; - dir = 2; - dwidth = 5; - height = 24; + dheight = 1; + dir = 8; + dwidth = 12; + height = 17; id = "syndicate_ne"; name = "northeast of station"; turf_type = /turf/open/space; - width = 18 + width = 23 }, /turf/open/space, /area/space/nearstation) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 8ed9acf09f..e31bb2fc08 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -80597,14 +80597,14 @@ /area/shuttle/abandoned) "EDa" = ( /obj/docking_port/stationary{ - dheight = 9; - dir = 2; - dwidth = 5; - height = 24; + dheight = 1; + dir = 8; + dwidth = 12; + height = 17; id = "syndicate_nw"; name = "northwest of station"; turf_type = /turf/open/space; - width = 18 + width = 23 }, /turf/open/space/basic, /area/space/nearstation) diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index ffda1f471d..4fc42569fa 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -34669,14 +34669,14 @@ /area/space/nearstation) "sws" = ( /obj/docking_port/stationary{ - dheight = 9; - dir = 2; - dwidth = 5; - height = 24; + dheight = 1; + dir = 8; + dwidth = 12; + height = 17; id = "syndicate_sw"; name = "southwest of station"; turf_type = /turf/open/space; - width = 18 + width = 23 }, /turf/open/space, /area/space/nearstation) diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 7eb9a7ac7a..54e01bc923 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -3137,14 +3137,14 @@ /area/maintenance/department/crew_quarters/dorms) "ajA" = ( /obj/docking_port/stationary{ - dheight = 9; - dir = 2; - dwidth = 5; - height = 24; + dheight = 1; + dir = 8; + dwidth = 12; + height = 17; id = "syndicate_ne"; name = "northeast of station"; turf_type = /turf/open/space; - width = 18 + width = 23 }, /turf/open/space, /area/space/nearstation) diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 27198fe072..804e2c7a9a 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -7568,11 +7568,16 @@ }, /area/shuttle/syndicate/hallway) "uc" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 4 +/obj/structure/chair{ + dir = 4; + name = "tactical chair" }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/syndicate/hallway) +/obj/effect/turf_decal/bot_white, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/shuttle/syndicate/airlock) "ud" = ( /obj/machinery/door/poddoor/shutters{ id = "nukeop_ready"; @@ -14641,6 +14646,125 @@ }, /turf/open/floor/plasteel, /area/tdome/arena) +"Mt" = ( +/obj/structure/chair{ + dir = 4; + name = "tactical chair" + }, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/shuttle/syndicate/airlock) +"Mu" = ( +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/syndicate, +/obj/item/crowbar/red, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/syndicate/airlock) +"Mv" = ( +/obj/structure/chair{ + dir = 4; + name = "tactical chair" + }, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/shuttle/syndicate/airlock) +"Mw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/syndicate/airlock) +"Mx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/syndicate/airlock) +"My" = ( +/obj/docking_port/stationary{ + area_type = /area/syndicate_mothership; + baseturf_type = /turf/open/floor/plating/asteroid/snow; + dheight = 1; + dir = 8; + dwidth = 12; + height = 17; + id = "syndicate_away"; + name = "syndicate recon outpost"; + turf_type = /turf/open/floor/plating/asteroid/snow; + width = 23 + }, +/obj/machinery/door/poddoor{ + id = "smindicate"; + name = "outer blast door" + }, +/obj/machinery/button/door{ + id = "smindicate"; + name = "external door control"; + pixel_x = 0; + pixel_y = 26; + req_access_txt = "150" + }, +/obj/docking_port/mobile{ + dheight = 1; + dir = 8; + dwidth = 12; + height = 17; + hidden = 1; + id = "syndicate"; + movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); + name = "syndicate infiltrator"; + port_direction = 4; + roundstart_move = null; + width = 23 + }, +/obj/structure/fans/tiny, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/syndicate/airlock) +"Mz" = ( +/turf/open/floor/plasteel/dark, +/area/shuttle/syndicate/airlock) +"MA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/syndicate/airlock) +"MB" = ( +/obj/structure/chair{ + dir = 4; + name = "tactical chair" + }, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/plasteel/dark, +/area/shuttle/syndicate/airlock) +"MC" = ( +/obj/structure/rack, +/obj/item/clothing/suit/space/syndicate/black/red, +/obj/item/clothing/head/helmet/space/syndicate/black/red, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/syndicate/airlock) +"MD" = ( +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'FOURTH WALL'."; + name = "\improper FOURTH WALL"; + pixel_x = -32 + }, +/turf/open/floor/plating/asteroid/snow/airless, +/area/syndicate_mothership) (1,1,1) = {" aa @@ -26361,38 +26485,38 @@ hl hl hl hh -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh +hh aa aa aa @@ -26617,41 +26741,41 @@ hl hl hl hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +hl +kt +MD +kt +kt +kt +kt +kt +kt +kt +kt +kt +kt +hl hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh -hh +aa +aa aa aa aa @@ -26887,27 +27011,25 @@ hl hl hl hl +kt +kt +kt +kt +kt +kt +kt +yc +yd +yd +yd +yd +yd +yd +yd +yd +yd +kt hl -hl -hl -hl -hl -hl -hl -we -hl -kt -kt -kt -kt -kt -kt -kt -kt -kt -kt -kt -kt hh aa aa @@ -26977,6 +27099,8 @@ aa aa aa aa +aa +aa "} (49,1,1) = {" aa @@ -27144,27 +27268,25 @@ hl hl hl hl -hl -hl -hl -kt kt +tY +tZ +tZ +tZ +tZ +tZ +yd +yL +zs +yL +AC +Bj +BT +Cj +CS +Di kt hl -hl -hl -hl -yc -yd -yd -yd -yd -yd -yd -yd -yd -yd -kt hh aa aa @@ -27234,6 +27356,8 @@ aa aa aa aa +aa +aa "} (50,1,1) = {" aa @@ -27401,27 +27525,25 @@ hl hl hl hl -hl -hl -hl -hl -tY -tZ -tZ -tZ -tZ -tZ -yd -yL -zs -yL -AC -Bj -BT -Cj -CS -Di kt +tZ +uG +vo +vo +vo +xA +yd +yM +zt +zR +zR +Bk +zR +Ck +CS +Dj +kt +hl hh aa aa @@ -27491,6 +27613,8 @@ aa aa aa aa +aa +aa "} (51,1,1) = {" aa @@ -27652,33 +27776,31 @@ hl hl hl hl -hl -hl -hl -hl -hl -hl -hl -hl -hl +kt +kt +kt +kt +kt +kt kt tZ -uG -vo -vo -vo -xA -yd -yM +uH +uH +uH +uH +uH +ye +yN zt -zR -zR -Bk -zR -Ck +zS +AD +Bl +BU +Cl CS -Dj +Dk kt +hl hh aa aa @@ -27748,6 +27870,8 @@ aa aa aa aa +aa +aa "} (52,1,1) = {" aa @@ -27909,33 +28033,31 @@ hl hl my hl -hl -kt -kt +oS +oT +oT +oT +oT hl hl -hl -hl -hl -hl -kt tZ uH uH uH uH uH -ye -yN +yd +yO zt -zS -AD -Bl -BU -Cl -CS -Dk +zT +AE +Bm +yf +yd +yd +Dl kt +hl hh aa aa @@ -28005,6 +28127,8 @@ aa aa aa aa +aa +aa "} (53,1,1) = {" aa @@ -28166,33 +28290,31 @@ hl hl hl hl -hl -kt -hl -oS oT +px +pR +qI oT -oT -oT -hl +rY hl tZ -uH -uH -uH -uH -uH +uI +vp +wf +wR +xB yd -yO +yP zt zT AE -Bm -yf +Bn yd -yd -Dl +hl +hl kt +kt +hl hh aa aa @@ -28262,6 +28384,8 @@ aa aa aa aa +aa +aa "} (54,1,1) = {" aa @@ -28423,33 +28547,31 @@ hl hl hl hl -hl -kt -hl -oT -px -pR +oU +py +pS qI oT -rY -hl +rZ +rZ tZ -uI -vp -wf -wR -xB +tZ +tZ +tZ +wS +xC +yf +yQ +yQ +zU +yQ yd -yP -zt -zT -AE -Bn yd +rZ +rZ +kt hl hl -kt -kt hh aa aa @@ -28519,6 +28641,8 @@ aa aa aa aa +aa +aa "} (55,1,1) = {" aa @@ -28680,31 +28804,29 @@ hl hl hl nx -hl -kt -hl oU -py -pS +pz +pT qI -oT -rZ -rZ -tZ -tZ -tZ -tZ -wS -xC -yf -yQ -yQ -zU -yQ -yd -yd -rZ -rZ +rb +sa +sY +ua +sY +sY +wg +sb +sb +sb +sb +zu +zV +AF +Bo +BV +Cm +CT +kt hl hl hh @@ -28776,6 +28898,8 @@ aa aa aa aa +aa +aa "} (56,1,1) = {" aa @@ -28937,31 +29061,29 @@ hl hl hl hl -hl -kt -hl oU -pz -pT +pA +pU qI -rb -sa -sY -ua -sY -sY -wg +rc sb +sZ +sZ +sZ sb +wh sb -sb -zu +sZ +sZ +sZ +sZ zV AF Bo -BV +BW Cm -CT +CU +kt hl hl hh @@ -29033,6 +29155,8 @@ aa aa aa aa +aa +aa "} (57,1,1) = {" aa @@ -29194,31 +29318,29 @@ hl my hl hl -hl -kt -hl oU -pA -pU +pB +pT qI -rc +oT +sc +ta +ub +ta +ta +wg sb -sZ -sZ -sZ sb -wh sb -sZ -sZ -sZ -sZ +sb +zv zV AF Bo -BW +BV Cm -CU +CV +kt hl hl hh @@ -29290,6 +29412,8 @@ aa aa aa aa +aa +aa "} (58,1,1) = {" aa @@ -29451,31 +29575,29 @@ hl hl hl hl -hl -kt -hl oU -pB -pT +pC +pV qI oT -sc -ta -ub -ta -ta -wg -sb -sb -sb -sb -zv -zV -AF -Bo -BV -Cm -CV +rZ +rZ +rZ +rZ +vq +vq +wT +xD +yg +yR +yR +zW +yR +yh +yh +rZ +rZ +kt hl hl hh @@ -29547,6 +29669,8 @@ aa aa aa aa +aa +aa "} (59,1,1) = {" aa @@ -29708,32 +29832,30 @@ hl hl hl hl -hl -kt -hl -oU -pC -pV +oT +pD +pW qI oT -rZ -rZ -uc -rZ -vq -vq -wT -xD -yg -yR -yR -zW -yR -yh -yh -rZ -rZ +sd hl +vq +Mt +Mv +uc +Mz +MB +yh +yS +zw +zX +AG +Bp +yh +hl +hl +kt +kt hl hh aa @@ -29804,6 +29926,8 @@ aa aa aa aa +aa +aa "} (60,1,1) = {" aa @@ -29965,33 +30089,31 @@ hl hl hl hl -hl -kt -hl +oV oT -pD -pW -qI oT -sd -tb -ng -nz +oT +oT +hl +hl vq -wi wU -xE +wU +wU +wU +wU yh -yS +yT zw zX AG -Bp +Bq +yg yh -hl -hl -kt +yh +Dm kt +hl hh aa aa @@ -30061,6 +30183,8 @@ aa aa aa aa +aa +aa "} (61,1,1) = {" aa @@ -30222,33 +30346,31 @@ hl mz hl my -hl kt -hl -oV -oT -oT -oT -oT -hl -tc -ll -uJ -vr -wj +kt +kt +kt +kt +kt +kt +vq wU -xE -yh -yT +wU +wU +wU +wU +yi +yU zw -zX -AG -Bq -yg -yh -yh -Dm +zY +AH +Br +zZ +Cn +CW +Dn kt +hl hh aa aa @@ -30318,6 +30440,8 @@ aa aa aa aa +aa +aa "} (62,1,1) = {" aa @@ -30480,32 +30604,30 @@ mA hl hl hl +hl +hl +nx +hl +hl kt -kt -kt -kt -kt -kt -kt -kt -tc -ll -uK -vs -wk -wU -xF -yi -yU +vq +Mu +Mw +Mx +MA +MC +yh +yV zw -zY -AH -Br zZ -Cn +zZ +Bs +zZ +Co CW -Dn +Do kt +hl hh aa aa @@ -30575,6 +30697,8 @@ aa aa aa aa +aa +aa "} (63,1,1) = {" aa @@ -30737,32 +30861,30 @@ hl hl hl hl -my hl hl hl hl -nx hl kt -tc -ll -tc -vt +yj vq vq +My +vs vq yh -yV +yW zw -zZ -zZ -Bs -zZ -Co +Aa +AI +Bt +BX +Cn CW -Do +Dp kt +hl hh aa aa @@ -30832,6 +30954,8 @@ aa aa aa aa +aa +aa "} (64,1,1) = {" aa @@ -30999,27 +31123,25 @@ hl hl hl hl -hl -hl kt -tc -ll -tc -hl -hl -hl -vq +kt +kt +uK +uJ +uK +kt +yj +yh +yh +yh +yh +yh +yh +yh +yh yh -yW -zw -Aa -AI -Bt -BX -Cn -CW -Dp kt +hl hh aa aa @@ -31089,6 +31211,8 @@ aa aa aa aa +aa +aa "} (65,1,1) = {" aa @@ -31250,7 +31374,7 @@ kt hl hl hl -mz +hl hl hl hl @@ -31262,21 +31386,19 @@ kt tc ll tc -hl -hl -hl -hl -yj -yh -yh -yh -yh -yh -yh -yh -yh -yh kt +kt +kt +kt +kt +kt +kt +kt +kt +kt +kt +kt +hl hh aa aa @@ -31346,6 +31468,8 @@ aa aa aa aa +aa +aa "} (66,1,1) = {" aa @@ -31514,26 +31638,24 @@ hl kt kt kt -rd kt -td -ll -td +kt +tc +uJ +tc kt rd kt kt -kt -kt -kt -kt -kt -kt -kt -kt -kt -kt -kt +hl +hl +hl +hl +hl +hl +hl +hl +hl hh aa aa @@ -31603,6 +31725,8 @@ aa aa aa aa +aa +aa "} (67,1,1) = {" aa @@ -31789,8 +31913,6 @@ hl hl hl hl -hl -hl hh aa aa @@ -31860,6 +31982,8 @@ aa aa aa aa +aa +aa "} (68,1,1) = {" aa @@ -32046,8 +32170,6 @@ hl hl hl hl -hl -hl hh aa aa @@ -32117,6 +32239,8 @@ aa aa aa aa +aa +aa "} (69,1,1) = {" aa @@ -32303,8 +32427,6 @@ hl hl BY hl -hl -hl hh aa aa @@ -32374,6 +32496,8 @@ aa aa aa aa +aa +aa "} (70,1,1) = {" aa @@ -32560,8 +32684,6 @@ hl BY Cp BY -hl -hl hh aa aa @@ -32631,6 +32753,8 @@ aa aa aa aa +aa +aa "} (71,1,1) = {" aa @@ -32817,8 +32941,6 @@ hl hl BY hl -hl -hl hh aa aa @@ -32888,6 +33010,8 @@ aa aa aa aa +aa +aa "} (72,1,1) = {" aa @@ -33074,8 +33198,6 @@ hl hl hl hl -hl -hl hh aa aa @@ -33145,6 +33267,8 @@ aa aa aa aa +aa +aa "} (73,1,1) = {" aa @@ -33332,8 +33456,8 @@ hh hh hh hh -hh -hh +aa +aa aa aa aa diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm index 283ac0f35c..ee5a435a86 100644 --- a/code/modules/shuttle/syndicate.dm +++ b/code/modules/shuttle/syndicate.dm @@ -56,8 +56,8 @@ shuttlePortName = "custom location" jumpto_ports = list("syndicate_ne" = 1, "syndicate_nw" = 1, "syndicate_n" = 1, "syndicate_se" = 1, "syndicate_sw" = 1, "syndicate_s" = 1) view_range = 13 - x_offset = -4 - y_offset = -2 + x_offset = -7 + y_offset = -1 see_hidden = TRUE #undef SYNDICATE_CHALLENGE_TIMER \ No newline at end of file From 734ed742a9d54165a879170964c1b79a55d1dbc6 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Fri, 22 Dec 2017 11:38:21 -0500 Subject: [PATCH 29/86] Fixes CODEOWNER wildcards (#33722) --- .github/CODEOWNERS | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 2df370e6ea..7a38745e0e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -6,10 +6,10 @@ /code/__DEFINES/clockcult.dm @ChangelingRain /code/datums/antagonists/datum_clockcult.dm @ChangelingRain -/code/game/gamemodes/blob/* @ChangelingRain -/code/game/gamemodes/clock_cult/* @ChangelingRain -/code/game/gamemodes/miniantags/revenant* @ChangelingRain -/code/game/objects/effects/temporary_visuals/* @ChangelingRain +/code/game/gamemodes/blob/ @ChangelingRain +/code/game/gamemodes/clock_cult/ @ChangelingRain +/code/game/gamemodes/miniantags/revenant/ @ChangelingRain +/code/game/objects/effects/temporary_visuals/ @ChangelingRain /code/modules/reagents/chemistry/reagents/blob_reagents.dm @ChangelingRain # Cyberboss @@ -22,26 +22,26 @@ /code/controllers/subsystem/mapping.dm @Cyberboss /code/controllers/globals.dm @Cyberboss /code/datums/helper_datums/getrev.dm @Cyberboss -/code/datums/components/* @Cyberboss +/code/datums/components/ @Cyberboss /code/datums/map_config.dm @Cyberboss /code/datums/forced_movement.dm @Cyberboss /code/datums/holocall.dm @Cyberboss /code/modules/admin/verbs/adminhelp.dm @Cyberboss /code/modules/admin/verbs/adminpm.dm @Cyberboss -/code/modules/server_tools/* @Cyberboss -/code/modules/mapping/* @Cyberboss +/code/modules/server_tools/ @Cyberboss +/code/modules/mapping/ @Cyberboss # duncathan /code/__DEFINES/atmospherics.dm @duncathan /code/controllers/subsystem/air.dm @duncathan -/code/modules/atmospherics/* @duncathan +/code/modules/atmospherics/ @duncathan # Jordie0608 -/SQL/* @Jordie0608 +/SQL/ @Jordie0608 /code/controllers/subsystem/dbcore.dm @Jordie0608 -/tools/SQLAlertEmail/* @Jordie0608 +/tools/SQLAlertEmail/ @Jordie0608 # MrStonedOne @@ -57,10 +57,10 @@ # ninjanomnom /code/controllers/subsystem/shuttle.dm @ninjanomnom -/code/modules/shuttle/* @ninjanomnom +/code/modules/shuttle/ @ninjanomnom # ShizCalev -/_maps/* @ShizCalev -/icons/* @ShizCalev -/sound/* @ShizCalev +/_maps/ @ShizCalev +/icons/ @ShizCalev +/sound/ @ShizCalev From 716e4da53e1ffbeb8739c594b855b2dd1c14aa3f Mon Sep 17 00:00:00 2001 From: Armhulen Date: Fri, 22 Dec 2017 08:38:04 -0800 Subject: [PATCH 31/86] cool beans, partner (#33713) --- code/modules/mob/living/carbon/human/human_defense.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index e3e1271132..4d70af857b 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -44,7 +44,10 @@ if(mind.martial_art && 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 - visible_message("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons!", "You deflect the projectile!") + if(mind.martial_art.deflection_chance >= 100) //if they can NEVER be hit, lets clue sec in ;) + visible_message("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons!", "You deflect the projectile!") + else + visible_message("[src] deflects the projectile!", "You deflect the projectile!") playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1) return 0 From 454c073d22d6ad0030034048cd5559f209945553 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Fri, 22 Dec 2017 08:40:15 -0800 Subject: [PATCH 33/86] Fixes message spam when proccalls are delayed due to another admin's proccalls running (#33732) * Fixes proccall block message spam * One thread --- code/modules/admin/verbs/debug.dm | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index e2bb78c9ec..daa1d58de5 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -107,6 +107,8 @@ GLOBAL_VAR(LastAdminCalledTarget) GLOBAL_PROTECT(LastAdminCalledTarget) GLOBAL_VAR(LastAdminCalledProc) GLOBAL_PROTECT(LastAdminCalledProc) +GLOBAL_LIST_EMPTY(AdminProcCallSpamPrevention) +GLOBAL_PROTECT(AdminProcCallSpamPrevention) /proc/WrapAdminProcCall(target, procname, list/arguments) var/current_caller = GLOB.AdminProcCaller @@ -114,9 +116,14 @@ GLOBAL_PROTECT(LastAdminCalledProc) if(!ckey) CRASH("WrapAdminProcCall with no ckey: [target] [procname] [english_list(arguments)]") if(current_caller && current_caller != ckey) - to_chat(usr, "Another set of admin called procs are still running, your proc will be run after theirs finish.") - UNTIL(!GLOB.AdminProcCaller) - to_chat(usr, "Running your proc") + if(!GLOB.AdminProcCallSpamPrevention[ckey]) + to_chat(usr, "Another set of admin called procs are still running, your proc will be run after theirs finish.") + GLOB.AdminProcCallSpamPrevention[ckey] = TRUE + UNTIL(!GLOB.AdminProcCaller) + to_chat(usr, "Running your proc") + GLOB.AdminProcCallSpamPrevention -= ckey + else + UNTIL(!GLOB.AdminProcCaller) GLOB.LastAdminCalledProc = procname if(target != GLOBAL_PROC) GLOB.LastAdminCalledTargetRef = "[REF(target)]" From f20622cc54a5c9624f3e91dfb88bc76b062e0a53 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Fri, 22 Dec 2017 11:43:03 -0500 Subject: [PATCH 35/86] Adds round ID to Show Server Revision (#33723) --- code/datums/helper_datums/getrev.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index ec39bcec67..c4ccc4c1fb 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -45,6 +45,8 @@ set name = "Show Server Revision" set desc = "Check the current server code revision" + if(GLOB.round_id) + to_chat(src, "Round ID: [GLOB.round_id]") if(GLOB.revdata.originmastercommit) to_chat(src, "Server revision compiled on: [GLOB.revdata.date]") var/prefix = "" From 48b54819606d497d9d8239cf4df42b757c6e3637 Mon Sep 17 00:00:00 2001 From: Emmett Gaines Date: Fri, 22 Dec 2017 11:47:12 -0500 Subject: [PATCH 37/86] re-implements issue template hiding and improves wording/structure (#33724) --- .github/ISSUE_TEMPLATE.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 10f60767bb..949f1c4c44 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,9 +1,9 @@ -[Directions]: # (If you discovered this issue from playing tgstation hosted servers +[Round ID]: # (If you discovered this issue from playing tgstation hosted servers:) +[Round ID]: # (**INCLUDE THE ROUND ID**) +[Round ID]: # (It can be found in the Status panel or retrieved from https://atlantaned.space/statbus/round.php ! The round id let's us look up valuable information and logs for the round the bug happened.) +[Testmerges]: # (If you believe the issue to be caused by a test merge [OOC tab -> Show Server Revision], report it in the pull request's comment section instead.) -INCLUDE THE ROUND ID +[Reproduction]: # (Explain your issue in detail, including the steps to reproduce it. Issues without proper reproduction steps or explanation are open to being ignored/closed by maintainers.) - -from the Status panel or retrieve it from https://atlantaned.space/statbus/round.php ! If you believe the issue to be caused by a test merge [OOC tab -> Show Server Revision], report it in the pull request's comment section instead. Explain your issue in detail, including the steps to reproduce it.) - -[For Admins]: # (Oddities induced by var-edits and other admin tools are not necessarily bugs. Verify that your issues occur under regular circumstances before reporting them.) +[For Admins]: # (Oddities induced by var-edits and other admin tools are not necessarily bugs. Verify that your issues occur under regular circumstances before reporting them.) \ No newline at end of file From 3af83a898ddb48dd8501bfbb9310e36c99f803b5 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Fri, 22 Dec 2017 13:41:26 -0600 Subject: [PATCH 39/86] cl --- html/changelogs/AutoChangeLog-pr-3639.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3731.yml | 5 ----- html/changelogs/AutoChangeLog-pr-3747.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3818.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3858.yml | 8 -------- html/changelogs/AutoChangeLog-pr-3864.yml | 5 ----- html/changelogs/AutoChangeLog-pr-3871.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3879.yml | 8 -------- html/changelogs/AutoChangeLog-pr-3881.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3884.yml | 5 ----- html/changelogs/AutoChangeLog-pr-3886.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3887.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3889.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3892.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3900.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3901.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3908.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3912.yml | 9 --------- html/changelogs/AutoChangeLog-pr-3913.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3916.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3919.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3920.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3951.yml | 6 ------ html/changelogs/AutoChangeLog-pr-3959.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3960.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3961.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3964.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3966.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3967.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3968.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3969.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3975.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3976.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3977.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3978.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3979.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3980.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3981.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3983.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3988.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3992.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3993.yml | 5 ----- html/changelogs/AutoChangeLog-pr-3994.yml | 5 ----- html/changelogs/AutoChangeLog-pr-3995.yml | 20 -------------------- html/changelogs/AutoChangeLog-pr-4000.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4001.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4005.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4008.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4010.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4012.yml | 6 ------ html/changelogs/AutoChangeLog-pr-4013.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4014.yml | 8 -------- html/changelogs/AutoChangeLog-pr-4022.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4026.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4027.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4028.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4030.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4031.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4032.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4033.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4034.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4036.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4038.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4043.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4049.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4050.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4051.yml | 8 -------- html/changelogs/AutoChangeLog-pr-4052.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4053.yml | 6 ------ html/changelogs/AutoChangeLog-pr-4055.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4059.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4060.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4064.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4066.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4067.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4069.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4072.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4075.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4076.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4077.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4080.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4084.yml | 8 -------- html/changelogs/AutoChangeLog-pr-4095.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4099.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4100.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4105.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4106.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4110.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4111.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4112.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4116.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4117.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4121.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4124.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4125.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4126.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4127.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4129.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4133.yml | 14 -------------- html/changelogs/AutoChangeLog-pr-4136.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4143.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4144.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4145.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4149.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4150.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4152.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4155.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4162.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4170.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4171.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4172.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4175.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4176.yml | 8 -------- html/changelogs/AutoChangeLog-pr-4177.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4180.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4182.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4184.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4186.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4191.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4196.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4198.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4200.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4201.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4207.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4209.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4215.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4216.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4218.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4220.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4234.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4235.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4240.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4241.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4243.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4244.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4246.yml | 16 ---------------- html/changelogs/AutoChangeLog-pr-4250.yml | 16 ---------------- html/changelogs/AutoChangeLog-pr-4254.yml | 6 ------ html/changelogs/AutoChangeLog-pr-4259.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4260.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4261.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4264.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4266.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4267.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4270.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4272.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4274.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4279.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4283.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4286.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4287.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4289.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4290.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4292.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4296.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4305.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4306.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4308.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4312.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4313.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4314.yml | 7 ------- html/changelogs/AutoChangeLog-pr-4315.yml | 10 ---------- html/changelogs/AutoChangeLog-pr-4319.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4331.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4338.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4339.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4340.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4341.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4344.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4346.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4349.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4350.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4351.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4353.yml | 7 ------- html/changelogs/AutoChangeLog-pr-4354.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4359.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4361.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4363.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4365.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4372.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4375.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4377.yml | 7 ------- html/changelogs/AutoChangeLog-pr-4378.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4382.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4383.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4384.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4389.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4390.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4394.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4412.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4416.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4417.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4420.yml | 10 ---------- html/changelogs/AutoChangeLog-pr-4433.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4437.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4442.yml | 8 -------- html/changelogs/AutoChangeLog-pr-4445.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4446.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4453.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4458.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4464.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4466.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4467.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4475.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4477.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4479.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4487.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4488.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4490.yml | 5 ----- 209 files changed, 981 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-3639.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3731.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3747.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3818.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3858.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3864.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3871.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3879.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3881.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3884.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3886.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3887.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3889.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3892.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3900.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3901.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3908.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3912.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3913.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3916.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3919.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3920.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3951.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3959.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3960.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3961.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3964.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3966.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3967.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3968.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3969.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3975.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3976.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3977.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3978.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3979.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3980.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3981.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3983.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3988.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3992.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3993.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3994.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3995.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4000.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4001.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4005.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4008.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4010.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4012.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4013.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4014.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4022.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4026.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4027.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4028.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4030.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4031.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4032.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4033.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4034.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4036.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4038.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4043.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4049.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4050.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4051.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4052.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4053.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4055.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4059.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4060.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4064.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4066.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4067.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4069.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4072.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4075.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4076.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4077.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4080.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4084.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4095.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4099.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4100.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4105.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4106.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4110.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4111.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4112.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4116.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4117.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4121.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4124.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4125.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4126.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4127.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4129.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4133.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4136.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4143.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4144.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4145.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4149.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4150.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4152.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4155.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4162.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4170.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4171.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4172.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4175.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4176.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4177.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4180.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4182.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4184.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4186.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4191.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4196.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4198.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4200.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4201.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4207.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4209.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4215.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4216.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4218.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4220.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4234.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4235.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4240.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4241.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4243.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4244.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4246.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4250.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4254.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4259.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4260.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4261.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4264.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4266.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4267.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4270.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4272.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4274.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4279.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4283.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4286.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4287.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4289.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4290.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4292.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4296.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4305.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4306.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4308.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4312.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4313.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4314.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4315.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4319.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4331.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4338.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4339.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4340.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4341.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4344.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4346.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4349.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4350.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4351.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4353.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4354.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4359.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4361.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4363.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4365.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4372.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4375.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4377.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4378.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4382.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4383.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4384.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4389.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4390.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4394.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4412.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4416.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4417.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4420.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4433.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4437.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4442.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4445.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4446.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4453.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4458.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4464.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4466.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4467.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4475.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4477.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4479.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4487.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4488.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4490.yml diff --git a/html/changelogs/AutoChangeLog-pr-3639.yml b/html/changelogs/AutoChangeLog-pr-3639.yml deleted file mode 100644 index 3625dfce90..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3639.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - bugfix: "Antags are able to greentext again" diff --git a/html/changelogs/AutoChangeLog-pr-3731.yml b/html/changelogs/AutoChangeLog-pr-3731.yml deleted file mode 100644 index 9486c7e793..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3731.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "ninjanomnom" -delete-after: True -changes: - - bugfix: "Singularity objects no longer become contaminated by radiation." - - admin: "Removed the radiation message admin spam and moved it to an investigation log." diff --git a/html/changelogs/AutoChangeLog-pr-3747.yml b/html/changelogs/AutoChangeLog-pr-3747.yml deleted file mode 100644 index 46ad021439..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3747.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ACCount" -delete-after: True -changes: - - tweak: "\"Tail removal\" and \"tail attachment\" surgeries are merged with \"organ manipulation\"." diff --git a/html/changelogs/AutoChangeLog-pr-3818.yml b/html/changelogs/AutoChangeLog-pr-3818.yml deleted file mode 100644 index 1be3ec57f4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3818.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Swindly" -delete-after: True -changes: - - bugfix: "You can now cancel a cavity implant during the implanting/removing step by using drapes while holding the appropriate tool in your inactive hand. Cyborgs can cancel the surgery by using drapes alone." diff --git a/html/changelogs/AutoChangeLog-pr-3858.yml b/html/changelogs/AutoChangeLog-pr-3858.yml deleted file mode 100644 index 2243f683c0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3858.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "deathride58 & TGstation contributors" -delete-after: True -changes: - - bugfix: "Fixed various area issues in Boxstation. The theatre no longer has an air alarm for space, and Security no longer has a line of walls with broken lighting." - - tweak: "Added more lights to Boxstation's security" - - rscadd: "(Upstream) Added a new white ship to Deltastation" - - tweak: "(Upstream) Replaced the reinforced glass in Atmos' gas tanks with reinforced plasma glass" - - tweak: "(Upstream) Atmos can no longer burn itself down via the waste loop outlet" diff --git a/html/changelogs/AutoChangeLog-pr-3864.yml b/html/changelogs/AutoChangeLog-pr-3864.yml deleted file mode 100644 index 2ff6cc010e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3864.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - tweak: "Cooldown on the Ripley's mining drills has been halved." - - tweak: "The frequency of the Ripley's ore pulse has been doubled." diff --git a/html/changelogs/AutoChangeLog-pr-3871.yml b/html/changelogs/AutoChangeLog-pr-3871.yml deleted file mode 100644 index 910a5893eb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3871.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Bluespace shelter walls no longer smooth with non-shelter walls and windows." diff --git a/html/changelogs/AutoChangeLog-pr-3879.yml b/html/changelogs/AutoChangeLog-pr-3879.yml deleted file mode 100644 index 440ea3e616..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3879.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "as334" -delete-after: True -changes: - - rscadd: "Pluoxium can now be formed by irradiating tiles with CO2 in the air." - - rscadd: "Rad collectors now steadily form Tritium at a slow pace." - - balance: "Nerfs fusion by making it slower, and produce radioactivity." - - balance: "Noblium formation now requires significantly more energy input." - - balance: "Tanks now melt if their temperature is above 1 Million Kelvin." diff --git a/html/changelogs/AutoChangeLog-pr-3881.yml b/html/changelogs/AutoChangeLog-pr-3881.yml deleted file mode 100644 index da5bf113eb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3881.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Mark9013100" -delete-after: True -changes: - - tweak: "Charcoal bottles have been renamed, and have been given a more informative description." diff --git a/html/changelogs/AutoChangeLog-pr-3884.yml b/html/changelogs/AutoChangeLog-pr-3884.yml deleted file mode 100644 index cccc830fa8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3884.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - bugfix: "You can no longer delete girders, lattices, or catwalks with the RPD" - - bugfix: "Fixes runtimes that occur when clicking girders, lattices, catwalks, or disposal pipes with the RPD in paint mode" diff --git a/html/changelogs/AutoChangeLog-pr-3886.yml b/html/changelogs/AutoChangeLog-pr-3886.yml deleted file mode 100644 index df6baaf9e8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3886.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Clockwork slabs no longer refer to components" diff --git a/html/changelogs/AutoChangeLog-pr-3887.yml b/html/changelogs/AutoChangeLog-pr-3887.yml deleted file mode 100644 index 6abe71ce5d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3887.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DaxDupont" -delete-after: True -changes: - - bugfix: "Medbots can inject from one tile away again." diff --git a/html/changelogs/AutoChangeLog-pr-3889.yml b/html/changelogs/AutoChangeLog-pr-3889.yml deleted file mode 100644 index 0dbe1a4a54..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3889.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "The detective and heads of staff are no longer attacked by portable turrets." diff --git a/html/changelogs/AutoChangeLog-pr-3892.yml b/html/changelogs/AutoChangeLog-pr-3892.yml deleted file mode 100644 index d56a3291ca..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3892.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ninjanomnom" -delete-after: True -changes: - - bugfix: "Fixes ruin cable spawning and probably some other bugs" diff --git a/html/changelogs/AutoChangeLog-pr-3900.yml b/html/changelogs/AutoChangeLog-pr-3900.yml deleted file mode 100644 index aea022be12..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3900.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Qbopper and JJRcop" -delete-after: True -changes: - - tweak: "The default internet sound volume was changed from 100 to 25. Stop complaining in OOC about your ears!" diff --git a/html/changelogs/AutoChangeLog-pr-3901.yml b/html/changelogs/AutoChangeLog-pr-3901.yml deleted file mode 100644 index ac91a766d7..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3901.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nicn" -delete-after: True -changes: - - balance: "Damage from low pressure has been doubled." diff --git a/html/changelogs/AutoChangeLog-pr-3908.yml b/html/changelogs/AutoChangeLog-pr-3908.yml deleted file mode 100644 index bd69080a7d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3908.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Posters may no longer be placed on diagonal wall corners." diff --git a/html/changelogs/AutoChangeLog-pr-3912.yml b/html/changelogs/AutoChangeLog-pr-3912.yml deleted file mode 100644 index 85cf3a8454..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3912.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - rscadd: "Deep fryers now have sound." - - tweak: "Deep fryers now use cooking oil, a specialized reagent that becomes highly damaging at high temperatures. You can get it from grinding soybeans and meat." - - tweak: "Deep fryers now become more efficient with higher-level micro lasers, using less oil and frying faster." - - tweak: "Deep fryers now slowly use oil as it fries objects, instead of all at once." - - bugfix: "You can now correctly refill deep fryers with syringes and pills." - - rscadd: "Microwaves have new sounds!" diff --git a/html/changelogs/AutoChangeLog-pr-3913.yml b/html/changelogs/AutoChangeLog-pr-3913.yml deleted file mode 100644 index c2a59fe367..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3913.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cobby" -delete-after: True -changes: - - rscadd: "The Xray now only hits the first mob it comes into contact with instead of being outright removed from the game." diff --git a/html/changelogs/AutoChangeLog-pr-3916.yml b/html/changelogs/AutoChangeLog-pr-3916.yml deleted file mode 100644 index e61e4d044c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3916.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Frozenguy5" -delete-after: True -changes: - - bugfix: "Broken cable cuffs no longer has an invisible sprite." diff --git a/html/changelogs/AutoChangeLog-pr-3919.yml b/html/changelogs/AutoChangeLog-pr-3919.yml deleted file mode 100644 index ab0e21a5d3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3919.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Floyd / Qustinnus" -delete-after: True -changes: - - soundadd: "Reebe now has ambience sounds" diff --git a/html/changelogs/AutoChangeLog-pr-3920.yml b/html/changelogs/AutoChangeLog-pr-3920.yml deleted file mode 100644 index 8111335f02..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3920.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LetterJay" -delete-after: True -changes: - - bugfix: "Flavor text can be examined again" diff --git a/html/changelogs/AutoChangeLog-pr-3951.yml b/html/changelogs/AutoChangeLog-pr-3951.yml deleted file mode 100644 index 6dcac4a2d3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3951.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "SpiderPsycho" -delete-after: True -changes: - - rscadd: "Added insects without fuzz" - - rscdel: "Removed fuzz" - - tweak: "changed the name of the fuzzless sprites to insects so the character creation can call them properly." diff --git a/html/changelogs/AutoChangeLog-pr-3959.yml b/html/changelogs/AutoChangeLog-pr-3959.yml deleted file mode 100644 index f89f2489dd..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3959.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "disable_warning wasn't getting checked and the chat was being spammed" diff --git a/html/changelogs/AutoChangeLog-pr-3960.yml b/html/changelogs/AutoChangeLog-pr-3960.yml deleted file mode 100644 index dd9ab1e232..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3960.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "cell chargers weren't animating properly" diff --git a/html/changelogs/AutoChangeLog-pr-3961.yml b/html/changelogs/AutoChangeLog-pr-3961.yml deleted file mode 100644 index 52f66a3b46..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3961.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ike709" -delete-after: True -changes: - - imageadd: "Added new vent and scrubber sprites by Partheo." diff --git a/html/changelogs/AutoChangeLog-pr-3964.yml b/html/changelogs/AutoChangeLog-pr-3964.yml deleted file mode 100644 index 6061524af8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3964.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "Atmos scrubbers (vent and portable) can now filter any and all gases." diff --git a/html/changelogs/AutoChangeLog-pr-3966.yml b/html/changelogs/AutoChangeLog-pr-3966.yml deleted file mode 100644 index 40cdd5ec13..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3966.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - bugfix: "Sped up saycode to remove free lag from highpop" diff --git a/html/changelogs/AutoChangeLog-pr-3967.yml b/html/changelogs/AutoChangeLog-pr-3967.yml deleted file mode 100644 index 28378bcc30..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3967.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DaxDupont" -delete-after: True -changes: - - tweak: "CentCom has issued a firmware updated for the operating computers. It is no longer needed to manually refresh the procedure and patient status." diff --git a/html/changelogs/AutoChangeLog-pr-3968.yml b/html/changelogs/AutoChangeLog-pr-3968.yml deleted file mode 100644 index 3430a1e8cb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3968.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "JJRcop" -delete-after: True -changes: - - bugfix: "Fixes changeling eggs not putting the changeling in control if the brainslug is destroyed before hatching." diff --git a/html/changelogs/AutoChangeLog-pr-3969.yml b/html/changelogs/AutoChangeLog-pr-3969.yml deleted file mode 100644 index 7f53c200d6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3969.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "HUDs from mechs and helmets no longer conflict with HUD glasses and no longer inappropriately remove implanted HUDs." diff --git a/html/changelogs/AutoChangeLog-pr-3975.yml b/html/changelogs/AutoChangeLog-pr-3975.yml deleted file mode 100644 index 450706db1f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3975.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DaxDupont" -delete-after: True -changes: - - bugfix: "Proximity sensors no longer beep when unarmed." diff --git a/html/changelogs/AutoChangeLog-pr-3976.yml b/html/changelogs/AutoChangeLog-pr-3976.yml deleted file mode 100644 index b3d144e1de..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3976.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Iamgoofball" -delete-after: True -changes: - - spellcheck: "fixed grammar on output circuits" diff --git a/html/changelogs/AutoChangeLog-pr-3977.yml b/html/changelogs/AutoChangeLog-pr-3977.yml deleted file mode 100644 index a4916a713e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3977.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Iamgoofball" -delete-after: True -changes: - - spellcheck: "fixes grammar on list circuits" diff --git a/html/changelogs/AutoChangeLog-pr-3978.yml b/html/changelogs/AutoChangeLog-pr-3978.yml deleted file mode 100644 index 0840869b16..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3978.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Iamgoofball" -delete-after: True -changes: - - spellcheck: "fixes grammar on logic gate descriptions" diff --git a/html/changelogs/AutoChangeLog-pr-3979.yml b/html/changelogs/AutoChangeLog-pr-3979.yml deleted file mode 100644 index e9a21ef984..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3979.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Iamgoofball" -delete-after: True -changes: - - bugfix: "fixes grammar on trig circuits" diff --git a/html/changelogs/AutoChangeLog-pr-3980.yml b/html/changelogs/AutoChangeLog-pr-3980.yml deleted file mode 100644 index 09e3ebe5ef..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3980.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MMMiracles" -delete-after: True -changes: - - balance: "Power regen on the regular tesla relay has been reduced to 50, from 150." diff --git a/html/changelogs/AutoChangeLog-pr-3981.yml b/html/changelogs/AutoChangeLog-pr-3981.yml deleted file mode 100644 index 0670048ed3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3981.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nicbn" -delete-after: True -changes: - - soundadd: "Now rolling beds and office chairs have a sound!" diff --git a/html/changelogs/AutoChangeLog-pr-3983.yml b/html/changelogs/AutoChangeLog-pr-3983.yml deleted file mode 100644 index 0e3a681757..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3983.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "oranges" -delete-after: True -changes: - - rscdel: "Removed the shocker circuit" diff --git a/html/changelogs/AutoChangeLog-pr-3988.yml b/html/changelogs/AutoChangeLog-pr-3988.yml deleted file mode 100644 index 743551eaaa..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3988.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DaxDupont" -delete-after: True -changes: - - bugfix: "Plant trays will now properly process fluorine and adjust toxins and water contents." diff --git a/html/changelogs/AutoChangeLog-pr-3992.yml b/html/changelogs/AutoChangeLog-pr-3992.yml deleted file mode 100644 index b60be8068c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3992.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "JJRcop" -delete-after: True -changes: - - tweak: "The silicon airlock menu looks a little more like it used to." diff --git a/html/changelogs/AutoChangeLog-pr-3993.yml b/html/changelogs/AutoChangeLog-pr-3993.yml deleted file mode 100644 index 14c4d31514..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3993.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "purple bartender suit and apron added to clothesmates!" - - rscadd: "long hair 3 added, check it out. both have sprites from okand!" diff --git a/html/changelogs/AutoChangeLog-pr-3994.yml b/html/changelogs/AutoChangeLog-pr-3994.yml deleted file mode 100644 index 2ff513ddf5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3994.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "The RPD has a shiny new UI!" - - rscadd: "The RPD can now paint pipes as it lays them, for quicker piping projects." diff --git a/html/changelogs/AutoChangeLog-pr-3995.yml b/html/changelogs/AutoChangeLog-pr-3995.yml deleted file mode 100644 index 77d6c658da..0000000000 --- a/html/changelogs/AutoChangeLog-pr-3995.yml +++ /dev/null @@ -1,20 +0,0 @@ -author: "ShizCalev (Upstream), WJohnston (Upstream), Okand37 (Upstream), deathride58" -delete-after: True -changes: - - tweak: "(Upstream) The computers on all maps have have been updated for the latest directional sprite changes. Please report any computers facing in strange directions to your nearest mapper." - - rscadd: "(Upstream) Updated the Test Map debugging verb to report more issues regarding APCs. -DELTASTATION" - - bugfix: "(Upstream) Reverted Okand37's morgue changes which broke power in the area." - - bugfix: "(Upstream) Corrected wrong area on the Southern airlock leading into electrical maintenance. -ALL STATIONS" - - bugfix: "(Upstream) Corrected numerous duplicate APCs in areas which led to power issues." - - rscdel: "(Upstream) Removes stationary docking ports for syndicate infiltrator ships on all maps. Use the docking navigator computer instead! This gives the white ship and syndicate infiltrator more room to navigate and place custom locations that are otherwise occupied by fixed shuttle landing zones that are rarely used." - - rscadd: "(Upstream, Deltastation) Tweaked Atmospherics" - - bugfix: "(Upstream, Deltastation) Fixed the Incinerator air injector" - - rscadd: "(Upstream, Deltastation) Tweaked Engineering" - - rscadd: "(Upstream, Deltastation) Added logs to the Chaplain's closet for gimmicks (bonfires)" - - rscadd: "(Upstream, Deltastation) Tweaked Security" - - bugfix: "(Upstream, Deltastation) Fixed medical morgue maintenance not providing radiation shielding and exterior chemistry windoor" - - rscadd: "(Upstream, Deltastation) Bar now has a door from the backroom to the theatre stage" - - rscadd: "(Upstream, Deltastation) Tweaked Locker Room/Dormitories" - - bugfix: "The armory no longer has a deep frying oil vat in place of dragnets." diff --git a/html/changelogs/AutoChangeLog-pr-4000.yml b/html/changelogs/AutoChangeLog-pr-4000.yml deleted file mode 100644 index bfd91f572d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4000.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - imageadd: "The Nanotrasen logo on modular computers has been fixed, rejoice!" diff --git a/html/changelogs/AutoChangeLog-pr-4001.yml b/html/changelogs/AutoChangeLog-pr-4001.yml deleted file mode 100644 index 578f211e20..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4001.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Pizza box stacking works again." diff --git a/html/changelogs/AutoChangeLog-pr-4005.yml b/html/changelogs/AutoChangeLog-pr-4005.yml deleted file mode 100644 index cf136090a6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4005.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "now lists should work properly" diff --git a/html/changelogs/AutoChangeLog-pr-4008.yml b/html/changelogs/AutoChangeLog-pr-4008.yml deleted file mode 100644 index 6d6b7d53b8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4008.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "zennerx" -delete-after: True -changes: - - bugfix: "fixed a bug that made you try and scream while unconscious due to a fire" diff --git a/html/changelogs/AutoChangeLog-pr-4010.yml b/html/changelogs/AutoChangeLog-pr-4010.yml deleted file mode 100644 index b413fb1671..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4010.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kor" -delete-after: True -changes: - - bugfix: "Blobbernauts will no longer spawn if a player is not selected to control it, preventing AI blobbernauts from running off the blob and to their deaths." diff --git a/html/changelogs/AutoChangeLog-pr-4012.yml b/html/changelogs/AutoChangeLog-pr-4012.yml deleted file mode 100644 index 18b4c3dfd2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4012.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Toriate" -delete-after: True -changes: - - tweak: "Mag Pistol and Mag Rifle no longer spawn with magazines when built in protolathe" - - balance: "Nerf guns no longer max out science in five seconds flat" - - bugfix: "Nerf gun magazines no longer give infinite metal and glass" diff --git a/html/changelogs/AutoChangeLog-pr-4013.yml b/html/changelogs/AutoChangeLog-pr-4013.yml deleted file mode 100644 index 0507fafc72..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4013.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Fix some permanent-on and permanent-off bugs caused by the HUD stacking change." diff --git a/html/changelogs/AutoChangeLog-pr-4014.yml b/html/changelogs/AutoChangeLog-pr-4014.yml deleted file mode 100644 index 1a1698767d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4014.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Skylar Lineman, your local R&D moonlighter" -delete-after: True -changes: - - rscadd: "Research has been completely overhauled into the techweb system! No more levels, the station now unlocks research \"nodes\" with research points passively generated when there is atleast one research server properly cooled, powered, and online." - - rscadd: "R&D lab has been replaced by the departmental lathe system on the three major maps. Each department gets a lathe and possibly a circuit imprinter that only have designs assigned by that department." - - rscadd: "The ore redemption machine has been moved into cargo bay on maps with decentralized research to prevent the hallways from becoming a free for all. Honk!" - - balance: "You shouldn't expect balance as this is the initial merge. Please put all feedback and concerns on the forum so we can revise the system over the days, weeks, and months, to make this enjoyable for everyone. Heavily wanted are ideas of how to add more ways of generating points." - - balance: "You can get techweb points by setting off bombs with an active science doppler array listening. The bombs have to have a theoretical radius far above maxcap to make a difference. You can only go up, not down, in radius, so you can't get 6 times the points with 6 TTVs. The algorithm is exponentially/logarithmically scaled to prevent \"world destroyer\" bombs from instantly finishing research." diff --git a/html/changelogs/AutoChangeLog-pr-4022.yml b/html/changelogs/AutoChangeLog-pr-4022.yml deleted file mode 100644 index 295229de2b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4022.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Chairs, PA parts, infrared emitters, and doppler arrays will now rotate clockwise." diff --git a/html/changelogs/AutoChangeLog-pr-4026.yml b/html/changelogs/AutoChangeLog-pr-4026.yml deleted file mode 100644 index 3424fdd501..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4026.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - bugfix: "Using a chameleon projector will now dismount you from any vehicles you are riding, in order to prevent wacky space glitches and being sent to a realm outside space and time." diff --git a/html/changelogs/AutoChangeLog-pr-4027.yml b/html/changelogs/AutoChangeLog-pr-4027.yml deleted file mode 100644 index 925f8d5256..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4027.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ike709" -delete-after: True -changes: - - bugfix: "Fixed some computers facing the wrong direction." diff --git a/html/changelogs/AutoChangeLog-pr-4028.yml b/html/changelogs/AutoChangeLog-pr-4028.yml deleted file mode 100644 index 1af9360833..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4028.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Code by Pyko, Ported by Frozenguy5" -delete-after: True -changes: - - rscadd: "Rat Kebabs and Double Rat Kebabs have been added!" diff --git a/html/changelogs/AutoChangeLog-pr-4030.yml b/html/changelogs/AutoChangeLog-pr-4030.yml deleted file mode 100644 index ca630fbfd8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4030.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "zennerx" -delete-after: True -changes: - - tweak: "Skateboard crashes now give slight brain damage!" - - rscadd: "Using a helmet prevents brain damage from the skateboard!" diff --git a/html/changelogs/AutoChangeLog-pr-4031.yml b/html/changelogs/AutoChangeLog-pr-4031.yml deleted file mode 100644 index 4907986852..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4031.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - code_imp: "Ladders have been refactored and should be far less buggy." - - bugfix: "Jacob's ladder actually works again." diff --git a/html/changelogs/AutoChangeLog-pr-4032.yml b/html/changelogs/AutoChangeLog-pr-4032.yml deleted file mode 100644 index 4969c5bcaf..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4032.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "PubbyStation - Unpowered air injectors in various locations have been fixed." diff --git a/html/changelogs/AutoChangeLog-pr-4033.yml b/html/changelogs/AutoChangeLog-pr-4033.yml deleted file mode 100644 index effc283b83..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4033.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "MetaStation - Air injector leading out of the incinerator has been fixed" - - bugfix: "MetaStation - Corrected a couple maintenance airlocks being powered by the wrong areas." diff --git a/html/changelogs/AutoChangeLog-pr-4034.yml b/html/changelogs/AutoChangeLog-pr-4034.yml deleted file mode 100644 index eff19f0cfa..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4034.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Throwing drinking glasses and cartons will now consistently cause them to break!" diff --git a/html/changelogs/AutoChangeLog-pr-4036.yml b/html/changelogs/AutoChangeLog-pr-4036.yml deleted file mode 100644 index 820c726cea..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4036.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Computers will no longer rotate incorrectly when being deconstructed." - - bugfix: "You can now rotate computer frames during construction." diff --git a/html/changelogs/AutoChangeLog-pr-4038.yml b/html/changelogs/AutoChangeLog-pr-4038.yml deleted file mode 100644 index 9500855d83..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4038.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "WJohnston" -delete-after: True -changes: - - bugfix: "Green banded default airlocks now have extended click area like all other airlocks." diff --git a/html/changelogs/AutoChangeLog-pr-4043.yml b/html/changelogs/AutoChangeLog-pr-4043.yml deleted file mode 100644 index b867396350..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4043.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Francinum" -delete-after: True -changes: - - tweak: "The shuttle build plate is now better sized for all stations." diff --git a/html/changelogs/AutoChangeLog-pr-4049.yml b/html/changelogs/AutoChangeLog-pr-4049.yml deleted file mode 100644 index f2d883ca0d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4049.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "WJohnston" -delete-after: True -changes: - - imageadd: "A bunch of new turf decals for mappers to play with, coming in yellow, white, and red varieties!" diff --git a/html/changelogs/AutoChangeLog-pr-4050.yml b/html/changelogs/AutoChangeLog-pr-4050.yml deleted file mode 100644 index 85d49a56fe..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4050.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Computers will no longer delete themselves when being built, whoops!" diff --git a/html/changelogs/AutoChangeLog-pr-4051.yml b/html/changelogs/AutoChangeLog-pr-4051.yml deleted file mode 100644 index ee3ed953c1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4051.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "ACCount" -delete-after: True -changes: - - refactor: "Old integrated circuit save file format is ditched in favor of JSON. Readability, both of save files and save code, is improved greatly." - - tweak: "Integrated circuit panels now open with screwdriver instead of crowbar, to match every single other thing on this server." - - tweak: "Integrated circuit printer now stores up to 25 metal sheets." - - bugfix: "Fixed integrated circuit rechargers not recharging guns properly and not updating icons." - - bugfix: "Fixed multiple bugs in integrated circuits UIs, improved overall usability." diff --git a/html/changelogs/AutoChangeLog-pr-4052.yml b/html/changelogs/AutoChangeLog-pr-4052.yml deleted file mode 100644 index ad7e91b332..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4052.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Humans missing legs or are legcuffed will no longer move slower in areas without gravity." diff --git a/html/changelogs/AutoChangeLog-pr-4053.yml b/html/changelogs/AutoChangeLog-pr-4053.yml deleted file mode 100644 index 9f749a63a5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4053.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Toriate" -delete-after: True -changes: - - rscadd: "Added recolourable clothes" - - tweak: "jumpsuits in mixed wardrobe replaced with recolourable clothes" - - imageadd: "greyscaled clothing sprites for colourable clothes" diff --git a/html/changelogs/AutoChangeLog-pr-4055.yml b/html/changelogs/AutoChangeLog-pr-4055.yml deleted file mode 100644 index 618a46b39c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4055.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "The structures external to stations are now properly lit. Make sure you bring a flashlight." diff --git a/html/changelogs/AutoChangeLog-pr-4059.yml b/html/changelogs/AutoChangeLog-pr-4059.yml deleted file mode 100644 index 1742cf5805..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4059.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "psykzz" -delete-after: True -changes: - - rscadd: "Added TGUI for Turbine computer" diff --git a/html/changelogs/AutoChangeLog-pr-4060.yml b/html/changelogs/AutoChangeLog-pr-4060.yml deleted file mode 100644 index 7846d861f4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4060.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Y0SH1 M4S73R" -delete-after: True -changes: - - spellcheck: "The R&D Server's name is now improper." - - spellcheck: "The R&D Server now has an explanation of what it does." diff --git a/html/changelogs/AutoChangeLog-pr-4064.yml b/html/changelogs/AutoChangeLog-pr-4064.yml deleted file mode 100644 index 90f52d39aa..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4064.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "jammer312" -delete-after: True -changes: - - bugfix: "fixed conjuration spells forgetting about conjured items" diff --git a/html/changelogs/AutoChangeLog-pr-4066.yml b/html/changelogs/AutoChangeLog-pr-4066.yml deleted file mode 100644 index 6858021004..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4066.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - code_imp: "Chasm code has been refactored to be more sane." - - bugfix: "Building lattices over chasms no longer sometimes deletes the chasm." diff --git a/html/changelogs/AutoChangeLog-pr-4067.yml b/html/changelogs/AutoChangeLog-pr-4067.yml deleted file mode 100644 index 103a03d08a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4067.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Space cats will no longer have a smashed helmet when they lay down." diff --git a/html/changelogs/AutoChangeLog-pr-4069.yml b/html/changelogs/AutoChangeLog-pr-4069.yml deleted file mode 100644 index c6832bbbf7..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4069.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - admin: "\"ahelp\" chat command can now accept a ticket number as opposed to a ckey" diff --git a/html/changelogs/AutoChangeLog-pr-4072.yml b/html/changelogs/AutoChangeLog-pr-4072.yml deleted file mode 100644 index 88296b7a45..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4072.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - code_imp: "Added round id to the status world topic" diff --git a/html/changelogs/AutoChangeLog-pr-4075.yml b/html/changelogs/AutoChangeLog-pr-4075.yml deleted file mode 100644 index d627c00d1f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4075.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "GupGup" -delete-after: True -changes: - - bugfix: "Fixes hostile mobs attacking surrounding tiles when trying to attack someone" diff --git a/html/changelogs/AutoChangeLog-pr-4076.yml b/html/changelogs/AutoChangeLog-pr-4076.yml deleted file mode 100644 index b40f213dd3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4076.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - rscadd: "Added two new symptoms: one allows viruses to still work while dead, and allows infection of undead species, and one allows infection of inorganic species (such as plasmapeople or golems)." diff --git a/html/changelogs/AutoChangeLog-pr-4077.yml b/html/changelogs/AutoChangeLog-pr-4077.yml deleted file mode 100644 index 56e6ca4c9e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4077.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Aliens in soft-crit will now use the correct sprite." diff --git a/html/changelogs/AutoChangeLog-pr-4080.yml b/html/changelogs/AutoChangeLog-pr-4080.yml deleted file mode 100644 index d10288ec03..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4080.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MrStonedOne and Jordie" -delete-after: True -changes: - - server: "As a late note, serverops be advise that mysql is no longer supported. existing mysql databases will need to be converted to mariadb" diff --git a/html/changelogs/AutoChangeLog-pr-4084.yml b/html/changelogs/AutoChangeLog-pr-4084.yml deleted file mode 100644 index ddd147e1e0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4084.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - bugfix: "The vault in boxstation now has power again." - - bugfix: "The gravity generator in boxstation now has power again." - - bugfix: "Various broken decals in boxstation have been fixed." - - bugfix: "The clown and mime offices no longer have APCs pointing to the wrong areas." - - rscadd: "Boxstation's secure cell has been readded to security." diff --git a/html/changelogs/AutoChangeLog-pr-4095.yml b/html/changelogs/AutoChangeLog-pr-4095.yml deleted file mode 100644 index dd5036cb59..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4095.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ACCount" -delete-after: True -changes: - - rscdel: "Removed \"console screen\" stock part. Just use glass sheets instead." diff --git a/html/changelogs/AutoChangeLog-pr-4099.yml b/html/changelogs/AutoChangeLog-pr-4099.yml deleted file mode 100644 index ac5424fd57..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4099.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ninjanomnom" -delete-after: True -changes: - - bugfix: "Custom shuttle dockers can no longer place docking regions inside other custom docker regions." diff --git a/html/changelogs/AutoChangeLog-pr-4100.yml b/html/changelogs/AutoChangeLog-pr-4100.yml deleted file mode 100644 index e8abc00b9e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4100.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Fix water misters being inappropriately glued to hands in some cases." diff --git a/html/changelogs/AutoChangeLog-pr-4105.yml b/html/changelogs/AutoChangeLog-pr-4105.yml deleted file mode 100644 index 1ce922ad64..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4105.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "More Robust Than You" -delete-after: True -changes: - - tweak: "Spessmen are now smart enough to realize you don't need to turn around to pull cigarette butts" diff --git a/html/changelogs/AutoChangeLog-pr-4106.yml b/html/changelogs/AutoChangeLog-pr-4106.yml deleted file mode 100644 index 326d296e90..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4106.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Some misplaced decals in the Hotel brig have been corrected." diff --git a/html/changelogs/AutoChangeLog-pr-4110.yml b/html/changelogs/AutoChangeLog-pr-4110.yml deleted file mode 100644 index cd94f6dae7..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4110.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CosmicScientist" -delete-after: True -changes: - - bugfix: "bolas are back in tablecrafting!" diff --git a/html/changelogs/AutoChangeLog-pr-4111.yml b/html/changelogs/AutoChangeLog-pr-4111.yml deleted file mode 100644 index 1019538b17..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4111.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ninjanomnom" -delete-after: True -changes: - - bugfix: "Fixes thermite burning hotter than the boiling point of stone" diff --git a/html/changelogs/AutoChangeLog-pr-4112.yml b/html/changelogs/AutoChangeLog-pr-4112.yml deleted file mode 100644 index 12412931b6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4112.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "AIs and cyborgs can interact with unscrewed airlocks and APCs." diff --git a/html/changelogs/AutoChangeLog-pr-4116.yml b/html/changelogs/AutoChangeLog-pr-4116.yml deleted file mode 100644 index 877ad76460..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4116.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Dorsisdwarf" -delete-after: True -changes: - - tweak: "Catpeople are now distracted instead of debilitated" - - rscadd: "Normal cats now go for laser pointers" diff --git a/html/changelogs/AutoChangeLog-pr-4117.yml b/html/changelogs/AutoChangeLog-pr-4117.yml deleted file mode 100644 index bb2c70bccc..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4117.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "You can no longer buckle people to roller beds from inside of a locker." diff --git a/html/changelogs/AutoChangeLog-pr-4121.yml b/html/changelogs/AutoChangeLog-pr-4121.yml deleted file mode 100644 index a226595420..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4121.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "zennerx" -delete-after: True -changes: - - bugfix: "Zombies don't reanimate with no head!" diff --git a/html/changelogs/AutoChangeLog-pr-4124.yml b/html/changelogs/AutoChangeLog-pr-4124.yml deleted file mode 100644 index e568f3e9df..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4124.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "WJohnston" -delete-after: True -changes: - - bugfix: "Fixed a case where items would sometimes be placed underneath racks." diff --git a/html/changelogs/AutoChangeLog-pr-4125.yml b/html/changelogs/AutoChangeLog-pr-4125.yml deleted file mode 100644 index a8f5bdbe86..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4125.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - bugfix: "Hopefully fixed mesons granting the ability to hear people through walls." diff --git a/html/changelogs/AutoChangeLog-pr-4126.yml b/html/changelogs/AutoChangeLog-pr-4126.yml deleted file mode 100644 index 42689125e8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4126.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Cryo cells can now be properly rotated with a wrench." diff --git a/html/changelogs/AutoChangeLog-pr-4127.yml b/html/changelogs/AutoChangeLog-pr-4127.yml deleted file mode 100644 index b9f6abc58d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4127.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "More Robust Than You" -delete-after: True -changes: - - bugfix: "Fixed cult leaders being de-culted upon election if they had a mindshield implant" diff --git a/html/changelogs/AutoChangeLog-pr-4129.yml b/html/changelogs/AutoChangeLog-pr-4129.yml deleted file mode 100644 index 16d3765876..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4129.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ninjanomnom" -delete-after: True -changes: - - rscadd: "You can now make a new tasty traditional treat: butterdogs. Watch out, they're slippery." diff --git a/html/changelogs/AutoChangeLog-pr-4133.yml b/html/changelogs/AutoChangeLog-pr-4133.yml deleted file mode 100644 index 2b50fbd4ea..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4133.yml +++ /dev/null @@ -1,14 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - balance: "Viruses' healing symptoms have been reworked!" - - rscdel: "All existing healing symptoms have been removed in favour of new ones." - - rscdel: "Weight Even and Weight Gain have been removed, so hunger can be used for balancing in symptoms." - - rscadd: "Starlight Condensation heals toxin damage if you're in space using starlight as a catalyst. Being up to two tiles away also works, as long as you can still see it, but slower." - - rscadd: "Toxolysis (level 7) rapidly cleanses all chemicals from the body, with no exception." - - rscadd: "Cellular Molding heals brute damage depending on your body temperature: the higher the temperature, the faster the healing. Requires above-average temperature to activate, and the speed heavily increases while on fire." - - rscadd: "Regenerative Coma (level 8) causes the virus to send you into a deep coma when you are heavily damaged (>70 brute+burn damage). While you are unconscious, either from the virus or from other sources, the virus will heal both brute and burn damage fairly quickly. Sleeping also works, but at reduced speed." - - rscadd: "Tissue Hydration heals burn damage if you are wet (negative fire stacks) or if you have water in your bloodstream." - - rscadd: "Plasma Fixation (level 8) stabilizes temperature and heals burns while plasma is in your body or while standing in a plasma cloud. Does not protect from the poisoning effects of plasma." - - rscadd: "Radioactive Resonance gives a mild constant brute and burn healing while irradiated. The healing becomes more intense if you reach higher levels of radiation, but is still less than the alternatives." - - rscadd: "Metabolic Boost (level 7) doubles the rate at which you process chemicals, good and bad, but also increases hunger tenfold." diff --git a/html/changelogs/AutoChangeLog-pr-4136.yml b/html/changelogs/AutoChangeLog-pr-4136.yml deleted file mode 100644 index 0737b28919..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4136.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "ACCount" -delete-after: True -changes: - - rscadd: "New integrated circuit components: list constructors/deconstructors. Useful for building lists and taking them apart." - - bugfix: "Fixed multiple bugs in integrated circuits UIs, improved overall usability." diff --git a/html/changelogs/AutoChangeLog-pr-4143.yml b/html/changelogs/AutoChangeLog-pr-4143.yml deleted file mode 100644 index dc1f281cec..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4143.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - code_imp: "rejiggered botcode a little bit" diff --git a/html/changelogs/AutoChangeLog-pr-4144.yml b/html/changelogs/AutoChangeLog-pr-4144.yml deleted file mode 100644 index bcefc8437a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4144.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "You can make many different types of office and comfy chairs with metal" - - tweak: "Stack menus use /datum/browser" diff --git a/html/changelogs/AutoChangeLog-pr-4145.yml b/html/changelogs/AutoChangeLog-pr-4145.yml deleted file mode 100644 index c7b269b20f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4145.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "improvedname" -delete-after: True -changes: - - tweak: "toolbelts can now carry geiger counters" diff --git a/html/changelogs/AutoChangeLog-pr-4149.yml b/html/changelogs/AutoChangeLog-pr-4149.yml deleted file mode 100644 index 909fc3e1b9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4149.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "JJRcop" -delete-after: True -changes: - - admin: "Fixed the Make space ninja verb." diff --git a/html/changelogs/AutoChangeLog-pr-4150.yml b/html/changelogs/AutoChangeLog-pr-4150.yml deleted file mode 100644 index 943af018e5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4150.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ACCount" -delete-after: True -changes: - - rscdel: "Mass-spectrometers are removed. Would anyone notice if not for this changelog entry?" diff --git a/html/changelogs/AutoChangeLog-pr-4152.yml b/html/changelogs/AutoChangeLog-pr-4152.yml deleted file mode 100644 index df1b1cd09f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4152.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ACCount" -delete-after: True -changes: - - rscdel: "\"Machine prototype\" is removed from the game." diff --git a/html/changelogs/AutoChangeLog-pr-4155.yml b/html/changelogs/AutoChangeLog-pr-4155.yml deleted file mode 100644 index 0f762fae2e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4155.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "AI and observer diagnostic huds will now show the astar path of all bots, and Pai bots will be given a visible path to follow when called by the AI." diff --git a/html/changelogs/AutoChangeLog-pr-4162.yml b/html/changelogs/AutoChangeLog-pr-4162.yml deleted file mode 100644 index be4968592e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4162.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - tweak: "The sloth no longer suspiciously moves fast when gliding between tiles." - - balance: "The sloth's movespeed when inhabited by a player has been lowered from once every 1/5 of a second to once every second." diff --git a/html/changelogs/AutoChangeLog-pr-4170.yml b/html/changelogs/AutoChangeLog-pr-4170.yml deleted file mode 100644 index f54be6c190..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4170.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ninjanomnom" -delete-after: True -changes: - - tweak: "Reduced the max volume of sm by 1/5th and made the upper bounds only play mid delamination." diff --git a/html/changelogs/AutoChangeLog-pr-4171.yml b/html/changelogs/AutoChangeLog-pr-4171.yml deleted file mode 100644 index 612f5ad379..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4171.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "psykzz" -delete-after: True -changes: - - bugfix: "Fixing the broken turbine computer" diff --git a/html/changelogs/AutoChangeLog-pr-4172.yml b/html/changelogs/AutoChangeLog-pr-4172.yml deleted file mode 100644 index a2dac53175..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4172.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - tweak: "Damage examinations now include a \"moderate\" classification. Before minor was <30 and severe was anything 30 or above. Now minor is <25, moderate is 25 to <50, and severe is 50+." diff --git a/html/changelogs/AutoChangeLog-pr-4175.yml b/html/changelogs/AutoChangeLog-pr-4175.yml deleted file mode 100644 index 1eed117c43..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4175.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - imageadd: "Construct shells have a new animated sprite" diff --git a/html/changelogs/AutoChangeLog-pr-4176.yml b/html/changelogs/AutoChangeLog-pr-4176.yml deleted file mode 100644 index 76ccbf0925..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4176.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Toriate" -delete-after: True -changes: - - rscadd: "Added Lavaknights, a new ghost role of cat people in knight armor." - - rscadd: "Added Hypereutactic blades, NEBs on steroids." - - tweak: "Made NEBs alt click to recolor -wip: Added lavaknight spawners. Someone else needs to add it in to a map or ruin properly." - - imageadd: "added sprites for hypereutactic blades" diff --git a/html/changelogs/AutoChangeLog-pr-4177.yml b/html/changelogs/AutoChangeLog-pr-4177.yml deleted file mode 100644 index f6e65ed068..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4177.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - balance: "Clockwork magicks will now prevent Bags of Holding from being combined on Reebe." diff --git a/html/changelogs/AutoChangeLog-pr-4180.yml b/html/changelogs/AutoChangeLog-pr-4180.yml deleted file mode 100644 index fb6248b653..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4180.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - bugfix: "Flashes will now burn out AFTER flashing when they fail instead of being a ticking time bomb that waits to screw you over on your next attempt." diff --git a/html/changelogs/AutoChangeLog-pr-4182.yml b/html/changelogs/AutoChangeLog-pr-4182.yml deleted file mode 100644 index 6d0c949e11..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4182.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Frozenguy5" -delete-after: True -changes: - - tweak: "The Particle Accelerator's wires can no longer be EMP'd" diff --git a/html/changelogs/AutoChangeLog-pr-4184.yml b/html/changelogs/AutoChangeLog-pr-4184.yml deleted file mode 100644 index f97a70a206..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4184.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CosmicScientist" -delete-after: True -changes: - - rscadd: "You can make plushies kiss one another!" diff --git a/html/changelogs/AutoChangeLog-pr-4186.yml b/html/changelogs/AutoChangeLog-pr-4186.yml deleted file mode 100644 index 86951d81f1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4186.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - code_imp: "Cleans up some loc assignments" diff --git a/html/changelogs/AutoChangeLog-pr-4191.yml b/html/changelogs/AutoChangeLog-pr-4191.yml deleted file mode 100644 index 5904f70b86..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4191.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "BeeSting12" -delete-after: True -changes: - - spellcheck: "Occupand ---> Occupant on opened cryogenic pods." - - spellcheck: "Cyrogenic ---> Cryogenic on opened cryogenic pods." diff --git a/html/changelogs/AutoChangeLog-pr-4196.yml b/html/changelogs/AutoChangeLog-pr-4196.yml deleted file mode 100644 index 49ab9fdbd9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4196.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "zennerx" -delete-after: True -changes: - - spellcheck: "fixed some typos in the weapon firing mechanism description" diff --git a/html/changelogs/AutoChangeLog-pr-4198.yml b/html/changelogs/AutoChangeLog-pr-4198.yml deleted file mode 100644 index 93e2f2212a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4198.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - rscadd: "Light fixtures now turn an ominous, dim red color when they lose power, and draw from an internal power cell to maintain it until either the cell dies (usually after 10 minutes) or power is restored." - - rscadd: "You can override emergency light functionality from an APC. You can also click on individual lights as a cyborg or AI to override them individually. Traitor AIs also have a new ability that disables emergency lights across the entire station." diff --git a/html/changelogs/AutoChangeLog-pr-4200.yml b/html/changelogs/AutoChangeLog-pr-4200.yml deleted file mode 100644 index a2321590c7..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4200.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "You can now lay (buckle!) yourself to a bed to avoid being burnt to a crisp during \"the floor is lava\" event." diff --git a/html/changelogs/AutoChangeLog-pr-4201.yml b/html/changelogs/AutoChangeLog-pr-4201.yml deleted file mode 100644 index 127a8b26ed..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4201.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - tweak: "Igniting plasma statues no longer ignores ignition temperature and only creates as much plasma as was used in its creation." diff --git a/html/changelogs/AutoChangeLog-pr-4207.yml b/html/changelogs/AutoChangeLog-pr-4207.yml deleted file mode 100644 index 692dca99ed..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4207.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - bugfix: "You now need fuel in your welder to repair mechs." diff --git a/html/changelogs/AutoChangeLog-pr-4209.yml b/html/changelogs/AutoChangeLog-pr-4209.yml deleted file mode 100644 index ee1613d170..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4209.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "You can now record and replay holopad messages using holodisks." - - rscadd: "Holodisks are printable in autolathes." diff --git a/html/changelogs/AutoChangeLog-pr-4215.yml b/html/changelogs/AutoChangeLog-pr-4215.yml deleted file mode 100644 index 6e4fe16805..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4215.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - rscadd: "Nanotrasen is happy to announce the pinnacle in plasma research! The Disco Inferno shuttle design is the result of decades of plasma research. Burn, baby, burn!" diff --git a/html/changelogs/AutoChangeLog-pr-4216.yml b/html/changelogs/AutoChangeLog-pr-4216.yml deleted file mode 100644 index 8b39d4aa94..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4216.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - tweak: "Stethoscopes now inform the user if the target can be defibrillated; the user will hear a \"faint, fluttery pulse.\"" diff --git a/html/changelogs/AutoChangeLog-pr-4218.yml b/html/changelogs/AutoChangeLog-pr-4218.yml deleted file mode 100644 index 334c16e021..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4218.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - spellcheck: "Energy values are now measured in joules. What was previously 1 unit is now 1 kJ." diff --git a/html/changelogs/AutoChangeLog-pr-4220.yml b/html/changelogs/AutoChangeLog-pr-4220.yml deleted file mode 100644 index 7287bee043..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4220.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - sounddel: "Reduced the volume of showers" diff --git a/html/changelogs/AutoChangeLog-pr-4234.yml b/html/changelogs/AutoChangeLog-pr-4234.yml deleted file mode 100644 index 3310bdb750..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4234.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Syndicate uplink implants now work again." diff --git a/html/changelogs/AutoChangeLog-pr-4235.yml b/html/changelogs/AutoChangeLog-pr-4235.yml deleted file mode 100644 index 35197c0edf..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4235.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - rscdel: "Reverted changes in 3d sound system that tripled the distance that sound would carry." diff --git a/html/changelogs/AutoChangeLog-pr-4240.yml b/html/changelogs/AutoChangeLog-pr-4240.yml deleted file mode 100644 index bb77fc8cd8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4240.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "Quiet areas of libraries on station have now been equipped with a -vending machine containing suitable recreational activities." diff --git a/html/changelogs/AutoChangeLog-pr-4241.yml b/html/changelogs/AutoChangeLog-pr-4241.yml deleted file mode 100644 index 77a17bb5b1..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4241.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "The drone dispenser on Metastation has been moved to the -maintenance by Robotics." diff --git a/html/changelogs/AutoChangeLog-pr-4243.yml b/html/changelogs/AutoChangeLog-pr-4243.yml deleted file mode 100644 index 4971528f94..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4243.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Revenant Defile ability" -delete-after: True -changes: - - bugfix: "Revenant's Defile now removes salt piles" diff --git a/html/changelogs/AutoChangeLog-pr-4244.yml b/html/changelogs/AutoChangeLog-pr-4244.yml deleted file mode 100644 index d1081a8801..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4244.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont & Alek2ander" -delete-after: True -changes: - - tweak: "Binary chat messages been made more visible." diff --git a/html/changelogs/AutoChangeLog-pr-4246.yml b/html/changelogs/AutoChangeLog-pr-4246.yml deleted file mode 100644 index 555f050d39..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4246.yml +++ /dev/null @@ -1,16 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - rscadd: "Brain damage has been completely reworked! -remove: Brain damage now no longer simply makes you dumb. Although most of its effects have been shifted into a brain trauma." - - rscadd: "Every time you take brain damage, there's a chance you'll suffer a brain trauma. There are many variations of brain traumas, split in mild, severe, and special." - - rscadd: "Mild brain traumas are the easiest to get, can be lightly to moderately annoying, and can be cured with mannitol and time." - - rscadd: "Severe brain traumas are much rarer and require extensive brain damage before you have a chance to get them; they are usually very debilitating. Unlike mild traumas, they require surgery to cure. A new surgery procedure has been added for this, the aptly named Brain Surgery. It can also heal minor traumas." - - rscadd: "Special brain traumas are rarely gained in place of Severe traumas: they are either complex or beneficial. -However, they are also even easier to cure than mild traumas, which means that keeping these will usually mean keeping a mild trauma along with it." - - rscadd: "Mobs can only naturally have one mild trauma and one severe or special trauma." - - balance: "Brain damage will now kill and ruin the brain if it goes above 200. If it somehow goes above 400, the brain will melt and be destroyed completely." - - balance: "Many brain-damaging effects have been given a damage cap, making them non-lethal." - - rscdel: "The Unintelligible mutation has been removed and made into a brain trauma." - - rscdel: "Brain damage no longer makes using machines a living hell." - - rscadd: "Abductors give minor traumas to people they experiment on." diff --git a/html/changelogs/AutoChangeLog-pr-4250.yml b/html/changelogs/AutoChangeLog-pr-4250.yml deleted file mode 100644 index 7539b323a8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4250.yml +++ /dev/null @@ -1,16 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - rscadd: "Added the Eminence role to clockcult! Players can elect themselves or ghosts as the Eminence from the eminence spire structure on Reebe." - - rscadd: "The Eminence is incorporeal and invisible, and directs the entire cult. Anything they say is heard over the Hierophant network, and they can issue commands by middle-clicking themselves or different turfs." - - rscadd: "The Eminence also has a single-use mass recall that warps all servants to the Ark chamber." - - rscadd: "Added traps, triggers, and brass filaments to link them. They can all be constructed from brass sheets, and do different things and trigger in different ways. Current traps include the brass skewer and steam vent, and triggers include the pressure sensor, lever, and repeater." - - rscadd: "The Eminence can activate trap triggers by clicking on them!" - - rscadd: "Servants can deconstruct traps instantly with a wrench." - - rscdel: "Mending Mantra has been removed." - - tweak: "Clockwork scriptures have been recolored and sorted based on their functions; yellow scriptures are for construction, red for offense, blue for defense, and purple for niche." - - balance: "Servants now spawn with a PDA and black shoes to make disguise more feasible." - - balance: "The Eminence can superheat up to 20 clockwork walls at a time. Superheated walls are immune to hulk and mech punches, but can still be broken conventionally." - - balance: "Clockwork walls are slightly faster to build before the Ark activates, taking an extra second less." - - bugfix: "Poly no longer continually undergoes binary fission when Ratvar is in range." - - code_imp: "The global records alert for servants will no longer display info that doesn't affect them since the rework." diff --git a/html/changelogs/AutoChangeLog-pr-4254.yml b/html/changelogs/AutoChangeLog-pr-4254.yml deleted file mode 100644 index cdfa4c7c0b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4254.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Games vending machines can now properly be rebuilt." - - bugfix: "Games vending machines can now be refilled via supply crates." - - rscadd: "Games Supply Crates have been added to the cargo console." diff --git a/html/changelogs/AutoChangeLog-pr-4259.yml b/html/changelogs/AutoChangeLog-pr-4259.yml deleted file mode 100644 index 7536cfa7a6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4259.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "Action buttons now remember positions where you locked." - - tweak: "Now locking action buttons prevents them from being reset." diff --git a/html/changelogs/AutoChangeLog-pr-4260.yml b/html/changelogs/AutoChangeLog-pr-4260.yml deleted file mode 100644 index 1880edb973..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4260.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - rscadd: "You can now make pet carriers from the autolathe, to carry around chef meat and other small animals without having to drag them. The HoP, captain, and CMO also start with carriers in their lockers for their pets." diff --git a/html/changelogs/AutoChangeLog-pr-4261.yml b/html/changelogs/AutoChangeLog-pr-4261.yml deleted file mode 100644 index d7b0bcebf5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4261.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Slime blueprints can now make an area compatible with Xenobio consoles, regardless of the name of the new area" diff --git a/html/changelogs/AutoChangeLog-pr-4264.yml b/html/changelogs/AutoChangeLog-pr-4264.yml deleted file mode 100644 index 3a3b5c1f42..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4264.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "You now can get a medal for wasting hours talking to the secret debug tile." - - bugfix: "Fixed runtime for the tile when poly's speech file doesn't exist." diff --git a/html/changelogs/AutoChangeLog-pr-4266.yml b/html/changelogs/AutoChangeLog-pr-4266.yml deleted file mode 100644 index e66348d5b4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4266.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Fixed the camera failure, race swap, cursed items, and imposter wizard random events" - - tweak: "The cursed items event no longer nullspaces items" diff --git a/html/changelogs/AutoChangeLog-pr-4267.yml b/html/changelogs/AutoChangeLog-pr-4267.yml deleted file mode 100644 index 97e3a17b9a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4267.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MrDoomBringer" -delete-after: True -changes: - - imageadd: "All stations have been outfitted with brand new Smoke Machines! They have nicer sprites now!" diff --git a/html/changelogs/AutoChangeLog-pr-4270.yml b/html/changelogs/AutoChangeLog-pr-4270.yml deleted file mode 100644 index 06c99c93ee..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4270.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - config: "The default view range can now be defined in the config. The default is 15x15, which is simplified to 7 by BYOND. For reference, Goonstation's widescreen range is 21x15. Do note that changing this value will affect the title screen. The title screen images and the title screen area on the Centcom z-level will have to be updated if the default view range is changed." diff --git a/html/changelogs/AutoChangeLog-pr-4272.yml b/html/changelogs/AutoChangeLog-pr-4272.yml deleted file mode 100644 index 8bedafab45..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4272.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "The drone dispenser on Box Station has been moved from the Testing -Lab to the Morgue/Robotics maintenance tunnel." diff --git a/html/changelogs/AutoChangeLog-pr-4274.yml b/html/changelogs/AutoChangeLog-pr-4274.yml deleted file mode 100644 index b1915f089b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4274.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - bugfix: "Fixed observer chat flavor of silicon chat." diff --git a/html/changelogs/AutoChangeLog-pr-4279.yml b/html/changelogs/AutoChangeLog-pr-4279.yml deleted file mode 100644 index cddc887068..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4279.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dax Dupont" -delete-after: True -changes: - - bugfix: "Grilles now no longer revert to a pre-broken icon state when you hit them after they broke." diff --git a/html/changelogs/AutoChangeLog-pr-4283.yml b/html/changelogs/AutoChangeLog-pr-4283.yml deleted file mode 100644 index a96b866609..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4283.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - tweak: "The pAI software interface is now accessible via an action button." diff --git a/html/changelogs/AutoChangeLog-pr-4286.yml b/html/changelogs/AutoChangeLog-pr-4286.yml deleted file mode 100644 index 83ede8f21d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4286.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "External airlocks of the mining base and gulag are now cycle-linked." diff --git a/html/changelogs/AutoChangeLog-pr-4287.yml b/html/changelogs/AutoChangeLog-pr-4287.yml deleted file mode 100644 index 55bbeb05c2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4287.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - tweak: "Instead of activating randomly on speech, Godwoken Syndrome randomly grants inspiration, causing the next message to be a Voice of God." diff --git a/html/changelogs/AutoChangeLog-pr-4289.yml b/html/changelogs/AutoChangeLog-pr-4289.yml deleted file mode 100644 index d0da6e0f58..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4289.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "Nanotrasen would like to remind crewmembers and especially medical personnel to stand clear of cadeavers before applying a defibrillator shock. (You get shocked if you're pulling/grabbing someone being defibbed.)" - - tweak: "defib shock/charge sounds upped from 50% to 75%." diff --git a/html/changelogs/AutoChangeLog-pr-4290.yml b/html/changelogs/AutoChangeLog-pr-4290.yml deleted file mode 100644 index a7a034433f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4290.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Swindly" -delete-after: True -changes: - - rscadd: "You can kill yourself with a few more items." diff --git a/html/changelogs/AutoChangeLog-pr-4292.yml b/html/changelogs/AutoChangeLog-pr-4292.yml deleted file mode 100644 index 14dda4b668..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4292.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - tweak: "Flickering lights will now actually flicker and not go between emergency lights and normal lighting." diff --git a/html/changelogs/AutoChangeLog-pr-4296.yml b/html/changelogs/AutoChangeLog-pr-4296.yml deleted file mode 100644 index 1e87a3fdaf..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4296.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - bugfix: "Emergency lights no longer stay on forever in some cases." diff --git a/html/changelogs/AutoChangeLog-pr-4305.yml b/html/changelogs/AutoChangeLog-pr-4305.yml deleted file mode 100644 index d6ae57f28d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4305.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "The MULEbots that the station starts with now show their ID numbers." diff --git a/html/changelogs/AutoChangeLog-pr-4306.yml b/html/changelogs/AutoChangeLog-pr-4306.yml deleted file mode 100644 index 0a6361f11d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4306.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Improvedname" -delete-after: True -changes: - - tweak: "cats now drop their ears and tail when butchered." diff --git a/html/changelogs/AutoChangeLog-pr-4308.yml b/html/changelogs/AutoChangeLog-pr-4308.yml deleted file mode 100644 index 5f277e0e53..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4308.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Booze-o-mats have beer" diff --git a/html/changelogs/AutoChangeLog-pr-4312.yml b/html/changelogs/AutoChangeLog-pr-4312.yml deleted file mode 100644 index 8c05f5d79e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4312.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - bugfix: "Modes not in rotation have had their \"false report\" weights for the Command Report standardized" diff --git a/html/changelogs/AutoChangeLog-pr-4313.yml b/html/changelogs/AutoChangeLog-pr-4313.yml deleted file mode 100644 index a1124c765a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4313.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - tweak: "The white ship navigation computer now takes 10 seconds to designate a landing spot, and users can no longer see the syndicate shuttle or its custom landing location. If the white ship landing location would intersect the syndicate shuttle or its landing location, it will fail after the 10 seconds have elapsed." diff --git a/html/changelogs/AutoChangeLog-pr-4314.yml b/html/changelogs/AutoChangeLog-pr-4314.yml deleted file mode 100644 index e471271981..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4314.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "flightsuits should no longer disappear when you take them off involuntarily" - - bugfix: "beam rifles actually fire striaght now" - - bugfix: "click catchers now actually work" - - bugfix: "you no longer see space in areas you normally can't see, instead of black. in reality you can still see space but it's faint enough that you can't tell so I'll say I fixed it." diff --git a/html/changelogs/AutoChangeLog-pr-4315.yml b/html/changelogs/AutoChangeLog-pr-4315.yml deleted file mode 100644 index a021f0ccc4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4315.yml +++ /dev/null @@ -1,10 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "Added MANY new types of airlock assembly that can be built with metal. Use metal in hand to see the new airlock assembly recipes." - - rscadd: "Added new airlock types to the RCD and airlock painter" - - rscadd: "Vault door assemblies can be built with 8 plasteel, high security assemblies with 6 plasteel" - - rscadd: "Glass mineral airlocks are finally constructible. Use glass and mineral sheets on an airlock assembly in any order to make them." - - tweak: "Glass and mineral sheets are now able to be welded out of door assemblies rather than having to deconstruct the whole thing" - - rscdel: "Airlock painter no longer works on airlock assemblies (still works on airlocks)" - - bugfix: "Titanium airlocks no longer have any missing overlays" diff --git a/html/changelogs/AutoChangeLog-pr-4319.yml b/html/changelogs/AutoChangeLog-pr-4319.yml deleted file mode 100644 index 851d5f12bc..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4319.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Frozenguy5" -delete-after: True -changes: - - balance: "Some hardsuits have had their melee, fire and rad armor ratings tweaked." diff --git a/html/changelogs/AutoChangeLog-pr-4331.yml b/html/changelogs/AutoChangeLog-pr-4331.yml deleted file mode 100644 index 04532aa4a8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4331.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Swindly" -delete-after: True -changes: - - bugfix: "Swarmers can no longer deconstruct objects with living things in them." diff --git a/html/changelogs/AutoChangeLog-pr-4338.yml b/html/changelogs/AutoChangeLog-pr-4338.yml deleted file mode 100644 index da4fde1e23..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4338.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "You can now print telecomms equipment again." diff --git a/html/changelogs/AutoChangeLog-pr-4339.yml b/html/changelogs/AutoChangeLog-pr-4339.yml deleted file mode 100644 index bf7c49d3e8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4339.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - rscadd: "The blood cult revive rune will now replace the souls of braindead or inactive cultists/constructs when properly invoked. These \"revivals\" will not count toward the revive limit." - - rscadd: "The clock cult healing rune will now replace the souls of braindead or inactive cultists/constructs when left atop the rune. These \"revivals\" will not drain the rune's energy." diff --git a/html/changelogs/AutoChangeLog-pr-4340.yml b/html/changelogs/AutoChangeLog-pr-4340.yml deleted file mode 100644 index 6992dc2fd8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4340.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - bugfix: "fixes mobs not metabolizing their reagents" diff --git a/html/changelogs/AutoChangeLog-pr-4341.yml b/html/changelogs/AutoChangeLog-pr-4341.yml deleted file mode 100644 index e276d3bcb8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4341.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Mark9013100" -delete-after: True -changes: - - rscadd: "Medical Wardrobes now contain an additional standard and EMT labcoat." diff --git a/html/changelogs/AutoChangeLog-pr-4344.yml b/html/changelogs/AutoChangeLog-pr-4344.yml deleted file mode 100644 index a020f7882f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4344.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - bugfix: "Donator items use the proper sprites when worn again." diff --git a/html/changelogs/AutoChangeLog-pr-4346.yml b/html/changelogs/AutoChangeLog-pr-4346.yml deleted file mode 100644 index d03954b91f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4346.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - bugfix: "The standard-issue PDAs are now holographic again." diff --git a/html/changelogs/AutoChangeLog-pr-4349.yml b/html/changelogs/AutoChangeLog-pr-4349.yml deleted file mode 100644 index 3f1bb91439..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4349.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Nonstandard power cells found in MULEbots, cyborgs, and elsewhere now have the correct description." diff --git a/html/changelogs/AutoChangeLog-pr-4350.yml b/html/changelogs/AutoChangeLog-pr-4350.yml deleted file mode 100644 index 2116fa9fd5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4350.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - bugfix: "Genetics will no longer have a random block completely disappear each round" diff --git a/html/changelogs/AutoChangeLog-pr-4351.yml b/html/changelogs/AutoChangeLog-pr-4351.yml deleted file mode 100644 index bc5cabdb55..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4351.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - bugfix: "glass shards and bananium floors no longer make a sound when \"walked\" over by a camera or a ghost" diff --git a/html/changelogs/AutoChangeLog-pr-4353.yml b/html/changelogs/AutoChangeLog-pr-4353.yml deleted file mode 100644 index 6fcf3e2ebe..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4353.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "deathride58" -delete-after: True -changes: - - rscadd: "All maps now have departmental lathes as they're supposed to." - - rscadd: "Pubbystation and Omegastation now have kinkmates! This does not add them back to the rotation, though. Tell Jay to re-enable Pubby and Omega in the server's config." - - rscadd: "Omegastation's dorms now have bolt buttons." - - bugfix: "The table in the back of Boxstation's maint bar gambling area will no longer throw people around." diff --git a/html/changelogs/AutoChangeLog-pr-4354.yml b/html/changelogs/AutoChangeLog-pr-4354.yml deleted file mode 100644 index e9aa1f0f2b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4354.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - code_imp: "Tidied up some loc assignments" diff --git a/html/changelogs/AutoChangeLog-pr-4359.yml b/html/changelogs/AutoChangeLog-pr-4359.yml deleted file mode 100644 index 6679e4b920..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4359.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - server: "Added new admin flag, AUTOLOGIN, to control if admins start with admin powers. this defaults to on, and can be removed with -AUTOLOGIN" - - admin: "Admins with +PERMISSION may now deadmin or readmin other admins via the permission panel." diff --git a/html/changelogs/AutoChangeLog-pr-4361.yml b/html/changelogs/AutoChangeLog-pr-4361.yml deleted file mode 100644 index 140a9a4fe3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4361.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Shuttles now place hyperspace ripples where they are about to land again." diff --git a/html/changelogs/AutoChangeLog-pr-4363.yml b/html/changelogs/AutoChangeLog-pr-4363.yml deleted file mode 100644 index fda81eb42b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4363.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "JStheguy" -delete-after: True -changes: - - rscadd: "Added 10 new assembly designs to the integrated circuit printer, the difference from current designs is purely aesthetics." - - imageadd: "Added the icons for said new assembly designs to electronic_setups.dmi, changed the current electronic mechanism and electronic machine sprites." diff --git a/html/changelogs/AutoChangeLog-pr-4365.yml b/html/changelogs/AutoChangeLog-pr-4365.yml deleted file mode 100644 index 165bb4d0df..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4365.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Epoc" -delete-after: True -changes: - - bugfix: "Adds Cybernetic Lungs to the Cyber Organs research node" diff --git a/html/changelogs/AutoChangeLog-pr-4372.yml b/html/changelogs/AutoChangeLog-pr-4372.yml deleted file mode 100644 index 7c1aa4b97c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4372.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - soundadd: "Revamped gun dry-firing sounds." - - tweak: "Everyone around you will now hear when your gun goes click. You don't want to hear click when you want to hear bang!" diff --git a/html/changelogs/AutoChangeLog-pr-4375.yml b/html/changelogs/AutoChangeLog-pr-4375.yml deleted file mode 100644 index 2cf7f4c721..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4375.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - code_imp: "fixes the remaining loc assignments" diff --git a/html/changelogs/AutoChangeLog-pr-4377.yml b/html/changelogs/AutoChangeLog-pr-4377.yml deleted file mode 100644 index 5234e24f49..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4377.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - rscadd: "Grinding runed metal and brass now produces iron/blood and iron/teslium, respectively." - - balance: "As part of some code-side improvements, the amount of reagents you get from grinding some objects might be slightly different." - - bugfix: "Some grinding recipes that didn't work, like dead mice and glowsticks, now do." - - bugfix: "All-In-One grinders now correctly grind up everything, instead of one thing at a time." diff --git a/html/changelogs/AutoChangeLog-pr-4378.yml b/html/changelogs/AutoChangeLog-pr-4378.yml deleted file mode 100644 index 22ea638655..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4378.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - imageadd: "Closet sprites changed." diff --git a/html/changelogs/AutoChangeLog-pr-4382.yml b/html/changelogs/AutoChangeLog-pr-4382.yml deleted file mode 100644 index 64568eb274..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4382.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - config: "Added \"$include\" directives to config files. These are recursive. Only config.txt will be default loaded if they are specified inside it" diff --git a/html/changelogs/AutoChangeLog-pr-4383.yml b/html/changelogs/AutoChangeLog-pr-4383.yml deleted file mode 100644 index cf9c743a03..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4383.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Naksu" -delete-after: True -changes: - - code_imp: "Preliminary work on tracking cliented living mobs across Z-levels to facilitate mob AI changes later" diff --git a/html/changelogs/AutoChangeLog-pr-4384.yml b/html/changelogs/AutoChangeLog-pr-4384.yml deleted file mode 100644 index d7f2f90350..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4384.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "EtheoBoxxman" -delete-after: True -changes: - - rscdel: "Removed chasm that spawns on killing ash walker tendril" diff --git a/html/changelogs/AutoChangeLog-pr-4389.yml b/html/changelogs/AutoChangeLog-pr-4389.yml deleted file mode 100644 index 36f17b95de..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4389.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Toriate" -delete-after: True -changes: - - tweak: "NEBs now consistently alt click to recolor" diff --git a/html/changelogs/AutoChangeLog-pr-4390.yml b/html/changelogs/AutoChangeLog-pr-4390.yml deleted file mode 100644 index 89d3683a34..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4390.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "AverageJoe82" -delete-after: True -changes: - - rscadd: "drones now have night vision" - - rscdel: "drones no longer have lights" diff --git a/html/changelogs/AutoChangeLog-pr-4394.yml b/html/changelogs/AutoChangeLog-pr-4394.yml deleted file mode 100644 index 68d57a2d11..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4394.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "The shuttle will no longer be autocalled if the round has already ended." diff --git a/html/changelogs/AutoChangeLog-pr-4412.yml b/html/changelogs/AutoChangeLog-pr-4412.yml deleted file mode 100644 index 6280189218..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4412.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - tweak: "Vitality matrices don't have visible messages when someone crosses them anymore." diff --git a/html/changelogs/AutoChangeLog-pr-4416.yml b/html/changelogs/AutoChangeLog-pr-4416.yml deleted file mode 100644 index 543fe52edd..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4416.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Robustin" -delete-after: True -changes: - - bugfix: "The wizard event \"race swap\" should now stick to \"safer\" species." diff --git a/html/changelogs/AutoChangeLog-pr-4417.yml b/html/changelogs/AutoChangeLog-pr-4417.yml deleted file mode 100644 index 46b7019353..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4417.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - bugfix: "Clockcult power alerts will no longer show outside of the clockcult gamemode (they could be triggered by scarabs.)" diff --git a/html/changelogs/AutoChangeLog-pr-4420.yml b/html/changelogs/AutoChangeLog-pr-4420.yml deleted file mode 100644 index 305d701c7f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4420.yml +++ /dev/null @@ -1,10 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - rscadd: "A few new traumas have been added." - - balance: "Thresholds to get brain traumas have been lowered, as they currently pretty much only trigger if you intentionally chug impedrezene." - - tweak: "Melee head hits deal minor brain damage. Crits still do a significant amount." - - tweak: "Nuke Op implants no longer trigger on deathgasp. (They still explode on death)" - - tweak: "You'll now receive messages when crossing certain brain damage thresholds." - - tweak: "Split Personalities are instructed not to suicide while in control." - - tweak: "Godwoken Syndrome now randomly sends Voice of God commands, instead of being controllable." diff --git a/html/changelogs/AutoChangeLog-pr-4433.yml b/html/changelogs/AutoChangeLog-pr-4433.yml deleted file mode 100644 index 39bde17139..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4433.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ninjanomnom" -delete-after: True -changes: - - bugfix: "Decals should now rotate the correct way around." diff --git a/html/changelogs/AutoChangeLog-pr-4437.yml b/html/changelogs/AutoChangeLog-pr-4437.yml deleted file mode 100644 index 9b11b0912e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4437.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nicbn" -delete-after: True -changes: - - bugfix: "Now the chem smoke machine uses stock parts for volume and range." diff --git a/html/changelogs/AutoChangeLog-pr-4442.yml b/html/changelogs/AutoChangeLog-pr-4442.yml deleted file mode 100644 index e480e91419..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4442.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - rscadd: "Abductors can now see if people already have glands! Never worry about abducting the same guy twice again." - - rscadd: "Added the Mind Interface Device to the abductor shop for 2 Credits. Only scientists can use it." - - rscadd: "The MID has two modes: Transmit and Control." - - rscadd: "Transmit will allow you to send a message anytime, anywhere to the mind of a target of your choice, regardless of language barriers. The message will be anonymous, but abductor-like." - - rscadd: "Control allows you to give a temporary directive to a target with an implanted gland, that they MUST follow. Duration and amount of uses varies by gland type. When a gland is spent, it will no longer respond to Control signals. The target forgets ever receiving the objective when the duration ends." diff --git a/html/changelogs/AutoChangeLog-pr-4445.yml b/html/changelogs/AutoChangeLog-pr-4445.yml deleted file mode 100644 index 6dd7a7e486..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4445.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Fixed captain's PDA showing unusable Toggle Remote Door menu option" diff --git a/html/changelogs/AutoChangeLog-pr-4446.yml b/html/changelogs/AutoChangeLog-pr-4446.yml deleted file mode 100644 index 3811f7ffb7..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4446.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - balance: "The codespeak manual now has unlimited uses and costs 3 TC." - - bugfix: "Nuke ops can now purchase the codespeak manual, as was intended." diff --git a/html/changelogs/AutoChangeLog-pr-4453.yml b/html/changelogs/AutoChangeLog-pr-4453.yml deleted file mode 100644 index 24bce9c510..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4453.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "A changeling will learn all languages from anyone they absorb." diff --git a/html/changelogs/AutoChangeLog-pr-4458.yml b/html/changelogs/AutoChangeLog-pr-4458.yml deleted file mode 100644 index 4e51890691..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4458.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - tweak: "The Disease Outbreak event now can generate random advanced viruses, with more symptoms and higher level as round time goes on." diff --git a/html/changelogs/AutoChangeLog-pr-4464.yml b/html/changelogs/AutoChangeLog-pr-4464.yml deleted file mode 100644 index 17f7d8fc07..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4464.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "You can enforce no smoking zones with a disarm aimed at the smokers mouth." diff --git a/html/changelogs/AutoChangeLog-pr-4466.yml b/html/changelogs/AutoChangeLog-pr-4466.yml deleted file mode 100644 index e8239ebfb4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4466.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Toriate" -delete-after: True -changes: - - balance: "Roundstart xenos are no longer pierce immune, also no more extra damage from heat." diff --git a/html/changelogs/AutoChangeLog-pr-4467.yml b/html/changelogs/AutoChangeLog-pr-4467.yml deleted file mode 100644 index ae009bf26f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4467.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "improvedname" -delete-after: True -changes: - - bugfix: "Corrects 357. speedloader in the autolathe" diff --git a/html/changelogs/AutoChangeLog-pr-4475.yml b/html/changelogs/AutoChangeLog-pr-4475.yml deleted file mode 100644 index f37e80ed55..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4475.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - bugfix: "Passing a space transition no longer interrupts pulls." diff --git a/html/changelogs/AutoChangeLog-pr-4477.yml b/html/changelogs/AutoChangeLog-pr-4477.yml deleted file mode 100644 index bba0dab724..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4477.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes arm implants being immune to EMPs" diff --git a/html/changelogs/AutoChangeLog-pr-4479.yml b/html/changelogs/AutoChangeLog-pr-4479.yml deleted file mode 100644 index 623a1ada72..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4479.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscdel: "Integrated circuit smoke circuits now require 10 units of reagents to fire." diff --git a/html/changelogs/AutoChangeLog-pr-4487.yml b/html/changelogs/AutoChangeLog-pr-4487.yml deleted file mode 100644 index 588566e15c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4487.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ganglyalexander" -delete-after: True -changes: - - bugfix: "module icons for dog borgs now reference to a existing icon" diff --git a/html/changelogs/AutoChangeLog-pr-4488.yml b/html/changelogs/AutoChangeLog-pr-4488.yml deleted file mode 100644 index 21031f2cf3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4488.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "coiax" -delete-after: True -changes: - - rscadd: "At the end of the round, all players can see who the antagonists -are." diff --git a/html/changelogs/AutoChangeLog-pr-4490.yml b/html/changelogs/AutoChangeLog-pr-4490.yml deleted file mode 100644 index 6477196745..0000000000 --- a/html/changelogs/AutoChangeLog-pr-4490.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "CitadelStationBot" -delete-after: True -changes: - - rscadd: "You can adjust line height in chat settings" - - tweak: "Default chat line height is slightly shorter, from 1.4 to 1.2" From 6856fc1be26ec9b5acef63a0dbac3c24d80421af Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 22 Dec 2017 14:32:56 -0600 Subject: [PATCH 40/86] [MIRROR] [s] Fixes the frying oil reagent (#4504) * Merge pull request #33745 from vuonojenmustaturska/oilfix [s] Fixes the frying oil reagent * [s] Fixes the frying oil reagent --- code/modules/reagents/chemistry/reagents/food_reagents.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index a3c0d2c034..a9f9145972 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -97,10 +97,10 @@ /datum/reagent/consumable/cooking_oil/reaction_obj(obj/O, reac_volume) if(holder && holder.chem_temp >= fry_temperature) - if(isitem(O)) + if(isitem(O) && !istype(O, /obj/item/reagent_containers/food/snacks/deepfryholder)) O.loc.visible_message("[O] rapidly fries as it's splashed with hot oil! Somehow.") - var/obj/item/reagent_containers/food/snacks/deepfryholder/F = new(O.drop_location()) - F.fry(O, volume) + var/obj/item/reagent_containers/food/snacks/deepfryholder/F = new(O.drop_location(), O) + F.fry(volume) /datum/reagent/consumable/cooking_oil/reaction_mob(mob/living/M, method = TOUCH, reac_volume, show_message = 1, touch_protection = 0) if(!istype(M)) From f6e82e446049d5d236ed953144ab2efb375344bc Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 22 Dec 2017 14:33:00 -0600 Subject: [PATCH 41/86] Automatic changelog generation for PR #4504 [ci skip] --- html/changelogs/AutoChangeLog-pr-4504.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4504.yml diff --git a/html/changelogs/AutoChangeLog-pr-4504.yml b/html/changelogs/AutoChangeLog-pr-4504.yml new file mode 100644 index 0000000000..7da90cb88b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4504.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - bugfix: "frying oil actually works" From 938f409782d7b8589fc5ba6bc936bcc17318eed5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 22 Dec 2017 15:14:25 -0600 Subject: [PATCH 42/86] [MIRROR] Christmas (#4491) * Christmas (#33690) * Christmas Event Updates * Dont recreate the list every time * Check for drop del * Changes some things to placate that one guy from FTL * Christmas --- code/game/objects/items/gift.dm | 34 +++++++++++++++++++++----- code/game/objects/structures/flora.dm | 18 +++++++++++--- code/modules/events/holiday/xmas.dm | 25 +++---------------- code/modules/holiday/holidays.dm | 4 +-- icons/obj/flora/pinetrees.dmi | Bin 36037 -> 42806 bytes 5 files changed, 49 insertions(+), 32 deletions(-) diff --git a/code/game/objects/items/gift.dm b/code/game/objects/items/gift.dm index 1e3e9ccd73..0fe53f293c 100644 --- a/code/game/objects/items/gift.dm +++ b/code/game/objects/items/gift.dm @@ -7,6 +7,9 @@ /* * Gifts */ + +GLOBAL_LIST_EMPTY(possible_gifts) + /obj/item/a_gift name = "gift" desc = "PRESENTS!!!! eek!" @@ -30,6 +33,14 @@ to_chat(M, "You're supposed to be spreading gifts, not opening them yourself!") return + var/gift_type = get_gift_type() + + qdel(src) + var/obj/item/I = new gift_type(M) + M.put_in_hands(I) + I.add_fingerprint(M) + +/obj/item/a_gift/proc/get_gift_type() var/gift_type_list = list(/obj/item/sord, /obj/item/storage/wallet, /obj/item/storage/photo_album, @@ -72,10 +83,21 @@ var/gift_type = pick(gift_type_list) - if(!ispath(gift_type, /obj/item)) - return + return gift_type - qdel(src) - var/obj/item/I = new gift_type(M) - M.put_in_hands(I) - I.add_fingerprint(M) + +/obj/item/a_gift/anything + name = "christmas gift" + desc = "It could be anything!" + +/obj/item/a_gift/anything/get_gift_type() + if(!GLOB.possible_gifts.len) + var/list/gift_types_list = subtypesof(/obj/item) + for(var/V in gift_types_list) + var/obj/item/I = V + if((!initial(I.icon_state)) || (!initial(I.item_state)) || (initial(I.flags_1) & ABSTRACT_1)) + gift_types_list -= V + GLOB.possible_gifts = gift_types_list + var/gift_type = pick(GLOB.possible_gifts) + + return gift_type diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index f7071cd0a5..393ff3886d 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -36,9 +36,6 @@ else return ..() - - - /obj/structure/flora/tree/pine name = "pine tree" desc = "A coniferous pine tree." @@ -53,6 +50,21 @@ name = "xmas tree" desc = "A wondrous decorated Christmas tree." icon_state = "pine_c" + var/gifts_under_tree = FALSE + var/list/ckeys_that_took = list() + +/obj/structure/flora/tree/pine/xmas/attack_hand(mob/living/user) + if(!gifts_under_tree) + return + if(!user.ckey) + return + if(ckeys_that_took[user.ckey]) + to_chat(user, "You already took your gift.") + return + to_chat(user, "After a bit of rummaging, you locate a gift with your name on it!") + ckeys_that_took[user.ckey] = TRUE + var/obj/item/a_gift/anything/A = new + user.put_in_hands(A) /obj/structure/flora/tree/pine/xmas/Initialize() . = ..() diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index 2f5618714d..956a214009 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -1,19 +1,3 @@ -/datum/round_event_control/treevenge - name = "Treevenge (Christmas)" - holidayID = CHRISTMAS - typepath = /datum/round_event/treevenge - max_occurrences = 1 - weight = 20 - -/datum/round_event/treevenge/start() - for(var/obj/structure/flora/tree/pine/xmas in world) - var/mob/living/simple_animal/hostile/tree/evil_tree = new /mob/living/simple_animal/hostile/tree(xmas.loc) - evil_tree.icon_state = xmas.icon_state - evil_tree.icon_living = evil_tree.icon_state - evil_tree.icon_dead = evil_tree.icon_state - evil_tree.icon_gib = evil_tree.icon_state - qdel(xmas) //b-but I don't want to delete xmas... - //this is an example of a possible round-start event /datum/round_event_control/presents name = "Presents under Trees (Christmas)" @@ -24,12 +8,11 @@ earliest_start = 0 /datum/round_event/presents/start() - for(var/obj/structure/flora/tree/pine/xmas in world) + for(var/obj/structure/flora/tree/pine/xmas/xmas in world) if(!(xmas.z in GLOB.station_z_levels)) continue - for(var/turf/open/floor/T in orange(1,xmas)) - for(var/i=1,i<=rand(1,5),i++) - new /obj/item/a_gift(T) + xmas.icon_state = "pinepresents" + xmas.gifts_under_tree = TRUE for(var/mob/living/simple_animal/pet/dog/corgi/Ian/Ian in GLOB.mob_living_list) Ian.place_on_head(new /obj/item/clothing/head/helmet/space/santahat(Ian)) for(var/obj/machinery/computer/security/telescreen/entertainment/Monitor in GLOB.machines) @@ -98,7 +81,7 @@ name = "Santa is coming to town! (Christmas)" holidayID = CHRISTMAS typepath = /datum/round_event/santa - weight = 150 + weight = 20 max_occurrences = 1 earliest_start = 20000 diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 388a9d6893..85605fd2c4 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -387,9 +387,9 @@ Since Ramadan is an entire month that lasts 29.5 days on average, the start and /datum/holiday/xmas name = CHRISTMAS - begin_day = 23 + begin_day = 22 begin_month = DECEMBER - end_day = 25 + end_day = 27 /datum/holiday/xmas/greet() return "Have a merry Christmas!" diff --git a/icons/obj/flora/pinetrees.dmi b/icons/obj/flora/pinetrees.dmi index e7fa58cb1a95b17e0c6c4151ec109fa299c2da72..a68e0388b08e29a8ab2ee1b3ee8ea684f778f98c 100644 GIT binary patch literal 42806 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 literal 36037 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 Date: Fri, 22 Dec 2017 15:14:27 -0600 Subject: [PATCH 43/86] Automatic changelog generation for PR #4491 [ci skip] --- html/changelogs/AutoChangeLog-pr-4491.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4491.yml diff --git a/html/changelogs/AutoChangeLog-pr-4491.yml b/html/changelogs/AutoChangeLog-pr-4491.yml new file mode 100644 index 0000000000..3076537362 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4491.yml @@ -0,0 +1,4 @@ +author: "Kor" +delete-after: True +changes: + - rscadd: "During Christmas you will be able to click on the tree in the Chapel to receive one present per round. That present can contain any item in the game." From f40d74e52f6af7fbf8eb1963eb82957576aa42d4 Mon Sep 17 00:00:00 2001 From: coiax Date: Sat, 23 Dec 2017 00:02:42 +0000 Subject: [PATCH 44/86] Gibber rebalance (#33737) :cl: coiax balance: The kitchen gibber must be anchored in order to use. balance: The gibber requires bodies to have no external items or equipment. /:cl: Unanchoring the gibber, running around with it, ebowing people, then shoving them in is not fun. As a double check, you REALLY should be stripping them of all that cloth, it'll jam up the gears. - Removes the abiotic() proc, it's literally used only in the gibber. --- .../kitchen_machinery/gibber.dm | 24 ++++++++++++------- .../mob/living/carbon/human/human_helpers.dm | 11 --------- code/modules/mob/mob_helpers.dm | 5 ---- 3 files changed, 16 insertions(+), 24 deletions(-) diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index 372c085adb..99a3de90e1 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -1,4 +1,3 @@ - /obj/machinery/gibber name = "gibber" desc = "The name isn't descriptive enough?" @@ -12,10 +11,10 @@ circuit = /obj/item/circuitboard/machine/gibber var/operating = FALSE //Is it on? - var/dirty = 0 // Does it need cleaning? + var/dirty = FALSE // Does it need cleaning? var/gibtime = 40 // Time from starting until meat appears var/meat_produced = 0 - var/ignore_clothing = 0 + var/ignore_clothing = FALSE /obj/machinery/gibber/Initialize() @@ -30,7 +29,7 @@ gib_time -= 5 * M.rating gibtime = gib_time if(M.rating >= 2) - ignore_clothing = 1 + ignore_clothing = TRUE /obj/machinery/gibber/update_icon() cut_overlays() @@ -61,6 +60,10 @@ to_chat(user, "It's locked and running.") return + if(!anchored) + to_chat(user, "[src] cannot be used unless bolted to the ground.") + return + if(user.pulling && user.a_intent == INTENT_GRAB && isliving(user.pulling)) var/mob/living/L = user.pulling if(!iscarbon(L)) @@ -70,12 +73,17 @@ if(C.buckled ||C.has_buckled_mobs()) to_chat(user, "[C] is attached to something!") return - if(C.abiotic(1) && !ignore_clothing) - to_chat(user, "Subject may not have abiotic items on.") - return + + if(!ignore_clothing) + for(var/obj/item/I in C.held_items + C.get_equipped_items()) + if(!(I.flags_1 & NODROP_1)) + to_chat(user, "Subject may not have abiotic items on.") + return user.visible_message("[user] starts to put [C] into the gibber!") - src.add_fingerprint(user) + + add_fingerprint(user) + if(do_after(user, gibtime, target = src)) if(C && user.pulling == C && !C.buckled && !C.has_buckled_mobs() && !occupant) user.visible_message("[user] stuffs [C] into the gibber!") diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index d1d657652b..41875b7d91 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -91,17 +91,6 @@ return wear_id.GetID() -/mob/living/carbon/human/abiotic(full_body = 0) - var/abiotic_hands = FALSE - for(var/obj/item/I in held_items) - if(!(I.flags_1 & NODROP_1)) - abiotic_hands = TRUE - break - if(full_body && abiotic_hands && ((back && !(back.flags_1&NODROP_1)) || (wear_mask && !(wear_mask.flags_1&NODROP_1)) || (head && !(head.flags_1&NODROP_1)) || (shoes && !(shoes.flags_1&NODROP_1)) || (w_uniform && !(w_uniform.flags_1&NODROP_1)) || (wear_suit && !(wear_suit.flags_1&NODROP_1)) || (glasses && !(glasses.flags_1&NODROP_1)) || (ears && !(ears.flags_1&NODROP_1)) || (gloves && !(gloves.flags_1&NODROP_1)) ) ) - return TRUE - return abiotic_hands - - /mob/living/carbon/human/IsAdvancedToolUser() if(disabilities & MONKEYLIKE) return FALSE diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 747d589c05..10c9a04a6e 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -285,11 +285,6 @@ It's fairly easy to fix if dealing with single letters but not so much with comp firstname.Find(real_name) return firstname.match -/mob/proc/abiotic(full_body = 0) - for(var/obj/item/I in held_items) - if(!(I.flags_1 & NODROP_1)) - return 1 - return 0 //change a mob's act-intent. Input the intent as a string such as "help" or use "right"/"left /mob/verb/a_intent_change(input as text) From e0118067ec3fffb0e0d38bdf42333c0e4a5d661d Mon Sep 17 00:00:00 2001 From: Dax Dupont Date: Sat, 23 Dec 2017 01:50:41 +0100 Subject: [PATCH 46/86] 2 borg metal fixes for the price of one (#33738) --- code/game/objects/items/stacks/stack.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 5e80353db9..cef25a0a36 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -109,7 +109,7 @@ if (recipes_sublist && recipe_list[recipes_sublist] && istype(recipe_list[recipes_sublist], /datum/stack_recipe_list)) var/datum/stack_recipe_list/srl = recipe_list[recipes_sublist] recipe_list = srl.recipes - var/t1 = "Amount Left: [amount]
    " + var/t1 = "Amount Left: [get_amount()]
    " for(var/i in 1 to length(recipe_list)) var/E = recipe_list[i] if (isnull(E)) @@ -161,8 +161,8 @@ if (href_list["sublist"] && !href_list["make"]) interact(usr, text2num(href_list["sublist"])) if (href_list["make"]) - if (get_amount() < 1) - qdel(src) //Never should happen + if (get_amount() < 1 && !is_cyborg) + qdel(src) var/list/recipes_list = recipes if (href_list["sublist"]) From 937fc2421cdca4a75431cbd00d002d0b425b54cb Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sat, 23 Dec 2017 02:42:50 -0500 Subject: [PATCH 48/86] Add a single whitespace (#33746) --- code/game/world.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/world.dm b/code/game/world.dm index 2853bb2ef6..39d48d28ac 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -251,3 +251,4 @@ GLOBAL_PROTECT(security_mode) hub_password = "kMZy3U5jJHSiBQjr" else hub_password = "SORRYNOPASSWORD" + From bede61c0ee0ba96f94935dbede627173b2552f93 Mon Sep 17 00:00:00 2001 From: Robustin Date: Sat, 23 Dec 2017 02:45:52 -0500 Subject: [PATCH 50/86] Fixed empty HUD_List breaking alternate_appearances (#33742) * Alt Appearance works on empty HUD lists * Fixes empty list runtime --- code/game/alternate_appearance.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/alternate_appearance.dm b/code/game/alternate_appearance.dm index 901a8610a6..712b3425e0 100644 --- a/code/game/alternate_appearance.dm +++ b/code/game/alternate_appearance.dm @@ -78,6 +78,7 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) QDEL_NULL(ghost_appearance) /datum/atom_hud/alternate_appearance/basic/add_to_hud(atom/A) + LAZYINITLIST(A.hud_list) A.hud_list[appearance_key] = theImage . = ..() From 17267781b5330677802e8b5c935cfc1121de7a7b Mon Sep 17 00:00:00 2001 From: Robustin Date: Sat, 23 Dec 2017 04:18:24 -0500 Subject: [PATCH 52/86] Reworked EMP doorshocking (#33741) --- code/game/machinery/doors/door.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 30ae436289..c7a21bf31b 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -195,7 +195,7 @@ /obj/machinery/door/emp_act(severity) if(prob(20/severity) && (istype(src, /obj/machinery/door/airlock) || istype(src, /obj/machinery/door/window)) ) INVOKE_ASYNC(src, .proc/open) - if(prob(40/severity)) + if(prob(severity*10 - 20)) if(secondsElectrified == 0) secondsElectrified = -1 shockedby += "\[[time_stamp()]\]EM Pulse" From 17c9a5ab0b1193f8606a59af466354fe310e684f Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sat, 23 Dec 2017 09:03:45 -0500 Subject: [PATCH 54/86] Merge pull request #33775 from MoreRobustThanYou/patch-39 Revert gulpfs version to 6d71a65 in tgui --- tgui/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tgui/package.json b/tgui/package.json index 007ee04ab9..52662139a6 100644 --- a/tgui/package.json +++ b/tgui/package.json @@ -22,7 +22,7 @@ "es3ify": "0.2.1", "fg-loadcss": "1.0.0-0", "fontfaceobserver": "1.6.3", - "gulp": "github:gulpjs/gulp#4.0", + "gulp": "github:gulpjs/gulp#6d71a65", "gulp-bytediff": "1.0.0", "gulp-cssnano": "2.1.2", "gulp-if": "2.0.0", From 2a80a2d6fbf5c23e23cd8639ec04ad34d5e94679 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sat, 23 Dec 2017 09:26:23 -0500 Subject: [PATCH 56/86] Merge pull request #33728 from kevinz000/patch-408 Fixes biodegrading handcuffs --- code/game/gamemodes/changeling/powers/biodegrade.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/gamemodes/changeling/powers/biodegrade.dm b/code/game/gamemodes/changeling/powers/biodegrade.dm index dbb0e3a88a..4a34de151e 100644 --- a/code/game/gamemodes/changeling/powers/biodegrade.dm +++ b/code/game/gamemodes/changeling/powers/biodegrade.dm @@ -55,12 +55,14 @@ /obj/effect/proc_holder/changeling/biodegrade/proc/dissolve_handcuffs(mob/living/carbon/human/user, obj/O) if(O && user.handcuffed == O) user.visible_message("[O] dissolve[O.gender==PLURAL?"":"s"] into a puddle of sizzling goop.") + user.uncuff() new /obj/effect/decal/cleanable/greenglow(O.drop_location()) qdel(O) /obj/effect/proc_holder/changeling/biodegrade/proc/dissolve_straightjacket(mob/living/carbon/human/user, obj/S) if(S && user.wear_suit == S) user.visible_message("[S] dissolves into a puddle of sizzling goop.") + user.uncuff() new /obj/effect/decal/cleanable/greenglow(S.drop_location()) qdel(S) From 7bcf4d466a51c2801b5dd367e0e2d764541e7383 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sat, 23 Dec 2017 09:30:31 -0500 Subject: [PATCH 58/86] Merge pull request #33784 from octareenroon91/patch-56 Fix file path to aimalf.ogg --- code/game/gamemodes/malfunction/Malf_Modules.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 1c17893a28..9e2e889047 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -304,7 +304,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( sleep(30) if(!owner || QDELETED(owner)) return - priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", 'sound/AI/aimalf.ogg') + priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", 'sound/ai/aimalf.ogg') set_security_level("delta") var/obj/machinery/doomsday_device/DOOM = new(owner_AI) owner_AI.nuking = TRUE From af1f13e114cd84be04c28aa9dbd5f434b1f5dad3 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sat, 23 Dec 2017 09:35:34 -0500 Subject: [PATCH 60/86] Merge pull request #33306 from coiax/replace-clean-flag-with-component Replaces CLEAN_ON_MOVE_1 flag with cleaning component --- code/__DEFINES/flags.dm | 2 +- code/datums/components/cleaning.dm | 40 +++++++++++++++++++ code/game/atoms_movable.dm | 32 --------------- .../modules/mob/living/silicon/robot/robot.dm | 4 +- code/modules/vehicles/pimpin_ride.dm | 5 ++- tgstation.dme | 1 + 6 files changed, 48 insertions(+), 36 deletions(-) create mode 100644 code/datums/components/cleaning.dm diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 965ee51502..8b3e74b96e 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -22,7 +22,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define ON_BORDER_1 512 // item has priority to check when entering or leaving #define NOSLIP_1 1024 //prevents from slipping on wet floors, in space etc -#define CLEAN_ON_MOVE_1 2048 +#define _UNUSED_1 2048 // BLOCK_GAS_SMOKE_EFFECT_1 only used in masks at the moment. #define BLOCK_GAS_SMOKE_EFFECT_1 4096 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! diff --git a/code/datums/components/cleaning.dm b/code/datums/components/cleaning.dm new file mode 100644 index 0000000000..5d9d5992e2 --- /dev/null +++ b/code/datums/components/cleaning.dm @@ -0,0 +1,40 @@ +/datum/component/cleaning + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + +/datum/component/cleaning/Initialize() + if(!ismovableatom(parent)) + . = COMPONENT_INCOMPATIBLE + CRASH("[type] added to a [parent.type]") + RegisterSignal(list(COMSIG_MOVABLE_MOVED), .proc/Clean) + +/datum/component/cleaning/proc/Clean() + var/atom/movable/AM = parent + var/turf/tile = AM.loc + if(!isturf(tile)) + return + + tile.clean_blood() + for(var/A in tile) + if(is_cleanable(A)) + qdel(A) + else if(istype(A, /obj/item)) + var/obj/item/cleaned_item = A + cleaned_item.clean_blood() + else if(ishuman(A)) + var/mob/living/carbon/human/cleaned_human = A + if(cleaned_human.lying) + if(cleaned_human.head) + cleaned_human.head.clean_blood() + cleaned_human.update_inv_head() + if(cleaned_human.wear_suit) + cleaned_human.wear_suit.clean_blood() + cleaned_human.update_inv_wear_suit() + else if(cleaned_human.w_uniform) + cleaned_human.w_uniform.clean_blood() + cleaned_human.update_inv_w_uniform() + if(cleaned_human.shoes) + cleaned_human.shoes.clean_blood() + cleaned_human.update_inv_shoes() + cleaned_human.clean_blood() + cleaned_human.wash_cream() + to_chat(cleaned_human, "[AM] cleans your face!") diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index ddb768488a..08568660fd 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -132,44 +132,12 @@ if (orbiting) orbiting.Check() - if(flags_1 & CLEAN_ON_MOVE_1) - clean_on_move() - var/datum/proximity_monitor/proximity_monitor = src.proximity_monitor if(proximity_monitor) proximity_monitor.HandleMove() return 1 -/atom/movable/proc/clean_on_move() - var/turf/tile = loc - if(isturf(tile)) - tile.clean_blood() - for(var/A in tile) - if(is_cleanable(A)) - qdel(A) - else if(istype(A, /obj/item)) - var/obj/item/cleaned_item = A - cleaned_item.clean_blood() - else if(ishuman(A)) - var/mob/living/carbon/human/cleaned_human = A - if(cleaned_human.lying) - if(cleaned_human.head) - cleaned_human.head.clean_blood() - cleaned_human.update_inv_head() - if(cleaned_human.wear_suit) - cleaned_human.wear_suit.clean_blood() - cleaned_human.update_inv_wear_suit() - else if(cleaned_human.w_uniform) - cleaned_human.w_uniform.clean_blood() - cleaned_human.update_inv_w_uniform() - if(cleaned_human.shoes) - cleaned_human.shoes.clean_blood() - cleaned_human.update_inv_shoes() - cleaned_human.clean_blood() - cleaned_human.wash_cream() - to_chat(cleaned_human, "[src] cleans your face!") - /atom/movable/Destroy(force) var/inform_admins = (flags_2 & INFORM_ADMINS_ON_RELOCATE_2) var/stationloving = (flags_2 & STATIONLOVING_2) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index db10f4a81c..2788413ee9 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1029,9 +1029,9 @@ status_flags &= ~CANPUSH if(module.clean_on_move) - flags_1 |= CLEAN_ON_MOVE_1 + AddComponent(/datum/component/cleaning) else - flags_1 &= ~CLEAN_ON_MOVE_1 + qdel(GetComponent(/datum/component/cleaning)) hat_offset = module.hat_offset diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm index 3925b863ff..88524366a6 100644 --- a/code/modules/vehicles/pimpin_ride.dm +++ b/code/modules/vehicles/pimpin_ride.dm @@ -13,6 +13,9 @@ var/datum/component/riding/D = LoadComponent(/datum/component/riding) D.set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 4), TEXT_SOUTH = list(0, 7), TEXT_EAST = list(-12, 7), TEXT_WEST = list( 12, 7))) + if(floorbuffer) + AddComponent(/datum/component/cleaning) + /obj/vehicle/ridden/janicart/Destroy() if(mybag) qdel(mybag) @@ -47,7 +50,7 @@ floorbuffer = TRUE qdel(I) to_chat(user, "You upgrade [src] with the floor buffer.") - flags_1 |= CLEAN_ON_MOVE_1 + AddComponent(/datum/component/cleaning) update_icon() else return ..() diff --git a/tgstation.dme b/tgstation.dme index aadf2bf1b8..4b6ba31e8b 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -345,6 +345,7 @@ #include "code\datums\components\archaeology.dm" #include "code\datums\components\caltrop.dm" #include "code\datums\components\chasm.dm" +#include "code\datums\components\cleaning.dm" #include "code\datums\components\decal.dm" #include "code\datums\components\infective.dm" #include "code\datums\components\jousting.dm" From a11167982145381cc5836ba6746c3a071abd6083 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sun, 24 Dec 2017 14:52:31 -0500 Subject: [PATCH 62/86] Merge pull request #33801 from AutomaticFrenzy/patch/download Fix download objective always greentexting --- code/game/gamemodes/objective.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 46f96961c9..ef307c95a0 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -524,7 +524,7 @@ GLOBAL_LIST_EMPTY(possible_items_special) var/list/otherwise = M.GetAllContents() for(var/obj/item/disk/tech_disk/TD in otherwise) TD.stored_research.copy_research_to(checking) - return checking.researched_nodes.len >= target + return checking.researched_nodes.len >= target_amount /datum/objective/capture From d9f3c74607636b59ee27fe9d98c9b1a0f3d9be3a Mon Sep 17 00:00:00 2001 From: Armhulen Date: Sat, 23 Dec 2017 10:45:21 -0800 Subject: [PATCH 64/86] pride and satisfaction --- code/datums/diseases/gbs.dm | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm index 71e4064676..6d77acd3ae 100644 --- a/code/datums/diseases/gbs.dm +++ b/code/datums/diseases/gbs.dm @@ -1,6 +1,6 @@ /datum/disease/gbs name = "GBS" - max_stages = 5 + max_stages = 4 spread_text = "On contact" spread_flags = VIRUS_SPREAD_BLOOD | VIRUS_SPREAD_CONTACT_SKIN | VIRUS_SPREAD_CONTACT_FLUIDS cure_text = "Synaptizine & Sulfur" @@ -16,25 +16,15 @@ ..() switch(stage) if(2) - if(prob(45)) - affected_mob.adjustToxLoss(5) - affected_mob.updatehealth() - if(prob(1)) - affected_mob.emote("sneeze") - if(3) if(prob(5)) affected_mob.emote("cough") - else if(prob(5)) + if(3) + if(prob(5)) affected_mob.emote("gasp") if(prob(10)) - to_chat(affected_mob, "You're starting to feel very weak...") + to_chat(affected_mob, "Your body hurts all over!") if(4) - if(prob(10)) - affected_mob.emote("cough") - affected_mob.adjustToxLoss(5) - affected_mob.updatehealth() - if(5) - to_chat(affected_mob, "Your body feels as if it's trying to rip itself open...") + to_chat(affected_mob, "Your body feels as if it's trying to rip itself apart!") if(prob(50)) affected_mob.gib() else From d1d8687a63771845b286773aa2349877b0a6b115 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sun, 24 Dec 2017 13:56:50 -0500 Subject: [PATCH 66/86] Merge pull request #33765 from MoreRobustThanYou/patch-33 Make airlocks use VARSET_CALLBACK --- code/game/machinery/doors/airlock.dm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 775c9dd894..3d659f104b 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -251,16 +251,13 @@ note = null update_icon() -/obj/machinery/door/airlock/proc/unzap() //for addtimer - justzap = FALSE - /obj/machinery/door/airlock/bumpopen(mob/living/user) //Airlocks now zap you when you 'bump' them open when they're electrified. --NeoFite if(!issilicon(usr)) if(isElectrified()) if(!justzap) if(shock(user, 100)) justzap = TRUE - addtimer(CALLBACK(src, .proc/unzap), 10) + addtimer(VARSET_CALLBACK(src, justzap, FALSE) , 10) return else return From 0068bb2ed26346c9c3d9fdf19a39c3b934cfa775 Mon Sep 17 00:00:00 2001 From: FrozenGuy5 <31222036+praisenarsie@users.noreply.github.com> Date: Sat, 23 Dec 2017 18:31:11 +0000 Subject: [PATCH 68/86] adds world.realtime to soapstone --- code/modules/library/soapstone.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/library/soapstone.dm b/code/modules/library/soapstone.dm index cee4665f07..fd75ba4351 100644 --- a/code/modules/library/soapstone.dm +++ b/code/modules/library/soapstone.dm @@ -142,7 +142,7 @@ hidden_message = newmessage creator_name = user.real_name creator_key = user.ckey - realdate = world.timeofday + realdate = world.realtime map = SSmapping.config.map_name update_icon() From 95354a388fecf3dd8bc1b302128fb6aa43531113 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sun, 24 Dec 2017 11:45:04 -0500 Subject: [PATCH 70/86] Vending TGUI --- code/game/machinery/vending.dm | 278 ++++++++++++--------------------- tgui/assets/tgui.css | 2 +- 2 files changed, 98 insertions(+), 182 deletions(-) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index d3598d4866..427ffa119a 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -25,8 +25,8 @@ integrity_failure = 100 armor = list(melee = 20, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70) circuit = /obj/item/circuitboard/machine/vendor - var/active = 1 //No sales pitches if off! - var/vend_ready = 1 //Are we ready to vend?? Is it time?? + var/active = TRUE //No sales pitches if off! + var/vend_ready = TRUE //Are we ready to vend?? Is it time?? // To be filled out at compile time var/list/products = list() //For each, use the following pattern: @@ -227,15 +227,15 @@ if(!allowed(user) && !emagged && scan_id) to_chat(user, "[src]'s chef compartment blinks red: Access denied.") req_access_txt = "0" - return 0 + return FALSE req_access_txt = "0" - return 1 + return TRUE /obj/machinery/vending/snack/proc/iscompartmentfull(mob/user) if(contents.len >= 30) // no more than 30 dishes can fit inside to_chat(user, "[src]'s chef compartment is full.") - return 1 - return 0 + return TRUE + return FALSE /obj/machinery/vending/snack/proc/food_load(obj/item/reagent_containers/food/snacks/S) if(dish_quants[S.name]) @@ -350,180 +350,6 @@ /obj/machinery/vending/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/vending/attack_hand(mob/user) - var/dat = "" - if(panel_open && !isAI(user)) - return wires.interact(user) - else - if(stat & (BROKEN|NOPOWER)) - return - - dat += "

    Select an item

    " - dat += "
    " - if(product_records.len == 0) - dat += "No product loaded!" - else - var/list/display_records = product_records - if(extended_inventory) - display_records = product_records + hidden_records - if(coin || bill) - display_records = product_records + coin_records - if((coin || bill) && extended_inventory) - display_records = product_records + hidden_records + coin_records - dat += "
      " - for (var/datum/data/vending_product/R in display_records) - dat += "
    • " - if(R.amount > 0) - dat += "Vend " - else - dat += "Sold out " - dat += "[sanitize(R.product_name)]:" - dat += " [R.amount]" - dat += "
    • " - dat += "
    " - dat += "
    " - if(premium.len > 0) - dat += "Change Return: " - if (coin || bill) - dat += "[(coin ? coin : "")][(bill ? bill : "")]  Remove" - else - dat += "No money  Remove" - if(istype(src, /obj/machinery/vending/snack)) - dat += "

    Chef's Food Selection

    " - dat += "
    " - for (var/O in dish_quants) - if(dish_quants[O] > 0) - var/N = dish_quants[O] - dat += "Dispense " - dat += "[capitalize(O)]: [N]
    " - dat += "
    " - user.set_machine(src) - if(seconds_electrified && !(stat & NOPOWER)) - if(shock(user, 100)) - return - - var/datum/browser/popup = new(user, "vending", (name)) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) - popup.open() - - -/obj/machinery/vending/Topic(href, href_list) - if(..()) - return - - if(href_list["remove_coin"]) - if(!(coin || bill)) - to_chat(usr, "There is no money in this machine.") - return - if(coin) - if(!usr.get_active_held_item()) - usr.put_in_hands(coin) - else - coin.forceMove(get_turf(src)) - to_chat(usr, "You remove [coin] from [src].") - coin = null - if(bill) - if(!usr.get_active_held_item()) - usr.put_in_hands(bill) - else - bill.forceMove(get_turf(src)) - to_chat(usr, "You remove [bill] from [src].") - bill = null - - - usr.set_machine(src) - - if((href_list["dispense"]) && (vend_ready)) - var/N = href_list["dispense"] - if(dish_quants[N] <= 0) // Sanity check, there are probably ways to press the button when it shouldn't be possible. - return - vend_ready = 0 - use_power(5) - - dish_quants[N] = max(dish_quants[N] - 1, 0) - for(var/obj/O in contents) - if(O.name == N) - O.forceMove(drop_location()) - break - vend_ready = 1 - updateUsrDialog() - return - - if((href_list["vend"]) && (vend_ready)) - if(panel_open) - to_chat(usr, "The vending machine cannot dispense products while its service panel is open!") - return - - if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH - to_chat(usr, "Access denied." ) - flick(icon_deny,src) - return - - vend_ready = 0 //One thing at a time!! - - var/datum/data/vending_product/R = locate(href_list["vend"]) - if(!R || !istype(R) || !R.product_path) - vend_ready = 1 - return - - if(R in hidden_records) - if(!extended_inventory) - vend_ready = 1 - return - else if(R in coin_records) - if(!(coin || bill)) - to_chat(usr, "You need to insert money to get this item!") - vend_ready = 1 - return - if(coin && coin.string_attached) - if(prob(50)) - if(usr.put_in_hands(coin)) - to_chat(usr, "You successfully pull [coin] out before [src] could swallow it.") - coin = null - else - to_chat(usr, "You couldn't pull [coin] out because your hands are full!") - QDEL_NULL(coin) - else - to_chat(usr, "You weren't able to pull [coin] out fast enough, the machine ate it, string and all!") - QDEL_NULL(coin) - else - QDEL_NULL(coin) - QDEL_NULL(bill) - - else if (!(R in product_records)) - vend_ready = 1 - message_admins("Vending machine exploit attempted by [key_name(usr, usr.client)]!") - return - - if (R.amount <= 0) - to_chat(usr, "Sold out.") - vend_ready = 1 - return - else - R.amount-- - - if(((last_reply + 200) <= world.time) && vend_reply) - speak(vend_reply) - last_reply = world.time - - use_power(5) - if(icon_vend) //Show the vending animation if needed - flick(icon_vend,src) - new R.product_path(get_turf(src)) - SSblackbox.record_feedback("nested tally", "vending_machine_usage", 1, list("[type]", "[R.product_path]")) - vend_ready = 1 - return - - updateUsrDialog() - return - - else if(href_list["togglevoice"] && panel_open) - shut_up = !shut_up - - updateUsrDialog() - - /obj/machinery/vending/process() if(stat & (BROKEN|NOPOWER)) return @@ -605,6 +431,96 @@ else return FALSE +/obj/machinery/vending/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "vending", name, 350, 475, master_ui, state) + ui.open() + +/obj/machinery/vending/ui_data() + var/list/data = list() + var/list/listed_products = list() + var/list/display_records = product_records + if(extended_inventory) + display_records += hidden_records + if(coin) + display_records += coin_records + for(var/key = 1 to display_records.len) + var/datum/data/vending_product/I = display_records[key] + listed_products.Add(list(list( + "key" = key, + "name" = I.product_name, + "color" = I.display_color, + "amount" = I.amount))) + data["products"] = listed_products + if(!isnull(coin)) + data["coin"] = coin.name + data["coinslot"] = premium.len + data["canvend"] = vend_ready + + return data + +/obj/machinery/vending/ui_act(action, params) + if(..()) + return + if(!vend_ready) + return + switch(action) + if("vend") + if(!allowed(usr) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH + to_chat(usr, "Access denied.") + flick(icon_deny,src) + return + vend_ready = FALSE + addtimer(VARSET_CALLBACK(src, vend_ready, TRUE), 10) + var/key = text2num(params["key"]) + var/datum/data/vending_product/R = product_records[key] + if(R in hidden_records) + if(!extended_inventory) + return + else if(R in coin_records) + if(!coin) + to_chat(usr, "You need to insert a coin to get this item!") + return + if(coin.string_attached) + if(prob(50)) + if(usr.put_in_hands(coin)) + to_chat(usr, "You successfully pull [coin] out before [src] could swallow it.") + coin = null + else + to_chat(usr, "You couldn't pull [coin] out because your hands are full!") + QDEL_NULL(coin) + else + to_chat(usr, "You weren't able to pull [coin] out fast enough, the machine ate it, string and all!") + QDEL_NULL(coin) + else + QDEL_NULL(coin) + else if (!(R in product_records)) + return + + + + if (R.amount <= 0) + to_chat(usr, "Sold out.") + return + R.amount-- + if(((last_reply + 200) <= world.time) && vend_reply) + speak(vend_reply) + last_reply = world.time + use_power(5) + if(icon_vend) //Show the vending animation if needed + flick(icon_vend,src) + new R.product_path(drop_location()) + return TRUE + if("eject") + if(!coin) + to_chat(usr, "There is no coin in this machine.") + return + usr.put_in_hands(coin) + to_chat(usr, "You remove [coin] from [src].") + coin = null + /* * Vending machine types */ @@ -1195,4 +1111,4 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C #undef STANDARD_CHARGE #undef CONTRABAND_CHARGE -#undef COIN_CHARGE \ No newline at end of file +#undef COIN_CHARGE diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css index 256b53c106..c73fc2adfa 100644 --- a/tgui/assets/tgui.css +++ b/tgui/assets/tgui.css @@ -1 +1 @@ -@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button.gridable.center{text-align:center;width:75px}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display.tabular{padding:0;margin:0}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input.number{width:35px}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .cell,body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork section .cell:not(:first-child){text-align:center;padding-top:0}body.clockwork section .cell span.button{width:75px}body.clockwork section:not(:last-child){padding-right:4px}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button.gridable.center{text-align:center;width:75px}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display.tabular{padding:0;margin:0}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input.number{width:35px}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen section .cell:not(:first-child){text-align:center;padding-top:0}body.nanotrasen section .cell span.button{width:75px}body.nanotrasen section:not(:last-child){padding-right:4px}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff750000",endColorstr="#ff340404",GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button.gridable.center{text-align:center;width:75px}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display.tabular{padding:0;margin:0}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input.number{width:35px}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate section .cell:not(:first-child){text-align:center;padding-top:0}body.syndicate section .cell span.button{width:75px}body.syndicate section:not(:last-child){padding-right:4px}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file +@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button.gridable.center{text-align:center;width:75px}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display.tabular{padding:0;margin:0}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input.number{width:35px}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .cell,body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork section .cell:not(:first-child){text-align:center;padding-top:0}body.clockwork section .cell span.button{width:75px}body.clockwork section:not(:last-child){padding-right:4px}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCA0MjUgMjAwIiBvcGFjaXR5PSIuMzMiPgogIDxwYXRoIGQ9Im0gMTc4LjAwMzk5LDAuMDM4NjkgLTcxLjIwMzkzLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM0LDYuMDI1NTUgbCAwLDE4Ny44NzE0NyBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgNi43NjEzNCw2LjAyNTU0IGwgNTMuMTA3MiwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTAxLjU0NDAxOCA3Mi4yMTYyOCwxMDQuNjk5Mzk4IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA1Ljc2MDE1LDIuODcwMTYgbCA3My41NTQ4NywwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzNSwtNi4wMjU1NSBsIC01NC43MTY0NCwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzMyw2LjAyNTU1IGwgMCwxMDIuNjE5MzUgTCAxODMuNzY0MTMsMi45MDg4NiBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTUuNzYwMTQsLTIuODcwMTcgeiIgLz4KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPgogIDxwYXRoIGQ9Im0gNDIwLjE1NTM1LDE3Ny44OTExOSBhIDEzLjQxMjAzOCwxMi41MDE4NDIgMCAwIDEgLTguNjMyOTUsMjIuMDY5NTEgbCAtNjYuMTE4MzIsMCBhIDUuMzY0ODE1Miw1LjAwMDczNyAwIDAgMSAtNS4zNjQ4MiwtNS4wMDA3NCBsIDAsLTc5Ljg3OTMxIHoiIC8+Cjwvc3ZnPgo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4KPCEtLSBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIC0tPgo=") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button.gridable.center{text-align:center;width:75px}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display.tabular{padding:0;margin:0}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input.number{width:35px}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen section .cell:not(:first-child){text-align:center;padding-top:0}body.nanotrasen section .cell span.button{width:75px}body.nanotrasen section:not(:last-child){padding-right:4px}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCAyMDAgMjg5Ljc0MiIgb3BhY2l0eT0iLjMzIj4KICA8cGF0aCBkPSJtIDkzLjUzNzY3NywwIGMgLTE4LjExMzEyNSwwIC0zNC4yMjAxMzMsMy4xMTE2NCAtNDguMzIzNDg0LDkuMzM0MzcgLTEzLjk2NTA5Miw2LjIyMTY3IC0yNC42MTI0NDIsMTUuMDcxMTQgLTMxLjk0MDY1MSwyNi41NDcxIC03LjE4OTkzOTgsMTEuMzM3ODkgLTEwLjMwMTIyNjYsMjQuNzQ5MTEgLTEwLjMwMTIyNjYsNDAuMjM0NzggMCwxMC42NDY2MiAyLjcyNTAwMjYsMjAuNDY0NjUgOC4xNzUxMTE2LDI5LjQ1MjU4IDUuNjE1Mjc3LDguOTg2ODYgMTQuMDM4Mjc3LDE3LjM1MjA0IDI1LjI2ODgyMSwyNS4wOTQzNiAxMS4yMzA1NDQsNy42MDUzMSAyNi41MDc0MjEsMTUuNDE4MzUgNDUuODMwNTE0LDIzLjQzNzgyIDE5Ljk4Mzc0OCw4LjI5NTU3IDM0Ljg0ODg0OCwxNS41NTQ3MSA0NC41OTI5OTgsMjEuNzc2MzggOS43NDQxNCw2LjIyMjczIDE2Ljc2MTcsMTIuODU4NSAyMS4wNTU3MiwxOS45MDk1MSA0LjI5NDA0LDcuMDUyMDggNi40NDE5MywxNS43NjQwOCA2LjQ0MTkzLDI2LjEzNDU5IDAsMTYuMTc3MDIgLTUuMjAxOTYsMjguNDgyMjIgLTE1LjYwNjczLDM2LjkxNjgyIC0xMC4yMzk2LDguNDM0NyAtMjUuMDIyMDMsMTIuNjUyMyAtNDQuMzQ1MTY5LDEyLjY1MjMgLTE0LjAzODE3MSwwIC0yNS41MTUyNDcsLTEuNjU5NCAtMzQuNDMzNjE4LC00Ljk3NzcgLTguOTE4MzcsLTMuNDU2NiAtMTYuMTg1NTcyLC04LjcxMTMgLTIxLjgwMDgzOSwtMTUuNzYzMyAtNS42MTUyNzcsLTcuMDUyMSAtMTAuMDc0Nzk1LC0xNi42NjA4OCAtMTMuMzc3ODk5LC0yOC44MjgxMiBsIC0yNC43NzMxNjI2MjkzOTQ1LDAgMCw1Ni44MjYzMiBDIDMzLjg1Njc2OSwyODYuMDc2MDEgNjMuNzQ5MDQsMjg5Ljc0MjAxIDg5LjY3ODM4MywyODkuNzQyMDEgYyAxNi4wMjAwMjcsMCAzMC43MTk3ODcsLTEuMzgyNyA0NC4wOTczMzcsLTQuMTQ3OSAxMy41NDI3MiwtMi45MDQzIDI1LjEwNDEsLTcuNDY3NiAzNC42ODMwOSwtMTMuNjg5MyA5Ljc0NDEzLC02LjM1OTcgMTcuMzQwNDIsLTE0LjUxOTUgMjIuNzkwNTIsLTI0LjQ3NDggNS40NTAxLC0xMC4wOTMzMiA4LjE3NTExLC0yMi4zOTk1OSA4LjE3NTExLC0zNi45MTY4MiAwLC0xMi45OTc2NCAtMy4zMDIxLC0yNC4zMzUzOSAtOS45MDgyOSwtMzQuMDE0NiAtNi40NDEwNSwtOS44MTcyNSAtMTUuNTI1NDUsLTE4LjUyNzA3IC0yNy4yNTE0NiwtMjYuMTMxMzMgLTExLjU2MDg1LC03LjYwNDI3IC0yNy45MTA4MywtMTUuODMxNDIgLTQ5LjA1MDY2LC0yNC42ODAyMiAtMTcuNTA2NDQsLTcuMTkwMTIgLTMwLjcxOTY2OCwtMTMuNjg5NDggLTM5LjYzODAzOCwtMTkuNDk3MDEgLTguOTE4MzcxLC01LjgwNzUyIC0xOC42MDc0NzQsLTEyLjQzNDA5IC0yNC4wOTY1MjQsLTE4Ljg3NDE3IC01LjQyNjA0MywtNi4zNjYxNiAtOS42NTg4MjYsLTE1LjA3MDAzIC05LjY1ODgyNiwtMjQuODg3MjkgMCwtOS4yNjQwMSAyLjA3NTQxNCwtMTcuMjEzNDUgNi4yMjM0NTQsLTIzLjg1MDMzIDExLjA5ODI5OCwtMTQuMzk3NDggNDEuMjg2NjM4LC0xLjc5NTA3IDQ1LjA3NTYwOSwyNC4zNDc2MiA0LjgzOTM5Miw2Ljc3NDkxIDguODQ5MzUsMTYuMjQ3MjkgMTIuMDI5NTE1LDI4LjQxNTYgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTQuNDc4MjUsLTUuOTI0NDggLTkuOTU0ODgsLTEwLjYzMjIyIC0xNS45MDgzNywtMTQuMzc0MTEgMS42NDA1NSwwLjQ3OTA1IDMuMTkwMzksMS4wMjM3NiA0LjYzODY1LDEuNjQwMjQgNi40OTg2MSwyLjYyNjA3IDEyLjE2NzkzLDcuMzI3NDcgMTcuMDA3MywxNC4xMDM0NSA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNSwxNi4yNDU2NyAxMi4wMjk1MiwyOC40MTM5NyAwLDAgOC40ODEyOCwtMC4xMjg5NCA4LjQ4OTc4LC0wLjAwMiAwLjQxNzc2LDYuNDE0OTQgLTEuNzUzMzksOS40NTI4NiAtNC4xMjM0MiwxMi41NjEwNCAtMi40MTc0LDMuMTY5NzggLTUuMTQ0ODYsNi43ODk3MyAtNC4wMDI3OCwxMy4wMDI5IDEuNTA3ODYsOC4yMDMxOCAxMC4xODM1NCwxMC41OTY0MiAxNC42MjE5NCw5LjMxMTU0IC0zLjMxODQyLC0wLjQ5OTExIC01LjMxODU1LC0xLjc0OTQ4IC01LjMxODU1LC0xLjc0OTQ4IDAsMCAxLjg3NjQ2LDAuOTk4NjggNS42NTExNywtMS4zNTk4MSAtMy4yNzY5NSwwLjk1NTcxIC0xMC43MDUyOSwtMC43OTczOCAtMTEuODAxMjUsLTYuNzYzMTMgLTAuOTU3NTIsLTUuMjA4NjEgMC45NDY1NCwtNy4yOTUxNCAzLjQwMTEzLC0xMC41MTQ4MiAyLjQ1NDYyLC0zLjIxOTY4IDUuMjg0MjYsLTYuOTU4MzEgNC42ODQzLC0xNC40ODgyNCBsIDAuMDAzLDAuMDAyIDguOTI2NzYsMCAwLC01NS45OTk2NyBjIC0xNS4wNzEyNSwtMy44NzE2OCAtMjcuNjUzMTQsLTYuMzYwNDIgLTM3Ljc0NjcxLC03LjQ2NTg2IC05Ljk1NTMxLC0xLjEwNzU1IC0yMC4xODgyMywtMS42NTk4MSAtMzAuNjk2NjEzLC0xLjY1OTgxIHogbSA3MC4zMjE2MDMsMTcuMzA4OTMgMC4yMzgwNSw0MC4zMDQ5IGMgMS4zMTgwOCwxLjIyNjY2IDIuNDM5NjUsMi4yNzgxNSAzLjM0MDgxLDMuMTA2MDIgNC44MzkzOSw2Ljc3NDkxIDguODQ5MzQsMTYuMjQ1NjYgMTIuMDI5NTEsMjguNDEzOTcgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTYuNjc3MzEsLTQuNTkzODEgLTE5LjgzNjQzLC0xMC40NzMwOSAtMzYuMTQwNzEsLTE1LjgyNTIyIHogbSAtMjguMTIwNDksNS42MDU1MSA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM3LC02LjQ2Njk3IC0xMy44NDY3OCwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NzA1LDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiBtIDE1LjIyMTk1LDI0LjAwODQ4IDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzgsLTYuNDY2OTcgLTEzLjg0Njc5LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDQsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gLTk5LjExMzg0LDIuMjA3NjQgOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzODIsLTYuNDY2OTcgLTEzLjg0Njc4MiwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NTQyLDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiIgLz4KPC9zdmc+CjwhLS0gVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIC0tPgo8IS0tIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8gLS0+Cg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff750000",endColorstr="#ff340404",GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button.gridable.center{text-align:center;width:75px}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display.tabular{padding:0;margin:0}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input.number{width:35px}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate section .cell:not(:first-child){text-align:center;padding-top:0}body.syndicate section .cell span.button{width:75px}body.syndicate section:not(:last-child){padding-right:4px}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file From a893559c6bf4edfaf5462957e5af036a151f9a2d Mon Sep 17 00:00:00 2001 From: arsserpentarium <32496644+arsserpentarium@users.noreply.github.com> Date: Sun, 24 Dec 2017 06:55:37 +0300 Subject: [PATCH 71/86] [READY]Circuitry upgrades --- code/modules/hydroponics/grown.dm | 4 +- .../integrated_electronics/core/assemblies.dm | 30 +-- .../integrated_electronics/core/debugger.dm | 2 +- .../integrated_electronics/core/helpers.dm | 4 +- .../core/integrated_circuit.dm | 18 +- .../integrated_electronics/core/pins.dm | 10 +- .../core/special_pins/index_pin.dm | 6 +- .../subtypes/arithmetic.dm | 60 ++--- .../subtypes/converters.dm | 8 +- .../integrated_electronics/subtypes/input.dm | 137 +++++++++- .../integrated_electronics/subtypes/logic.dm | 2 +- .../subtypes/manipulation.dm | 16 +- .../subtypes/reagents.dm | 239 +++++++++++++++--- .../integrated_electronics/subtypes/smart.dm | 2 +- .../obj/assemblies/electronic_components.dmi | Bin 21775 -> 22954 bytes 15 files changed, 409 insertions(+), 129 deletions(-) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 15456c1e34..dadf077c8a 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -146,7 +146,7 @@ /obj/item/reagent_containers/food/snacks/grown/on_grind() var/nutriment = reagents.get_reagent_amount("nutriment") - if(grind_results.len) + if(grind_results&&grind_results.len) for(var/i in 1 to grind_results.len) grind_results[grind_results[i]] = nutriment reagents.del_reagent("nutriment") @@ -154,7 +154,7 @@ /obj/item/reagent_containers/food/snacks/grown/on_juice() var/nutriment = reagents.get_reagent_amount("nutriment") - if(juice_results.len) + if(juice_results&&juice_results.len) for(var/i in 1 to juice_results.len) juice_results[juice_results[i]] = nutriment reagents.del_reagent("nutriment") diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 805cf787f7..637c3bfcee 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -20,6 +20,8 @@ var/charge_tick = FALSE var/charge_delay = 4 var/use_cyborg_cell = TRUE + max_integrity = 50 + armor = list(melee = 50, bullet = 70, laser = 70, energy = 100, bomb = 10, bio = 100, rad = 100, fire = 0, acid = 0) /obj/item/device/electronic_assembly/proc/check_interactivity(mob/user) return user.canUseTopic(src,be_close = TRUE) @@ -30,8 +32,6 @@ START_PROCESSING(SScircuit, src) materials[MAT_METAL] = round((max_complexity + max_components) / 4) * SScircuit.cost_multiplier - - /obj/item/device/electronic_assembly/Destroy() STOP_PROCESSING(SScircuit, src) return ..() @@ -273,22 +273,9 @@ /obj/item/device/electronic_assembly/afterattack(atom/target, mob/user, proximity) - for(var/obj/item/integrated_circuit/input/sensor/S in assembly_components) - if(!proximity) - if(istype(S,/obj/item/integrated_circuit/input/sensor/ranged)||(!user)) - if(user.client) - if(!(target in view(user.client))) - continue - else - if(!(target in view(user))) - continue - else - continue - S.set_pin_data(IC_OUTPUT, 1, WEAKREF(target)) - S.check_then_do_work() - S.scan(target) - - visible_message(" [user] waves [src] around [target].") + for(var/obj/item/integrated_circuit/input/S in assembly_components) + if(S.sense(target,user,proximity)) + visible_message(" [user] waves [src] around [target].") /obj/item/device/electronic_assembly/screwdriver_act(mob/living/user, obj/item/S) @@ -326,8 +313,11 @@ interact(user) return TRUE else + for(var/obj/item/integrated_circuit/input/S in assembly_components) + S.attackby_react(I,user,user.a_intent) return ..() + /obj/item/device/electronic_assembly/attack_self(mob/user) if(!check_interactivity(user)) return @@ -391,7 +381,6 @@ /obj/item/device/electronic_assembly/proc/get_object() return src - // Returns the location to be used for dropping items. // Same as the regular drop_location(), but with checks being run on acting_object if necessary. /obj/item/integrated_circuit/drop_location() @@ -406,6 +395,7 @@ /obj/item/device/electronic_assembly/default //The /default electronic_assemblys are to allow the introduction of the new naming scheme without breaking old saves. name = "type-a electronic assembly" + /obj/item/device/electronic_assembly/calc name = "type-b electronic assembly" icon_state = "setup_small_calc" @@ -507,4 +497,4 @@ /obj/item/device/electronic_assembly/drone/arms name = "type-b electronic drone" icon_state = "setup_drone_arms" - desc = "It's a case, for building mobile electronics with. This one is armed and dangerous." \ No newline at end of file + desc = "It's a case, for building mobile electronics with. This one is armed and dangerous." diff --git a/code/modules/integrated_electronics/core/debugger.dm b/code/modules/integrated_electronics/core/debugger.dm index ac6f5c1a1e..666fcf00d6 100644 --- a/code/modules/integrated_electronics/core/debugger.dm +++ b/code/modules/integrated_electronics/core/debugger.dm @@ -56,7 +56,7 @@ data_to_show = A.name to_chat(user, "You write '[data_to_write ? data_to_show : "NULL"]' to the '[io]' pin of \the [io.holder].") else if(io.io_type == PULSE_CHANNEL) - io.holder.check_then_do_work(ignore_power = TRUE) + io.holder.check_then_do_work(io.ord,ignore_power = TRUE) to_chat(user, "You pulse \the [io.holder]'s [io].") io.holder.interact(user) // This is to update the UI. diff --git a/code/modules/integrated_electronics/core/helpers.dm b/code/modules/integrated_electronics/core/helpers.dm index e84823f201..773c4f0684 100644 --- a/code/modules/integrated_electronics/core/helpers.dm +++ b/code/modules/integrated_electronics/core/helpers.dm @@ -15,9 +15,9 @@ io_type_override = io_list_copy[io_entry] if(io_type_override) - io_list.Add(new io_type_override(src, io_entry, default_data, pin_type)) + io_list.Add(new io_type_override(src, io_entry, default_data, pin_type,i)) else - io_list.Add(new io_type(src, io_entry, default_data, pin_type)) + io_list.Add(new io_type(src, io_entry, default_data, pin_type,i)) /obj/item/integrated_circuit/proc/set_pin_data(pin_type, pin_number, datum/new_data) diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm index 069ca4245c..0c1a2fdad5 100644 --- a/code/modules/integrated_electronics/core/integrated_circuit.dm +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -58,6 +58,12 @@ a creative player the means to solve many problems. Circuits are held inside an /obj/item/integrated_circuit/proc/any_examine(mob/user) return +/obj/item/integrated_circuit/proc/attackby_react(var/atom/movable/A,mob/user) + return + +/obj/item/integrated_circuit/proc/sense(var/atom/movable/A,mob/user,prox) + return + /obj/item/integrated_circuit/proc/check_interactivity(mob/user) if(assembly) return assembly.check_interactivity(user) @@ -291,17 +297,18 @@ a creative player the means to solve many problems. Circuits are held inside an return TRUE // Battery has enough. return FALSE // Not enough power. -/obj/item/integrated_circuit/proc/check_then_do_work(var/ignore_power = FALSE) +/obj/item/integrated_circuit/proc/check_then_do_work(ord,var/ignore_power = FALSE) if(world.time < next_use) // All intergrated circuits have an internal cooldown, to protect from spam. - return + return FALSE if(power_draw_per_use && !ignore_power) if(!check_power()) power_fail() - return + return FALSE next_use = world.time + cooldown_per_use - do_work() + do_work(ord) + return TRUE -/obj/item/integrated_circuit/proc/do_work() +/obj/item/integrated_circuit/proc/do_work(ord) return /obj/item/integrated_circuit/proc/disconnect_all() @@ -369,4 +376,3 @@ a creative player the means to solve many problems. Circuits are held inside an return TRUE return FALSE - diff --git a/code/modules/integrated_electronics/core/pins.dm b/code/modules/integrated_electronics/core/pins.dm index bff96b713c..528281c3b7 100644 --- a/code/modules/integrated_electronics/core/pins.dm +++ b/code/modules/integrated_electronics/core/pins.dm @@ -25,14 +25,16 @@ D [1]/ || var/list/linked = list() var/io_type = DATA_CHANNEL var/pin_type // IC_INPUT, IC_OUTPUT, IC_ACTIVATOR - used in saving assembly wiring + var/ord - -/datum/integrated_io/New(loc, _name, _data, _pin_type) +/datum/integrated_io/New(loc, _name, _data, _pin_type,_ord) name = _name if(_data) data = _data if(_pin_type) pin_type = _pin_type + if(_ord) + ord = _ord holder = loc @@ -148,7 +150,7 @@ D [1]/ || /datum/integrated_io/activate/push_data() for(var/k in 1 to linked.len) var/datum/integrated_io/io = linked[k] - io.holder.check_then_do_work() + io.holder.check_then_do_work(io.ord) /datum/integrated_io/proc/pull_data() for(var/k in 1 to linked.len) @@ -207,7 +209,7 @@ D [1]/ || write_data_to_pin(new_data) /datum/integrated_io/activate/ask_for_pin_data(mob/user) // This just pulses the pin. - holder.check_then_do_work(ignore_power = TRUE) + holder.check_then_do_work(ord,ignore_power = TRUE) to_chat(user, "You pulse \the [holder]'s [src] pin.") /datum/integrated_io/activate diff --git a/code/modules/integrated_electronics/core/special_pins/index_pin.dm b/code/modules/integrated_electronics/core/special_pins/index_pin.dm index 51b12a0f3a..06267eec61 100644 --- a/code/modules/integrated_electronics/core/special_pins/index_pin.dm +++ b/code/modules/integrated_electronics/core/special_pins/index_pin.dm @@ -1,4 +1,4 @@ -// These pins can only contain integer numbers between 1 and IC_MAX_LIST_LENGTH. Null is not allowed. +// These pins can only contain integer numbers between 0 and IC_MAX_LIST_LENGTH. Null is allowed. /datum/integrated_io/index name = "index pin" data = 1 @@ -11,10 +11,10 @@ /datum/integrated_io/index/write_data_to_pin(new_data) if(isnull(new_data)) - new_data = 1 + new_data = 0 if(isnum(new_data)) - data = CLAMP(round(new_data), 1, IC_MAX_LIST_LENGTH) + data = CLAMP(round(new_data), 0, IC_MAX_LIST_LENGTH) holder.on_data_written() /datum/integrated_io/index/display_pin_type() diff --git a/code/modules/integrated_electronics/subtypes/arithmetic.dm b/code/modules/integrated_electronics/subtypes/arithmetic.dm index 7dec779f83..e491a34a69 100644 --- a/code/modules/integrated_electronics/subtypes/arithmetic.dm +++ b/code/modules/integrated_electronics/subtypes/arithmetic.dm @@ -30,10 +30,9 @@ /obj/item/integrated_circuit/arithmetic/addition/do_work() var/result = 0 for(var/k in 1 to inputs.len) - var/datum/integrated_io/I = inputs[k] - I.pull_data() - if(isnum(I.data)) - result = result + I.data + var/I = get_pin_data(IC_INPUT, k) + if(isnum(I)) + result += I set_pin_data(IC_OUTPUT, 1, result) push_data() @@ -56,13 +55,10 @@ return var/result = A.data - for(var/k in 1 to inputs.len) - var/datum/integrated_io/I = inputs[k] - if(I == A) - continue - I.pull_data() - if(isnum(I.data)) - result = result - I.data + for(var/k in 2 to inputs.len) + var/I = get_pin_data(IC_INPUT, k) + if(isnum(I)) + result -= I set_pin_data(IC_OUTPUT, 1, result) push_data() @@ -85,13 +81,10 @@ if(!isnum(A.data)) return var/result = A.data - for(var/k in 1 to inputs.len) - var/datum/integrated_io/I = inputs[k] - if(I == A) - continue - I.pull_data() - if(isnum(I.data)) - result = result * I.data + for(var/k in 2 to inputs.len) + var/I = get_pin_data(IC_INPUT, k) + if(isnum(I)) + result *= I set_pin_data(IC_OUTPUT, 1, result) push_data() @@ -114,13 +107,12 @@ return var/result = A.data - for(var/k in 1 to inputs.len) - var/datum/integrated_io/I = inputs[k] - if(I == A) - continue - I.pull_data() - if(isnum(I.data) && I.data != 0) //No runtimes here. - result = result / I.data + + for(var/k in 2 to inputs.len) + var/I = get_pin_data(IC_INPUT, k) + if(isnum(I) && (I != 0)) + result /= I + set_pin_data(IC_OUTPUT, 1, result) push_data() @@ -228,12 +220,11 @@ /obj/item/integrated_circuit/arithmetic/average/do_work() var/result = 0 var/inputs_used = 0 - for(var/k in 1 to inputs.len) - var/datum/integrated_io/I = inputs[k] - I.pull_data() - if(isnum(I.data)) + for(var/k in 2 to inputs.len) + var/I = get_pin_data(IC_INPUT, k) + if(isnum(I)) inputs_used++ - result = result + I.data + result += I if(inputs_used) result = result / inputs_used @@ -288,11 +279,10 @@ /obj/item/integrated_circuit/arithmetic/square_root/do_work() var/result = 0 - for(var/k in 1 to inputs.len) - var/datum/integrated_io/I = inputs[k] - I.pull_data() - if(isnum(I.data)) - result = sqrt(I.data) + for(var/k in 2 to inputs.len) + var/I = get_pin_data(IC_INPUT, k) + if(isnum(I)) + result += sqrt(I) set_pin_data(IC_OUTPUT, 1, result) push_data() diff --git a/code/modules/integrated_electronics/subtypes/converters.dm b/code/modules/integrated_electronics/subtypes/converters.dm index d622ea8ca9..cd9306d0da 100644 --- a/code/modules/integrated_electronics/subtypes/converters.dm +++ b/code/modules/integrated_electronics/subtypes/converters.dm @@ -160,10 +160,10 @@ /obj/item/integrated_circuit/converter/concatenator/do_work() var/result = null - for(var/datum/integrated_io/I in inputs) - I.pull_data() - if(!isnull(I.data)) - result = result + I.data + for(var/k in 1 to inputs.len) + var/I = get_pin_data(IC_INPUT, k) + if(!isnull(I)) + result = result + I set_pin_data(IC_OUTPUT, 1, result) push_data() diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index c39cfeac44..91b4b437e3 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -128,7 +128,7 @@ var/mob/living/carbon/human/H = get_pin_data_as_type(IC_INPUT, 1, /mob/living/carbon/human) if(!istype(H)) //Invalid input return - if(H in view(get_turf(H))) // Like medbot's analyzer it can be used in range.. + if(H in view(get_turf(src))) // Like medbot's analyzer it can be used in range.. var/total_health = round(H.health/H.getMaxHealth(), 0.01)*100 var/missing_health = H.getMaxHealth() - H.health @@ -143,6 +143,49 @@ push_data() activate_pin(2) +/obj/item/integrated_circuit/input/slime_scanner + name = "slime_scanner" + desc = "A very small version of the xenobio analyser. This allows the machine to know every needed properties of slime." + icon_state = "medscan_adv" + complexity = 12 + inputs = list("\ target") + outputs = list( + "colour" = IC_PINTYPE_STRING, + "adult" = IC_PINTYPE_BOOLEAN, + "nutrition" = IC_PINTYPE_NUMBER, + "charge" = IC_PINTYPE_NUMBER, + "health" = IC_PINTYPE_NUMBER, + "possible mutation" = IC_PINTYPE_LIST, + "genetic destability"= IC_PINTYPE_NUMBER, + "slime core amount" = IC_PINTYPE_NUMBER, + "Growth progress" = IC_PINTYPE_NUMBER, + ) + activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT) + spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 80 + +/obj/item/integrated_circuit/input/slime_scanner/do_work() + var/mob/living/simple_animal/slime/T = get_pin_data_as_type(IC_INPUT, 1, /mob/living/simple_animal/slime) + if(!isslime(T)) //Invalid input + return + if(T in view(get_turf(src))) // Like medbot's analyzer it can be used in range.. + + set_pin_data(IC_OUTPUT, 1, T.colour) + set_pin_data(IC_OUTPUT, 2, T.is_adult) + set_pin_data(IC_OUTPUT, 3, T.nutrition/T.get_max_nutrition()) + set_pin_data(IC_OUTPUT, 4, T.powerlevel) + set_pin_data(IC_OUTPUT, 5, round(T.health/T.maxHealth,0.01)*100) + set_pin_data(IC_OUTPUT, 6, uniqueList(T.slime_mutation)) + set_pin_data(IC_OUTPUT, 7, T.mutation_chance) + set_pin_data(IC_OUTPUT, 8, T.cores) + set_pin_data(IC_OUTPUT, 9, T.amount_grown/SLIME_EVOLUTION_THRESHOLD) + + + push_data() + activate_pin(2) + + + /obj/item/integrated_circuit/input/plant_scanner name = "integrated plant analyzer" desc = "A very small version of the plant analyser. This allows the machine to know all valuable params of plants in trays. \ @@ -180,7 +223,7 @@ return for(var/i=1, i<=outputs.len, i++) set_pin_data(IC_OUTPUT, i, null) - if(H in view(get_turf(H))) // Like medbot's analyzer it can be used in range.. + if(H in view(get_turf(src))) // Like medbot's analyzer it can be used in range.. if(H.myseed) set_pin_data(IC_OUTPUT, 1, H.myseed.plantname) set_pin_data(IC_OUTPUT, 2, H.age) @@ -228,7 +271,7 @@ return for(var/i=1, i<=outputs.len, i++) set_pin_data(IC_OUTPUT, i, null) - if(H in view(get_turf(H))) // Like medbot's analyzer it can be used in range.. + if(H in view(get_turf(src))) // Like medbot's analyzer it can be used in range.. if(H.myseed) for(var/datum/plant_gene/reagent/G in H.myseed.genes) greagents.Add(G.get_name()) @@ -671,12 +714,15 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH power_draw_per_use = 120 -/obj/item/integrated_circuit/input/sensor/proc/scan(var/atom/A) +/obj/item/integrated_circuit/input/sensor/sense(var/atom/A,mob/user,prox) + if(!prox) + return FALSE + if(!check_then_do_work()) + return FALSE var/ignore_bags = get_pin_data(IC_INPUT, 1) if(ignore_bags) if(istype(A, /obj/item/storage)) return FALSE - set_pin_data(IC_OUTPUT, 1, WEAKREF(A)) push_data() activate_pin(1) @@ -694,6 +740,52 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH power_draw_per_use = 120 +/obj/item/integrated_circuit/input/sensor/ranged/sense(var/atom/A,mob/user) + if(!user) + return FALSE + if(user.client) + if(!(A in view(user.client))) + return FALSE + else + if(!(A in view(user))) + return FALSE + if(!check_then_do_work()) + return FALSE + var/ignore_bags = get_pin_data(IC_INPUT, 1) + if(ignore_bags) + if(istype(A, /obj/item/storage)) + return FALSE + set_pin_data(IC_OUTPUT, 1, WEAKREF(A)) + push_data() + activate_pin(1) + return TRUE + +/obj/item/integrated_circuit/input/objscaner + name = "scaner" + desc = "Scans and obtains a reference for any objects you use on assembly." + extended_desc = "If 'put down' pin is set to true, assembly will take scanned object from your hands to it's location.\ + useful for interaction with grabber. Scaner works only with help intent." + icon_state = "recorder" + complexity = 4 + inputs = list("put down" = IC_PINTYPE_BOOLEAN) + outputs = list("scanned" = IC_PINTYPE_REF) + activators = list("on scanned" = IC_PINTYPE_PULSE_OUT) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 20 + +/obj/item/integrated_circuit/input/objscaner/attackby_react(var/atom/A,var/mob/user,intent) + if(intent!=INTENT_HELP) + return FALSE + if(!check_then_do_work()) + return FALSE + var/pu = get_pin_data(IC_INPUT, 1) + if(pu) + user.transferItemToLoc(A,drop_location()) + set_pin_data(IC_OUTPUT, 1, WEAKREF(A)) + push_data() + activate_pin(1) + return TRUE + /obj/item/integrated_circuit/input/internalbm name = "internal battery monitor" desc = "This monitors the charge level of an internal battery." @@ -760,3 +852,38 @@ activate_pin(2) push_data() return + +/obj/item/integrated_circuit/input/ntnetsc + name = "NTnet scaner" + desc = "This can return NTnet id of component insi given object, if there is any." + icon_state = "signalsc" + w_class = WEIGHT_CLASS_TINY + complexity = 2 + inputs = list("target" = IC_PINTYPE_REF) + outputs = list( + "id" = IC_PINTYPE_STRING + ) + activators = list("read" = IC_PINTYPE_PULSE_IN, "found" = IC_PINTYPE_PULSE_OUT,"not found" = IC_PINTYPE_PULSE_OUT) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 1 + +/obj/item/integrated_circuit/input/ntnetsc/do_work() + + var/atom/AM = get_pin_data_as_type(IC_INPUT, 1, /atom) + var/list/processing_list = list(AM) + var/datum/component/ntnet_interface/net = null + set_pin_data(IC_OUTPUT, 1, null) + while(processing_list.len && !net) + var/atom/A = processing_list[1] + processing_list.Cut(1, 2) + //Byond does not allow things to be in multiple contents, or double parent-child hierarchies, so only += is needed + //This is also why we don't need to check against assembled as we go along + processing_list += A.contents + net = A.GetComponent(/datum/component/ntnet_interface) + if(net) + set_pin_data(IC_OUTPUT, 1, net.hardware_id) + activate_pin(2) + else + activate_pin(3) + push_data() + return diff --git a/code/modules/integrated_electronics/subtypes/logic.dm b/code/modules/integrated_electronics/subtypes/logic.dm index 627301ef10..f8e858ef94 100644 --- a/code/modules/integrated_electronics/subtypes/logic.dm +++ b/code/modules/integrated_electronics/subtypes/logic.dm @@ -2,7 +2,7 @@ name = "logic gate" desc = "This tiny chip will decide for you!" extended_desc = "Logic circuits will treat a null, 0, and a \"\" string value as FALSE and anything else as TRUE." - complexity = 3 + complexity = 1 outputs = list("result") activators = list("compare" = IC_PINTYPE_PULSE_IN) category_text = "Logic" diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index f32f414fbb..5099547197 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -155,9 +155,11 @@ if(isnum(wanted_dir.data)) if(step(assembly, wanted_dir.data)) activate_pin(2) + return else activate_pin(3) return FALSE + return FALSE /obj/item/integrated_circuit/manipulation/grenade name = "grenade primer" @@ -247,9 +249,14 @@ /obj/item/integrated_circuit/manipulation/plant_module/do_work() ..() var/turf/T = get_turf(src) - var/obj/machinery/hydroponics/AM = get_pin_data_as_type(IC_INPUT, 1, /obj/machinery/hydroponics) - if(!istype(AM)) //Invalid input + var/obj/OM = get_pin_data_as_type(IC_INPUT, 1, /obj) + if(istype(OM,/obj/structure/spacevine) && get_pin_data(IC_INPUT, 2) == 2) + qdel(OM) + activate_pin(2) return + var/obj/machinery/hydroponics/AM = OM + if(!istype(AM)) //Invalid input + return FALSE var/mob/living/M = get_turf(AM) if(!M.Adjacent(T)) return //Can't reach @@ -276,6 +283,7 @@ qdel(AM.myseed) AM.myseed = null AM.weedlevel = 0 //Has a side effect of cleaning up those nasty weeds + AM.dead = 0 AM.update_icon() else activate_pin(2) @@ -284,7 +292,7 @@ /obj/item/integrated_circuit/manipulation/grabber name = "grabber" - desc = "A circuit with it's own inventory for small/medium items, used to grab and store things." + desc = "A circuit with it's own inventory for tiny/small items, used to grab and store things." icon_state = "grabber" extended_desc = "The circuit accepts a reference to thing to be grabbed. It can store up to 10 things. Modes: 1 for grab. 0 for eject the first thing. -1 for eject all." w_class = WEIGHT_CLASS_SMALL @@ -307,7 +315,7 @@ var/mode = get_pin_data(IC_INPUT, 2) if(mode == 1) - if(check_target(AM, exclude_contents = TRUE)) + if(check_target(AM)) if((contents.len < max_items) && (!max_w_class || AM.w_class <= max_w_class)) AM.forceMove(src) if(mode == 0) diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 33f92c3646..6f527c8149 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -9,6 +9,11 @@ . = ..() if(volume) create_reagents(volume) + push_vol() + +/obj/item/integrated_circuit/reagent/proc/push_vol() + set_pin_data(IC_OUTPUT, 1, reagents.total_volume) + push_data() /obj/item/integrated_circuit/reagent/smoke name = "smoke generator" @@ -29,7 +34,8 @@ ) activators = list( "create smoke" = IC_PINTYPE_PULSE_IN, - "on smoked" = IC_PINTYPE_PULSE_OUT + "on smoked" = IC_PINTYPE_PULSE_OUT, + "push ref" = IC_PINTYPE_PULSE_IN ) spawn_flags = IC_SPAWN_RESEARCH power_draw_per_use = 20 @@ -40,24 +46,27 @@ //reset warning only if we have reagents now if(changetype == ADD_REAGENT) notified = FALSE - set_pin_data(IC_OUTPUT, 1, reagents.total_volume) - push_data() + push_vol() -/obj/item/integrated_circuit/reagent/smoke/do_work() - if(!reagents || (reagents.total_volume < IC_SMOKE_REAGENTS_MINIMUM_UNITS)) - return - var/location = get_turf(src) - var/datum/effect_system/smoke_spread/chem/S = new - S.attach(location) - playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - if(S) - S.set_up(reagents, smoke_radius, location, notified) - if(!notified) - notified = TRUE - S.start() - - reagents.clear_reagents() - activate_pin(2) +/obj/item/integrated_circuit/reagent/smoke/do_work(ord) + switch(ord) + if(1) + if(!reagents || (reagents.total_volume < IC_SMOKE_REAGENTS_MINIMUM_UNITS)) + return + var/location = get_turf(src) + var/datum/effect_system/smoke_spread/chem/S = new + S.attach(location) + playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) + if(S) + S.set_up(reagents, smoke_radius, location, notified) + if(!notified) + notified = TRUE + S.start() + reagents.clear_reagents() + activate_pin(2) + if(3) + set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) + push_data() /obj/item/integrated_circuit/reagent/injector name = "integrated hypo-injector" @@ -85,7 +94,9 @@ activators = list( "inject" = IC_PINTYPE_PULSE_IN, "on injected" = IC_PINTYPE_PULSE_OUT, - "on fail" = IC_PINTYPE_PULSE_OUT + "on fail" = IC_PINTYPE_PULSE_OUT, + "push ref" = IC_PINTYPE_PULSE_IN + ) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH power_draw_per_use = 15 @@ -93,15 +104,8 @@ var/transfer_amount = 10 var/busy = FALSE -/obj/item/integrated_circuit/reagent/injector/interact(mob/user) - set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) - push_data() - ..() - - /obj/item/integrated_circuit/reagent/injector/on_reagent_change(changetype) - set_pin_data(IC_OUTPUT, 1, reagents.total_volume) - push_data() + push_vol() /obj/item/integrated_circuit/reagent/injector/on_data_written() var/new_amount = get_pin_data(IC_INPUT, 2) @@ -127,7 +131,15 @@ temp_reagents.clear_reagents() qdel(temp_reagents) -/obj/item/integrated_circuit/reagent/injector/do_work() +/obj/item/integrated_circuit/reagent/injector/do_work(ord) + switch(ord) + if(1) + inject() + if(4) + set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) + push_data() + +/obj/item/integrated_circuit/reagent/injector/proc/inject() set waitfor = FALSE // Don't sleep in a proc that is called by a processor without this set, otherwise it'll delay the entire thing var/atom/movable/AM = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) var/atom/movable/acting_object = get_object() @@ -281,17 +293,20 @@ "volume used" = IC_PINTYPE_NUMBER, "self reference" = IC_PINTYPE_REF ) - activators = list() + activators = list("push ref" = IC_PINTYPE_PULSE_OUT) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH +<<<<<<< HEAD /obj/item/integrated_circuit/reagent/storage/interact(mob/user) +======= + +/obj/item/integrated_circuit/reagent/storage/do_work() +>>>>>>> 95b9e19... [READY]Circuitry upgrades (#33579) set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) push_data() - ..() /obj/item/integrated_circuit/reagent/storage/on_reagent_change(changetype) - set_pin_data(IC_OUTPUT, 1, reagents.total_volume) - push_data() + push_vol() /obj/item/integrated_circuit/reagent/storage/cryo name = "cryo reagent storage" @@ -306,6 +321,7 @@ . = ..() reagents.set_reacting(FALSE) + /obj/item/integrated_circuit/reagent/storage/big name = "big reagent storage" desc = "Stores liquid inside, and away from electrical components. Can store up to 180u." @@ -317,6 +333,99 @@ complexity = 16 spawn_flags = IC_SPAWN_RESEARCH +/obj/item/integrated_circuit/reagent/storage/grinder + name = "reagent grinder" + desc = "This is reagent grinder.It accepts ref to something and refines it into reagents. Can store up to 100u." + icon_state = "blender" + extended_desc = "" + inputs = list( + "target" = IC_PINTYPE_REF, + ) + outputs = list( + "volume used" = IC_PINTYPE_NUMBER, + "self reference" = IC_PINTYPE_REF + ) + activators = list( + "grind" = IC_PINTYPE_PULSE_IN, + "on grind" = IC_PINTYPE_PULSE_OUT, + "on fail" = IC_PINTYPE_PULSE_OUT, + "push ref" = IC_PINTYPE_PULSE_IN + ) + volume = 100 + power_draw_per_use = 150 + complexity = 16 + spawn_flags = IC_SPAWN_RESEARCH + + +/obj/item/integrated_circuit/reagent/storage/grinder/do_work(ord) + switch(ord) + if(1) + grind() + if(4) + set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) + push_data() + +/obj/item/integrated_circuit/reagent/storage/grinder/proc/grind() + if(reagents.total_volume >= reagents.maximum_volume) + activate_pin(3) + return FALSE + var/obj/item/I = get_pin_data_as_type(IC_INPUT, 1, /obj/item) + if(istype(I)&&(I.grind_results)&&check_target(I)&&(I.on_grind(src) != -1)) + reagents.add_reagent_list(I.grind_results) + if(I.reagents) + I.reagents.trans_to(src, I.reagents.total_volume) + qdel(I) + activate_pin(2) + return TRUE + activate_pin(3) + return FALSE + +obj/item/integrated_circuit/reagent/storage/juicer + name = "reagent juicer" + desc = "This is reagent juicer.It accepts ref to something and refines it into reagents. Can store up to 100u." + icon_state = "blender" + extended_desc = "" + inputs = list( + "target" = IC_PINTYPE_REF, + ) + outputs = list( + "volume used" = IC_PINTYPE_NUMBER, + "self reference" = IC_PINTYPE_REF + ) + activators = list( + "juice" = IC_PINTYPE_PULSE_IN, + "on juice" = IC_PINTYPE_PULSE_OUT, + "on fail" = IC_PINTYPE_PULSE_OUT, + "push ref" = IC_PINTYPE_PULSE_IN + ) + volume = 100 + power_draw_per_use = 150 + complexity = 16 + spawn_flags = IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/reagent/storage/juicer/do_work(ord) + switch(ord) + if(1) + juice() + if(4) + set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) + push_data() + +/obj/item/integrated_circuit/reagent/storage/juicer/proc/juice() + if(reagents.total_volume >= reagents.maximum_volume) + activate_pin(3) + return FALSE + var/obj/item/I = get_pin_data_as_type(IC_INPUT, 1, /obj/item) + if(istype(I)&&check_target(I)&&(I.juice_results)&&(I.on_juice() != -1)) + reagents.add_reagent_list(I.juice_results) + qdel(I) + activate_pin(2) + return TRUE + activate_pin(3) + return FALSE + + + /obj/item/integrated_circuit/reagent/storage/scan name = "reagent scanner" desc = "Stores liquid inside, and away from electrical components. Can store up to 60u. On pulse this beaker will send list of contained reagents." @@ -330,17 +439,22 @@ "list of reagents" = IC_PINTYPE_LIST ) activators = list( - "scan" = IC_PINTYPE_PULSE_IN + "scan" = IC_PINTYPE_PULSE_IN, + "push ref" = IC_PINTYPE_PULSE_IN ) spawn_flags = IC_SPAWN_RESEARCH -/obj/item/integrated_circuit/reagent/storage/scan/do_work() - var/cont[0] - for(var/datum/reagent/RE in reagents.reagent_list) - cont += RE.id - set_pin_data(IC_OUTPUT, 3, cont) - push_data() - +/obj/item/integrated_circuit/reagent/storage/scan/do_work(ord) + switch(ord) + if(1) + var/cont[0] + for(var/datum/reagent/RE in reagents.reagent_list) + cont += RE.id + set_pin_data(IC_OUTPUT, 3, cont) + push_data() + if(2) + set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) + push_data() /obj/item/integrated_circuit/reagent/filter name = "reagent filter" @@ -394,7 +508,8 @@ if(!source.reagents || !target.reagents) return - if(!source.is_drainable() || !target.is_refillable()) + // FALSE in those procs makes mobs invalid targets. + if(!source.is_drawable(FALSE) || !target.is_injectable(FALSE)) return if(target.reagents.maximum_volume - target.reagents.total_volume <= 0) @@ -410,3 +525,45 @@ activate_pin(2) push_data() +/obj/item/integrated_circuit/reagent/storage/heater + name = "chemical heater" + desc = "Stores liquid inside, and away from electrical components. Can store up to 60u. Will heat or freeze reagents \ + to target temperature, when turned on." + icon_state = "heater" + container_type = OPENCONTAINER + complexity = 8 + inputs = list( + "target temperature" = IC_PINTYPE_NUMBER, + "on" = IC_PINTYPE_BOOLEAN + ) + inputs_default = list("1" = 300) + outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_REF,"temperature" = IC_PINTYPE_NUMBER) + spawn_flags = IC_SPAWN_RESEARCH + var/heater_coefficient = 0.1 + +/obj/item/integrated_circuit/reagent/storage/heater/on_data_written() + if(get_pin_data(IC_INPUT, 2)) + power_draw_idle = 30 + else + power_draw_idle = 0 + +/obj/item/integrated_circuit/reagent/storage/heater/Initialize() + .=..() + START_PROCESSING(SScircuit, src) + +/obj/item/integrated_circuit/reagent/storage/heater/Destroy() + STOP_PROCESSING(SScircuit, src) + return ..() + +/obj/item/integrated_circuit/reagent/storage/heater/process() + if(power_draw_idle) + var/target_temperature = get_pin_data(IC_INPUT, 1) + if(reagents.chem_temp > target_temperature) + reagents.chem_temp += min(-1, (target_temperature - reagents.chem_temp) * heater_coefficient) + if(reagents.chem_temp < target_temperature) + reagents.chem_temp += max(1, (target_temperature - reagents.chem_temp) * heater_coefficient) + + reagents.chem_temp = round(reagents.chem_temp) + reagents.handle_reactions() + set_pin_data(IC_OUTPUT, 3, reagents.chem_temp) + push_data() diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm index ec59c3cab1..37a38677b0 100644 --- a/code/modules/integrated_electronics/subtypes/smart.dm +++ b/code/modules/integrated_electronics/subtypes/smart.dm @@ -27,6 +27,6 @@ push_data() return // Can't see the target. - set_pin_data(IC_OUTPUT, 1, get_dir(get_turf(src), get_turf(A))) + set_pin_data(IC_OUTPUT, 1, get_dir(get_turf(src), get_step_towards2(get_turf(src),A))) push_data() activate_pin(2) diff --git a/icons/obj/assemblies/electronic_components.dmi b/icons/obj/assemblies/electronic_components.dmi index 1852079e7392745c0a3911bf1ea557f74b052e0d..a9dac06d6b8bcc864bce0ca0194ba949b0856b4d 100644 GIT binary patch literal 22954 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 Date: Sun, 24 Dec 2017 16:52:16 -0600 Subject: [PATCH 72/86] Automatic changelog generation for PR #4505 [ci skip] --- html/changelogs/AutoChangeLog-pr-4505.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4505.yml diff --git a/html/changelogs/AutoChangeLog-pr-4505.yml b/html/changelogs/AutoChangeLog-pr-4505.yml new file mode 100644 index 0000000000..baf8daa374 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4505.yml @@ -0,0 +1,6 @@ +author: "coiax" +delete-after: True +changes: + - balance: "The kitchen gibber must be anchored in order to use." + - balance: "The gibber requires bodies to have no external items or +equipment." From 848006fefde1d0219fbbd0e57861a7e78a8fb384 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Dec 2017 16:52:35 -0600 Subject: [PATCH 73/86] Automatic changelog generation for PR #4506 [ci skip] --- html/changelogs/AutoChangeLog-pr-4506.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4506.yml diff --git a/html/changelogs/AutoChangeLog-pr-4506.yml b/html/changelogs/AutoChangeLog-pr-4506.yml new file mode 100644 index 0000000000..0b2d10fffe --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4506.yml @@ -0,0 +1,4 @@ +author: "Dax Dupont" +delete-after: True +changes: + - bugfix: "Borgs will no longer have their metal/glass/etc stacks commit sudoku when it runs out of metal. They will also show the correct amount instead of a constant of \"1\" on menu interaction." From 568ecf9160fef5e08e0e3b1d08dba4efe9a04879 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Dec 2017 16:52:48 -0600 Subject: [PATCH 74/86] Automatic changelog generation for PR #4507 [ci skip] --- html/changelogs/AutoChangeLog-pr-4507.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4507.yml diff --git a/html/changelogs/AutoChangeLog-pr-4507.yml b/html/changelogs/AutoChangeLog-pr-4507.yml new file mode 100644 index 0000000000..3076537362 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4507.yml @@ -0,0 +1,4 @@ +author: "Kor" +delete-after: True +changes: + - rscadd: "During Christmas you will be able to click on the tree in the Chapel to receive one present per round. That present can contain any item in the game." From b6f4a63ec81b91af7e756594e099fdffdd46d565 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Dec 2017 16:53:17 -0600 Subject: [PATCH 75/86] Automatic changelog generation for PR #4509 [ci skip] --- html/changelogs/AutoChangeLog-pr-4509.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4509.yml diff --git a/html/changelogs/AutoChangeLog-pr-4509.yml b/html/changelogs/AutoChangeLog-pr-4509.yml new file mode 100644 index 0000000000..0be18e6c47 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4509.yml @@ -0,0 +1,4 @@ +author: "Robustin" +delete-after: True +changes: + - tweak: "The EMP door shocking effect has a new formula. Heavy EMP's will no longer shock doors while light EMP's have a 10% chance (down from 13.33%)." From 5bf490ae1d2be4883f62e44897d51760b64abf9c Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Dec 2017 17:00:20 -0600 Subject: [PATCH 76/86] Automatic changelog generation for PR #4516 [ci skip] --- html/changelogs/AutoChangeLog-pr-4516.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4516.yml diff --git a/html/changelogs/AutoChangeLog-pr-4516.yml b/html/changelogs/AutoChangeLog-pr-4516.yml new file mode 100644 index 0000000000..66e1e9c6f3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4516.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "\"Download N research nodes\" objective is now checked correctly again." From dacf4b7b795e9fcb30d0d422c40850dd768b01af Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Dec 2017 17:00:53 -0600 Subject: [PATCH 77/86] Automatic changelog generation for PR #4519 [ci skip] --- html/changelogs/AutoChangeLog-pr-4519.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4519.yml diff --git a/html/changelogs/AutoChangeLog-pr-4519.yml b/html/changelogs/AutoChangeLog-pr-4519.yml new file mode 100644 index 0000000000..aa0bf5a78d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4519.yml @@ -0,0 +1,4 @@ +author: "Frozenguy5" +delete-after: True +changes: + - bugfix: "Soapstones now give the correct time they were placed down." From dab03cf25f06a6385f15ba0f671dc5d7d617b400 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Dec 2017 17:01:06 -0600 Subject: [PATCH 78/86] Automatic changelog generation for PR #4521 [ci skip] --- html/changelogs/AutoChangeLog-pr-4521.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4521.yml diff --git a/html/changelogs/AutoChangeLog-pr-4521.yml b/html/changelogs/AutoChangeLog-pr-4521.yml new file mode 100644 index 0000000000..2b5553d55f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4521.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - tweak: "Vending machines now use TGUI" From 6dc2d8f0eb3598a52c20216bdb6774cda42ab497 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 24 Dec 2017 18:02:13 -0500 Subject: [PATCH 79/86] Update reagents.dm --- code/modules/integrated_electronics/subtypes/reagents.dm | 5 ----- 1 file changed, 5 deletions(-) diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 6f527c8149..0c66c3a943 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -296,12 +296,7 @@ activators = list("push ref" = IC_PINTYPE_PULSE_OUT) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH -<<<<<<< HEAD -/obj/item/integrated_circuit/reagent/storage/interact(mob/user) -======= - /obj/item/integrated_circuit/reagent/storage/do_work() ->>>>>>> 95b9e19... [READY]Circuitry upgrades (#33579) set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) push_data() From 2609dc109f542f45db9f0fcce8a24d573474bd4b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Dec 2017 22:10:17 -0600 Subject: [PATCH 80/86] Automatic changelog generation for PR #4440 [ci skip] --- html/changelogs/AutoChangeLog-pr-4440.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4440.yml diff --git a/html/changelogs/AutoChangeLog-pr-4440.yml b/html/changelogs/AutoChangeLog-pr-4440.yml new file mode 100644 index 0000000000..9d14363c8a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4440.yml @@ -0,0 +1,4 @@ +author: "ninjanomnom" +delete-after: True +changes: + - bugfix: "Non movement keys pressed while moving no longer stop movement." From 7b40f3f0e0821e5cb3cd228189c57c5199e09ed3 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 25 Dec 2017 05:09:21 -0600 Subject: [PATCH 81/86] Update disease_outbreak.dm --- code/modules/events/disease_outbreak.dm | 35 ++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index beb3fb476f..f33d8ec87a 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -13,7 +13,7 @@ var/max_severity = 3 -/datum/round_event/disease_outbreak/announce() +/datum/round_event/disease_outbreak/announce(fake) priority_announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/ai/outbreak7.ogg') /datum/round_event/disease_outbreak/setup() @@ -33,7 +33,7 @@ var/turf/T = get_turf(H) if(!T) continue - if(T.z != ZLEVEL_STATION_PRIMARY) + if(!(T.z in GLOB.station_z_levels)) continue if(!H.client) continue @@ -51,7 +51,7 @@ var/datum/disease/D if(!advanced_virus) if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work. - if(!H.dna || (H.has_disability(BLIND))) //A blindness disease would be the worst. + if(!H.dna || (H.has_disability(DISABILITY_BLIND))) //A blindness disease would be the worst. continue D = new virus_type() var/datum/disease/dnaspread/DS = D @@ -64,4 +64,33 @@ D = make_virus(max_severity, max_severity) D.carrier = TRUE H.AddDisease(D) + + if(advanced_virus) + var/datum/disease/advance/A = D + var/list/name_symptoms = list() //for feedback + for(var/datum/symptom/S in A.symptoms) + name_symptoms += S.name + message_admins("An event has triggered a random advanced virus outbreak on [key_name_admin(H)]! It has these symptoms: [english_list(name_symptoms)]") + log_game("An event has triggered a random advanced virus outbreak on [key_name(H)]! It has these symptoms: [english_list(name_symptoms)]") break + +/datum/round_event/disease_outbreak/proc/make_virus(max_symptoms, max_level) + if(max_symptoms > SYMPTOM_LIMIT) + max_symptoms = SYMPTOM_LIMIT + var/datum/disease/advance/A = new(FALSE, null) + A.symptoms = list() + var/list/datum/symptom/possible_symptoms = list() + for(var/symptom in subtypesof(/datum/symptom)) + var/datum/symptom/S = symptom + if(initial(S.level) > max_level) + continue + if(initial(S.level) <= 0) //unobtainable symptoms + continue + possible_symptoms += S + for(var/i in 1 to max_symptoms) + var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms) + if(chosen_symptom) + var/datum/symptom/S = new chosen_symptom + A.symptoms += S + A.Refresh() //just in case someone already made and named the same disease + return A From 62a9649a989075aa45e2bcfb3b95d19a7da003ed Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 25 Dec 2017 05:23:37 -0600 Subject: [PATCH 82/86] Update disease_outbreak.dm --- code/modules/events/disease_outbreak.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index f33d8ec87a..5c28632c89 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -51,7 +51,7 @@ var/datum/disease/D if(!advanced_virus) if(virus_type == /datum/disease/dnaspread) //Dnaspread needs strain_data set to work. - if(!H.dna || (H.has_disability(DISABILITY_BLIND))) //A blindness disease would be the worst. + if(!H.dna || (H.has_disability(BLIND))) //A blindness disease would be the worst. continue D = new virus_type() var/datum/disease/dnaspread/DS = D From 8ed083837770a8bd5803bac0baeb66f781d828e7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 25 Dec 2017 21:26:20 -0600 Subject: [PATCH 83/86] Automatic changelog generation for PR #4494 [ci skip] --- html/changelogs/AutoChangeLog-pr-4494.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4494.yml diff --git a/html/changelogs/AutoChangeLog-pr-4494.yml b/html/changelogs/AutoChangeLog-pr-4494.yml new file mode 100644 index 0000000000..d873e211a5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4494.yml @@ -0,0 +1,6 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Projectiles that pierce objects will no longer be thrown off course when doing so!" + - code_imp: "Projectiles now use /datum/point/vectors for trajectory calculations." + - bugfix: "Beam rifle reflections will no longer glitch out." From b4763cb2bea2902c9885f7bbb186b08807ba485d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 25 Dec 2017 21:26:36 -0600 Subject: [PATCH 84/86] Automatic changelog generation for PR #4497 [ci skip] --- html/changelogs/AutoChangeLog-pr-4497.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4497.yml diff --git a/html/changelogs/AutoChangeLog-pr-4497.yml b/html/changelogs/AutoChangeLog-pr-4497.yml new file mode 100644 index 0000000000..05673f222c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4497.yml @@ -0,0 +1,4 @@ +author: "WJohnston" +delete-after: True +changes: + - tweak: "Syndicate nuke op infiltrator shuttle is no longer lopsided." From fcf707ad66317227c2675a8668b385185091b4ed Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 25 Dec 2017 21:27:20 -0600 Subject: [PATCH 85/86] Automatic changelog generation for PR #4482 [ci skip] --- html/changelogs/AutoChangeLog-pr-4482.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4482.yml diff --git a/html/changelogs/AutoChangeLog-pr-4482.yml b/html/changelogs/AutoChangeLog-pr-4482.yml new file mode 100644 index 0000000000..210ad03b5b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4482.yml @@ -0,0 +1,5 @@ +author: "Xhuis" +delete-after: True +changes: + - balance: "Floors blessed with holy water prevent servants from warping in and the Eminence from crossing them." + - balance: "The Eminence can never enter the Chapel." From adfb04fa6d65e067c5fcd5bba8b497b2c643a83a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Mon, 25 Dec 2017 21:27:42 -0600 Subject: [PATCH 86/86] Automatic changelog generation for PR #4492 [ci skip] --- html/changelogs/AutoChangeLog-pr-4492.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4492.yml diff --git a/html/changelogs/AutoChangeLog-pr-4492.yml b/html/changelogs/AutoChangeLog-pr-4492.yml new file mode 100644 index 0000000000..3b8e0de7e3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4492.yml @@ -0,0 +1,4 @@ +author: "Awesine" +delete-after: True +changes: + - rscadd: "added some things which happen to be mining scanner things to that gulag thing"