diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index 69e618282e..a43e6129b7 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -167,7 +167,7 @@ /obj/item/book/manual/wiki/barman_recipes, /obj/item/book/granter/action/drink_fling, /obj/item/reagent_containers/food/drinks/shaker, -/obj/item/reagent_containers/glass/rag, +/obj/item/reagent_containers/rag, /turf/open/floor/wood, /area/ruin/powered/beach) "aI" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm index a22d1a21e7..60ae409ea2 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm @@ -161,7 +161,7 @@ /turf/open/floor/plasteel/white, /area/ruin/powered/animal_hospital) "av" = ( -/obj/item/reagent_containers/glass/rag, +/obj/item/reagent_containers/rag, /obj/item/reagent_containers/spray/cleaner, /obj/effect/turf_decal/tile/blue{ dir = 1 diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index b330592a8e..8e0d9a523a 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -4728,7 +4728,7 @@ /area/ruin/unpowered/syndicate_lava_base/bar) "lz" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/glass/rag{ +/obj/item/reagent_containers/rag{ pixel_x = -4; pixel_y = 9 }, diff --git a/_maps/RandomRuins/SpaceRuins/bus.dmm b/_maps/RandomRuins/SpaceRuins/bus.dmm index fe624c19bf..c731bcac5e 100644 --- a/_maps/RandomRuins/SpaceRuins/bus.dmm +++ b/_maps/RandomRuins/SpaceRuins/bus.dmm @@ -260,7 +260,7 @@ /turf/open/floor/plating/asteroid/airless, /area/ruin/unpowered/no_grav) "aQ" = ( -/obj/item/reagent_containers/glass/rag, +/obj/item/reagent_containers/rag, /turf/open/floor/plating/asteroid/airless, /area/ruin/unpowered/no_grav) "aR" = ( diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm index c64a73eada..69b56946f2 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm @@ -2010,7 +2010,7 @@ /area/ruin/space/has_grav/hotel/bar) "gd" = ( /obj/structure/table/reinforced, -/obj/item/reagent_containers/glass/rag, +/obj/item/reagent_containers/rag, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 diff --git a/_maps/RandomZLevels/VR/syndicate_trainer.dmm b/_maps/RandomZLevels/VR/syndicate_trainer.dmm index f68a799b76..a8c316d770 100644 --- a/_maps/RandomZLevels/VR/syndicate_trainer.dmm +++ b/_maps/RandomZLevels/VR/syndicate_trainer.dmm @@ -1973,7 +1973,7 @@ /turf/open/indestructible, /area/awaymission/centcomAway/thunderdome) "lB" = ( -/obj/item/reagent_containers/glass/rag, +/obj/item/reagent_containers/rag, /turf/open/indestructible, /area/awaymission/centcomAway/general) "lD" = ( diff --git a/_maps/RandomZLevels/beach.dmm b/_maps/RandomZLevels/beach.dmm index dddeadb0be..7aab25e400 100644 --- a/_maps/RandomZLevels/beach.dmm +++ b/_maps/RandomZLevels/beach.dmm @@ -150,7 +150,7 @@ /area/awaymission/beach) "aB" = ( /obj/structure/table, -/obj/item/reagent_containers/glass/rag, +/obj/item/reagent_containers/rag, /turf/open/floor/wood, /area/awaymission/beach) "aC" = ( diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index 61c606dcde..7edc7b4518 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -5383,7 +5383,7 @@ "kn" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, -/obj/item/reagent_containers/glass/rag{ +/obj/item/reagent_containers/rag{ pixel_y = 5 }, /obj/machinery/door/poddoor/shutters{ diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm index 39f7d99173..f6d46ef97d 100644 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/undergroundoutpost45.dmm @@ -3601,7 +3601,7 @@ "hn" = ( /obj/structure/table, /obj/item/stack/packageWrap, -/obj/item/reagent_containers/glass/rag, +/obj/item/reagent_containers/rag, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 4420059f62..50b5504af5 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -20908,7 +20908,7 @@ pixel_x = 32 }, /obj/item/book/manual/wiki/barman_recipes, -/obj/item/reagent_containers/glass/rag, +/obj/item/reagent_containers/rag, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 @@ -57658,7 +57658,7 @@ /area/ai_monitored/storage/eva) "vjm" = ( /obj/structure/table/wood, -/obj/item/reagent_containers/glass/rag, +/obj/item/reagent_containers/rag, /obj/machinery/light/small{ dir = 1 }, diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index bfc4a60f08..b4aabc3676 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -14482,7 +14482,7 @@ }, /obj/item/book/manual/wiki/barman_recipes, /obj/item/reagent_containers/food/drinks/shaker, -/obj/item/reagent_containers/glass/rag, +/obj/item/reagent_containers/rag, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 4de1657e48..7faca77d70 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -38985,7 +38985,7 @@ pixel_y = 5 }, /obj/item/reagent_containers/food/drinks/shaker, -/obj/item/reagent_containers/glass/rag{ +/obj/item/reagent_containers/rag{ pixel_y = 5 }, /obj/effect/turf_decal/tile/bar, @@ -59281,7 +59281,7 @@ }, /area/maintenance/port/aft) "ckR" = ( -/obj/item/reagent_containers/glass/rag, +/obj/item/reagent_containers/rag, /obj/structure/table/wood, /turf/open/floor/wood{ icon_state = "wood-broken4" diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index cef0aefc50..0c55f05fcb 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -13484,7 +13484,7 @@ /obj/structure/table/wood, /obj/item/book/manual/wiki/barman_recipes, /obj/item/reagent_containers/food/drinks/shaker, -/obj/item/reagent_containers/glass/rag, +/obj/item/reagent_containers/rag, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/tile/neutral{ dir = 1 diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index e03ba4fcd2..0166dd6a84 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -21118,7 +21118,7 @@ "aYf" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/barman_recipes, -/obj/item/reagent_containers/glass/rag, +/obj/item/reagent_containers/rag, /obj/effect/turf_decal/tile/red{ dir = 1 }, diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index d796330cc8..0f8e832d63 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -3730,6 +3730,13 @@ }, /turf/open/floor/plasteel, /area/centcom/control) +"jA" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/item/soap/syndie, +/turf/open/floor/plasteel/freezer, +/area/syndicate_mothership) "jB" = ( /obj/structure/noticeboard{ dir = 8; @@ -4215,6 +4222,14 @@ "ku" = ( /turf/closed/indestructible/fakeglass, /area/syndicate_mothership) +"kv" = ( +/obj/structure/mirror{ + pixel_x = -28 + }, +/obj/structure/table, +/obj/item/reagent_containers/rag/towel/syndicate, +/turf/open/floor/plasteel/freezer, +/area/syndicate_mothership) "kw" = ( /turf/open/floor/plasteel/yellowsiding, /area/centcom/supply) @@ -8414,10 +8429,6 @@ }, /turf/open/floor/plating, /area/syndicate_mothership) -"tg" = ( -/obj/item/soap/syndie, -/turf/open/floor/plasteel/freezer, -/area/syndicate_mothership) "tl" = ( /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plating, @@ -15122,7 +15133,7 @@ /obj/structure/table/wood, /obj/item/book/manual/wiki/barman_recipes, /obj/item/reagent_containers/food/drinks/shaker, -/obj/item/reagent_containers/glass/rag, +/obj/item/reagent_containers/rag, /obj/machinery/newscaster{ pixel_y = -32 }, @@ -17430,12 +17441,6 @@ }, /turf/open/floor/plasteel/white, /area/centcom/holding) -"Rl" = ( -/obj/structure/mirror{ - pixel_x = -28 - }, -/turf/open/floor/plasteel/freezer, -/area/syndicate_mothership) "Rm" = ( /obj/structure/chair/wood/wings{ dir = 3 @@ -37823,8 +37828,8 @@ nx mA Tz ku -tg -Rl +jA +kv uM QV wp diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index de9c7af221..06c3c352ca 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -3,26 +3,35 @@ #define COLOR_INPUT_DISABLED "#F0F0F0" #define COLOR_INPUT_ENABLED "#D3B5B5" -//#define COLOR_WHITE "#EEEEEE" -//#define COLOR_SILVER "#C0C0C0" -//#define COLOR_GRAY "#808080" +#define COLOR_DARKMODE_INFO_BUTTONS_BG "#40628A" +#define COLOR_DARKMODE_ISSUE_BUTTON_BG "#ce4242" +#define COLOR_DARKMODE_BACKGROUND "#202020" +#define COLOR_DARKMODE_DARKBACKGROUND "#171717" +#define COLOR_DARKMODE_TEXT "#f0f0f0" + +#define COLOR_WHITEMODE_INFO_BUTTONS_BG "#90b3dd" +#define COLOR_WHITEMODE_ISSUE_BUTTON_BG "#ef7f7f" +#define COLOR_WHITEMODE_BACKGROUND "#ffffff" +#define COLOR_WHITEMODE_DARKBACKGROUND "#eeeeee" +#define COLOR_WHITEMODE_TEXT "#000000" + #define COLOR_FLOORTILE_GRAY "#8D8B8B" #define COLOR_ALMOST_BLACK "#333333" -//#define COLOR_BLACK "#000000" +#define COLOR_BLACK "#000000" #define COLOR_RED "#FF0000" -//#define COLOR_RED_LIGHT "#FF3333" -//#define COLOR_MAROON "#800000" +#define COLOR_RED_LIGHT "#FF3333" +#define COLOR_MAROON "#800000" #define COLOR_YELLOW "#FFFF00" -//#define COLOR_OLIVE "#808000" -//#define COLOR_LIME "#32CD32" +#define COLOR_OLIVE "#808000" +#define COLOR_LIME "#32CD32" #define COLOR_GREEN "#008000" #define COLOR_CYAN "#00FFFF" -//#define COLOR_TEAL "#008080" +#define COLOR_TEAL "#008080" #define COLOR_BLUE "#0000FF" -//#define COLOR_BLUE_LIGHT "#33CCFF" -//#define COLOR_NAVY "#000080" +#define COLOR_BLUE_LIGHT "#33CCFF" +#define COLOR_NAVY "#000080" #define COLOR_PINK "#FFC0CB" -//#define COLOR_MAGENTA "#FF00FF" +#define COLOR_MAGENTA "#FF00FF" #define COLOR_PURPLE "#800080" #define COLOR_ORANGE "#FF9900" #define COLOR_BEIGE "#CEB689" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 30a7694e5f..73711fe02d 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -275,10 +275,6 @@ GLOBAL_LIST_INIT(pda_styles, list(MONO, VT, ORBITRON, SHARE)) GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_SKIN_ALT = 'icons/obj/pda_alt.dmi', PDA_SKIN_RUGGED = 'icons/obj/pda_rugged.dmi', PDA_SKIN_MODERN = 'icons/obj/pda_modern.dmi')) -//Color Defines -#define OOC_COLOR "#002eb8" -#define AOOC_COLOR "#b8002e" - ///////////////////////////////////// // atom.appearence_flags shortcuts // ///////////////////////////////////// diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 1c3832001f..5c21fbbc71 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -26,6 +26,7 @@ #define ABSTRACT (1<<8) // for all things that are technically items but used for various different stuff #define IMMUTABLE_SLOW (1<<9) //When players should not be able to change the slowdown of the item (Speed potions, ect) #define SURGICAL_TOOL (1<<10) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes) +#define NO_UNIFORM_REQUIRED (1<<11) // Can be worn on certain slots (currently belt and id) that would otherwise require an uniform. // Flags for the clothing_flags var on /obj/item/clothing @@ -36,4 +37,4 @@ #define NOSLIP (1<<4) //prevents from slipping on wet floors, in space etc #define THICKMATERIAL (1<<5) //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. #define VOICEBOX_TOGGLABLE (1<<6) // The voicebox in this clothing can be toggled. -#define VOICEBOX_DISABLED (1<<7) // The voicebox is currently turned off. \ No newline at end of file +#define VOICEBOX_DISABLED (1<<7) // The voicebox is currently turned off. diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index cdd2e99dd8..55d9e7a6cd 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -281,6 +281,17 @@ var/statspage = CONFIG_GET(string/roundstatsurl) var/info = statspage ? "[GLOB.round_id]" : GLOB.round_id parts += "[GLOB.TAB]Round ID: [info]" + + var/list/voting_results = SSvote.stored_gamemode_votes + + if(length(voting_results)) + parts += "[GLOB.TAB]Voting: " + var/total_score = 0 + for(var/choice in voting_results) + var/score = voting_results[choice] + total_score += score + parts += "[GLOB.TAB][GLOB.TAB][choice]: [score]" + parts += "[GLOB.TAB]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]" parts += "[GLOB.TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[popcount["station_integrity"]]%"]" var/total_players = GLOB.joined_player_list.len diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index ef460cd54c..d92ab17584 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -73,7 +73,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/paper/crumpled = 1, /obj/item/pen = 1, /obj/item/reagent_containers/spray/pestspray = 1, - /obj/item/reagent_containers/glass/rag = 3, + /obj/item/reagent_containers/rag = 3, /obj/item/stock_parts/cell = 3, /obj/item/storage/belt/utility = 2, /obj/item/storage/box = 2, diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 5e960e0f96..4001c666ee 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -437,7 +437,7 @@ SUBSYSTEM_DEF(job) if(job.custom_spawn_text) to_chat(M, "[job.custom_spawn_text]") if(CONFIG_GET(number/minimal_access_threshold)) - to_chat(M, "As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.") + to_chat(M, "As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.") if(job && H) if(job.dresscodecompliant)// CIT CHANGE - dress code compliance diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index df96c44df7..47945e4333 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -229,7 +229,7 @@ SUBSYSTEM_DEF(ticker) if(GLOB.secret_force_mode != "secret") var/datum/game_mode/smode = config.pick_mode(GLOB.secret_force_mode) if(!smode.can_start()) - message_admins("\blue Unable to force secret [GLOB.secret_force_mode]. [smode.required_players] players and [smode.required_enemies] eligible antagonists needed.") + message_admins("Unable to force secret [GLOB.secret_force_mode]. [smode.required_players] players and [smode.required_enemies] eligible antagonists needed.") else mode = smode @@ -302,14 +302,14 @@ SUBSYSTEM_DEF(ticker) round_start_time = world.time SSdbcore.SetRoundStart() - to_chat(world, "Welcome to [station_name()], enjoy your stay!") + to_chat(world, "Welcome to [station_name()], enjoy your stay!") SEND_SOUND(world, sound('sound/ai/welcome.ogg')) current_state = GAME_STATE_PLAYING Master.SetRunLevel(RUNLEVEL_GAME) if(SSevents.holidays) - to_chat(world, "and...") + to_chat(world, "and...") for(var/holidayname in SSevents.holidays) var/datum/holiday/holiday = SSevents.holidays[holidayname] to_chat(world, "

[holiday.greet()]

") @@ -425,7 +425,7 @@ SUBSYSTEM_DEF(ticker) m = pick(memetips) if(m) - to_chat(world, "Tip of the round: [html_encode(m)]") + to_chat(world, "Tip of the round: [html_encode(m)]") /datum/controller/subsystem/ticker/proc/check_queue() var/hpc = CONFIG_GET(number/hard_popcap) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 422b1eda26..f432e44b18 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -18,6 +18,8 @@ SUBSYSTEM_DEF(vote) var/obfuscated = FALSE//CIT CHANGE - adds obfuscated/admin-only votes + var/list/stored_gamemode_votes = list() //Basically the last voted gamemode is stored here for end-of-round use. + /datum/controller/subsystem/vote/fire() //called by master_controller if(mode) time_remaining = round((started_time + CONFIG_GET(number/vote_period) - world.time)/10) @@ -90,10 +92,12 @@ SUBSYSTEM_DEF(vote) text += "[question]" else text += "[capitalize(mode)] Vote" + stored_gamemode_votes = list() for(var/i=1,i<=choices.len,i++) var/votes = choices[choices[i]] if(!votes) votes = 0 + stored_gamemode_votes[choices[i]] = votes text += "\n[choices[i]]: [obfuscated ? "???" : votes]" //CIT CHANGE - adds obfuscated votes if(mode != "custom") if(winners.len > 1 && !obfuscated) //CIT CHANGE - adds obfuscated votes diff --git a/code/datums/components/spooky.dm b/code/datums/components/spooky.dm index 8989cb499d..1d5549d0fe 100644 --- a/code/datums/components/spooky.dm +++ b/code/datums/components/spooky.dm @@ -27,7 +27,7 @@ C.stuttering = 20 if((!istype(H.dna.species, /datum/species/skeleton)) && (!istype(H.dna.species, /datum/species/golem)) && (!istype(H.dna.species, /datum/species/android)) && (!istype(H.dna.species, /datum/species/jelly))) C.adjustStaminaLoss(25) //boneless humanoids don't lose the will to live - to_chat(C, "DOOT") + to_chat(C, "DOOT") spectral_change(H) else //the sound will spook monkeys. diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index d5c983bc39..f0fb7f6095 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -1351,8 +1351,8 @@ if(amount != 0) log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ") - var/msg = "[key_name(usr)] dealt [amount] amount of [Text] damage to [L] " - message_admins(msg) + var/msg = "[key_name(usr)] dealt [amount] amount of [Text] damage to [L] " + message_admins("[msg]") admin_ticket_log(L, msg) vv_update_display(L, Text, "[newamt]") else if(href_list["copyoutfit"]) diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 4283d7f78f..cdf932e127 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -85,7 +85,7 @@ return 1 return 0 -/datum/martial_art/krav_maga/proc/leg_sweep(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) +/datum/martial_art/krav_maga/proc/leg_sweep(mob/living/carbon/human/A, mob/living/carbon/human/D) if(D.lying || D.IsKnockdown()) return 0 D.visible_message("[A] leg sweeps [D]!", \ diff --git a/code/datums/wires/autolathe.dm b/code/datums/wires/autolathe.dm index ebad7d1469..f83bab5910 100644 --- a/code/datums/wires/autolathe.dm +++ b/code/datums/wires/autolathe.dm @@ -30,6 +30,7 @@ addtimer(CALLBACK(A, /obj/machinery/autolathe.proc/reset, wire), 60) if(WIRE_SHOCK) A.shocked = !A.shocked + A.shock(usr, 50) addtimer(CALLBACK(A, /obj/machinery/autolathe.proc/reset, wire), 60) if(WIRE_DISABLE) A.disabled = !A.disabled @@ -40,9 +41,11 @@ switch(wire) if(WIRE_HACK) A.adjust_hacked(!mend) - if(WIRE_HACK) + if(WIRE_SHOCK) A.shocked = !mend + A.shock(usr, 50) if(WIRE_DISABLE) A.disabled = !mend if(WIRE_ZAP) - A.shock(usr, 50) \ No newline at end of file + A.shock(usr, 50) + diff --git a/code/game/gamemodes/brother/traitor_bro.dm b/code/game/gamemodes/brother/traitor_bro.dm index e25c4f7716..18611ebfcb 100644 --- a/code/game/gamemodes/brother/traitor_bro.dm +++ b/code/game/gamemodes/brother/traitor_bro.dm @@ -6,6 +6,7 @@ name = "traitor+brothers" config_tag = "traitorbro" restricted_jobs = list("AI", "Cyborg") + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Quartermaster", "Chief Engineer", "Research Director") announce_span = "danger" announce_text = "There are Syndicate agents and Blood Brothers on the station!\n\ diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 0a9a135986..5e8515d3d5 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -95,6 +95,12 @@ var/obj/item/toy/crayon/CR = WM.color_source add_atom_colour(CR.paint_color, WASHABLE_COLOUR_PRIORITY) +/obj/item/reagents_containers/rag/towel/machine_wash(obj/machinery/washing_machine/WM) + if(WM.color_source) + if(istype(WM.color_source, /obj/item/toy/crayon)) + var/obj/item/toy/crayon/CR = WM.color_source + add_atom_colour(CR.paint_color, WASHABLE_COLOUR_PRIORITY) + /mob/living/simple_animal/pet/dog/corgi/machine_wash(obj/machinery/washing_machine/WM) gib() diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index ba08109427..21bbdfd14b 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -159,15 +159,15 @@ t1 = "*dead*" else t1 = "Unknown" - return {"Health: [patient.stat > 1 ? "[t1]" : "[patient.health]% ([t1])"]
- Core Temperature: [patient.bodytemperature-T0C]°C ([patient.bodytemperature*1.8-459.67]°F)
- Brute Damage: [patient.getBruteLoss()]%
- Respiratory Damage: [patient.getOxyLoss()]%
- Toxin Content: [patient.getToxLoss()]%
- Burn Severity: [patient.getFireLoss()]%
- [patient.getCloneLoss() ? "Subject appears to have cellular damage." : ""]
- [patient.getBrainLoss() ? "Significant brain damage detected." : ""]
- [length(patient.get_traumas()) ? "Brain Traumas detected." : ""]
+ return {"Health: [patient.stat > 1 ? "[t1]" : "[patient.health]% ([t1])"]
+ Core Temperature: [patient.bodytemperature-T0C]°C ([patient.bodytemperature*1.8-459.67]°F)
+ Brute Damage: [patient.getBruteLoss()]%
+ Respiratory Damage: [patient.getOxyLoss()]%
+ Toxin Content: [patient.getToxLoss()]%
+ Burn Severity: [patient.getFireLoss()]%
+ [patient.getCloneLoss() ? "Subject appears to have cellular damage." : ""]
+ [patient.getBrainLoss() ? "Significant brain damage detected." : ""]
+ [length(patient.get_traumas()) ? "Brain Traumas detected." : ""]
"} /obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_patient_reagents() diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 9f52b4c1ac..57b9e89af7 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -341,9 +341,19 @@ SLIME SCANNER if(M.reagents) var/msg = "*---------*\n" if(M.reagents.reagent_list.len) - msg += "Subject contains the following reagents:\n" + var/list/datum/reagent/reagents = list() for(var/datum/reagent/R in M.reagents.reagent_list) - msg += "[R.volume] units of [R.name][R.overdosed == 1 ? " - OVERDOSING" : "."]\n" + if(R.invisible) + continue + reagents += R + + if(length(reagents)) + msg += "Subject contains the following reagents:\n" + for(var/datum/reagent/R in reagents) + msg += "[R.volume] units of [R.name][R.overdosed == 1 ? " - OVERDOSING" : "."]\n" + else + msg += "Subject contains no reagents.\n" + else msg += "Subject contains no reagents.\n" if(M.reagents.addiction_list.len) @@ -621,7 +631,7 @@ SLIME SCANNER to_chat(user, "Growth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]") if(T.effectmod) to_chat(user, "Core mutation in progress: [T.effectmod]") - to_chat(user, "Progress in core mutation: [T.applied] / [SLIME_EXTRACT_CROSSING_REQUIRED]") + to_chat(user, "Progress in core mutation: [T.applied] / [SLIME_EXTRACT_CROSSING_REQUIRED]") to_chat(user, "========================") diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index e1ecf6d14d..5594059463 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -248,7 +248,8 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ new/datum/stack_recipe("bio bag", /obj/item/storage/bag/bio, 4), \ null, \ new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 6), \ - new/datum/stack_recipe("rag", /obj/item/reagent_containers/glass/rag, 1), \ + new/datum/stack_recipe("rag", /obj/item/reagent_containers/rag, 1), \ + new/datum/stack_recipe("towel", /obj/item/reagent_containers/rag/towel, 3), \ new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \ new/datum/stack_recipe("empty sandbag", /obj/item/emptysandbag, 4), \ null, \ diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 4ff63ceeac..5a4d85885b 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -1196,3 +1196,20 @@ new /obj/item/reagent_containers/food/snacks/grown/chili(src) new /obj/item/reagent_containers/food/drinks/coffee/type2(src) new /obj/item/tank/internals/emergency_oxygen(src) + +//Where do I put this? +/obj/item/secbat + name = "Secbat box" + desc = "Contained inside is a secbat for use with law enforcement." + icon = 'icons/obj/storage.dmi' + icon_state = "box" + item_state = "syringe_kit" + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' + +/obj/item/secbat/attack_self(mob/user) + new /mob/living/simple_animal/hostile/retaliate/bat/secbat(user.loc) + to_chat(user, "You open the box, releasing the secbat!") + var/obj/item/stack/sheet/cardboard/I = new(user.drop_location()) + qdel(src) + user.put_in_hands(I) diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index b8320c80fb..405e697d3b 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -99,7 +99,7 @@ GLOBAL_LIST_INIT(globalBlankCanvases, new(AMT_OF_CANVASES)) return //Cleaning one pixel with a soap or rag - if(istype(I, /obj/item/soap) || istype(I, /obj/item/reagent_containers/glass/rag)) + if(istype(I, /obj/item/soap) || istype(I, /obj/item/reagent_containers/rag)) //Pixel info created only when needed var/icon/masterpiece = icon(icon,icon_state) var/thePix = masterpiece.GetPixel(pixX,pixY) diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 0809edaa71..d6d2f18e5a 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -21,8 +21,8 @@ new /obj/item/clothing/head/soft/black(src) new /obj/item/clothing/shoes/sneakers/black(src) new /obj/item/clothing/shoes/sneakers/black(src) - new /obj/item/reagent_containers/glass/rag(src) - new /obj/item/reagent_containers/glass/rag(src) + new /obj/item/reagent_containers/rag(src) + new /obj/item/reagent_containers/rag(src) new /obj/item/storage/box/beanbag(src) new /obj/item/clothing/suit/armor/vest/alt(src) new /obj/item/circuitboard/machine/dish_drive(src) @@ -53,7 +53,7 @@ new /obj/item/clothing/suit/toggle/chef(src) new /obj/item/clothing/under/rank/chef(src) new /obj/item/clothing/head/chefhat(src) - new /obj/item/reagent_containers/glass/rag(src) + new /obj/item/reagent_containers/rag(src) /obj/structure/closet/jcloset name = "custodial closet" diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index d70838a30b..46db567b10 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -537,7 +537,7 @@ if(istype(O, /obj/item/stack/medical/gauze)) var/obj/item/stack/medical/gauze/G = O - new /obj/item/reagent_containers/glass/rag(src.loc) + new /obj/item/reagent_containers/rag(src.loc) to_chat(user, "You tear off a strip of gauze and make a rag.") G.use(1) return diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 84e5ba4f82..5f3153d90f 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -6,7 +6,7 @@ set category = null set name = "Admin PM Mob" if(!holder) - to_chat(src, "Error: Admin-PM-Context: Only administrators may use this command.") + to_chat(src, "Error: Admin-PM-Context: Only administrators may use this command.") return if( !ismob(M) || !M.client ) return @@ -18,7 +18,7 @@ set category = "Admin" set name = "Admin PM" if(!holder) - to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.") + to_chat(src, "Error: Admin-PM-Panel: Only administrators may use this command.") return var/list/client/targets[0] for(var/client/T) @@ -37,7 +37,7 @@ /client/proc/cmd_ahelp_reply(whom) if(prefs.muted & MUTE_ADMINHELP) - to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).") + to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).") return var/client/C if(istext(whom)) @@ -48,7 +48,7 @@ C = whom if(!C) if(holder) - to_chat(src, "Error: Admin-PM: Client not found.") + to_chat(src, "Error: Admin-PM: Client not found.") return var/datum/admin_help/AH = C.current_ticket @@ -65,12 +65,12 @@ //Fetching a message if needed. src is the sender and C is the target client /client/proc/cmd_admin_pm(whom, msg) if(prefs.muted & MUTE_ADMINHELP) - to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).") + to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).") return if(!holder && !current_ticket) //no ticket? https://www.youtube.com/watch?v=iHSPf6x1Fdo - to_chat(src, "You can no longer reply to this ticket, please open another one by using the Adminhelp verb if need be.") - to_chat(src, "Message: [msg]") + to_chat(src, "You can no longer reply to this ticket, please open another one by using the Adminhelp verb if need be.") + to_chat(src, "Message: [msg]") return var/client/recipient @@ -95,14 +95,14 @@ if(!msg) return if(holder) - to_chat(src, "Error: Use the admin IRC channel, nerd.") + to_chat(src, "Error: Use the admin IRC channel, nerd.") return else if(!recipient) if(holder) - to_chat(src, "Error: Admin-PM: Client not found.") + to_chat(src, "Error: Admin-PM: Client not found.") if(msg) to_chat(src, msg) return @@ -118,12 +118,12 @@ return if(prefs.muted & MUTE_ADMINHELP) - to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).") + to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).") return if(!recipient) if(holder) - to_chat(src, "Error: Admin-PM: Client not found.") + to_chat(src, "Error: Admin-PM: Client not found.") else current_ticket.MessageNoRecipient(msg) return @@ -145,15 +145,15 @@ var/keywordparsedmsg = keywords_lookup(msg) if(irc) - to_chat(src, "PM to-Admins: [rawmsg]") + to_chat(src, "PM to-Admins: [rawmsg]") var/datum/admin_help/AH = admin_ticket_log(src, "Reply PM from-[key_name(src, TRUE, TRUE)] to IRC: [keywordparsedmsg]") ircreplyamount-- send2irc("[AH ? "#[AH.id] " : ""]Reply: [ckey]", rawmsg) else if(recipient.holder) if(holder) //both are admins - to_chat(recipient, "Admin PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]") - to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [keywordparsedmsg]") + to_chat(recipient, "Admin PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]") + to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [keywordparsedmsg]") //omg this is dumb, just fill in both their tickets var/interaction_message = "PM from-[key_name(src, recipient, 1)] to-[key_name(recipient, src, 1)]: [keywordparsedmsg]" @@ -162,10 +162,10 @@ admin_ticket_log(recipient, interaction_message) else //recipient is an admin but sender is not - var/replymsg = "Reply PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]" - admin_ticket_log(src, replymsg) - to_chat(recipient, replymsg) - to_chat(src, "PM to-Admins: [msg]") + var/replymsg = "Reply PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]" + admin_ticket_log(src, "[replymsg]") + to_chat(recipient, "[replymsg]") + to_chat(src, "PM to-Admins: [msg]") //play the receiving admin the adminhelp sound (if they have them enabled) if(recipient.prefs.toggles & SOUND_ADMINHELP) @@ -177,11 +177,11 @@ new /datum/admin_help(msg, recipient, TRUE) to_chat(recipient, "-- Administrator private message --") - to_chat(recipient, "Admin PM from-[key_name(src, recipient, 0)]: [msg]") - to_chat(recipient, "Click on the administrator's name to reply.") - to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [msg]") + to_chat(recipient, "Admin PM from-[key_name(src, recipient, 0)]: [msg]") + to_chat(recipient, "Click on the administrator's name to reply.") + to_chat(src, "Admin PM to-[key_name(recipient, src, 1)]: [msg]") - admin_ticket_log(recipient, "PM From [key_name_admin(src)]: [keywordparsedmsg]") + admin_ticket_log(recipient, "PM From [key_name_admin(src)]: [keywordparsedmsg]") //always play non-admin recipients the adminhelp sound SEND_SOUND(recipient, sound('sound/effects/adminhelp.ogg')) @@ -200,20 +200,20 @@ return else //neither are admins - to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.") + to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.") return if(irc) log_admin_private("PM: [key_name(src)]->IRC: [rawmsg]") for(var/client/X in GLOB.admins) - to_chat(X, "PM: [key_name(src, X, 0)]->IRC: [keywordparsedmsg]") + to_chat(X, "PM: [key_name(src, X, 0)]->IRC: [keywordparsedmsg]") else window_flash(recipient, ignorepref = TRUE) log_admin_private("PM: [key_name(src)]->[key_name(recipient)]: [rawmsg]") //we don't use message_admins here because the sender/receiver might get it too for(var/client/X in GLOB.admins) if(X.key!=key && X.key!=recipient.key) //check client/X is an admin and isn't the sender or recipient - to_chat(X, "PM: [key_name(src, X, 0)]->[key_name(recipient, X, 0)]: [keywordparsedmsg]" ) + to_chat(X, "PM: [key_name(src, X, 0)]->[key_name(recipient, X, 0)]: [keywordparsedmsg]" ) @@ -296,10 +296,10 @@ msg = emoji_parse(msg) to_chat(C, "-- Administrator private message --") - to_chat(C, "Admin PM from-[adminname]: [msg]") - to_chat(C, "Click on the administrator's name to reply.") + to_chat(C, "Admin PM from-[adminname]: [msg]") + to_chat(C, "Click on the administrator's name to reply.") - admin_ticket_log(C, "PM From [irc_tagged]: [msg]") + admin_ticket_log(C, "PM From [irc_tagged]: [msg]") window_flash(C, ignorepref = TRUE) //always play non-admin recipients the adminhelp sound diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index f74b31760d..52e76f95b6 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -298,7 +298,7 @@ if(candidates.len) ckey = input("Pick the player you want to respawn as a xeno.", "Suitable Candidates") as null|anything in candidates else - to_chat(usr, "Error: create_xeno(): no suitable candidates.") + to_chat(usr, "Error: create_xeno(): no suitable candidates.") if(!istext(ckey)) return 0 diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index 5a701d8a96..68ddf3ce28 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -62,13 +62,13 @@ /obj/effect/proc_holder/changeling/sting/transformation - name = "Transformation Sting" - desc = "We silently sting a human, injecting a retrovirus that forces them to transform." - helptext = "The victim will transform much like a changeling would. Does not provide a warning to others. Mutations will not be transferred, and monkeys will become human. This ability is loud, and might cause our blood to react violently to heat." + name = "Temporary Transformation Sting" + desc = "We silently sting a human, injecting a chemical that forces them to transform into a chosen being for a limited time. Additional stings extend the duration." + helptext = "The victim will transform much like a changeling would for a limited time. Does not provide a warning to others. Mutations will not be transferred, and monkeys will become human. This ability is loud, and might cause our blood to react violently to heat." sting_icon = "sting_transform" - chemical_cost = 50 - dna_cost = 3 - loudness = 2 + chemical_cost = 10 + dna_cost = 2 + loudness = 1 var/datum/changelingprofile/selected_dna = null action_icon = 'icons/mob/actions/actions_changeling.dmi' action_icon_state = "ling_sting_transform" @@ -97,19 +97,19 @@ return 1 /obj/effect/proc_holder/changeling/sting/transformation/sting_action(mob/user, mob/target) - log_combat(user, target, "stung", "transformation sting", " new identity is '[selected_dna.dna.real_name]'") - var/datum/dna/NewDNA = selected_dna.dna + if(ismonkey(target)) to_chat(user, "Our genes cry out as we sting [target.name]!") var/mob/living/carbon/C = target . = TRUE if(istype(C)) - C.real_name = NewDNA.real_name - NewDNA.transfer_identity(C) - if(ismonkey(C)) - C.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) - C.updateappearance(mutcolor_update=1) + if(C.reagents.has_reagent("changeling_sting_real")) + C.reagents.add_reagent("changeling_sting_real",120) + log_combat(user, target, "stung", "transformation sting", ", extending the duration.") + else + C.reagents.add_reagent("changeling_sting_real",120,list("desired_dna" = selected_dna.dna)) + log_combat(user, target, "stung", "transformation sting", " new identity is '[selected_dna.dna.real_name]'") /obj/effect/proc_holder/changeling/sting/false_armblade diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 7cfefd5413..86493f6322 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -385,9 +385,11 @@ /obj/item/warpwhistle/attack_self(mob/living/carbon/user) if(!istype(user) || on_cooldown) return + var/turf/T = get_turf(user) + if(!T) + return on_cooldown = TRUE last_user = user - var/turf/T = get_turf(user) playsound(T,'sound/magic/warpwhistle.ogg', 200, 1) user.canmove = FALSE new /obj/effect/temp_visual/tornado(T) @@ -402,6 +404,8 @@ return var/breakout = 0 while(breakout < 50) + if(!T) + break var/turf/potential_T = find_safe_turf() if(T.z != potential_T.z || abs(get_dist_euclidian(potential_T,T)) > 50 - breakout) user.forceMove(potential_T) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 46cc1fa93c..fdd5b9ffd9 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1633,7 +1633,7 @@ /obj/item/caution, /obj/item/storage/bag/trash, /obj/item/reagent_containers/spray/cleaner, - /obj/item/reagent_containers/glass/rag, + /obj/item/reagent_containers/rag, /obj/item/grenade/chem_grenade/cleaner, /obj/item/grenade/chem_grenade/cleaner, /obj/item/grenade/chem_grenade/cleaner, @@ -1666,7 +1666,7 @@ contains = list(/obj/item/caution, /obj/item/caution, /obj/item/caution, - /obj/item/reagent_containers/glass/rag, + /obj/item/reagent_containers/rag, /obj/item/reagent_containers/glass/bottle/ammonia, /obj/item/reagent_containers/glass/bottle/ammonia, /obj/item/reagent_containers/spray/drying_agent) @@ -2204,6 +2204,17 @@ /mob/living/simple_animal/hostile/retaliate/poison/snake) crate_name = "snake crate" +/datum/supply_pack/critter/secbat + name = "Security Bat Crate" + desc = "Contains five security bats, perfect to Bat-up any security officer." + cost = 2500 + contains = list(/mob/living/simple_animal/hostile/retaliate/bat/secbat, + /mob/living/simple_animal/hostile/retaliate/bat/secbat, + /mob/living/simple_animal/hostile/retaliate/bat/secbat, + /mob/living/simple_animal/hostile/retaliate/bat/secbat, + /mob/living/simple_animal/hostile/retaliate/bat/secbat) + crate_name = "security bat crate" + ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Costumes & Toys ///////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -2775,4 +2786,3 @@ /obj/item/toner, /obj/item/toner) crate_name = "toner crate" - diff --git a/code/modules/client/darkmode.dm b/code/modules/client/darkmode.dm new file mode 100644 index 0000000000..9e8d136b3b --- /dev/null +++ b/code/modules/client/darkmode.dm @@ -0,0 +1,117 @@ +//Darkmode preference by Kmc2000// + +/* +This lets you switch chat themes by using winset and CSS loading, you must relog to see this change (or rebuild your browseroutput datum) +Things to note: +If you change ANYTHING in interface/skin.dmf you need to change it here: +Format: +winset(src, "window as appears in skin.dmf after elem", "var to change = currentvalue;var to change = desired value") +How this works: +I've added a function to browseroutput.js which registers a cookie for darkmode and swaps the chat accordingly. You can find the button to do this under the "cog" icon next to the ping button (top right of chat) +This then swaps the window theme automatically +Thanks to spacemaniac and mcdonald for help with the JS side of this. +*/ + +/client/proc/force_white_theme() //There's no way round it. We're essentially changing the skin by hand. It's painful but it works, and is the way Lummox suggested. + //Main windows + winset(src, "infowindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]") + winset(src, "infowindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "info", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]") + winset(src, "info", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "browseroutput", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]") + winset(src, "browseroutput", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "outputwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]") + winset(src, "outputwindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "mainwindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]") + winset(src, "split", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]") + //Buttons + winset(src, "changelog", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]") + winset(src, "changelog", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "rules", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]") + winset(src, "rules", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "wiki", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]") + winset(src, "wiki", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "forum", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]") + winset(src, "forum", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "github", "background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG];background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG]") + winset(src, "github", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "report-issue", "background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG];background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG]") + winset(src, "report-issue", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") + //Status and verb tabs + winset(src, "output", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]") + winset(src, "output", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "statwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]") + winset(src, "statwindow", "text-color = #eaeaea;text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "stat", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]") + winset(src, "stat", "tab-background-color = [COLOR_DARKMODE_BACKGROUND];tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND]") + winset(src, "stat", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "stat", "tab-text-color = [COLOR_DARKMODE_TEXT];tab-text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "stat", "prefix-color = [COLOR_DARKMODE_TEXT];prefix-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "stat", "suffix-color = [COLOR_DARKMODE_TEXT];suffix-color = [COLOR_WHITEMODE_TEXT]") + //Etc. + winset(src, "say", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]") + winset(src, "say", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "asset_cache_browser", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_DARKBACKGROUND]") + winset(src, "asset_cache_browser", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") + winset(src, "tooltip", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = [COLOR_WHITEMODE_BACKGROUND]") + winset(src, "tooltip", "text-color = [COLOR_DARKMODE_TEXT];text-color = [COLOR_WHITEMODE_TEXT]") + +/client/proc/force_dark_theme() //Inversely, if theyre using white theme and want to swap to the superior dark theme, let's get WINSET() ing + //Main windows + winset(src, "infowindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]") + winset(src, "infowindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "info", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]") + winset(src, "info", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "browseroutput", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]") + winset(src, "browseroutput", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "outputwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]") + winset(src, "outputwindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "mainwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]") + winset(src, "split", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]") + //Buttons + winset(src, "changelog", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]") + winset(src, "changelog", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "rules", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]") + winset(src, "rules", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "wiki", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]") + winset(src, "wiki", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "forum", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]") + winset(src, "forum", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "github", "background-color = [COLOR_WHITEMODE_INFO_BUTTONS_BG];background-color = [COLOR_DARKMODE_INFO_BUTTONS_BG]") + winset(src, "github", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "report-issue", "background-color = [COLOR_WHITEMODE_ISSUE_BUTTON_BG];background-color = [COLOR_DARKMODE_ISSUE_BUTTON_BG]") + winset(src, "report-issue", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") + //Status and verb tabs + winset(src, "output", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]") + winset(src, "output", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "statwindow", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]") + winset(src, "statwindow", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "stat", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_DARKBACKGROUND]") + winset(src, "stat", "tab-background-color = [COLOR_WHITEMODE_DARKBACKGROUND];tab-background-color = [COLOR_DARKMODE_BACKGROUND]") + winset(src, "stat", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "stat", "tab-text-color = [COLOR_WHITEMODE_TEXT];tab-text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "stat", "prefix-color = [COLOR_WHITEMODE_TEXT];prefix-color = [COLOR_DARKMODE_TEXT]") + winset(src, "stat", "suffix-color = [COLOR_WHITEMODE_TEXT];suffix-color = [COLOR_DARKMODE_TEXT]") + //Etc. + winset(src, "say", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]") + winset(src, "say", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "asset_cache_browser", "background-color = [COLOR_WHITEMODE_DARKBACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]") + winset(src, "asset_cache_browser", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") + winset(src, "tooltip", "background-color = [COLOR_WHITEMODE_BACKGROUND];background-color = [COLOR_DARKMODE_BACKGROUND]") + winset(src, "tooltip", "text-color = [COLOR_WHITEMODE_TEXT];text-color = [COLOR_DARKMODE_TEXT]") + + +/datum/asset/simple/goonchat + verify = FALSE + assets = list( + "json2.min.js" = 'code/modules/goonchat/browserassets/js/json2.min.js', + "errorHandler.js" = 'code/modules/goonchat/browserassets/js/errorHandler.js', + "browserOutput.js" = 'code/modules/goonchat/browserassets/js/browserOutput.js', + "fontawesome-webfont.eot" = 'tgui/assets/fonts/fontawesome-webfont.eot', + "fontawesome-webfont.svg" = 'tgui/assets/fonts/fontawesome-webfont.svg', + "fontawesome-webfont.ttf" = 'tgui/assets/fonts/fontawesome-webfont.ttf', + "fontawesome-webfont.woff" = 'tgui/assets/fonts/fontawesome-webfont.woff', + "font-awesome.css" = 'code/modules/goonchat/browserassets/css/font-awesome.css', + "browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css', + "browserOutput_white.css" = 'code/modules/goonchat/browserassets/css/browserOutput_white.css', + ) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 9e48591361..54d75e8437 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -29,7 +29,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) //game-preferences var/lastchangelog = "" //Saved changlog filesize to detect if there was a change - var/ooccolor = null + var/ooccolor = "#c43b23" + var/aooccolor = "#ce254f" var/enable_tips = TRUE var/tip_delay = 500 //tip delay in milliseconds @@ -774,6 +775,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]
" if(unlock_content || check_rights_for(user.client, R_ADMIN)) dat += "OOC Color:     Change
" + dat += "Antag OOC Color:     Change
" + dat += "" if(user.client.holder) dat +="" @@ -1951,6 +1954,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_ooccolor) ooccolor = new_ooccolor + if("aooccolor") + var/new_aooccolor = input(user, "Choose your Antag OOC colour:", "Game Preference",ooccolor) as color|null + if(new_aooccolor) + aooccolor = new_aooccolor + if("bag") var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in GLOB.backbaglist if(new_backbag) diff --git a/code/modules/client/verbs/aooc.dm b/code/modules/client/verbs/aooc.dm index 893501a852..311c22955d 100644 --- a/code/modules/client/verbs/aooc.dm +++ b/code/modules/client/verbs/aooc.dm @@ -1,3 +1,6 @@ +GLOBAL_VAR_INIT(AOOC_COLOR, null)//If this is null, use the CSS for OOC. Otherwise, use a custom colour. +GLOBAL_VAR_INIT(normal_aooc_colour, "#ce254f") + /client/verb/aooc(msg as text) set name = "AOOC" set desc = "An OOC channel exclusive to antagonists." @@ -50,7 +53,7 @@ var/keyname = key if(prefs.unlock_content) if(prefs.toggles & MEMBER_PUBLIC) - keyname = "[icon2html('icons/member_content.dmi', world, "blag")][keyname]" + keyname = "[icon2html('icons/member_content.dmi', world, "blag")][keyname]" //The linkify span classes and linkify=TRUE below make ooc text get clickable chat href links if you pass in something resembling a url var/antaglisting = list() @@ -74,23 +77,27 @@ else to_chat(C, "Antag OOC: [keyname][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]") else - to_chat(C, "Antag OOC: [holder.fakekey ? holder.fakekey : key]: [msg]") + if(GLOB.AOOC_COLOR) + to_chat(C, "Antag OOC: [holder.fakekey ? holder.fakekey : key]: [msg]") + else + to_chat(C, "Antag OOC: [holder.fakekey ? holder.fakekey : key]: [msg]") else if(!(key in C.prefs.ignoring)) - to_chat(C, "Antag OOC: [keyname]: [msg]") - -GLOBAL_VAR_INIT(antag_ooc_colour, AOOC_COLOR) + if(GLOB.AOOC_COLOR) + to_chat(C, "Antag OOC: [keyname]: [msg]") + else + to_chat(C, "Antag OOC: [keyname]: [msg]") /client/proc/set_aooc(newColor as color) set name = "Set Antag OOC Color" set desc = "Modifies antag OOC Color" set category = "Fun" - GLOB.antag_ooc_colour = sanitize_ooccolor(newColor) + GLOB.AOOC_COLOR = sanitize_ooccolor(newColor) /client/proc/reset_aooc() set name = "Reset Antag OOC Color" set desc = "Returns antag OOC Color to default" set category = "Fun" - GLOB.antag_ooc_colour = AOOC_COLOR + GLOB.AOOC_COLOR = null /proc/toggle_aooc(toggle = null) if(toggle != null) //if we're specifically en/disabling ooc diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 5df13a1ffe..8a233025a1 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -1,3 +1,6 @@ +GLOBAL_VAR_INIT(OOC_COLOR, null)//If this is null, use the CSS for OOC. Otherwise, use a custom colour. +GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") + /client/verb/ooc(msg as text) set name = "OOC" //Gave this shit a shorter name so you only have to time out "ooc" rather than "ooc message" to use it --NeoFite set category = "OOC" @@ -66,9 +69,15 @@ else to_chat(C, "OOC: [keyname][holder.fakekey ? "/([holder.fakekey])" : ""]: [msg]") else - to_chat(C, "OOC: [holder.fakekey ? holder.fakekey : key]: [msg]") + if(GLOB.OOC_COLOR) + to_chat(C, "OOC: [holder.fakekey ? holder.fakekey : key]: [msg]") + else + to_chat(C, "OOC: [holder.fakekey ? holder.fakekey : key]: [msg]") else if(!(key in C.prefs.ignoring)) - to_chat(C, "OOC: [keyname]: [msg]") + if(GLOB.OOC_COLOR) + to_chat(C, "OOC: [keyname]: [msg]") + else + to_chat(C, "OOC: [keyname]: [msg]") /proc/toggle_ooc(toggle = null) if(toggle != null) //if we're specifically en/disabling ooc @@ -99,19 +108,17 @@ else GLOB.dooc_allowed = !GLOB.dooc_allowed -GLOBAL_VAR_INIT(normal_ooc_colour, OOC_COLOR) - /client/proc/set_ooc(newColor as color) set name = "Set Player OOC Color" set desc = "Modifies player OOC Color" set category = "Fun" - GLOB.normal_ooc_colour = sanitize_ooccolor(newColor) + GLOB.OOC_COLOR = sanitize_ooccolor(newColor) /client/proc/reset_ooc() set name = "Reset Player OOC Color" set desc = "Returns player OOC Color to default" set category = "Fun" - GLOB.normal_ooc_colour = OOC_COLOR + GLOB.OOC_COLOR = null /client/verb/colorooc() set name = "Set Your OOC Color" diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index 817fe59dcd..f0c1eeb833 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -8,6 +8,7 @@ slot_flags = ITEM_SLOT_GLOVES attack_verb = list("challenged") var/transfer_prints = FALSE + var/transfer_blood = 0 strip_delay = 20 equip_delay_other = 40 diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index 7346dc9ea9..cf411ef367 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -28,7 +28,6 @@ H.update_inv_wear_suit() else if(adjusted == ALT_STYLE) adjusted = NORMAL_STYLE - H.update_inv_wear_suit() if(("taur" in H.dna.species.mutant_bodyparts) && (H.dna.features["taur"] != "None")) if(H.dna.features["taur"] in list("Naga", "Tentacle")) diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index ca51fec347..f0665682a9 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -68,7 +68,7 @@ /datum/crafting_recipe/molotov name = "Molotov" result = /obj/item/reagent_containers/food/drinks/bottle/molotov - reqs = list(/obj/item/reagent_containers/glass/rag = 1, + reqs = list(/obj/item/reagent_containers/rag = 1, /obj/item/reagent_containers/food/drinks/bottle = 1) parts = list(/obj/item/reagent_containers/food/drinks/bottle = 1) time = 40 diff --git a/code/modules/detectivework/footprints_and_rag.dm b/code/modules/detectivework/footprints_and_rag.dm deleted file mode 100644 index a25bc01b13..0000000000 --- a/code/modules/detectivework/footprints_and_rag.dm +++ /dev/null @@ -1,50 +0,0 @@ - -/mob - var/bloody_hands = 0 - -/obj/item/clothing/gloves - var/transfer_blood = 0 - - -/obj/item/reagent_containers/glass/rag - name = "damp rag" - desc = "For cleaning up messes, you suppose." - w_class = WEIGHT_CLASS_TINY - icon = 'icons/obj/toy.dmi' - icon_state = "rag" - item_flags = NOBLUDGEON - reagent_flags = OPENCONTAINER - amount_per_transfer_from_this = 5 - possible_transfer_amounts = list() - volume = 5 - spillable = FALSE - -/obj/item/reagent_containers/glass/rag/suicide_act(mob/user) - user.visible_message("[user] is smothering [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!") - return (OXYLOSS) - -/obj/item/reagent_containers/glass/rag/afterattack(atom/A as obj|turf|area, mob/user,proximity) - . = ..() - if(!proximity) - return - if(iscarbon(A) && A.reagents && reagents.total_volume) - var/mob/living/carbon/C = A - var/reagentlist = pretty_string_from_reagent_list(reagents) - var/log_object = "a damp rag containing [reagentlist]" - if(user.a_intent == INTENT_HARM && !C.is_mouth_covered()) - reagents.reaction(C, INGEST) - reagents.trans_to(C, reagents.total_volume) - C.visible_message("[user] has smothered \the [C] with \the [src]!", "[user] has smothered you with \the [src]!", "You hear some struggling and muffled cries of surprise.") - log_combat(user, C, "smothered", log_object) - else - reagents.reaction(C, TOUCH) - reagents.clear_reagents() - C.visible_message("[user] has touched \the [C] with \the [src].") - log_combat(user, C, "touched", log_object) - - else if(istype(A) && src in user) - user.visible_message("[user] starts to wipe down [A] with [src]!", "You start to wipe down [A] with [src]...") - if(do_after(user,30, target = A)) - user.visible_message("[user] finishes wiping off [A]!", "You finish wiping off [A].") - SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) - return diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index f85668d2b8..0794d274b6 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -204,7 +204,7 @@ /obj/item/reagent_containers/food/drinks/holyoil name = "flask of zelus oil" - desc = "A brass flask of Zelus oil, a viscous fluid with a scenting of brass - this flask may be sipped or thrown." + desc = "A brass flask of Zelus oil, a viscous fluid scenting of brass. Can be thrown to deal damage from afar." icon_state = "zelusflask" list_reagents = list("holyoil" = 30) //Powerfull volume = 30 diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 463df71f71..082f20f524 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -82,6 +82,12 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico if("setMusicVolume") data = setMusicVolume(arglist(params)) + if("swaptodarkmode") + swaptodarkmode() + + if("swaptolightmode") + swaptolightmode() + if(data) ehjax_send(data = data) @@ -240,3 +246,10 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico // url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript. C << output(url_encode(url_encode(message)), "browseroutput:output") + + +/datum/chatOutput/proc/swaptolightmode() //Dark mode light mode stuff. Yell at KMC if this breaks! (See darkmode.dm for documentation) + owner.force_white_theme() + +/datum/chatOutput/proc/swaptodarkmode() + owner.force_dark_theme() diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index cf11b77879..b6db020df0 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -7,16 +7,20 @@ html, body { padding: 0; margin: 0; height: 100%; - color: #000000; + color: #f0f0f0; } body { - background: #E0E0E0; /*CIT CHANGE - darkens chatbox a lil*/ + background: #171717; font-family: Verdana, sans-serif; font-size: 9pt; + font-color: #f0f0f0; line-height: 1.2; overflow-x: hidden; overflow-y: scroll; - word-wrap: break-word; + word-wrap: break-word; + scrollbar-face-color:#1A1A1A; + scrollbar-track-color:#171717; + scrollbar-highlight-color:#171717; } em { @@ -56,9 +60,9 @@ img.icon { border-radius: 10px; } -a {color: #0000ff;} -a.visited {color: #ff00ff;} -a:visited {color: #ff00ff;} +a {color: #397ea5;} +a.visited {color: #7c00e6;} +a:visited {color: #7c00e6;} a.popt {text-decoration: none;} /***************************************** @@ -89,21 +93,21 @@ a.popt {text-decoration: none;} bottom: 0; right: 0; padding: 8px; - background: #ddd; + background: #202020; text-decoration: none; font-variant: small-caps; font-size: 1.1em; font-weight: bold; - color: #333; + color: #a4bad6; } -#newMessages:hover {background: #ccc;} +#newMessages:hover {background: #171717;} #newMessages i {vertical-align: middle; padding-left: 3px;} #ping { position: fixed; top: 0; - right: 80px; + right: 115px; width: 45px; - background: #ddd; + background: #202020; height: 30px; padding: 8px 0 2px 0; } @@ -120,19 +124,19 @@ a.popt {text-decoration: none;} right: 0; } #userBar .subCell { - background: #ddd; + background: #202020; height: 30px; padding: 5px 0; display: block; - color: #333; + color: #a4bad6; text-decoration: none; line-height: 28px; - border-top: 1px solid #b4b4b4; + border-top: 1px solid #171717; } -#userBar .subCell:hover {background: #ccc;} +#userBar .subCell:hover {background: #202020;} #userBar .toggle { width: 40px; - background: #ccc; + background: #202020; border-top: 0; float: right; text-align: center; @@ -242,9 +246,9 @@ a.popt {text-decoration: none;} ******************************************/ /* MOTD */ -.motd {color: #638500; font-family: Verdana, sans-serif;} -.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #638500; text-decoration: underline;} -.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #638500;} +.motd {color: #a4bad6; font-family: Verdana, sans-serif;} +.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #a4bad6; text-decoration: underline;} +.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #a4bad6;} /* ADD HERE FOR BOLD */ .bold, .name, .prefix, .ooc, .looc, .adminooc, .admin, .medal, .yell {font-weight: bold;} @@ -255,88 +259,90 @@ a.popt {text-decoration: none;} /* OUTPUT COLORS */ .highlight {background: yellow;} -h1, h2, h3, h4, h5, h6 {color: #0000ff;font-family: Georgia, Verdana, sans-serif;} -h1.alert, h2.alert {color: #000000;} +h1, h2, h3, h4, h5, h6 {color: #a4bad6;font-family: Georgia, Verdana, sans-serif;} +h1.alert, h2.alert {color: #a4bad6;} em {font-style: normal; font-weight: bold;} -.ooc { font-weight: bold;} +.ooc {color: #cca300; font-weight: bold;} +.antagooc {color: #ce254f; font-weight: bold;} .adminobserverooc {color: #0099cc; font-weight: bold;} -.adminooc {color: #700038; font-weight: bold;} +.adminooc {color: #3d5bc3; font-weight: bold;} -.adminsay {color: #FF4500; font-weight: bold;} -.admin {color: #386aff; font-weight: bold;} +.adminsay {color: #ff4500; font-weight: bold;} +.admin {color: #5975da; font-weight: bold;} .name { font-weight: bold;} .say {} -.deadsay {color: #5c00e6;} +.deadsay {color: #e2c1ff;} .binarysay {color: #20c20e; background-color: #000000; display: block;} .binarysay a {color: #00ff00;} .binarysay a:active, .binarysay a:visited {color: #88ff88;} -.radio {color: #008000;} -.sciradio {color: #993399;} -.comradio {color: #948f02;} -.secradio {color: #a30000;} -.medradio {color: #337296;} -.engradio {color: #fb5613;} -.suppradio {color: #a8732b;} -.servradio {color: #6eaa2c;} -.syndradio {color: #6d3f40;} -.centcomradio {color: #686868;} -.aiprivradio {color: #ff00ff;} -.redteamradio {color: #ff0000;} -.blueteamradio {color: #0000ff;} +.radio {color: #1ecc43;} +.sciradio {color: #c68cfa;} +.comradio {color: #5177ff;} +.secradio {color: #dd3535;} +.medradio {color: #57b8f0;} +.engradio {color: #f37746;} +.suppradio {color: #b88646;} +.servradio {color: #6ca729;} +.syndradio {color: #8f4a4b;} +.centcomradio {color: #2681a5;} +.aiprivradio {color: #d65d95;} +.redteamradio {color: #ff4444;} +.blueteamradio {color: #3434fd;} .yell { font-weight: bold;} -.alert {color: #ff0000;} -h1.alert, h2.alert {color: #000000;} +.alert {color: #d82020;} +h1.alert, h2.alert {color: #99aab5;} .emote { font-style: italic;} .selecteddna {color: #ffffff; background-color: #001B1B} -.attack {color: #ff0000;} -.disarm {color: #990000;} -.passive {color: #660000;} +.attack {color: #e01c1c;} +.disarm {color: #b42525;} +.passive {color: #a00f0f;} -.userdanger {color: #ff0000; font-weight: bold; font-size: 24px;} -.danger {color: #ff0000;} -.warning {color: #ff0000; font-style: italic;} -.alertwarning {color: #FF0000; font-weight: bold} -.boldwarning {color: #ff0000; font-style: italic; font-weight: bold} -.announce {color: #228b22; font-weight: bold;} -.boldannounce {color: #ff0000; font-weight: bold;} -.greenannounce {color: #00ff00; font-weight: bold;} +.userdanger {color: #c51e1e; font-weight: bold; font-size: 24px;} +.danger {color: #c51e1e;} +.warning {color: #c51e1e; font-style: italic;} +.alertwarning {color: #FF0000; font-weight: bold} +.boldwarning {color: #c51e1e; font-style: italic; font-weight: bold} +.announce {color: #c51e1e; font-weight: bold;} +.boldannounce {color: #c51e1e; font-weight: bold;} +.greenannounce {color: #059223; font-weight: bold;} .rose {color: #ff5050;} -.info {color: #0000CC;} -.notice {color: #000099;} -.boldnotice {color: #000099; font-weight: bold;} -.adminnotice {color: #0000ff;} +.info {color: #6685f5;} +.notice {color: #6685f5;} +.boldnotice {color: #6685f5; font-weight: bold;} +.adminnotice {color: #6685f5;} .adminhelp {color: #ff0000; font-weight: bold;} -.unconscious {color: #0000ff; font-weight: bold;} +.unconscious {color: #a4bad6; font-weight: bold;} .suicide {color: #ff5050; font-style: italic;} -.green {color: #03ff39;} -.red {color: #FF0000} -.blue {color: #215cff} -.nicegreen {color: #14a833;} +.red {color: #FF0000} +.pink {color: #ff70c1;} +.blue {color: #215cff} +.green {color: #059223;} +.nicegreen {color: #059223;} .userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;} .love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;} -.shadowling {color: #3b2769;} -.cult {color: #960000;} +.shadowling {color: #8e8a99;} +.cult {color: #aa1c1c;} -.cultitalic {color: #960000; font-style: italic;} -.cultbold {color: #960000; font-style: italic; font-weight: bold;} -.cultboldtalic {color: #960000; font-weight: bold; font-size: 24px;} +.cultitalic {color: #aa1c1c; font-style: italic;} +.cultbold {color: #aa1c1c; font-style: italic; font-weight: bold;} +.cultboldtalic {color: #aa1c1c; font-weight: bold; font-size: 24px;} -.cultlarge {color: #960000; font-weight: bold; font-size: 24px;} -.narsie {color: #960000; font-weight: bold; font-size: 120px;} -.narsiesmall {color: #960000; font-weight: bold; font-size: 48px;} +.cultlarge {color: #aa1c1c; font-weight: bold; font-size: 24px;} +.narsie {color: #aa1c1c; font-weight: bold; font-size: 120px;} +.narsiesmall {color: #aa1c1c; font-weight: bold; font-size: 48px;} .colossus {color: #7F282A; font-size: 40px;} -.hierophant {color: #660099; font-weight: bold; font-style: italic;} -.hierophant_warning {color: #660099; font-style: italic;} -.purple {color: #5e2d79;} -.holoparasite {color: #35333a;} +.hierophant {color: #b441ee; font-weight: bold; font-style: italic;} +.hierophant_warning {color: #c56bf1; font-style: italic;} +.purple {color: #9956d3;} +.holoparasite {color: #88809c;} .revennotice {color: #1d2953;} .revenboldnotice {color: #1d2953; font-weight: bold;} @@ -344,11 +350,11 @@ h1.alert, h2.alert {color: #000000;} .revenminor {color: #823abb} .revenwarning {color: #760fbb; font-style: italic;} .revendanger {color: #760fbb; font-weight: bold; font-size: 24px;} -.umbra {color: #5000A0;} -.umbra_emphasis {color: #5000A0; font-weight: bold; font-style: italic;} -.umbra_large {color: #5000A0; font-size: 24px; font-weight: bold; font-style: italic;} +.umbra {color: #7c00e6;} +.umbra_emphasis {color: #7c00e6; font-weight: bold; font-style: italic;} +.umbra_large {color: #7c00e6; font-size: 24px; font-weight: bold; font-style: italic;} -.deconversion_message {color: #5000A0; font-size: 24px; font-style: italic;} +.deconversion_message {color: #a947ff; font-size: 24px; font-style: italic;} .brass {color: #BE8700;} .heavy_brass {color: #BE8700; font-weight: bold; font-style: italic;} @@ -373,17 +379,17 @@ h1.alert, h2.alert {color: #000000;} .neovgre {color: #6E001A; font-weight: bold; font-style: italic;} .neovgre_small {color: #6E001A;} -.newscaster {color: #800000;} -.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;} +.newscaster {color: #c05d5d;} +.ghostalert {color: #6600ff; font-style: italic; font-weight: bold;} -.alien {color: #543354;} -.noticealien {color: #00c000;} -.alertalien {color: #00c000; font-weight: bold;} -.changeling {color: #800080; font-style: italic;} +.alien {color: #855d85;} +.noticealien {color: #059223;} +.alertalien {color: #059223; font-weight: bold;} +.changeling {color: #059223; font-style: italic;} -.spider {color: #4d004d;} +.spider {color: #8800ff;} -.interface {color: #330033;} +.interface {color: #750e75;} .sans {font-family: "Comic Sans MS", cursive, sans-serif;} .papyrus {font-family: "Papyrus", cursive, sans-serif;} @@ -394,29 +400,29 @@ h1.alert, h2.alert {color: #000000;} .big {font-size: 24px;} .reallybig {font-size: 32px;} .extremelybig {font-size: 40px;} -.greentext {color: #00FF00; font-size: 24px;} -.redtext {color: #FF0000; font-size: 24px;} -.clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} +.greentext {color: #059223; font-size: 24px;} +.redtext {color: #c51e1e; font-size: 24px;} +.clown {color: #ff70c1; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} .icon {height: 1em; width: auto;} .memo {color: #638500; text-align: center;} .memoedit {text-align: center; font-size: 16px;} -.abductor {color: #800080; font-style: italic;} -.mind_control {color: #A00D6F; font-size: 3; font-weight: bold; font-style: italic;} +.abductor {color: #c204c2; font-style: italic;} +.mind_control {color: #df3da9; font-size: 3; font-weight: bold; font-style: italic;} .slime {color: #00CED1;} .drone {color: #848482;} .monkey {color: #975032;} .swarmer {color: #2C75FF;} .resonate {color: #298F85;} -.monkeyhive {color: #774704;} -.monkeylead {color: #774704; font-size: 2;} +.monkeyhive {color: #a56408;} +.monkeylead {color: #af6805; font-size: 2;} .connectionClosed, .fatalError {background: red; color: white; padding: 5px;} .connectionClosed.restored {background: green;} -.internal.boldnshit {color: blue; font-weight: bold;} +.internal.boldnshit {color: #3d5bc3; font-weight: bold;} /* HELPER CLASSES */ .text-normal {font-weight: normal; font-style: normal;} diff --git a/code/modules/goonchat/browserassets/css/browserOutput_white.css b/code/modules/goonchat/browserassets/css/browserOutput_white.css new file mode 100644 index 0000000000..e21185449b --- /dev/null +++ b/code/modules/goonchat/browserassets/css/browserOutput_white.css @@ -0,0 +1,426 @@ +/***************************************** +* +* GLOBAL STYLES +* +******************************************/ +html, body { + padding: 0; + margin: 0; + height: 100%; + color: #000000; +} +body { + background: #fff; + font-family: Verdana, sans-serif; + font-size: 9pt; + line-height: 1.2; + overflow-x: hidden; + overflow-y: scroll; + word-wrap: break-word; +} + +em { + font-style: normal; + font-weight: bold; +} + +img { + margin: 0; + padding: 0; + line-height: 1; + -ms-interpolation-mode: nearest-neighbor; + image-rendering: pixelated; +} +img.icon { + height: 1em; + min-height: 16px; + width: auto; + vertical-align: bottom; +} + + +.r:before { /* "repeated" badge class for combined messages */ + content: 'x'; +} +.r { + display: inline-block; + min-width: 0.5em; + font-size: 0.7em; + padding: 0.2em 0.3em; + line-height: 1; + color: white; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: crimson; + border-radius: 10px; +} + +a {color: #0000ff;} +a.visited {color: #ff00ff;} +a:visited {color: #ff00ff;} +a.popt {text-decoration: none;} + +/***************************************** +* +* OUTPUT NOT RELATED TO ACTUAL MESSAGES +* +******************************************/ +#loading { + position: fixed; + width: 300px; + height: 150px; + text-align: center; + left: 50%; + top: 50%; + margin: -75px 0 0 -150px; +} +#loading i {display: block; padding-bottom: 3px;} + +#messages { + font-size: 13px; + padding: 3px; + margin: 0; + word-wrap: break-word; +} +#newMessages { + position: fixed; + display: block; + bottom: 0; + right: 0; + padding: 8px; + background: #ddd; + text-decoration: none; + font-variant: small-caps; + font-size: 1.1em; + font-weight: bold; + color: #333; +} +#newMessages:hover {background: #ccc;} +#newMessages i {vertical-align: middle; padding-left: 3px;} +#ping { + position: fixed; + top: 0; + right: 115px; + width: 45px; + background: #ddd; + height: 30px; + padding: 8px 0 2px 0; +} +#ping i {display: block; text-align: center;} +#ping .ms { + display: block; + text-align: center; + font-size: 8pt; + padding-top: 2px; +} +#userBar { + position: fixed; + top: 0; + right: 0; +} +#userBar .subCell { + background: #ddd; + height: 30px; + padding: 5px 0; + display: block; + color: #333; + text-decoration: none; + line-height: 28px; + border-top: 1px solid #b4b4b4; +} +#userBar .subCell:hover {background: #ccc;} +#userBar .toggle { + width: 40px; + background: #ccc; + border-top: 0; + float: right; + text-align: center; +} +#userBar .sub {clear: both; display: none; width: 160px;} +#userBar .sub.scroll {overflow-y: scroll;} +#userBar .sub.subCell {padding: 3px 0 3px 8px; line-height: 30px; font-size: 0.9em; clear: both;} +#userBar .sub span { + display: block; + line-height: 30px; + float: left; +} +#userBar .sub i { + display: block; + padding: 0 5px; + font-size: 1.1em; + width: 22px; + text-align: center; + line-height: 30px; + float: right; +} +#userBar .sub input { + position: absolute; + padding: 7px 5px; + width: 121px; + line-height: 30px; + float: left; +} +#userBar .topCell {border-top: 0;} + +/* POPUPS */ +.popup { + position: fixed; + top: 50%; + left: 50%; + background: #ddd; +} +.popup .close { + position: absolute; + background: #aaa; + top: 0; + right: 0; + color: #333; + text-decoration: none; + z-index: 2; + padding: 0 10px; + height: 30px; + line-height: 30px; +} +.popup .close:hover {background: #999;} +.popup .head { + background: #999; + color: #ddd; + padding: 0 10px; + height: 30px; + line-height: 30px; + text-transform: uppercase; + font-size: 0.9em; + font-weight: bold; + border-bottom: 2px solid green; +} +.popup input {border: 1px solid #999; background: #fff; margin: 0; padding: 5px; outline: none; color: #333;} +.popup input[type=text]:hover, .popup input[type=text]:active, .popup input[type=text]:focus {border-color: green;} +.popup input[type=submit] {padding: 5px 10px; background: #999; color: #ddd; text-transform: uppercase; font-size: 0.9em; font-weight: bold;} +.popup input[type=submit]:hover, .popup input[type=submit]:focus, .popup input[type=submit]:active {background: #aaa; cursor: pointer;} + +.changeFont {padding: 10px;} +.changeFont a {display: block; text-decoration: none; padding: 3px; color: #333;} +.changeFont a:hover {background: #ccc;} + +.highlightPopup {padding: 10px; text-align: center;} +.highlightPopup input[type=text] {display: block; width: 215px; text-align: left; margin-top: 5px;} +.highlightPopup input.highlightColor {background-color: #FFFF00;} +.highlightPopup input.highlightTermSubmit {margin-top: 5px;} + +/* ADMIN CONTEXT MENU */ +.contextMenu { + background-color: #ddd; + position: fixed; + margin: 2px; + width: 150px; +} +.contextMenu a { + display: block; + padding: 2px 5px; + text-decoration: none; + color: #333; +} + +.contextMenu a:hover { + background-color: #ccc; +} + +/* ADMIN FILTER MESSAGES MENU */ +.filterMessages {padding: 5px;} +.filterMessages div {padding: 2px 0;} +.filterMessages input {} +.filterMessages label {} + +.icon-stack {height: 1em; line-height: 1em; width: 1em; vertical-align: middle; margin-top: -2px;} + + +/***************************************** +* +* OUTPUT ACTUALLY RELATED TO MESSAGES +* +******************************************/ + +/* MOTD */ +.motd {color: #638500; font-family: Verdana, sans-serif;} +.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #638500; text-decoration: underline;} +.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #638500;} + +/* ADD HERE FOR BOLD */ +.bold, .name, .prefix, .ooc, .looc, .adminooc, .admin, .medal, .yell {font-weight: bold;} + +/* ADD HERE FOR ITALIC */ +.italic, .italics, .emote {font-style: italic;} + +/* OUTPUT COLORS */ +.highlight {background: yellow;} + +h1, h2, h3, h4, h5, h6 {color: #0000ff;font-family: Georgia, Verdana, sans-serif;} +h1.alert, h2.alert {color: #000000;} + +em {font-style: normal; font-weight: bold;} + +.ooc {color: #002eb8; font-weight: bold;} +.antagooc {color: #b8002e; font-weight: bold;} +.adminobserverooc {color: #0099cc; font-weight: bold;} +.adminooc {color: #700038; font-weight: bold;} + +.adminsay {color: #ff4500; font-weight: bold;} +.admin {color: #4473ff; font-weight: bold;} + +.name { font-weight: bold;} + +.say {} +.deadsay {color: #5c00e6;} +.binarysay {color: #20c20e; background-color: #000000; display: block;} +.binarysay a {color: #00ff00;} +.binarysay a:active, .binarysay a:visited {color: #88ff88;} +.radio {color: #008000;} +.sciradio {color: #993399;} +.comradio {color: #948f02;} +.secradio {color: #a30000;} +.medradio {color: #337296;} +.engradio {color: #fb5613;} +.suppradio {color: #a8732b;} +.servradio {color: #6eaa2c;} +.syndradio {color: #6d3f40;} +.centcomradio {color: #686868;} +.aiprivradio {color: #ff00ff;} +.redteamradio {color: #ff0000;} +.blueteamradio {color: #0000ff;} + +.yell { font-weight: bold;} + +.alert {color: #ff0000;} +h1.alert, h2.alert {color: #000000;} + +.emote { font-style: italic;} +.selecteddna {color: #ffffff; background-color: #001B1B} + +.attack {color: #ff0000;} +.disarm {color: #990000;} +.passive {color: #660000;} + +.userdanger {color: #ff0000; font-weight: bold; font-size: 24px;} +.danger {color: #ff0000;} +.warning {color: #ff0000; font-style: italic;} +.alertwarning {color: #FF0000; font-weight: bold} +.boldwarning {color: #ff0000; font-style: italic; font-weight: bold} +.announce {color: #228b22; font-weight: bold;} +.boldannounce {color: #ff0000; font-weight: bold;} +.greenannounce {color: #00ff00; font-weight: bold;} +.rose {color: #ff5050;} +.info {color: #0000CC;} +.notice {color: #000099;} +.boldnotice {color: #000099; font-weight: bold;} +.adminnotice {color: #0000ff;} +.adminhelp {color: #ff0000; font-weight: bold;} +.unconscious {color: #0000ff; font-weight: bold;} +.suicide {color: #ff5050; font-style: italic;} +.green {color: #03ff39;} +.red {color: #FF0000} +.pink {color: #FF69Bf;} +.blue {color: #0000FF} +.nicegreen {color: #14a833;} +.userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;} +.love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;} +.shadowling {color: #3b2769;} +.cult {color: #960000;} + +.cultitalic {color: #960000; font-style: italic;} +.cultbold {color: #960000; font-style: italic; font-weight: bold;} +.cultboldtalic {color: #960000; font-weight: bold; font-size: 24px;} + +.cultlarge {color: #960000; font-weight: bold; font-size: 24px;} +.narsie {color: #960000; font-weight: bold; font-size: 120px;} +.narsiesmall {color: #960000; font-weight: bold; font-size: 48px;} +.colossus {color: #7F282A; font-size: 40px;} +.hierophant {color: #660099; font-weight: bold; font-style: italic;} +.hierophant_warning {color: #660099; font-style: italic;} +.purple {color: #5e2d79;} +.holoparasite {color: #35333a;} + +.revennotice {color: #1d2953;} +.revenboldnotice {color: #1d2953; font-weight: bold;} +.revenbignotice {color: #1d2953; font-weight: bold; font-size: 24px;} +.revenminor {color: #823abb} +.revenwarning {color: #760fbb; font-style: italic;} +.revendanger {color: #760fbb; font-weight: bold; font-size: 24px;} +.umbra {color: #5000A0;} +.umbra_emphasis {color: #5000A0; font-weight: bold; font-style: italic;} +.umbra_large {color: #5000A0; font-size: 24px; font-weight: bold; font-style: italic;} + +.deconversion_message {color: #5000A0; font-size: 24px; font-style: italic;} + +.brass {color: #BE8700;} +.heavy_brass {color: #BE8700; font-weight: bold; font-style: italic;} +.large_brass {color: #BE8700; font-size: 24px;} +.big_brass {color: #BE8700; font-size: 24px; font-weight: bold; font-style: italic;} +.ratvar {color: #BE8700; font-size: 48px; font-weight: bold; font-style: italic;} +.alloy {color: #42474D;} +.heavy_alloy {color: #42474D; font-weight: bold; font-style: italic;} +.nezbere_large {color: #42474D; font-size: 24px; font-weight: bold; font-style: italic;} +.nezbere {color: #42474D; font-weight: bold; font-style: italic;} +.nezbere_small {color: #42474D;} +.sevtug_large {color: #AF0AAF; font-size: 24px; font-weight: bold; font-style: italic;} +.sevtug {color: #AF0AAF; font-weight: bold; font-style: italic;} +.sevtug_small {color: #AF0AAF;} +.inathneq_large {color: #1E8CE1; font-size: 24px; font-weight: bold; font-style: italic;} +.inathneq {color: #1E8CE1; font-weight: bold; font-style: italic;} +.inathneq_small {color: #1E8CE1;} +.nzcrentr_large {color: #DAAA18; font-size: 24px; font-weight: bold; font-style: italic;} +.nzcrentr {color: #DAAA18; font-weight: bold; font-style: italic;} +.nzcrentr_small {color: #DAAA18;} +.neovgre_large {color: #6E001A; font-size: 24px; font-weight: bold; font-style: italic;} +.neovgre {color: #6E001A; font-weight: bold; font-style: italic;} +.neovgre_small {color: #6E001A;} + +.newscaster {color: #800000;} +.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;} + +.alien {color: #543354;} +.noticealien {color: #00c000;} +.alertalien {color: #00c000; font-weight: bold;} +.changeling {color: #800080; font-style: italic;} + +.spider {color: #4d004d;} + +.interface {color: #330033;} + +.sans {font-family: "Comic Sans MS", cursive, sans-serif;} +.papyrus {font-family: "Papyrus", cursive, sans-serif;} +.robot {font-family: "Courier New", cursive, sans-serif;} + +.command_headset {font-weight: bold; font-size: 24px;} +.small {font-size: 8px;} +.big {font-size: 24px;} +.reallybig {font-size: 32px;} +.extremelybig {font-size: 40px;} +.greentext {color: #00FF00; font-size: 24px;} +.redtext {color: #FF0000; font-size: 24px;} +.clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} +.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} + +.icon {height: 1em; width: auto;} + +.memo {color: #638500; text-align: center;} +.memoedit {text-align: center; font-size: 16px;} +.abductor {color: #800080; font-style: italic;} +.mind_control {color: #A00D6F; font-size: 3; font-weight: bold; font-style: italic;} +.slime {color: #00CED1;} +.drone {color: #848482;} +.monkey {color: #975032;} +.swarmer {color: #2C75FF;} +.resonate {color: #298F85;} + +.monkeyhive {color: #774704;} +.monkeylead {color: #774704; font-size: 2;} + +.connectionClosed, .fatalError {background: red; color: white; padding: 5px;} +.connectionClosed.restored {background: green;} +.internal.boldnshit {color: blue; font-weight: bold;} + +/* HELPER CLASSES */ +.text-normal {font-weight: normal; font-style: normal;} +.hidden {display: none; visibility: hidden;} + diff --git a/code/modules/goonchat/browserassets/html/browserOutput.html b/code/modules/goonchat/browserassets/html/browserOutput.html index fe3be9486c..9c6d462a85 100644 --- a/code/modules/goonchat/browserassets/html/browserOutput.html +++ b/code/modules/goonchat/browserassets/html/browserOutput.html @@ -5,7 +5,7 @@ - + @@ -28,6 +28,9 @@ --ms +
+ +
diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js index 33553d765e..93a498fd06 100644 --- a/code/modules/goonchat/browserassets/js/browserOutput.js +++ b/code/modules/goonchat/browserassets/js/browserOutput.js @@ -35,6 +35,7 @@ var opts = { 'wasd': false, //Is the user in wasd mode? 'priorChatHeight': 0, //Thing for height-resizing detection 'restarting': false, //Is the round restarting? + 'darkmode':false, //Are we using darkmode? If not WHY ARE YOU LIVING IN 2009??? //Options menu 'selectedSubLoop': null, //Contains the interval loop for closing the selected sub menu @@ -394,6 +395,19 @@ function toHex(n) { return "0123456789ABCDEF".charAt((n-n%16)/16) + "0123456789ABCDEF".charAt(n%16); } +function swap() { //Swap to darkmode + if (opts.darkmode){ + document.getElementById("sheetofstyles").href = "browserOutput_white.css"; + opts.darkmode = false; + runByond('?_src_=chat&proc=swaptolightmode'); + } else { + document.getElementById("sheetofstyles").href = "browserOutput.css"; + opts.darkmode = true; + runByond('?_src_=chat&proc=swaptodarkmode'); + } + setCookie('darkmode', (opts.darkmode ? 'true' : 'false'), 365); +} + function handleClientData(ckey, ip, compid) { //byond sends player info to here var currentData = {'ckey': ckey, 'ip': ip, 'compid': compid}; @@ -601,6 +615,7 @@ $(function() { 'shighlightColor': getCookie('highlightcolor'), 'smusicVolume': getCookie('musicVolume'), 'smessagecombining': getCookie('messagecombining'), + 'sdarkmode': getCookie('darkmode'), }; if (savedConfig.sfontSize) { @@ -611,6 +626,9 @@ $(function() { $("body").css('line-height', savedConfig.slineHeight); internalOutput('Loaded line height setting of: '+savedConfig.slineHeight+'', 'internal'); } + if(savedConfig.sdarkmode == 'true'){ + swap(); + } if (savedConfig.spingDisabled) { if (savedConfig.spingDisabled == 'true') { opts.pingDisabled = true; @@ -655,8 +673,6 @@ $(function() { opts.messageCombining = true; } } - - (function() { var dataCookie = getCookie('connData'); if (dataCookie) { @@ -823,7 +839,9 @@ $(function() { $('#toggleOptions').click(function(e) { handleToggleClick($subOptions, $(this)); }); - + $('#darkmodetoggle').click(function(e) { + swap(); + }); $('#toggleAudio').click(function(e) { handleToggleClick($subAudio, $(this)); }); @@ -895,7 +913,7 @@ $(function() { $.ajax({ type: 'GET', - url: 'browserOutput.css', + url: 'browserOutput_white.css', success: function(styleData) { var blob = new Blob(['Chat Log', $messages.html(), '']); diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 8403d533c4..edf0fde83e 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -91,7 +91,7 @@ else return initial(pixel_x) -/mob/living/carbon/alien/humanoid/get_permeability_protection() +/mob/living/carbon/alien/humanoid/get_permeability_protection(list/target_zones) return 0.8 /mob/living/carbon/alien/humanoid/alien_evolve(mob/living/carbon/alien/humanoid/new_xeno) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index db7257f0f0..aa87a6e46d 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -634,6 +634,18 @@ else . += INFINITY +/mob/living/carbon/get_permeability_protection(list/target_zones = list(HANDS,CHEST,GROIN,LEGS,FEET,ARMS,HEAD)) + var/list/tally = list() + for(var/obj/item/I in get_equipped_items()) + for(var/zone in target_zones) + if(I.body_parts_covered & zone) + tally["[zone]"] = max(1 - I.permeability_coefficient, target_zones["[zone]"]) + var/protection = 0 + for(var/key in tally) + protection += tally[key] + protection *= INVERSE(target_zones.len) + return protection + //this handles hud updates /mob/living/carbon/update_damage_hud() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index b42346382f..ff4878aa13 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -27,7 +27,7 @@ for(var/bp in body_parts) if(!bp) continue - if(bp && istype(bp , /obj/item/clothing)) + if(istype(bp, /obj/item/clothing)) var/obj/item/clothing/C = bp if(C.body_parts_covered & def_zone.body_part) protection += C.armor.getRating(d_type) @@ -654,6 +654,7 @@ if(health >= 0) if(src == M) + var/to_send = "" visible_message("[src] examines [p_them()]self.", \ "You check yourself for injuries.") @@ -700,53 +701,55 @@ var/no_damage if(status == "OK" || status == "no damage") no_damage = TRUE - to_chat(src, "\t Your [LB.name] [HAS_TRAIT(src, TRAIT_SELF_AWARE) ? "has" : "is"] [status].") + to_send += "\t Your [LB.name] [HAS_TRAIT(src, TRAIT_SELF_AWARE) ? "has" : "is"] [status].\n" for(var/obj/item/I in LB.embedded_objects) - to_chat(src, "\t There is \a [I] embedded in your [LB.name]!") + to_send += "\t There is \a [I] embedded in your [LB.name]!\n" for(var/t in missing) - to_chat(src, "Your [parse_zone(t)] is missing!") + to_send += "Your [parse_zone(t)] is missing!\n" if(bleed_rate) - to_chat(src, "You are bleeding!") + to_send += "You are bleeding!\n" if(getStaminaLoss()) if(getStaminaLoss() > 30) - to_chat(src, "You're completely exhausted.") + to_send += "You're completely exhausted.\n" else - to_chat(src, "You feel fatigued.") + to_send += "You feel fatigued.\n" if(HAS_TRAIT(src, TRAIT_SELF_AWARE)) if(toxloss) if(toxloss > 10) - to_chat(src, "You feel sick.") + to_send += "You feel sick.\n" else if(toxloss > 20) - to_chat(src, "You feel nauseated.") + to_send += "You feel nauseated.\n" else if(toxloss > 40) - to_chat(src, "You feel very unwell!") + to_send += "You feel very unwell!\n" if(oxyloss) if(oxyloss > 10) - to_chat(src, "You feel lightheaded.") + to_send += "You feel lightheaded.\n" else if(oxyloss > 20) - to_chat(src, "Your thinking is clouded and distant.") + to_send += "Your thinking is clouded and distant.\n" else if(oxyloss > 30) - to_chat(src, "You're choking!") + to_send += "You're choking!\n" switch(nutrition) if(NUTRITION_LEVEL_FULL to INFINITY) - to_chat(src, "You're completely stuffed!") + to_send += "You're completely stuffed!\n" if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL) - to_chat(src, "You're well fed!") + to_send += "You're well fed!\n" if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) - to_chat(src, "You're not hungry.") + to_send += "You're not hungry.\n" if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) - to_chat(src, "You could use a bite to eat.") + to_send += "You could use a bite to eat.\n" if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) - to_chat(src, "You feel quite hungry.") + to_send += "You feel quite hungry.\n" if(0 to NUTRITION_LEVEL_STARVING) - to_chat(src, "You're starving!") + to_send += "You're starving!\n" if(roundstart_quirks.len) - to_chat(src, "You have these quirks: [get_trait_string()].") + to_send += "You have these quirks: [get_trait_string()].\n" + + to_chat(src, to_send) else if(wear_suit) wear_suit.add_fingerprint(M) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 0b40d3d26a..b65d62b63b 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -111,26 +111,6 @@ return ..() -/mob/living/carbon/human/get_permeability_protection() - var/list/prot = list("hands"=0, "chest"=0, "groin"=0, "legs"=0, "feet"=0, "arms"=0, "head"=0) - for(var/obj/item/I in get_equipped_items()) - if(I.body_parts_covered & HANDS) - prot["hands"] = max(1 - I.permeability_coefficient, prot["hands"]) - if(I.body_parts_covered & CHEST) - prot["chest"] = max(1 - I.permeability_coefficient, prot["chest"]) - if(I.body_parts_covered & GROIN) - prot["groin"] = max(1 - I.permeability_coefficient, prot["groin"]) - if(I.body_parts_covered & LEGS) - prot["legs"] = max(1 - I.permeability_coefficient, prot["legs"]) - if(I.body_parts_covered & FEET) - prot["feet"] = max(1 - I.permeability_coefficient, prot["feet"]) - if(I.body_parts_covered & ARMS) - prot["arms"] = max(1 - I.permeability_coefficient, prot["arms"]) - if(I.body_parts_covered & HEAD) - prot["head"] = max(1 - I.permeability_coefficient, prot["head"]) - var/protection = (prot["head"] + prot["arms"] + prot["feet"] + prot["legs"] + prot["groin"] + prot["chest"] + prot["hands"])/7 - return protection - /mob/living/carbon/human/can_use_guns(obj/item/G) . = ..() diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 176d967d52..d35df6b789 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -167,9 +167,9 @@ dropItemToGround(r_store, TRUE) //Again, makes sense for pockets to drop. if(l_store) dropItemToGround(l_store, TRUE) - if(wear_id) + if(wear_id && !CHECK_BITFIELD(wear_id.item_flags, NO_UNIFORM_REQUIRED)) dropItemToGround(wear_id) - if(belt) + if(belt && !CHECK_BITFIELD(belt.item_flags, NO_UNIFORM_REQUIRED)) dropItemToGround(belt) w_uniform = null update_suit_sensors() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 76d8a10474..37e5da2f84 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1019,13 +1019,12 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(SLOT_BELT) if(H.belt) return FALSE - - var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST) - - if(!H.w_uniform && !nojumpsuit && (!O || O.status != BODYPART_ROBOTIC)) - if(!disable_warning) - to_chat(H, "You need a jumpsuit before you can attach this [I.name]!") - return FALSE + if(!CHECK_BITFIELD(I.item_flags, NO_UNIFORM_REQUIRED)) + var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST) + if(!H.w_uniform && !nojumpsuit && (!O || O.status != BODYPART_ROBOTIC)) + if(!disable_warning) + to_chat(H, "You need a jumpsuit before you can attach this [I.name]!") + return FALSE if(!(I.slot_flags & ITEM_SLOT_BELT)) return return equip_delay_self_check(I, H, bypass_equip_delay_self) @@ -1062,12 +1061,12 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(SLOT_WEAR_ID) if(H.wear_id) return FALSE - - var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST) - if(!H.w_uniform && !nojumpsuit && (!O || O.status != BODYPART_ROBOTIC)) - if(!disable_warning) - to_chat(H, "You need a jumpsuit before you can attach this [I.name]!") - return FALSE + if(!CHECK_BITFIELD(I.item_flags, NO_UNIFORM_REQUIRED)) + var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST) + if(!H.w_uniform && !nojumpsuit && (!O || O.status != BODYPART_ROBOTIC)) + if(!disable_warning) + to_chat(H, "You need a jumpsuit before you can attach this [I.name]!") + return FALSE if( !(I.slot_flags & ITEM_SLOT_ID) ) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm index 5c20b0ce75..49121c9409 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -3,7 +3,7 @@ amount = dna.species.spec_stun(src,amount) return ..() -/mob/living/carbon/human/Knockdown(amount, updating = 1, ignore_canknockdown = 0) +/mob/living/carbon/human/Knockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg) amount = dna.species.spec_stun(src,amount) return ..() diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index feb80e8d2c..bb1b7ebe0e 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -377,13 +377,16 @@ There are several things that need to be remembered: if(wear_suit) var/obj/item/clothing/suit/S = wear_suit + var/no_taur_thanks = FALSE + if(!istype(S)) + no_taur_thanks = TRUE wear_suit.screen_loc = ui_oclothing if(client && hud_used && hud_used.hud_shown) if(hud_used.inventory_shown) client.screen += wear_suit update_observer_view(wear_suit,1) - if(S.mutantrace_variation) //Just make sure we've got this checked too + if(!no_taur_thanks && S.mutantrace_variation) //Just make sure we've got this checked too if(S.taurmode == NOT_TAURIC && S.adjusted == ALT_STYLE) //are we not a taur, but we have Digitigrade legs? Run this check first, then. S.alternate_worn_icon = 'modular_citadel/icons/mob/suit_digi.dmi' else @@ -404,7 +407,7 @@ There are several things that need to be remembered: if(OFFSET_SUIT in dna.species.offset_features) suit_overlay.pixel_x += dna.species.offset_features[OFFSET_SUIT][1] suit_overlay.pixel_y += dna.species.offset_features[OFFSET_SUIT][2] - if(S.center) + if(!no_taur_thanks && S.center) suit_overlay = center_image(suit_overlay, S.dimension_x, S.dimension_y) overlays_standing[SUIT_LAYER] = suit_overlay update_hair() diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index f1a6b58cd1..f9c2e2dd3d 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -152,15 +152,6 @@ return threatcount -/mob/living/carbon/monkey/get_permeability_protection() - var/protection = 0 - if(head) - protection = 1 - head.permeability_coefficient - if(wear_mask) - protection = max(1 - wear_mask.permeability_coefficient, protection) - protection = protection/7 //the rest of the body isn't covered. - return protection - /mob/living/carbon/monkey/IsVocal() if(!getorganslot(ORGAN_SLOT_LUNGS)) return 0 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index ea0f7ae388..0559e4f3d8 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -813,7 +813,7 @@ return 1 //used in datum/reagents/reaction() proc -/mob/living/proc/get_permeability_protection() +/mob/living/proc/get_permeability_protection(list/target_zones) return 0 /mob/living/proc/harvest(mob/living/user) //used for extra objects etc. in butchering diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index 807c52ea46..23ac527b2e 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -222,7 +222,7 @@ if(.) update_icons() -/mob/living/simple_animal/drone/cogscarab/Knockdown(amount, updating = 1, ignore_canknockdown = 0) +/mob/living/simple_animal/drone/cogscarab/Knockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg) . = ..() if(.) update_icons() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm index 5cee4ef1b7..cc54ad3bef 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm @@ -38,3 +38,13 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 +/mob/living/simple_animal/hostile/retaliate/bat/secbat + name = "Security Bat" + icon_state = "secbat" + icon_living = "secbat" + icon_dead = "secbat_dead" + icon_gib = "secbat_dead" + desc = "A fruit bat with a tiny little security hat who is ready to inject cuteness into any security operation." + emote_see = list("is ready to law down the law.", "flaps about with an air of authority.") + response_help = "respects the authority of" + gold_core_spawnable = FRIENDLY_SPAWN diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 5006bd2920..0880f7f432 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -62,15 +62,15 @@ return K.duration - world.time return 0 -/mob/living/proc/Knockdown(amount, updating = TRUE, ignore_canknockdown = FALSE) //Can't go below remaining duration +/mob/living/proc/Knockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg) //Can't go below remaining duration if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canknockdown) - if(absorb_stun(amount, ignore_canknockdown)) + if(absorb_stun(isnull(override_hardstun)? amount : override_hardstun, ignore_canknockdown)) return var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() if(K) - K.duration = max(world.time + amount, K.duration) - else if(amount > 0) - K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating) + K.duration = max(world.time + (isnull(override_hardstun)? amount : override_hardstun), K.duration) + else if((amount || override_hardstun) > 0) + K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating, override_hardstun, override_stamdmg) return K /mob/living/proc/SetKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE) //Sets remaining duration diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index a0126f5fdd..0cb886f11b 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -65,6 +65,7 @@ var/active_hand_index = 1 var/list/held_items = list() //len = number of hands, eg: 2 nulls is 2 empty hands, 1 item and 1 null is 1 full hand and 1 empty hand. //held_items[active_hand_index] is the actively held item, but please use get_active_held_item() instead, because OOP + var/bloody_hands = 0 var/datum/component/storage/active_storage = null//Carbon diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 9bfbffd330..0e5c2b39a5 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -34,9 +34,7 @@ var/overdosed = 0 // You fucked up and this is now triggering its overdose effects, purge that shit quick. var/self_consuming = FALSE var/metabolizing = FALSE - - - + var/invisible = FALSE //Set to true if it doesn't appear on handheld health analyzers. /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 42b012d52f..840a57055c 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1924,3 +1924,41 @@ P.length += added_length P.update() ..() + +/datum/reagent/changeling_string + name = "UNKNOWN" + id = "changeling_sting_real" + description = "404: Chemical not found." + metabolization_rate = REAGENTS_METABOLISM + color = "#0000FF" + can_synth = FALSE + var/datum/dna/original_dna + var/reagent_ticks = 0 + invisible = TRUE + +/datum/reagent/changeling_string/on_mob_metabolize(mob/living/carbon/C) + if(C && C.dna && data["desired_dna"]) + original_dna = new C.dna.type + C.dna.copy_dna(original_dna) + var/datum/dna/new_dna = data["desired_dna"] + new_dna.copy_dna(C.dna) + C.real_name = new_dna.real_name + C.updateappearance(mutcolor_update=1) + C.update_body() + C.domutcheck() + C.regenerate_icons() + ..() + +/datum/reagent/changeling_string/on_mob_end_metabolize(mob/living/carbon/C) + if(original_dna) + original_dna.copy_dna(C.dna) + C.real_name = original_dna.real_name + C.updateappearance(mutcolor_update=1) + C.update_body() + C.domutcheck() + C.regenerate_icons() + ..() + +/datum/reagent/changeling_string/Destroy() + qdel(original_dna) + return ..() diff --git a/code/modules/reagents/reagent_containers/rags.dm b/code/modules/reagents/reagent_containers/rags.dm new file mode 100644 index 0000000000..dc4e98d507 --- /dev/null +++ b/code/modules/reagents/reagent_containers/rags.dm @@ -0,0 +1,177 @@ +/obj/item/reagent_containers/rag + name = "damp rag" + desc = "For cleaning up messes, you suppose." + w_class = WEIGHT_CLASS_TINY + icon = 'icons/obj/toy.dmi' + icon_state = "rag" + item_flags = NOBLUDGEON + reagent_flags = OPENCONTAINER + amount_per_transfer_from_this = 5 + possible_transfer_amounts = list() + volume = 5 + spillable = FALSE + var/wipe_sound + var/soak_efficiency = 1 + var/extinguish_efficiency = 0 + var/action_speed = 3 SECONDS + var/damp_threshold = 0.5 + +/obj/item/reagent_containers/rag/suicide_act(mob/user) + user.visible_message("[user] is smothering [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!") + return (OXYLOSS) + +/obj/item/reagent_containers/rag/examine(mob/user) + . = ..() + if(reagents.total_volume) + to_chat(user, "Alt-Click to squeeze the liquids out of it.") + +/obj/item/reagent_containers/rag/afterattack(atom/A as obj|turf|area, mob/user,proximity) + . = ..() + if(!proximity) + return + if(iscarbon(A) && A.reagents && reagents.total_volume) + var/mob/living/carbon/C = A + var/reagentlist = pretty_string_from_reagent_list(reagents) + var/log_object = "a damp rag containing [reagentlist]" + if(user.a_intent == INTENT_HARM && !C.is_mouth_covered()) + reagents.reaction(C, INGEST) + reagents.trans_to(C, 5) + C.visible_message("[user] has smothered \the [C] with \the [src]!", "[user] has smothered you with \the [src]!", "You hear some struggling and muffled cries of surprise.") + log_combat(user, C, "smothered", log_object) + else + reagents.reaction(C, TOUCH) + reagents.remove_all(5) + C.visible_message("[user] has touched \the [C] with \the [src].") + log_combat(user, C, "touched", log_object) + + else if(istype(A) && src in user) + user.visible_message("[user] starts to wipe down [A] with [src]!", "You start to wipe down [A] with [src]...") + if(do_after(user, action_speed, target = A)) + user.visible_message("[user] finishes wiping off [A]!", "You finish wiping off [A].") + SEND_SIGNAL(A, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_MEDIUM) + return + +/obj/item/reagent_containers/rag/pre_altattackby(mob/living/M, mob/living/user, params) + if(istype(M) && user.a_intent == INTENT_HELP) + user.changeNext_move(CLICK_CD_MELEE) + if(user.on_fire) + user.visible_message("\The [user] uses \the [src] to pat out [M == user ? "[user.p_their()]" : "\the [M]'s"] flames!") + if(hitsound) + playsound(M, hitsound, 25, 1) + M.adjust_fire_stacks(-min(extinguish_efficiency, M.fire_stacks)) + else + if(reagents.total_volume > (volume * damp_threshold)) + to_chat(user, "\The [src] is too drenched to be used to dry [user == M ? "yourself" : "\the [M]"] off.") + return TRUE + user.visible_message("\The [user] starts drying [M == user ? "[user.p_them()]self" : "\the [M]"] off with \the [src]...") + if(do_mob(user, M, action_speed)) + if(reagents.total_volume > (volume * damp_threshold)) + return + user.visible_message("\The [user] dries [M == user ? "[user.p_them()]self" : "\the [M]"] off with \the [src].") + if(wipe_sound) + playsound(M, wipe_sound, 25, 1) + if(M.fire_stacks) + var/minus_plus = M.fire_stacks < 0 ? 1 : -1 + var/amount = min(abs(M.fire_stacks), soak_efficiency) + var/r_id = "fuel" + if(M.fire_stacks < 0) + r_id = "water" + reagents.add_reagent(r_id, amount * 0.3) + M.adjust_fire_stacks(minus_plus * amount) + M.wash_cream() + return TRUE + return ..() + +/obj/item/reagent_containers/rag/AltClick(mob/user) + . = ..() + if(reagents.total_volume && user.canUseTopic(src, BE_CLOSE)) + to_chat(user, "You start squeezing the liquids out of \the [src]...") + if(do_after(user, action_speed, TRUE, src)) + to_chat(user, "You squeeze \the [src] dry.") + var/atom/react_loc = get_turf(src) + if(ismob(react_loc)) + react_loc = react_loc.loc + if(react_loc) + reagents.reaction(react_loc, TOUCH) + reagents.clear_reagents() + +/obj/item/reagent_containers/rag/towel + name = "towel" + desc = "A soft cotton towel." + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "towel" + item_state = "towel" + slot_flags = ITEM_SLOT_HEAD | ITEM_SLOT_BELT | ITEM_SLOT_OCLOTHING + item_flags = NOBLUDGEON | NO_UNIFORM_REQUIRED //so it can be worn on the belt slot even with no uniform. + force = 1 + w_class = WEIGHT_CLASS_NORMAL + attack_verb = list("whipped") + hitsound = 'sound/items/towelwhip.ogg' + volume = 10 + total_mass = 2 + wipe_sound = 'sound/items/towelwipe.ogg' + soak_efficiency = 4 + extinguish_efficiency = 3 + var/flat_icon = "towel_flat" + var/folded_icon = "towel" + var/list/possible_colors + +/obj/item/reagent_containers/rag/towel/Initialize() + . = ..() + if(possible_colors) + add_atom_colour(pick(possible_colors), FIXED_COLOUR_PRIORITY) + +/obj/item/reagent_containers/rag/towel/attack(mob/living/M, mob/living/user) + if(user.a_intent == INTENT_HARM) + DISABLE_BITFIELD(item_flags, NOBLUDGEON) + . = TRUE + ..() + if(.) + ENABLE_BITFIELD(item_flags, NOBLUDGEON) + +/obj/item/reagent_containers/rag/towel/equipped(mob/living/user, slot) + . = ..() + switch(slot) + if(SLOT_BELT) + body_parts_covered = GROIN|LEGS + if(SLOT_WEAR_SUIT) + body_parts_covered = CHEST|GROIN|LEGS + if(SLOT_HEAD) + body_parts_covered = HEAD + flags_inv = HIDEHAIR + +/obj/item/reagent_containers/rag/towel/dropped(mob/user) + . = ..() + body_parts_covered = NONE + flags_inv = NONE + +/obj/item/reagent_containers/rag/towel/attack_self(mob/user) + if(!user.CanReach(src) || !user.dropItemToGround(src)) + return + to_chat(user, "You lay out \the [src] flat on the ground.") + icon_state = flat_icon + layer = BELOW_OBJ_LAYER + +/obj/item/reagent_containers/rag/towel/pickup(mob/living/user) + . = ..() + icon_state = folded_icon + layer = initial(layer) + +/obj/item/reagent_containers/rag/towel/on_reagent_change(changetype) + force = initial(force) + round(reagents.total_volume * 0.5) + +/obj/item/reagent_containers/rag/towel/random + possible_colors = list("#FF0000","#FF7F00","#FFFF00","#00FF00","#0000FF","#4B0082","#8F00FF") + +/obj/item/reagent_containers/rag/towel/syndicate + name = "syndicate towel" + desc = "Truly a weapon of mass destruction." + possible_colors = list("#DD1A1A", "#DB4325", "#E02700") + force = 4 + armour_penetration = 10 + volume = 20 + soak_efficiency = 6 + extinguish_efficiency = 5 + action_speed = 15 + damp_threshold = 0.8 + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 20, "bio" = 20, "rad" = 20, "fire" = 50, "acid" = 50) //items don't provide armor to wearers unlike clothing yet. \ No newline at end of file diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm index eaa1f36b75..06e38bb3eb 100644 --- a/code/modules/shuttle/ferry.dm +++ b/code/modules/shuttle/ferry.dm @@ -37,4 +37,4 @@ return last_request = world.time to_chat(usr, "Your request has been received by CentCom.") - to_chat(GLOB.admins, "FERRY: [ADMIN_LOOKUPFLW(usr)] (Move Ferry) is requesting to move the transport ferry to CentCom.") + to_chat(GLOB.admins, "FERRY: [ADMIN_LOOKUPFLW(usr)] (Move Ferry) is requesting to move the transport ferry to CentCom.") diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm index 59440cc3ee..1eca915d70 100644 --- a/code/modules/surgery/helpers.dm +++ b/code/modules/surgery/helpers.dm @@ -110,22 +110,15 @@ return 0.5 -/proc/get_location_accessible(mob/M, location) +/proc/get_location_accessible(mob/living/M, location) var/covered_locations = 0 //based on body_parts_covered var/face_covered = 0 //based on flags_inv var/eyesmouth_covered = 0 //based on flags_cover - if(iscarbon(M)) - var/mob/living/carbon/C = M - for(var/obj/item/clothing/I in list(C.back, C.wear_mask, C.head)) - covered_locations |= I.body_parts_covered - face_covered |= I.flags_inv - eyesmouth_covered |= I.flags_cover - if(ishuman(C)) - var/mob/living/carbon/human/H = C - for(var/obj/item/I in list(H.wear_suit, H.w_uniform, H.shoes, H.belt, H.gloves, H.glasses, H.ears)) - covered_locations |= I.body_parts_covered - face_covered |= I.flags_inv - eyesmouth_covered |= I.flags_cover + for(var/A in M.get_equipped_items()) + var/obj/item/I = A + covered_locations |= I.body_parts_covered + face_covered |= I.flags_inv + eyesmouth_covered |= I.flags_cover switch(location) if(BODY_ZONE_HEAD) diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index aaa1cf3b6f..b3b21fe375 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -12,7 +12,8 @@ /obj/item/reagent_containers/food/snacks/donut = 12, /obj/item/storage/box/evidence = 6, /obj/item/flashlight/seclite = 4, - /obj/item/restraints/legcuffs/bola/energy = 7) + /obj/item/restraints/legcuffs/bola/energy = 7, + /obj/item/secbat = 5) contraband = list(/obj/item/clothing/glasses/sunglasses = 2, /obj/item/storage/fancy/donut_box = 2, /obj/item/ssword_kit = 1) diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 9481d4d086..1bc0e242c8 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -199,7 +199,7 @@ /obj/item/clothing/suit/apron/purple_bartender = 2, /obj/item/clothing/head/soft/black = 4, /obj/item/clothing/shoes/sneakers/black = 4, - /obj/item/reagent_containers/glass/rag = 4, + /obj/item/reagent_containers/rag = 4, /obj/item/storage/box/beanbag = 1, /obj/item/clothing/suit/armor/vest/alt = 1, /obj/item/circuitboard/machine/dish_drive = 1, @@ -227,7 +227,7 @@ /obj/item/clothing/suit/toggle/chef = 2, /obj/item/clothing/under/rank/chef = 2, /obj/item/clothing/head/chefhat = 2, - /obj/item/reagent_containers/glass/rag = 3) + /obj/item/reagent_containers/rag = 3) refill_canister = /obj/item/vending_refill/wardrobe/chef_wardrobe /obj/item/vending_refill/wardrobe/chef_wardrobe diff --git a/html/changelogs/AutoChangeLog-pr-8829.yml b/html/changelogs/AutoChangeLog-pr-8829.yml new file mode 100644 index 0000000000..6d0dd108dd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8829.yml @@ -0,0 +1,5 @@ +author: "BurgerLUA" +delete-after: True +changes: + - code_imp: "Added a new framework for reagents. Reagents can now have a bool that determines if it can be detected by handheld medical analyzers. Currently only the changeling sting chemical does this." + - balance: "Made changeling transformation string last between 10-15 minutes. Lowered the dna cost of changeling sting from 3 dna to 2 dna. Lowered the chemical cost from 50 to 10. Lowered the loudness from 2 to 1. Changeling sting transformation can be removed via high doses of calomel." diff --git a/html/changelogs/AutoChangeLog-pr-8830.yml b/html/changelogs/AutoChangeLog-pr-8830.yml new file mode 100644 index 0000000000..e4cb94374b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8830.yml @@ -0,0 +1,6 @@ +author: "Ghommie (original PRs by Kmc2000 and actioninja)" +delete-after: True +changes: + - rscadd: "Added darkmode! You can opt-in to this by clicking the new toggle darkmode button just beside the settings one." + - rscadd: "Byond members will now have a new setting for their Antag OOC color, instead of using their OOC one. (Antag OOC still locked under admin discretion though)" + - rscdel: "Default black'n'white windows style." diff --git a/html/changelogs/AutoChangeLog-pr-8898.yml b/html/changelogs/AutoChangeLog-pr-8898.yml new file mode 100644 index 0000000000..e836d4225e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8898.yml @@ -0,0 +1,4 @@ +author: "WhiteHusky" +delete-after: True +changes: + - tweak: "Checking yourself shouldn't freeze the client anymore." diff --git a/html/changelogs/AutoChangeLog-pr-8906.yml b/html/changelogs/AutoChangeLog-pr-8906.yml new file mode 100644 index 0000000000..c988071f3e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8906.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - tweak: "Sweaters now cover groins too." diff --git a/html/changelogs/AutoChangeLog-pr-8909.yml b/html/changelogs/AutoChangeLog-pr-8909.yml new file mode 100644 index 0000000000..bfb1470f71 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8909.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixes krav maga gloves, wizard spells knockdowns." diff --git a/html/changelogs/AutoChangeLog-pr-8917.yml b/html/changelogs/AutoChangeLog-pr-8917.yml new file mode 100644 index 0000000000..2b858cad47 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8917.yml @@ -0,0 +1,4 @@ +author: "Bhijn" +delete-after: True +changes: + - bugfix: "Warp whistles no longer grant permanent invulnerability and invisibility" diff --git a/html/changelogs/AutoChangeLog-pr-8920.yml b/html/changelogs/AutoChangeLog-pr-8920.yml new file mode 100644 index 0000000000..6d3ae3ada4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8920.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "Towels. Crafted with 3 sheets of cloth, they can be worn on head, suit and belt slots even without uniform, or laid flat on the floor. Sprites from Baystation and Aurora Station." + - rscadd: "You can combat mode right click people while wielding rags and towels to pat out their flames (to no use for rags) or otherwise drying them out." diff --git a/html/changelogs/AutoChangeLog-pr-8922.yml b/html/changelogs/AutoChangeLog-pr-8922.yml new file mode 100644 index 0000000000..1e641bd424 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8922.yml @@ -0,0 +1,4 @@ +author: "BurgerBB" +delete-after: True +changes: + - rscadd: "Gamemode voting results are displayed at the end-round screen." diff --git a/html/changelogs/AutoChangeLog-pr-8925.yml b/html/changelogs/AutoChangeLog-pr-8925.yml new file mode 100644 index 0000000000..ddc90eba19 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8925.yml @@ -0,0 +1,4 @@ +author: "BurgerLUA" +delete-after: True +changes: + - bugfix: "Fixed autolathe wires not correctly shocking you when pulsed." diff --git a/html/changelogs/AutoChangeLog-pr-8926.yml b/html/changelogs/AutoChangeLog-pr-8926.yml new file mode 100644 index 0000000000..762318ab21 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8926.yml @@ -0,0 +1,4 @@ +author: "Fermis" +delete-after: True +changes: + - rscadd: "Added the secbat, a box to hold it and the ability to dispense it from the SecTech vendor." diff --git a/html/changelogs/AutoChangeLog-pr-8934.yml b/html/changelogs/AutoChangeLog-pr-8934.yml new file mode 100644 index 0000000000..e86e47a45f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8934.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "More loadout gear" diff --git a/html/changelogs/AutoChangeLog-pr-8939.yml b/html/changelogs/AutoChangeLog-pr-8939.yml new file mode 100644 index 0000000000..6041d66721 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-8939.yml @@ -0,0 +1,9 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "The syndicate base's bathroom is now fitted with a shower, and a special towel." + - bugfix: "Fixed many issues with towels." + - tweak: "The dry people off with rags/towels action can only be done if the object is NOT moist with reagents now. Also cleans banana creaming." + - rscadd: "Towels deal more damage while soaked with reagents." + - rscadd: "You can now squeeze rags/towels with Alt-Click." + - rscdel: "deleted an old and crappier towel sprite that got in the way." diff --git a/icons/member_content.dmi b/icons/member_content.dmi index bb59764627..7744371119 100644 Binary files a/icons/member_content.dmi and b/icons/member_content.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index c98ca98c42..2a85f8a422 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 02fdc52b45..f1e2f4e85a 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 09d6fe5374..3ca7290a0f 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index f1b125eb20..71c453856a 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index 7ef316be17..0ca09ad810 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 42c32f134a..835f3448b4 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/obj/clothing/belts.dm b/icons/obj/clothing/belts.dm deleted file mode 100644 index 34c716f5d8..0000000000 Binary files a/icons/obj/clothing/belts.dm and /dev/null differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index 0d68f00c8b..8788567b36 100644 Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index ce28145dc2..9f1d5b0b0c 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -434,3 +434,11 @@ datum/gear/darksabresheath category = SLOT_NECK path = /obj/item/bedsheet/captain ckeywhitelist = list("tikibomb") + +/datum/gear/borgplush + name = "Robot Plush" + category = SLOT_IN_BACKPACK + /obj/item/toy/plush/borgplushie + ckeywhitelist = list("nicholaiavenicci") + + diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm index 6fa597565f..c2713b49be 100644 --- a/modular_citadel/code/modules/client/loadout/backpack.dm +++ b/modular_citadel/code/modules/client/loadout/backpack.dm @@ -23,11 +23,6 @@ category = SLOT_IN_BACKPACK path = /obj/item/toy/plush/lampplushie -/datum/gear/plushrng - name = "Random plushie" - category = SLOT_IN_BACKPACK - path = /obj/item/toy/plush/random - /datum/gear/tennis name = "Classic Tennis Ball" category = SLOT_IN_BACKPACK @@ -84,8 +79,24 @@ path = /obj/item/toy/katana cost = 3 -//datum/gear/lumeyes -// name = "Luminescent eye auto surgeon" -// category = SLOT_IN_BACKPACK -// path = /obj/item/autosurgeon/gloweyes -// cost = 4 +/datum/gear/box + name = "Spare box" + category = SLOT_IN_BACKPACK + path = /obj/item/storage/box + cost = 2 + +/datum/gear/crowbar + name = "Pocket Crowbar" + category = SLOT_IN_BACKPACK + path = /obj/item/crowbar + cost = 2 + +/datum/gear/tapeplayer + name = "Taperecorder" + category = SLOT_IN_BACKPACK + path = /obj/item/taperecorder + +/datum/gear/tape + name = "Spare cassette tape" + category = SLOT_IN_BACKPACK + path = /obj/item/tape/random \ No newline at end of file diff --git a/modular_citadel/code/modules/clothing/under/turtlenecks.dm b/modular_citadel/code/modules/clothing/under/turtlenecks.dm index f4e1ba8bd9..fd13da11e9 100644 --- a/modular_citadel/code/modules/clothing/under/turtlenecks.dm +++ b/modular_citadel/code/modules/clothing/under/turtlenecks.dm @@ -43,8 +43,8 @@ icon_state = "bb_turtle" item_state = "w_suit" item_color = "bb_turtle" - body_parts_covered = CHEST|ARMS - can_adjust = 1 + body_parts_covered = CHEST|GROIN|ARMS + can_adjust = TRUE icon = 'modular_citadel/icons/obj/clothing/turtlenecks.dmi' alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi' mutantrace_variation = NO_MUTANTRACE_VARIATION diff --git a/modular_citadel/code/modules/mentor/mentorpm.dm b/modular_citadel/code/modules/mentor/mentorpm.dm index 34ace6f002..4c9a4766ec 100644 --- a/modular_citadel/code/modules/mentor/mentorpm.dm +++ b/modular_citadel/code/modules/mentor/mentorpm.dm @@ -3,7 +3,7 @@ set category = "Mentor" set name = "Mentor PM" if(!is_mentor()) - to_chat(src, "Error: Mentor-PM-Panel: Only Mentors and Admins may use this command.") + to_chat(src, "Error: Mentor-PM-Panel: Only Mentors and Admins may use this command.") return var/list/client/targets[0] for(var/client/T) @@ -27,24 +27,24 @@ else if(istype(whom,/client)) C = whom if(!C) - if(is_mentor()) to_chat(src, "Error: Mentor-PM: Client not found.") + if(is_mentor()) to_chat(src, "Error: Mentor-PM: Client not found.") else mentorhelp(msg) //Mentor we are replying to left. Mentorhelp instead(check below) return if(is_mentor(whom)) - to_chat(GLOB.admins | GLOB.mentors, "[src] has started replying to [whom]'s mhelp.") + to_chat(GLOB.admins | GLOB.mentors, "[src] has started replying to [whom]'s mhelp.") //get message text, limit it's length.and clean/escape html if(!msg) msg = input(src,"Message:", "Private message") as text|null - + if(!msg && is_mentor(whom)) - to_chat(GLOB.admins | GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.") + to_chat(GLOB.admins | GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.") return if(!C) if(is_mentor()) - to_chat(src, "Error: Mentor-PM: Client not found.") + to_chat(src, "Error: Mentor-PM: Client not found.") else mentorhelp(msg) //Mentor we are replying to has vanished, Mentorhelp instead (how the fuck does this work?let's hope it works,shrug) return @@ -54,8 +54,8 @@ return msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) - if(!msg && is_mentor(whom)) - to_chat(GLOB.admins | GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.") + if(!msg && is_mentor(whom)) + to_chat(GLOB.admins | GLOB.mentors, "[src] has stopped their reply to [whom]'s mhelp.") return log_mentor("Mentor PM: [key_name(src)]->[key_name(C)]: [msg]") @@ -65,21 +65,21 @@ var/show_char = CONFIG_GET(flag/mentors_mobname_only) if(C.is_mentor()) if(is_mentor())//both are mentors - to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0, 0)]: [msg]") - to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]") + to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0, 0)]: [msg]") + to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]
") - else //recipient is an mentor but sender is not - to_chat(C, "Reply PM from-[key_name_mentor(src, C, 1, 0, show_char)]: [msg]") - to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]") + else //recipient is a mentor but sender is not + to_chat(C, "Reply PM from-[key_name_mentor(src, C, 1, 0, show_char)]: [msg]") + to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, 0)]: [msg]") else - if(is_mentor()) //sender is an mentor but recipient is not. - to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0, 0)]: [msg]") - to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, show_char)]: [msg]") + if(is_mentor()) //sender is a mentor but recipient is not. + to_chat(C, "Mentor PM from-[key_name_mentor(src, C, 1, 0, 0)]: [msg]") + to_chat(src, "Mentor PM to-[key_name_mentor(C, C, 1, 0, show_char)]: [msg]") //we don't use message_Mentors here because the sender/receiver might get it too var/show_char_sender = !is_mentor() && CONFIG_GET(flag/mentors_mobname_only) var/show_char_recip = !C.is_mentor() && CONFIG_GET(flag/mentors_mobname_only) for(var/client/X in GLOB.mentors | GLOB.admins) if(X.key!=key && X.key!=C.key) //check client/X is an Mentor and isn't the sender or recipient - to_chat(X, "Mentor PM: [key_name_mentor(src, X, 0, 0, show_char_sender)]->[key_name_mentor(C, X, 0, 0, show_char_recip)]: [msg]") //inform X + to_chat(X, "Mentor PM: [key_name_mentor(src, X, 0, 0, show_char_sender)]->[key_name_mentor(C, X, 0, 0, show_char_recip)]: [msg]") //inform X diff --git a/modular_citadel/code/modules/mob/living/status_procs.dm b/modular_citadel/code/modules/mob/living/status_procs.dm deleted file mode 100644 index 851c7438a7..0000000000 --- a/modular_citadel/code/modules/mob/living/status_procs.dm +++ /dev/null @@ -1,10 +0,0 @@ -/mob/living/Knockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg) //Can't go below remaining duration - if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canknockdown) - if(absorb_stun(isnull(override_hardstun)? amount : override_hardstun, ignore_canknockdown)) - return - var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() - if(K) - K.duration = max(world.time + (isnull(override_hardstun)? amount : override_hardstun), K.duration) - else if((amount || override_hardstun) > 0) - K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating, override_hardstun, override_stamdmg) - return K diff --git a/modular_citadel/interface/skin.dmf b/modular_citadel/interface/skin.dmf index e4531a24ea..c5b5138609 100644 --- a/modular_citadel/interface/skin.dmf +++ b/modular_citadel/interface/skin.dmf @@ -54,7 +54,7 @@ window "mainwindow" size = 640x440 anchor1 = none anchor2 = none - background-color = #272727 + background-color = #eeeeee is-default = true saved-params = "pos;size;is-minimized;is-maximized" icon = 'icons\\ss13_64.png' @@ -66,7 +66,7 @@ window "mainwindow" size = 637x440 anchor1 = 0,0 anchor2 = 100,100 - background-color = #272727 + background-color = #eeeeee saved-params = "splitter" left = "mapwindow" right = "infowindow" @@ -78,7 +78,7 @@ window "mainwindow" size = 200x200 anchor1 = none anchor2 = none - background-color = #272727 + background-color = #ffffff is-visible = false saved-params = "" elem "tooltip" @@ -87,7 +87,7 @@ window "mainwindow" size = 999x999 anchor1 = none anchor2 = none - background-color = #272727 + background-color = #ffffff is-visible = false saved-params = "" @@ -98,7 +98,6 @@ window "mapwindow" size = 640x480 anchor1 = none anchor2 = none - background-color = #272727 saved-params = "pos;size;is-minimized;is-maximized" is-pane = true elem "map" @@ -120,7 +119,7 @@ window "infowindow" size = 640x480 anchor1 = none anchor2 = none - background-color = #272727 + background-color = #eeeeee saved-params = "pos;size;is-minimized;is-maximized" is-pane = true elem "info" @@ -129,7 +128,6 @@ window "infowindow" size = 640x445 anchor1 = 0,0 anchor2 = 100,100 - background-color = #272727 saved-params = "splitter" left = "statwindow" right = "outputwindow" @@ -140,8 +138,7 @@ window "infowindow" size = 104x20 anchor1 = 3,0 anchor2 = 19,0 - text-color = #ffffff - background-color = #40628a + background-color = #90b3dd saved-params = "is-checked" text = "Changelog" command = "changelog" @@ -151,8 +148,7 @@ window "infowindow" size = 100x20 anchor1 = 19,0 anchor2 = 34,0 - text-color = #ffffff - background-color = #40628a + background-color = #90b3dd saved-params = "is-checked" text = "Rules" command = "rules" @@ -162,8 +158,7 @@ window "infowindow" size = 100x20 anchor1 = 34,0 anchor2 = 50,0 - text-color = #ffffff - background-color = #40628a + background-color = #90b3dd saved-params = "is-checked" text = "Wiki" command = "wiki" @@ -173,8 +168,7 @@ window "infowindow" size = 100x20 anchor1 = 50,0 anchor2 = 66,0 - text-color = #ffffff - background-color = #40628a + background-color = #90b3dd saved-params = "is-checked" text = "Forum" command = "forum" @@ -184,8 +178,7 @@ window "infowindow" size = 100x20 anchor1 = 66,0 anchor2 = 81,0 - text-color = #ffffff - background-color = #40628a + background-color = #90b3dd saved-params = "is-checked" text = "GitHub" command = "github" @@ -196,8 +189,7 @@ window "infowindow" anchor1 = 81,0 anchor2 = 97,0 font-size = 8 - text-color = #ffffff - background-color = #40628a + background-color = #ef7f7f saved-params = "is-checked" text = "Report Issue" command = "report-issue" @@ -209,7 +201,7 @@ window "outputwindow" size = 640x480 anchor1 = none anchor2 = none - background-color = #272727 + background-color = #eeeeee saved-params = "pos;size;is-minimized;is-maximized" titlebar = false statusbar = false @@ -223,9 +215,9 @@ window "outputwindow" size = 595x20 anchor1 = 0,100 anchor2 = 100,100 - font-size = 10 background-color = #d3b5b5 is-default = true + border = sunken saved-params = "command" elem "say" type = BUTTON @@ -233,8 +225,7 @@ window "outputwindow" size = 37x20 anchor1 = 100,100 anchor2 = none - text-color = #ffffff - background-color = #272727 + background-color = #eeeeee saved-params = "is-checked" text = "Chat" command = ".winset \"say.is-checked=true ? input.command=\"!say \\\"\" : input.command=\"" @@ -246,7 +237,7 @@ window "outputwindow" size = 640x456 anchor1 = 0,0 anchor2 = 100,100 - background-color = #272727 + background-color = #ffffff is-visible = false is-disabled = true saved-params = "" @@ -257,8 +248,6 @@ window "outputwindow" size = 640x456 anchor1 = 0,0 anchor2 = 100,100 - text-color = #40628a - background-color = #272727 is-default = true saved-params = "" @@ -269,7 +258,7 @@ window "statwindow" size = 640x480 anchor1 = none anchor2 = none - background-color = #272727 + background-color = #eeeeee saved-params = "pos;size;is-minimized;is-maximized" is-pane = true elem "stat" @@ -278,14 +267,9 @@ window "statwindow" size = 640x480 anchor1 = 0,0 anchor2 = 100,100 - text-color = #ffffff - background-color = #383838 is-default = true saved-params = "" - tab-text-color = #ffffff - tab-background-color = #272727 - prefix-color = #ebebeb - suffix-color = #ebebeb + tab-background-color = #eeeeee window "preferences_window" elem "preferences_window" @@ -294,7 +278,6 @@ window "preferences_window" size = 1280x1000 anchor1 = none anchor2 = none - background-color = none is-visible = false saved-params = "pos;size;is-minimized;is-maximized" statusbar = false @@ -304,7 +287,6 @@ window "preferences_window" size = 960x1000 anchor1 = 0,0 anchor2 = 75,100 - background-color = none saved-params = "" elem "character_preview_map" type = MAP diff --git a/sound/items/towelwhip.ogg b/sound/items/towelwhip.ogg new file mode 100644 index 0000000000..49dab750a8 Binary files /dev/null and b/sound/items/towelwhip.ogg differ diff --git a/sound/items/towelwipe.ogg b/sound/items/towelwipe.ogg new file mode 100644 index 0000000000..2bee55c38d Binary files /dev/null and b/sound/items/towelwipe.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 05cd66987b..fe0a2e8063 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1453,6 +1453,7 @@ #include "code\modules\client\client_colour.dm" #include "code\modules\client\client_defines.dm" #include "code\modules\client\client_procs.dm" +#include "code\modules\client\darkmode.dm" #include "code\modules\client\message.dm" #include "code\modules\client\player_details.dm" #include "code\modules\client\preferences.dm" @@ -1546,7 +1547,6 @@ #include "code\modules\crafting\recipes.dm" #include "code\modules\detectivework\detective_work.dm" #include "code\modules\detectivework\evidence.dm" -#include "code\modules\detectivework\footprints_and_rag.dm" #include "code\modules\detectivework\scanner.dm" #include "code\modules\emoji\emoji_parse.dm" #include "code\modules\error_handler\error_handler.dm" @@ -2499,6 +2499,7 @@ #include "code\modules\reagents\reagent_containers\medspray.dm" #include "code\modules\reagents\reagent_containers\patch.dm" #include "code\modules\reagents\reagent_containers\pill.dm" +#include "code\modules\reagents\reagent_containers\rags.dm" #include "code\modules\reagents\reagent_containers\spray.dm" #include "code\modules\reagents\reagent_containers\syringes.dm" #include "code\modules\recycling\conveyor2.dm" @@ -2987,7 +2988,6 @@ #include "modular_citadel\code\modules\mob\dead\new_player\sprite_accessories.dm" #include "modular_citadel\code\modules\mob\living\damage_procs.dm" #include "modular_citadel\code\modules\mob\living\living.dm" -#include "modular_citadel\code\modules\mob\living\status_procs.dm" #include "modular_citadel\code\modules\mob\living\carbon\carbon.dm" #include "modular_citadel\code\modules\mob\living\carbon\damage_procs.dm" #include "modular_citadel\code\modules\mob\living\carbon\life.dm"