diff --git a/.vscode/settings.json b/.vscode/settings.json index 1a16e41dff..2fdade81ec 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,7 +13,7 @@ "source.fixAll.eslint": true }, "workbench.editorAssociations": { - "*.dmi": "imagePreview.previewEditor" + "*.dmi": "dmiEditor.dmiEditor" }, "files.eol": "\n", "gitlens.advanced.blame.customArguments": ["-w"], diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 79498d7b42..7189ba538d 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -80,7 +80,7 @@ //DNA - Because fuck you and your magic numbers being all over the codebase. #define DNA_BLOCK_SIZE 3 -#define DNA_UNI_IDENTITY_BLOCKS 15 +#define DNA_UNI_IDENTITY_BLOCKS 19 #define DNA_HAIR_COLOR_BLOCK 1 #define DNA_FACIAL_HAIR_COLOR_BLOCK 2 #define DNA_SKIN_TONE_BLOCK 3 @@ -96,6 +96,10 @@ #define DNA_MUTANTEAR_BLOCK 13 #define DNA_MUTANTMARKING_BLOCK 14 #define DNA_TAUR_BLOCK 15 +#define DNA_BARK_SOUND_BLOCK 16 +#define DNA_BARK_SPEED_BLOCK 17 +#define DNA_BARK_PITCH_BLOCK 18 +#define DNA_BARK_VARIANCE_BLOCK 19 #define DNA_SEQUENCE_LENGTH 4 #define DNA_MUTATION_BLOCKS 8 diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm new file mode 100644 index 0000000000..cc6e5bd49a --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm @@ -0,0 +1,3 @@ +/// Called from /mob/living/PushAM -- Called when this mob is about to push a movable, but before it moves +/// (aotm/movable/being_pushed) +#define COMSIG_LIVING_PUSHING_MOVABLE "living_pushing_movable" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm new file mode 100644 index 0000000000..5d2a471c0a --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -0,0 +1,2 @@ +///From base of mob/living/MobBump() (mob/living) +#define COMSIG_LIVING_MOB_BUMP "living_mob_bump" diff --git a/code/__DEFINES/movement.dm b/code/__DEFINES/movement.dm index 5bf7de8647..bccbd425dd 100644 --- a/code/__DEFINES/movement.dm +++ b/code/__DEFINES/movement.dm @@ -13,7 +13,7 @@ GLOBAL_VAR_INIT(glide_size_multiplier, 1.0) /// Then that's multiplied by the global glide size multiplier. 1.25 by default feels pretty close to spot on. This is just to try to get byond to behave. /// The whole result is then clamped to within the range above. /// Not very readable but it works -#define DELAY_TO_GLIDE_SIZE(delay) (clamp(((32 / max((delay) / world.tick_lag, 1)) * GLOB.glide_size_multiplier), MIN_GLIDE_SIZE, MAX_GLIDE_SIZE)) +#define DELAY_TO_GLIDE_SIZE(delay) (clamp(((world.icon_size / max((delay) / world.tick_lag, 1)) * GLOB.glide_size_multiplier), MIN_GLIDE_SIZE, MAX_GLIDE_SIZE)) /// Enables smooth movement // #define SMOOTH_MOVEMENT diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 4fb7784d57..bcda72cf37 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -15,8 +15,10 @@ #define DISABLE_DEATHRATTLE (1<<12) #define DISABLE_ARRIVALRATTLE (1<<13) #define COMBOHUD_LIGHTING (1<<14) -#define VERB_CONSENT (1<<15) // Skyrat - ERP Mechanic Addition -#define LEWD_VERB_SOUNDS (1<<16) // Skyrat - ERP Mechanic Addition +#define SOUND_BARK (1<<15) +#define VERB_CONSENT (1<<16) // Sandstorm - ERP Mechanic Addition +#define LEWD_VERB_SOUNDS (1<<17) // Sandstorm - ERP Mechanic Addition +#define TG_PLAYER_PANEL (1<<18) // SPLURT - Opt for the old splashscreen player panel #define DEADMIN_ALWAYS (1<<0) #define DEADMIN_ANTAGONIST (1<<1) @@ -24,7 +26,7 @@ #define DEADMIN_POSITION_SECURITY (1<<3) #define DEADMIN_POSITION_SILICON (1<<4) -#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS) +#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS|SOUND_BARK) //Chat toggles #define CHAT_OOC (1<<0) diff --git a/code/__DEFINES/reactions.dm b/code/__DEFINES/reactions.dm index d1329060eb..51c6e3c394 100644 --- a/code/__DEFINES/reactions.dm +++ b/code/__DEFINES/reactions.dm @@ -27,6 +27,7 @@ #define NOBLIUM_RESEARCH_AMOUNT 25 #define BZ_RESEARCH_SCALE 4 #define BZ_RESEARCH_MAX_AMOUNT 400 +#define QCD_RESEARCH_AMOUNT 2 // often made in absolutely massive quantities due to the simple nature of fusion #define MIASMA_RESEARCH_AMOUNT 6 #define STIMULUM_RESEARCH_AMOUNT 50 //Plasma fusion properties diff --git a/code/__DEFINES/rendering/atom_hud.dm b/code/__DEFINES/rendering/atom_hud.dm index 3128eb48e2..99cc12b805 100644 --- a/code/__DEFINES/rendering/atom_hud.dm +++ b/code/__DEFINES/rendering/atom_hud.dm @@ -62,11 +62,11 @@ #define ANTAG_HUD_BLOODSUCKER 24 #define ANTAG_HUD_FUGITIVE 25 #define ANTAG_HUD_HERETIC 26 -#define ANTAG_HUD_SPACECOP 29 -#define ANTAG_HUD_GANGSTER 30 -#define ANTAG_HUD_SLAVER 27 +#define ANTAG_HUD_SPACECOP 27 +#define ANTAG_HUD_GANGSTER 28 +#define ANTAG_HUD_SLAVER 29 // Which players consent via their game settings to be a target for antagonists -#define DATA_HUD_ANTAGTARGET 28 +#define DATA_HUD_ANTAGTARGET 30 #define ADD_HUD_TO_COOLDOWN 20 //cooldown for being shown the images for any particular data hud diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm index e27489380c..013d038f3a 100644 --- a/code/__DEFINES/research.dm +++ b/code/__DEFINES/research.dm @@ -73,6 +73,8 @@ TECHWEB_POINT_TYPE_GENERIC = "General Research"\ ) +#define LARGEST_BOMB "bomb" + #define BOMB_TARGET_POINTS 50000 //Adjust as needed. Actual hard cap is double this, but will never be reached due to hyperbolic curve. #define BOMB_TARGET_SIZE (world.system_type == MS_WINDOWS ? 240 : 50000) // The shockwave radius required for a bomb to get TECHWEB_BOMB_MIDPOINT points. // Linux still has old trit fires, so diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index f9574fc2bb..03451b143a 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -100,6 +100,24 @@ #define MAX_BROADCAST_LEN 512 #define MAX_CHARTER_LEN 80 +//Bark defines +#define BARK_DEFAULT_MINPITCH 0.6 +#define BARK_DEFAULT_MAXPITCH 1.4 +#define BARK_DEFAULT_MINVARY 0.1 +#define BARK_DEFAULT_MAXVARY 0.4 +#define BARK_DEFAULT_MINSPEED 2 +#define BARK_DEFAULT_MAXSPEED 8 + +#define BARK_SPEED_BASELINE 4 //Used to calculate delay between barks, any bark speeds below this feature higher bark density, any speeds above feature lower bark density. Keeps barking length consistent + +#define BARK_MAX_BARKS 128 +#define BARK_MAX_TIME (10 SECONDS) // More or less the amount of time the above takes to process through with a bark speed of 2. + +#define BARK_PITCH_RAND(gend) ((gend == MALE ? rand(60, 120) : (gend == FEMALE ? rand(80, 140) : rand(60,140))) / 100) //Macro for determining random pitch based off gender +#define BARK_VARIANCE_RAND (rand(BARK_DEFAULT_MINVARY * 100, BARK_DEFAULT_MAXVARY * 100) / 100) //Macro for randomizing bark variance to reduce the amount of copy-pasta necessary for that + +#define BARK_DO_VARY(pitch, variance) (rand(((pitch * 100) - (variance*50)), ((pitch*100) + (variance*50))) / 100) + // Is something in the IC chat filter? This is config dependent. #define CHAT_FILTER_CHECK(T) (config.ic_filter_regex && findtext(T, config.ic_filter_regex)) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 2e4c9c6ad3..b825ac266c 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -82,6 +82,12 @@ var/datum/emote/E = new path() E.emote_list[E.key] = E + for(var/path in subtypesof(/datum/bark)) + var/datum/bark/B = new path() + GLOB.bark_list[B.id] = path + if(B.allow_random) + GLOB.bark_random_list[B.id] = path + // Hair Gradients - Initialise all /datum/sprite_accessory/hair_gradient into an list indexed by gradient-style name for(var/path in subtypesof(/datum/sprite_accessory/hair_gradient)) var/datum/sprite_accessory/hair_gradient/H = new path() diff --git a/code/__HELPERS/matrices/color_matrix.dm b/code/__HELPERS/matrices/color_matrix.dm index e4a4a9bb48..bcc48b45f5 100644 --- a/code/__HELPERS/matrices/color_matrix.dm +++ b/code/__HELPERS/matrices/color_matrix.dm @@ -138,6 +138,25 @@ round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), ro var/sinval = round(sin(angle), 0.001); var/cosval = round(cos(angle), 0.001) return list(cosval,sinval,0,0, -sinval,cosval,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,0) +/** + * Builds a color matrix that transforms the hue, saturation, and value, all in one operation. + */ +/proc/color_matrix_hsv(hue, saturation, value) + hue = clamp(360 - hue, 0, 360) + + // This is very much a rough approximation of hueshifting. This carries some artifacting, such as negative values that simply shouldn't exist, but it does get the job done, and that's what matters. + var/cos_a = cos(hue) // These have to be inverted from 360, otherwise the hue's inverted + var/sin_a = sin(hue) + var/rot_x = cos_a + (1 - cos_a) / 3 + var/rot_y = (1 - cos_a) / 3 - 0.5774 * sin_a // 0.5774 is sqrt(1/3) + var/rot_z = (1 - cos_a) / 3 + 0.5774 * sin_a + + return list( + round((((1-saturation) * LUMA_R) + (rot_x * saturation)) * value, 0.01), round((((1-saturation) * LUMA_R) + (rot_y * saturation)) * value, 0.01), round((((1-saturation) * LUMA_R) + (rot_z * saturation)) * value, 0.01), + round((((1-saturation) * LUMA_G) + (rot_z * saturation)) * value, 0.01), round((((1-saturation) * LUMA_G) + (rot_x * saturation)) * value, 0.01), round((((1-saturation) * LUMA_G) + (rot_y * saturation)) * value, 0.01), + round((((1-saturation) * LUMA_B) + (rot_y * saturation)) * value, 0.01), round((((1-saturation) * LUMA_B) + (rot_z * saturation)) * value, 0.01), round((((1-saturation) * LUMA_B) + (rot_x * saturation)) * value, 0.01), + 0, 0, 0 + ) //Returns a matrix addition of A with B /proc/color_matrix_add(list/A, list/B) diff --git a/code/__HELPERS/matrices/transform_matrix.dm b/code/__HELPERS/matrices/transform_matrix.dm index 251ef8151f..8f8a67535e 100644 --- a/code/__HELPERS/matrices/transform_matrix.dm +++ b/code/__HELPERS/matrices/transform_matrix.dm @@ -19,7 +19,7 @@ speed /= segments if(parallel) - animate(src, transform = matrices[1], time = speed, loops , flags = ANIMATION_PARALLEL) + animate(src, transform = matrices[1], time = speed, loops, flags = ANIMATION_PARALLEL) else animate(src, transform = matrices[1], time = speed, loops) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 2771a3270b..0a9e68a790 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -379,6 +379,8 @@ parts += "[FOURSPACES]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]" parts += "[FOURSPACES]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[popcount["station_integrity"]]%"]" + if(mode.station_was_nuked && SSevents.holidays && SSevents.holidays[PRIDE_MONTH]) + parts += "[FOURSPACES]Gender revealed: [pick(500; "Male", 500; "Female", "Bigender", "Agender", "Demiboy", "Demigirl", "Genderfluid", "Pangender", "Xenogender", "Clown", 50; "What", 50; "Oh no.", 50; "Excuse me?")]" var/total_players = GLOB.joined_player_list.len if(total_players) parts+= "[FOURSPACES]Total Population: [total_players]" diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index b415b4720f..428784e953 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1176,25 +1176,22 @@ GLOBAL_REAL_VAR(list/stack_trace_storage) var/initialpixely = pixel_y var/shiftx = rand(-pixelshiftx,pixelshiftx) var/shifty = rand(-pixelshifty,pixelshifty) - animate(src, pixel_x = pixel_x + shiftx, pixel_y = pixel_y + shifty, time = 0.2, loop = duration) - pixel_x = initialpixelx - pixel_y = initialpixely + animate(src, pixel_x = shiftx, pixel_y = shifty, time = 0.2, loop = duration, flags = ANIMATION_RELATIVE) + animate(pixel_x = initialpixelx, pixel_y = initialpixely, time = 0.2) -/atom/proc/do_jiggle(targetangle = 45, timer = 20) +/atom/proc/do_jiggle(targetangle = 25, timer = 20) var/matrix/OM = matrix(transform) var/matrix/M = matrix(transform) - var/halftime = timer * 0.5 M.Turn(pick(-targetangle, targetangle)) - animate(src, transform = M, time = halftime, easing = ELASTIC_EASING) - animate(src, transform = OM, time = halftime, easing = ELASTIC_EASING) + animate(src, transform = M, time = timer * 0.1, easing = BACK_EASING | EASE_IN) + animate(transform = OM, time = timer * 0.4, easing = ELASTIC_EASING) /atom/proc/do_squish(squishx = 1.2, squishy = 0.6, timer = 20) var/matrix/OM = matrix(transform) var/matrix/M = matrix(transform) - var/halftime = timer * 0.5 M.Scale(squishx, squishy) - animate(src, transform = M, time = halftime, easing = BOUNCE_EASING) - animate(src, transform = OM, time = halftime, easing = BOUNCE_EASING) + animate(src, transform = M, time = timer * 0.5, easing = ELASTIC_EASING) + animate(transform = OM, time = timer * 0.5, easing = BOUNCE_EASING, flags = ANIMATION_PARALLEL) /proc/weightclass2text(var/w_class) switch(w_class) diff --git a/code/__SPLURTCODE/DEFINES/cooldowns.dm b/code/__SPLURTCODE/DEFINES/cooldowns.dm new file mode 100644 index 0000000000..2979db3592 --- /dev/null +++ b/code/__SPLURTCODE/DEFINES/cooldowns.dm @@ -0,0 +1,10 @@ +/* + + Read code\__DEFINES\cooldowns.dm + +*/ + +//INDEXES +#define COOLDOWN_DOMINANT_SNAP "dominant_snap" +#define COOLDOWN_DOMINANT_EXAMINE "dominant_examine" +#define COOLDOWN_EMOTE_FART "emote_fart" diff --git a/code/__SPLURTCODE/DEFINES/dcs/signals.dm b/code/__SPLURTCODE/DEFINES/dcs/signals.dm new file mode 100644 index 0000000000..4b4f351e72 --- /dev/null +++ b/code/__SPLURTCODE/DEFINES/dcs/signals.dm @@ -0,0 +1,6 @@ +#define COMSIG_MOB_EMOTE "mob_emote" // from /mob/emote(): (proc args list) + // used to access COMSIG_MOB_SAY argslist + #define EMOTE_ACT 1 + #define EMOTE_MTYPE 2 + #define EMOTE_MESSAGE 3 + #define EMOTE_INTENTIONAL 4 diff --git a/code/__SPLURTCODE/DEFINES/login.dm b/code/__SPLURTCODE/DEFINES/login.dm new file mode 100644 index 0000000000..24fa5b4c50 --- /dev/null +++ b/code/__SPLURTCODE/DEFINES/login.dm @@ -0,0 +1 @@ +#define LINKIFY_READY(string, value) "[string]" diff --git a/code/__SPLURTCODE/DEFINES/mobs.dm b/code/__SPLURTCODE/DEFINES/mobs.dm index 2b91d1eee4..c8b92378d8 100644 --- a/code/__SPLURTCODE/DEFINES/mobs.dm +++ b/code/__SPLURTCODE/DEFINES/mobs.dm @@ -1 +1,4 @@ +// Ready states at roundstart for mob/dead/new_player +#define PLAYER_READY_TO_OBSERVE 2 + #define WENDIGO_BODYPART "wendigo" diff --git a/code/__SPLURTCODE/DEFINES/quirks.dm b/code/__SPLURTCODE/DEFINES/quirks.dm new file mode 100644 index 0000000000..9353f87dc7 --- /dev/null +++ b/code/__SPLURTCODE/DEFINES/quirks.dm @@ -0,0 +1,3 @@ +//Dominant/Well-trained quirks +#define DOMINANT_DETECT_RANGE 5 +#define DOMINANT_SNAP_COOLDOWN 10 SECONDS diff --git a/code/__SPLURTCODE/DEFINES/spans.dm b/code/__SPLURTCODE/DEFINES/spans.dm index 9e004d3972..d3a5934d3b 100644 --- a/code/__SPLURTCODE/DEFINES/spans.dm +++ b/code/__SPLURTCODE/DEFINES/spans.dm @@ -1,2 +1,3 @@ #define span_userlove(str) ("" + str + "") #define span_love(str) ("" + str + "") +#define span_lewd(str) ("" + str + "") diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 1b6250a250..fe092e6d7f 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -43,6 +43,10 @@ GLOBAL_LIST_EMPTY(arachnid_spinneret_list) GLOBAL_LIST_EMPTY(arachnid_mandibles_list) GLOBAL_LIST_EMPTY(caps_list) + //Bark bits +GLOBAL_LIST_EMPTY(bark_list) +GLOBAL_LIST_EMPTY(bark_random_list) + //a way to index the right bodypart list given the type of bodypart GLOBAL_LIST_INIT(mutant_reference_list, list( "tail_lizard" = GLOB.tails_list_lizard, diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 692f2317ef..d3d0fb32b6 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -60,7 +60,7 @@ if(client && hud_used) hud_used.reorganize_alerts() thealert.transform = matrix(32, 6, MATRIX_TRANSLATE) - animate(thealert, transform = matrix(), time = 2.5, easing = CUBIC_EASING) + animate(thealert, transform = matrix(), time = 2.5, easing = BACK_EASING) if(thealert.timeout) addtimer(CALLBACK(src, .proc/alert_timeout, thealert, category), thealert.timeout) diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index ce581685ed..8f237c4a71 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -178,7 +178,7 @@ GLOBAL_LIST_EMPTY(radial_menus) starting.Scale(0.1,0.1) E.transform = starting var/matrix/TM = matrix() - animate(E,pixel_x = px,pixel_y = py, transform = TM, time = timing) + animate(E,pixel_x = px,pixel_y = py, transform = TM, time = timing, easing = SINE_EASING | EASE_OUT) else E.pixel_y = py E.pixel_x = px diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 8f3a7ef02c..23486cac29 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -126,6 +126,8 @@ return DISCARD_LAST_ACTION user.do_attack_animation(O) O.attacked_by(src, user) + if(force >= 20) + shake_camera(user, ((force - 15) * 0.01 + 1), ((force - 15) * 0.01)) /atom/movable/proc/attacked_by() return diff --git a/code/_rendering/atom_huds/atom_hud.dm b/code/_rendering/atom_huds/atom_hud.dm index bdb996892e..9cdf277c5f 100644 --- a/code/_rendering/atom_huds/atom_hud.dm +++ b/code/_rendering/atom_huds/atom_hud.dm @@ -30,6 +30,8 @@ GLOBAL_LIST_INIT(huds, list( ANTAG_HUD_BLOODSUCKER = new/datum/atom_hud/antag/bloodsucker(), ANTAG_HUD_FUGITIVE = new/datum/atom_hud/antag(), ANTAG_HUD_HERETIC = new/datum/atom_hud/antag/hidden(), + ANTAG_HUD_SPACECOP = new/datum/atom_hud/antag(), + ANTAG_HUD_GANGSTER = new/datum/atom_hud/antag/hidden(), ANTAG_HUD_SLAVER = new/datum/atom_hud/antag(), DATA_HUD_ANTAGTARGET = new/datum/atom_hud/data/human/antagtarget(), )) diff --git a/code/controllers/subsystem/jukeboxes.dm b/code/controllers/subsystem/jukeboxes.dm index 3e87ff256a..1e457703c2 100644 --- a/code/controllers/subsystem/jukeboxes.dm +++ b/code/controllers/subsystem/jukeboxes.dm @@ -161,15 +161,15 @@ SUBSYSTEM_DEF(jukeboxes) if(istype(hearer_env)) pressure_factor = min(source_pressure, hearer_env.return_pressure()) - if(pressure_factor && targetfalloff && M.can_hear() && (M.z in audible_zlevels)) - if(get_area(M) == currentarea) + if(pressure_factor && targetfalloff && M.can_hear() && (hearerturf.z in audible_zlevels)) + if(get_area(hearerturf) == currentarea) inrange = TRUE else if(M in hearerscache) inrange = TRUE - song_played.x = (currentturf.x - M.x) * SOUND_DEFAULT_DISTANCE_MULTIPLIER - song_played.z = (currentturf.y - M.y) * SOUND_DEFAULT_DISTANCE_MULTIPLIER - song_played.y = (((currentturf.z - M.z) * 10 * SOUND_DEFAULT_DISTANCE_MULTIPLIER) + ((currentturf.z < M.z) ? -5 : 5)) + song_played.x = (currentturf.x - hearerturf.x) * SOUND_DEFAULT_DISTANCE_MULTIPLIER + song_played.z = (currentturf.y - hearerturf.y) * SOUND_DEFAULT_DISTANCE_MULTIPLIER + song_played.y = (((currentturf.z - hearerturf.z) * 10 * SOUND_DEFAULT_DISTANCE_MULTIPLIER) + ((currentturf.z < hearerturf.z) ? -5 : 5)) if(pressure_factor < ONE_ATMOSPHERE) song_played.volume = (min((targetfalloff * 50), 100) * max((pressure_factor - SOUND_MINIMUM_PRESSURE)/(ONE_ATMOSPHERE - SOUND_MINIMUM_PRESSURE), 1)) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index e057a1fb86..6763a2117d 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -165,6 +165,10 @@ SUBSYSTEM_DEF(ticker) to_chat(world, "Welcome to [station_name()]!") send2chat("New round starting on [SSmapping.config.map_name]!", CONFIG_GET(string/chat_announce_new_game)) current_state = GAME_STATE_PREGAME + //SPLURT EDIT - Bring back old panel + //Everyone who wants to be an observer is now spawned + create_observers() + //SPLURT EDIT SEND_SIGNAL(src, COMSIG_TICKER_ENTER_PREGAME) fire() @@ -385,6 +389,8 @@ SUBSYSTEM_DEF(ticker) LAZYOR(player.client.prefs.characters_joined_as, player.new_character.real_name) else stack_trace("WARNING: Either a player did not have a new_character, did not have a client, or did not have preferences. This is VERY bad.") + else if(!(player.client?.prefs.toggles & TG_PLAYER_PANEL)) + player.new_player_panel() CHECK_TICK /datum/controller/subsystem/ticker/proc/collect_minds() diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 1a5d54a306..79b3010b85 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -320,11 +320,11 @@ SUBSYSTEM_DEF(vote) admintext += "\nIt should be noted that this is not a raw tally of votes but rather the median score plus a tiebreaker!" for(var/i=1,i<=choices.len,i++) var/votes = choices[choices[i]] - admintext += "\n[choices[i]]: [votes]" + admintext += "\n[choices[i]]: [votes ? votes : "0"]" //This is raw data, but the raw data is null by default. If ya don't compensate for it, then it'll look weird! else for(var/i=1,i<=scores.len,i++) var/score = scores[scores[i]] - admintext += "\n[scores[i]]: [score]" + admintext += "\n[scores[i]]: [score ? score : "0"]" message_admins(admintext) return . diff --git a/code/datums/bark.dm b/code/datums/bark.dm new file mode 100644 index 0000000000..a7119273c3 --- /dev/null +++ b/code/datums/bark.dm @@ -0,0 +1,139 @@ +//Datums for barks and bark accessories + +/datum/bark + var/name = "Default" + var/id = "Default" + var/soundpath //Path for the actual sound file used for the bark + + // Pitch vars. The actual range for a bark is [(pitch - (maxvariance*0.5)) to (pitch + (maxvariance*0.5))] + // Make absolutely sure to take variance into account when curating a sound for bark purposes. + var/minpitch = BARK_DEFAULT_MINPITCH + var/maxpitch = BARK_DEFAULT_MAXPITCH + var/minvariance = BARK_DEFAULT_MINVARY + var/maxvariance = BARK_DEFAULT_MAXVARY + + // Speed vars. Speed determines the number of characters required for each bark, with lower speeds being faster with higher bark density + var/minspeed = BARK_DEFAULT_MINSPEED + var/maxspeed = BARK_DEFAULT_MAXSPEED + + // Visibility vars. Regardless of what's set below, these can still be obtained via adminbus and genetics. Rule of fun. + var/list/ckeys_allowed + var/ignore = FALSE //Controls whether or not this can be chosen in chargen + var/allow_random = FALSE //Allows chargen randomization to use this. This is mainly to restrict the pool to sounds that fit well for most characters + + +// So the basic jist of the sound design here: We make use primarily of shorter instrument samples for barks. We would've went with animalese instead, but doing so would've involved quite a bit of overhead to saycode. +// Short instrument samples tend to sound surprisingly nice for barks, being able to be played in rapid succession without being outright obnoxious. +// It isn't just instruments that work well here, however. Anything that works well as a stab? Short attack, no sustain, a decent amount of release? Also works extremely well for barks. + +/datum/bark/mutedc2 + name = "Muted String (Low)" + id = "mutedc2" + soundpath = 'sound/instruments/synthesis_samples/guitar/crisis_muted/C2.ogg' + allow_random = TRUE + +/datum/bark/mutedc3 + name = "Muted String (Medium)" + id = "mutedc3" + soundpath = 'sound/instruments/synthesis_samples/guitar/crisis_muted/C3.ogg' + allow_random = TRUE + +/datum/bark/mutedc4 + name = "Muted String (High)" + id = "mutedc4" + soundpath = 'sound/instruments/synthesis_samples/guitar/crisis_muted/C4.ogg' + allow_random = TRUE + +/datum/bark/banjoc3 + name = "Banjo (Medium)" + id = "banjoc3" + soundpath = 'sound/instruments/banjo/Cn3.ogg' + allow_random = TRUE + +/datum/bark/banjoc4 + name = "Banjo (High)" + id = "banjoc4" + soundpath = 'sound/instruments/banjo/Cn4.ogg' + allow_random = TRUE + +/datum/bark/squeaky + name = "Squeaky" + id = "squeak" + soundpath = 'sound/items/toysqueak1.ogg' + maxspeed = 4 + +/datum/bark/beep + name = "Beepy" + id = "beep" + soundpath = 'sound/machines/terminal_select.ogg' + maxpitch = 1 //Bringing the pitch higher just hurts your ears :< + maxspeed = 4 //This soundbyte's too short for larger speeds to not sound awkward + +/datum/bark/chitter + name = "Chittery" + id = "chitter" + minspeed = 6 //This is a pretty long sound + soundpath = 'sound/items/Ratchet.ogg' + +/datum/bark/synthetic_grunt + name = "Synthetic (Grunt)" + id = "synthgrunt" + soundpath = 'sound/misc/bloop.ogg' + +/datum/bark/synthetic + name = "Synthetic (Normal)" + id = "synth" + soundpath = 'sound/machines/uplinkerror.ogg' + +/datum/bark/bullet + name = "Windy" + id = "bullet" + maxpitch = 1.6 //This works well with higher pitches! + soundpath = 'sound/weapons/bulletflyby.ogg' //This works... Surprisingly well as a bark? It's neat! + + +// Genetics-only/admin-only sounds. These either clash hard with the audio design of the above sounds, or have some other form of audio design issue, but aren't *too* awful as a sometimes thing. +// Rule of fun very much applies to this section. Audio design is extremely important for the above section, but down here? No gods, no masters, pure anarchy. +// The min/max variables simply don't apply to these, as only chargen cares about them. As such, there's no need to define those. + +/datum/bark/bikehorn + name = "Bikehorn" + id = "horn" + soundpath = 'sound/instruments/bikehorn/Cn4.ogg' + ignore = TRUE // This is an unusually quiet sound. + +/datum/bark/bwoink + name = "Bwoink" + id = "bwoink" + soundpath = 'sound/effects/adminhelp.ogg' + ignore = TRUE // Emergent heart attack generation + +/datum/bark/merp + name = "Merp" + id = "merp" + soundpath = 'modular_citadel/sound/voice/merp.ogg' + ignore = TRUE + +/datum/bark/bark + name = "Bark" + id = "bark" + soundpath = 'modular_citadel/sound/voice/bark1.ogg' + ignore = TRUE + +/datum/bark/nya + name = "Nya" + id = "nya" + soundpath = 'modular_citadel/sound/voice/nya.ogg' + ignore = TRUE + +/datum/bark/moff + name = "Moff" + id = "moff" + soundpath = 'modular_citadel/sound/voice/mothsqueak.ogg' + ignore = TRUE + +/datum/bark/weh + name = "Weh" + id = "weh" + soundpath = 'modular_citadel/sound/voice/weh.ogg' + ignore = TRUE diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index 5eb89f4c10..f4a979c510 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -202,6 +202,7 @@ message.maptext_height = mheight message.maptext_x = (CHAT_MESSAGE_WIDTH - owner.bound_width) * -0.5 message.maptext = MAPTEXT(complete_text) + message.pixel_x = -owner.pixel_x //Dogborgs and other wide boys have a pixel offset. This accounts for that // View the message LAZYADDASSOC(owned_by.seen_messages, message_loc, src) @@ -212,10 +213,6 @@ scheduled_destruction = world.time + (lifespan - CHAT_MESSAGE_EOL_FADE) enter_subsystem() - var/mob/living/silicon/robot/R = target - if(iscyborg(R)) - if((R.module.dogborg == TRUE || R.dogborg == TRUE) && isturf(R.loc)) //I hate whoever that thought that putting two types of dogborg that don't even sync up properly was good - message.pixel_x = 16 /** * Applies final animations to overlay CHAT_MESSAGE_EOL_FADE deciseconds prior to message deletion diff --git a/code/datums/components/bouncy.dm b/code/datums/components/bouncy.dm index fed603410e..3c4e228b59 100644 --- a/code/datums/components/bouncy.dm +++ b/code/datums/components/bouncy.dm @@ -32,7 +32,7 @@ var/atom/movable/A = parent switch(rand(1, 3)) if(1) - A.do_jiggle(45 + rand(-10, 10) * bouncy_mod, 14) + A.do_jiggle(25 + rand(-5, 5) * bouncy_mod, 14) if(2) var/min_b = 0.6/bouncy_mod var/max_b = 1.2 * bouncy_mod diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm index 1535c3f142..9bdb009962 100644 --- a/code/datums/components/embedded.dm +++ b/code/datums/components/embedded.dm @@ -346,9 +346,9 @@ /datum/component/embedded/proc/examineTurf(datum/source, mob/user, list/examine_list) if(harmful) - examine_list += "\t There is \a [weapon] embedded in [parent]!" + examine_list += "There is \a [weapon] embedded in [parent]!" else - examine_list += "\t There is \a [weapon] stuck to [parent]!" + examine_list += "There is \a [weapon] stuck to [parent]!" /// Someone is ripping out the item from the turf by hand diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index f8764bee28..9c542b505c 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -69,23 +69,23 @@ msg += "My current mood: " //Short term switch(mood_level) if(1) - msg += "I wish I was dead!\n" + msg += "I wish I was dead!\n" if(2) - msg += "I feel terrible...\n" + msg += "I feel terrible...\n" if(3) - msg += "I feel very upset.\n" + msg += "I feel very upset.\n" if(4) - msg += "I'm a bit sad.\n" + msg += "I'm a bit sad.\n" if(5) - msg += "I'm alright.\n" + msg += "I'm alright.\n" if(6) - msg += "I feel pretty okay.\n" + msg += "I feel pretty okay.\n" if(7) - msg += "I feel pretty good.\n" + msg += "I feel pretty good.\n" if(8) - msg += "I feel amazing!\n" + msg += "I feel amazing!\n" if(9) - msg += "I love life!\n" + msg += "I love life!\n" msg += "Moodlets:\n"//All moodlets if(mood_events.len) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 98bbdbed05..40daac88cf 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -432,25 +432,26 @@ if(M.incapacitated() || !M.canUseStorage()) return var/atom/A = parent - A.add_fingerprint(M) // this must come before the screen objects only block, dunno why it wasn't before if(over_object == M) user_show_to_mob(M, trigger_on_found = TRUE) if(isrevenant(M)) INVOKE_ASYNC(GLOBAL_PROC, .proc/RevenantThrow, over_object, M, source) return + if(check_locked(null, M) || !M.CanReach(A) || (!M.CanReach(over_object) && !istype(over_object, /atom/movable/screen))) + return + playsound(A, "rustle", 50, TRUE, -5) + A.do_jiggle() + A.add_fingerprint(M) if(!istype(over_object, /atom/movable/screen)) INVOKE_ASYNC(src, .proc/dump_content_at, over_object, M) return if(A.loc != M) return - playsound(A, "rustle", 50, TRUE, -5) - A.do_jiggle() if(istype(over_object, /atom/movable/screen/inventory/hand)) var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(A, H.held_index) return - A.add_fingerprint(M) /datum/component/storage/proc/user_show_to_mob(mob/M, force = FALSE, trigger_on_found = FALSE) var/atom/A = parent diff --git a/code/datums/components/virtual_reality.dm b/code/datums/components/virtual_reality.dm index 56e06e3582..c0e6e9dba6 100644 --- a/code/datums/components/virtual_reality.dm +++ b/code/datums/components/virtual_reality.dm @@ -84,9 +84,9 @@ if(VR) VR.level_below = src level_above = VR - M.transfer_ckey(vr_M, FALSE) mastermind = M.mind mastermind.current.audiovisual_redirect = parent + M.transfer_ckey(vr_M, FALSE) RegisterSignal(mastermind, COMSIG_PRE_MIND_TRANSFER, .proc/switch_player) RegisterSignal(M, list(COMSIG_MOB_DEATH, COMSIG_PARENT_QDELETING), .proc/game_over) RegisterSignal(M, COMSIG_MOB_PRE_PLAYER_CHANGE, .proc/player_hijacked) diff --git a/code/datums/dna.dm b/code/datums/dna.dm index c795e1140e..c89ece5396 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -153,6 +153,10 @@ if(!GLOB.taur_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/taur, GLOB.taur_list) L[DNA_TAUR_BLOCK] = construct_block(GLOB.taur_list.Find(features["taur"]), GLOB.taur_list.len) + L[DNA_BARK_SOUND_BLOCK] = construct_block(GLOB.bark_list.Find(H.vocal_bark_id), GLOB.bark_list.len) + L[DNA_BARK_SPEED_BLOCK] = construct_block(H.vocal_speed * 4, 16) + L[DNA_BARK_PITCH_BLOCK] = construct_block(H.vocal_pitch * 30, 48) + L[DNA_BARK_VARIANCE_BLOCK] = construct_block(H.vocal_pitch_range * 48, 48) for(var/i=1, i<=DNA_UNI_IDENTITY_BLOCKS, i++) if(L[i]) @@ -248,19 +252,19 @@ if(DNA_HAIR_STYLE_BLOCK) setblock(uni_identity, blocknumber, construct_block(GLOB.hair_styles_list.Find(H.hair_style), GLOB.hair_styles_list.len)) if(DNA_COLOR_ONE_BLOCK) - sanitize_hexcolor(features["mcolor"], 6) + setblock(uni_identity, blocknumber, sanitize_hexcolor(features["mcolor"], 6)) if(DNA_COLOR_TWO_BLOCK) - sanitize_hexcolor(features["mcolor2"], 6) + setblock(uni_identity, blocknumber, sanitize_hexcolor(features["mcolor2"], 6)) if(DNA_COLOR_THREE_BLOCK) - sanitize_hexcolor(features["mcolor3"], 6) + setblock(uni_identity, blocknumber, sanitize_hexcolor(features["mcolor3"], 6)) if(DNA_MUTANTTAIL_BLOCK) - construct_block(GLOB.mam_tails_list.Find(features["mam_tail"]), GLOB.mam_tails_list.len) + setblock(uni_identity, blocknumber, construct_block(GLOB.mam_tails_list.Find(features["mam_tail"]), GLOB.mam_tails_list.len)) if(DNA_MUTANTEAR_BLOCK) - construct_block(GLOB.mam_ears_list.Find(features["mam_ears"]), GLOB.mam_ears_list.len) + setblock(uni_identity, blocknumber, construct_block(GLOB.mam_ears_list.Find(features["mam_ears"]), GLOB.mam_ears_list.len)) if(DNA_MUTANTMARKING_BLOCK) - construct_block(GLOB.mam_body_markings_list.Find(features["mam_body_markings"]), GLOB.mam_body_markings_list.len) + setblock(uni_identity, blocknumber, construct_block(GLOB.mam_body_markings_list.Find(features["mam_body_markings"]), GLOB.mam_body_markings_list.len)) if(DNA_TAUR_BLOCK) - construct_block(GLOB.taur_list.Find(features["taur"]), GLOB.taur_list.len) + setblock(uni_identity, blocknumber, construct_block(GLOB.taur_list.Find(features["taur"]), GLOB.taur_list.len)) if(species.mutant_bodyparts["taur"] && ishuman(holder)) var/datum/sprite_accessory/taur/T = GLOB.taur_list[features["taur"]] switch(T?.taur_mode) @@ -272,6 +276,14 @@ H.physiology.footstep_type = FOOTSTEP_MOB_CRAWL else H.physiology.footstep_type = null + if(DNA_BARK_SOUND_BLOCK) + setblock(uni_identity, blocknumber, construct_block(GLOB.bark_list.Find(H.vocal_bark_id), GLOB.bark_list.len)) + if(DNA_BARK_SPEED_BLOCK) + setblock(uni_identity, blocknumber, construct_block(H.vocal_speed * 4, 16)) + if(DNA_BARK_PITCH_BLOCK) + setblock(uni_identity, blocknumber, construct_block(H.vocal_pitch * 30, 48)) + if(DNA_BARK_VARIANCE_BLOCK) + setblock(uni_identity, blocknumber, construct_block(H.vocal_pitch_range * 48, 48)) //Please use add_mutation or activate_mutation instead /datum/dna/proc/force_give(datum/mutation/human/HM) @@ -483,6 +495,10 @@ update_body_parts() if(mutations_overlay_update) update_mutations_overlay() + set_bark(GLOB.bark_list[deconstruct_block(getblock(structure, DNA_BARK_SOUND_BLOCK), GLOB.bark_list.len)]) + vocal_speed = (deconstruct_block(getblock(structure, DNA_BARK_PITCH_BLOCK), 16) / 4) + vocal_pitch = (deconstruct_block(getblock(structure, DNA_BARK_PITCH_BLOCK), 48) / 30) + vocal_pitch_range = (deconstruct_block(getblock(structure, DNA_BARK_VARIANCE_BLOCK), 48) / 48) /mob/proc/domutcheck() diff --git a/code/datums/elements/strippable.dm b/code/datums/elements/strippable.dm index e67120f254..85fea3533e 100644 --- a/code/datums/elements/strippable.dm +++ b/code/datums/elements/strippable.dm @@ -136,13 +136,19 @@ if (isnull(item)) return FALSE - source.visible_message( - span_warning("[user] tries to remove [source]'s [item.name]."), - span_userdanger("[user] tries to remove your [item.name]."), - ignored_mobs = user, - ) + var/strip_silence + var/obj/item/clothing/gloves/gloves = user.get_item_by_slot(ITEM_SLOT_GLOVES) + if(istype(gloves)) + strip_silence = gloves.strip_silence - to_chat(user, span_danger("You try to remove [source]'s [item]...")) + if(!strip_silence) + source.visible_message( + span_warning("[user] tries to remove [source]'s [item.name]."), + span_userdanger("[user] tries to remove your [item.name]."), + ignored_mobs = user, + ) + + to_chat(user, strip_silence ? span_danger("You try to remove [source]'s [item]...") : span_notice("You try to remove [source]'s [item]...")) user.log_message("[key_name(source)] is being stripped of [item] by [key_name(user)]", LOG_ATTACK, color="red") source.log_message("[key_name(source)] is being stripped of [item] by [key_name(user)]", LOG_VICTIM, color="red", log_globally=FALSE) item.add_fingerprint(source) @@ -284,7 +290,12 @@ /// A utility function for `/datum/strippable_item`s to start unequipping an item from a mob. /proc/start_unequip_mob(obj/item/item, mob/source, mob/user, strip_delay) - if (!do_mob(user, source, strip_delay || item.strip_delay, ignorehelditem = TRUE)) + var/strip_mod = 1 + var/obj/item/clothing/gloves/gloves = user.get_item_by_slot(ITEM_SLOT_GLOVES) + if(istype(gloves)) + strip_mod = gloves.strip_mod + + if (!do_mob(user, source, (strip_delay || item.strip_delay) / strip_mod, ignorehelditem = TRUE)) return FALSE return TRUE diff --git a/code/datums/wounds/_scars.dm b/code/datums/wounds/_scars.dm index 3365fc359d..3fb6546edb 100644 --- a/code/datums/wounds/_scars.dm +++ b/code/datums/wounds/_scars.dm @@ -118,7 +118,7 @@ if(WOUND_SEVERITY_LOSS) msg = "[victim.p_their(TRUE)] [limb.name] [description]." // different format msg = "[msg]" - return "\t[msg]" + return "[msg]" /// Whether a scar can currently be seen by the viewer /datum/scar/proc/is_visible(mob/viewer) diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm index f3e22807cf..c16be6005a 100644 --- a/code/datums/wounds/burns.dm +++ b/code/datums/wounds/burns.dm @@ -167,7 +167,7 @@ if(WOUND_INFECTION_SEPTIC to INFINITY) . += "Infection Level: LOSS IMMINENT\n" if(infestation > sanitization) - . += "\tSurgical debridement, antiobiotics/sterilizers, or regenerative mesh will rid infection. Paramedic UV penlights are also effective.\n" + . += "Surgical debridement, antiobiotics/sterilizers, or regenerative mesh will rid infection. Paramedic UV penlights are also effective.\n" if(flesh_damage > 0) . += "Flesh damage detected: Please apply ointment or regenerative mesh to allow recovery.\n" diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index dd70825339..361c518073 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -212,6 +212,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED // airlock_wires = /datum/wires/airlock/maint sound_environment = SOUND_AREA_TUNNEL_ENCLOSED + minimap_color = "#454545" //Maintenance - Departmental @@ -435,6 +436,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/hallway nightshift_public_area = NIGHTSHIFT_AREA_PUBLIC sound_environment = SOUND_AREA_STANDARD_STATION + minimap_color = "#aaaaaa" /area/hallway/primary name = "Primary Hallway" @@ -490,6 +492,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/hallway/secondary/exit name = "Escape Shuttle Hallway" icon_state = "escape" + minimap_color = "#baa0a0" /area/hallway/secondary/exit/departure_lounge name = "Departure Lounge" @@ -498,6 +501,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/hallway/secondary/entry name = "Arrival Shuttle Hallway" icon_state = "entry" + minimap_color = "#a0a0ba" /area/hallway/secondary/service name = "Service Hallway" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 44916cf1d2..24b49a3af7 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -124,6 +124,10 @@ /// Color on minimaps, if it's null (which is default) it makes one at random. var/minimap_color + var/minimap_color2 // if this isn't null, then this will show as a checkerboard pattern mixed in with the above. works even if the above is null (for better or worse) + + var/minimap_show_walls = TRUE + /** * These two vars allow for multiple unique areas to be linked to a master area * and share some functionalities such as APC powernet nodes, fire alarms etc, without sacrificing diff --git a/code/game/area/areas/ruins/_ruins.dm b/code/game/area/areas/ruins/_ruins.dm index 6699e94129..f9af5c8ce4 100644 --- a/code/game/area/areas/ruins/_ruins.dm +++ b/code/game/area/areas/ruins/_ruins.dm @@ -9,6 +9,9 @@ ambientsounds = RUINS sound_environment = SOUND_ENVIRONMENT_STONEROOM var/valid_territory = FALSE // hey so what if we did not allow things like cult summons to appear on ruins + minimap_color = "#775940" + minimap_color2 = "#6b5d48" + minimap_show_walls = FALSE /area/ruin/unpowered diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 1de7a1576e..4077f86e52 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1322,7 +1322,7 @@ filters += filter(arglist(arguments)) UNSETEMPTY(filter_data) -/atom/proc/transition_filter(name, time, list/new_params, easing, loop) +/atom/proc/transition_filter(name, time, list/new_params, easing, loop, parallel = TRUE) var/filter = get_filter(name) if(!filter) return @@ -1333,7 +1333,7 @@ for(var/thing in new_params) params[thing] = new_params[thing] - animate(filter, new_params, time = time, easing = easing, loop = loop) + animate(filter, new_params, time = time, easing = easing, loop = loop, flags = (parallel ? ANIMATION_PARALLEL : 0)) for(var/param in params) filter_data[name][param] = params[param] diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 4b137d8b60..f758152426 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -65,6 +65,14 @@ /// last time we yelled var/last_yell = 0 + // Text-to-bark sounds + var/sound/vocal_bark + var/vocal_bark_id + var/vocal_pitch = 1 + var/vocal_pitch_range = 0.2 //Actual pitch is (pitch - (vocal_pitch_range*0.5)) to (pitch + (vocal_pitch_range*0.5)) + var/vocal_volume = 70 //Baseline. This gets modified by yelling and other factors + var/vocal_speed = 4 //Lower values are faster, higher values are slower + /atom/movable/Initialize(mapload) . = ..() switch(blocks_emissive) @@ -605,11 +613,11 @@ if(throwing && !throw_override) return if(on && !(movement_type & FLOATING)) - animate(src, pixel_y = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE) - animate(pixel_y = -2, time = 10, loop = -1, flags = ANIMATION_RELATIVE) + animate(src, pixel_z = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE) + animate(pixel_z = -4, time = 10, loop = -1, flags = ANIMATION_RELATIVE) setMovetype(movement_type | FLOATING) else if (!on && (movement_type & FLOATING)) - animate(src, pixel_y = initial(pixel_y), time = 10) + animate(src, pixel_z = initial(pixel_y), time = 10) setMovetype(movement_type & ~FLOATING) floating_need_update = FALSE // assume it's done @@ -697,6 +705,17 @@ var/datum/language_holder/LH = get_language_holder() return LH.update_atom_languages(src) +/// Sets the vocal bark for the atom, using the bark's ID +/atom/movable/proc/set_bark(id) + if(!id) + return FALSE + var/datum/bark/B = GLOB.bark_list[id] + if(!B) + return FALSE + vocal_bark = sound(initial(B.soundpath)) + vocal_bark_id = id + return vocal_bark + /* End language procs */ @@ -775,4 +794,4 @@ M.Turn(pick(-30, 30)) animate(I, alpha = 175, pixel_x = to_x, pixel_y = to_y, time = 3, transform = M, easing = CUBIC_EASING) sleep(1) - animate(I, alpha = 0, transform = matrix(), time = 1) + animate(I, alpha = 0, transform = matrix(), time = 1, flags = ANIMATION_PARALLEL) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 0d95448702..1fb2405584 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -104,6 +104,9 @@ Class Procs: anchored = TRUE interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT + vocal_bark_id = "synth" + vocal_pitch = 0.6 + var/stat = 0 var/use_power = IDLE_POWER_USE //0 = dont run the auto diff --git a/code/game/machinery/colormate.dm b/code/game/machinery/colormate.dm index 1528142a3b..a208fc0bd2 100644 --- a/code/game/machinery/colormate.dm +++ b/code/game/machinery/colormate.dm @@ -1,6 +1,10 @@ +#define COLORMATE_TINT 1 +#define COLORMATE_HSV 2 +#define COLORMATE_MATRIX 3 + /obj/machinery/gear_painter name = "\improper Color Mate" - desc = "A machine to give your apparel a fresh new color! Recommended to use with white items for best results." + desc = "A machine to give your apparel a fresh new color!" icon = 'icons/obj/vending.dmi' icon_state = "colormate" // light_mask = "colormate-light-mask" @@ -10,7 +14,11 @@ var/atom/movable/inserted var/activecolor = "#FFFFFF" var/list/color_matrix_last - var/matrix_mode = FALSE + var/active_mode = COLORMATE_HSV + + var/build_hue = 0 + var/build_sat = 1 + var/build_val = 1 /// Allow holder'd mobs var/allow_mobs = TRUE /// Minimum lightness for normal mode @@ -71,8 +79,8 @@ return if(!QDELETED(H)) H.release() + insert_mob(victim, user) - temp = "[victim] has been inserted." SStgui.update_uis(src) if(is_type_in_list(I, allowed_types) && is_operational()) @@ -85,7 +93,6 @@ inserted = I update_icon() - temp = "[I] has been inserted." SStgui.update_uis(src) else @@ -134,7 +141,7 @@ /obj/machinery/gear_painter/ui_data(mob/user) . = list() - .["matrixactive"] = matrix_mode + .["activemode"] = active_mode .["matrixcolors"] = list( "rr" = color_matrix_last[1], "rg" = color_matrix_last[2], @@ -149,6 +156,9 @@ "cg" = color_matrix_last[11], "cb" = color_matrix_last[12] ) + .["buildhue"] = build_hue + .["buildsat"] = build_sat + .["buildval"] = build_val if(temp) .["temp"] = temp if(inserted) @@ -166,7 +176,7 @@ if(inserted) switch(action) if("switch_modes") - matrix_mode = text2num(params["mode"]) + active_mode = text2num(params["mode"]) return TRUE if("choose_color") var/chosen_color = input(usr, "Choose a color: ", "Colormate color picking", activecolor) as color|null @@ -174,14 +184,11 @@ activecolor = chosen_color return TRUE if("paint") - if(!check_valid_color(activecolor, usr)) - return TRUE - inserted.add_atom_colour(activecolor, FIXED_COLOUR_PRIORITY) - playsound(src, 'sound/effects/spray3.ogg', 50, 1) + do_paint(usr) temp = "Painted Successfully!" return TRUE if("drop") - temp = "Ejected \the [inserted]!" + temp = "" drop_item() return TRUE if("clear") @@ -192,76 +199,95 @@ if("set_matrix_color") color_matrix_last[params["color"]] = params["value"] return TRUE - if("matrix_paint") - var/list/cm = rgb_construct_color_matrix( - text2num(color_matrix_last[1]), - text2num(color_matrix_last[2]), - text2num(color_matrix_last[3]), - text2num(color_matrix_last[4]), - text2num(color_matrix_last[5]), - text2num(color_matrix_last[6]), - text2num(color_matrix_last[7]), - text2num(color_matrix_last[8]), - text2num(color_matrix_last[9]), - text2num(color_matrix_last[10]), - text2num(color_matrix_last[11]), - text2num(color_matrix_last[12]) - ) - if(!check_valid_color(cm, usr)) - return TRUE - inserted.add_atom_colour(cm, FIXED_COLOUR_PRIORITY) - playsound(src, 'sound/effects/spray3.ogg', 50, 1) - temp = "Matrix Painted Successfully!" + if("set_hue") + build_hue = clamp(text2num(params["buildhue"]), 0, 360) return TRUE + if("set_sat") + build_sat = clamp(text2num(params["buildsat"]), -10, 10) + return TRUE + if("set_val") + build_val = clamp(text2num(params["buildval"]), -10, 10) + return TRUE + + +/obj/machinery/gear_painter/proc/do_paint(mob/user) + var/color_to_use + switch(active_mode) + if(COLORMATE_TINT) + color_to_use = activecolor + if(COLORMATE_MATRIX) + color_to_use = rgb_construct_color_matrix( + text2num(color_matrix_last[1]), + text2num(color_matrix_last[2]), + text2num(color_matrix_last[3]), + text2num(color_matrix_last[4]), + text2num(color_matrix_last[5]), + text2num(color_matrix_last[6]), + text2num(color_matrix_last[7]), + text2num(color_matrix_last[8]), + text2num(color_matrix_last[9]), + text2num(color_matrix_last[10]), + text2num(color_matrix_last[11]), + text2num(color_matrix_last[12]) + ) + if(COLORMATE_HSV) + color_to_use = color_matrix_hsv(build_hue, build_sat, build_val) + color_matrix_last = color_to_use + if(!color_to_use || !check_valid_color(color_to_use, user)) + to_chat(user, "Invalid color.") + return FALSE + inserted.add_atom_colour(color_to_use, FIXED_COLOUR_PRIORITY) + playsound(src, 'sound/effects/spray3.ogg', 50, 1) + return TRUE + /// Produces the preview image of the item, used in the UI, the way the color is not stacking is a sin. /obj/machinery/gear_painter/proc/build_preview() if(inserted) //sanity - if(matrix_mode) - var/list/cm = rgb_construct_color_matrix( - text2num(color_matrix_last[1]), - text2num(color_matrix_last[2]), - text2num(color_matrix_last[3]), - text2num(color_matrix_last[4]), - text2num(color_matrix_last[5]), - text2num(color_matrix_last[6]), - text2num(color_matrix_last[7]), - text2num(color_matrix_last[8]), - text2num(color_matrix_last[9]), - text2num(color_matrix_last[10]), - text2num(color_matrix_last[11]), - text2num(color_matrix_last[12]) - ) - if(!check_valid_color(cm, usr)) - temp = "Failed to generate preview: Invalid color!" - return getFlatIcon(inserted, defdir=SOUTH, no_anim=TRUE) + var/list/cm + switch(active_mode) + if(COLORMATE_MATRIX) + cm = rgb_construct_color_matrix( + text2num(color_matrix_last[1]), + text2num(color_matrix_last[2]), + text2num(color_matrix_last[3]), + text2num(color_matrix_last[4]), + text2num(color_matrix_last[5]), + text2num(color_matrix_last[6]), + text2num(color_matrix_last[7]), + text2num(color_matrix_last[8]), + text2num(color_matrix_last[9]), + text2num(color_matrix_last[10]), + text2num(color_matrix_last[11]), + text2num(color_matrix_last[12]) + ) + if(!check_valid_color(cm, usr)) + return getFlatIcon(inserted, defdir=SOUTH, no_anim=TRUE) - var/cur_color = inserted.color - inserted.color = null - inserted.color = cm - var/icon/preview = getFlatIcon(inserted, defdir=SOUTH, no_anim=TRUE) - inserted.color = cur_color + if(COLORMATE_TINT) + if(!check_valid_color(activecolor, usr)) + return getFlatIcon(inserted, defdir=SOUTH, no_anim=TRUE) - . = preview + if(COLORMATE_HSV) + cm = color_matrix_hsv(build_hue, build_sat, build_val) + color_matrix_last = cm + if(!check_valid_color(cm, usr)) + return getFlatIcon(inserted, defdir=SOUTH, no_anim=TRUE) - else - if(!check_valid_color(activecolor, usr)) - temp = "Failed to generate preview: Invalid color!" - return getFlatIcon(inserted, defdir=SOUTH, no_anim=TRUE) + var/cur_color = inserted.color + inserted.color = null + inserted.color = (active_mode == COLORMATE_TINT ? activecolor : cm) + var/icon/preview = getFlatIcon(inserted, defdir=SOUTH, no_anim=TRUE) + inserted.color = cur_color + temp = "" - var/cur_color = inserted.color - inserted.color = null - inserted.color = activecolor - var/icon/preview = getFlatIcon(inserted, defdir=SOUTH, no_anim=TRUE) - inserted.color = cur_color - - . = preview + . = preview /obj/machinery/gear_painter/proc/check_valid_color(list/cm, mob/user) if(!islist(cm)) // normal var/list/HSV = ReadHSV(RGBtoHSV(cm)) if(HSV[3] < minimum_normal_lightness) - temp = "[cm] is far too dark (min lightness [minimum_normal_lightness]!" + temp = "[cm] is too dark (Minimum lightness: [minimum_normal_lightness])" return FALSE return TRUE else // matrix @@ -275,6 +301,6 @@ COLORTEST("FFFFFF", cm) #undef COLORTEST if(passed < minimum_matrix_tests) - temp = "[english_list(color)] is not allowed (passed [passed] out of 4, minimum [minimum_matrix_tests], minimum lightness [minimum_matrix_lightness])." + temp = "Matrix is too dark. (passed [passed] out of [minimum_matrix_tests] required tests. Minimum lightness: [minimum_matrix_lightness])." return FALSE return TRUE diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 18ed5205be..458f231f4b 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -203,9 +203,13 @@ GLOBAL_LIST_EMPTY(doppler_arrays) point_gain = (BOMB_TARGET_POINTS * 2 * orig_light) / (orig_light + BOMB_TARGET_SIZE) /*****The Point Capper*****/ - if(point_gain > linked_techweb.largest_bomb_value) - var/old_tech_largest_bomb_value = linked_techweb.largest_bomb_value //held so we can pull old before we do math - linked_techweb.largest_bomb_value = point_gain + + var/list/largest_values = linked_techweb.largest_values + if(!(LARGEST_BOMB in largest_values)) + largest_values[LARGEST_BOMB] = 0 + if(point_gain > largest_values[LARGEST_BOMB]) + var/old_tech_largest_bomb_value = largest_values[LARGEST_BOMB] //held so we can pull old before we do math + linked_techweb.largest_values[LARGEST_BOMB] = point_gain point_gain -= old_tech_largest_bomb_value var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_SCI) if(D) diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index ff6f96a29f..12b2ba08e4 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -230,13 +230,13 @@ if(beaker) if(beaker.reagents && beaker.reagents.reagent_list.len) - . += "\tAttached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.\n" + . += "Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.\n" else - . += "\tAttached is an empty [beaker.name].\n" + . += "Attached is an empty [beaker.name].\n" else - . += "\tNo chemicals are attached.\n" + . += "No chemicals are attached.\n" - . += "\t[attached ? attached : "No one"] is attached." + . += "[attached ? attached : "No one"] is attached." /obj/machinery/iv_drip/telescopic name = "telescopic IV drip" diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index ef9825ee79..a33d2a1d09 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -644,7 +644,7 @@ /obj/machinery/vending/engineering = "Robco Tool Maker", /obj/machinery/vending/sovietsoda = "BODA", /obj/machinery/vending/security = "SecTech", - // /obj/machinery/vending/modularpc = "Deluxe Silicate Selections", + /obj/machinery/vending/modularpc = "Deluxe Silicate Selections", /obj/machinery/vending/custom = "Custom Vendor") /obj/item/circuitboard/machine/vendor/attackby(obj/item/I, mob/user, params) diff --git a/code/game/objects/items/debug_items.dm b/code/game/objects/items/debug_items.dm index c7aaab6a26..40038d2e7f 100644 --- a/code/game/objects/items/debug_items.dm +++ b/code/game/objects/items/debug_items.dm @@ -24,7 +24,7 @@ var/choice = input("Select a species", "Human Spawner", null) in GLOB.species_list selected_species = GLOB.species_list[choice] -/* Revive this once we purge all the istype checks for tools for tool_behaviour +// Revive this once we purge all the istype checks for tools for tool_behaviour /obj/item/debug/omnitool name = "omnitool" desc = "The original hypertool, born before them all. Use it in hand to unleash it's true power." @@ -99,4 +99,3 @@ tool_behaviour = TOOL_SCALPEL if("Saw") tool_behaviour = TOOL_SAW -*/ diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 8b3fe7eb1d..0d062b893f 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -156,21 +156,21 @@ GENETICS SCANNER // Damage descriptions if(brute_loss > 10) - msg += "\n\t[brute_loss > 50 ? "Severe" : "Minor"] tissue damage detected." + msg += "\n[brute_loss > 50 ? "Severe" : "Minor"] tissue damage detected." if(fire_loss > 10) - msg += "\n\t[fire_loss > 50 ? "Severe" : "Minor"] burn damage detected." + msg += "\n[fire_loss > 50 ? "Severe" : "Minor"] burn damage detected." if(oxy_loss > 10) - msg += "\n\t[oxy_loss > 50 ? "Severe" : "Minor"] oxygen deprivation detected." + msg += "\n[oxy_loss > 50 ? "Severe" : "Minor"] oxygen deprivation detected." if(tox_loss > 10) - msg += "\n\t[tox_loss > 50 ? "Severe" : "Minor"] amount of [HAS_TRAIT(M, TRAIT_ROBOTIC_ORGANISM) ? "system corruption" : "toxin damage"] detected." + msg += "\n[tox_loss > 50 ? "Severe" : "Minor"] amount of [HAS_TRAIT(M, TRAIT_ROBOTIC_ORGANISM) ? "system corruption" : "toxin damage"] detected." if(M.getStaminaLoss()) - msg += "\n\tSubject appears to be suffering from fatigue." + msg += "\nSubject appears to be suffering from fatigue." if(advanced) - msg += "\n\tFatigue Level: [M.getStaminaLoss()]%." + msg += "\nFatigue Level: [M.getStaminaLoss()]%." if (M.getCloneLoss()) - msg += "\n\tSubject appears to have [M.getCloneLoss() > 30 ? "Severe" : "Minor"] cellular damage." + msg += "\nSubject appears to have [M.getCloneLoss() > 30 ? "Severe" : "Minor"] cellular damage." if(advanced) - msg += "\n\tCellular Damage Level: [M.getCloneLoss()]." + msg += "\nCellular Damage Level: [M.getCloneLoss()]." if(ishuman(M)) var/mob/living/carbon/human/H = M if(advanced && H.has_dna()) @@ -182,7 +182,7 @@ GENETICS SCANNER var/mob/living/carbon/C = M var/list/damaged = C.get_damaged_bodyparts(1,1) if(length(damaged)>0 || oxy_loss>0 || tox_loss>0 || fire_loss>0) - dmgreport += "\ + dmgreport += "
\ \ \ \ @@ -322,7 +322,7 @@ GENETICS SCANNER damage_message += " Minor [O.name] failure detected." if(temp_message || damage_message) - msg += "\t[uppertext(O.name)]: [damage_message] [temp_message]\n" + msg += "\n[uppertext(O.name)]: [damage_message] [temp_message]\n" @@ -337,24 +337,24 @@ GENETICS SCANNER var/has_liver = C.dna && !(NOLIVER in C.dna.species.species_traits) var/has_stomach = C.dna && !(NOSTOMACH in C.dna.species.species_traits) if(!M.getorganslot(ORGAN_SLOT_EYES)) - msg += "\tSubject does not have eyes.\n" + msg += "Subject does not have eyes.\n" if(!M.getorganslot(ORGAN_SLOT_EARS)) - msg += "\tSubject does not have ears.\n" + msg += "Subject does not have ears.\n" if(!M.getorganslot(ORGAN_SLOT_BRAIN)) - msg += "\tSubject's brain function is non-existent!\n" + msg += "Subject's brain function is non-existent!\n" if(has_liver && !M.getorganslot(ORGAN_SLOT_LIVER)) - msg += "\tSubject's liver is missing!\n" + msg += "Subject's liver is missing!\n" if(blooded && !M.getorganslot(ORGAN_SLOT_HEART)) - msg += "\tSubject's heart is missing!\n" + msg += "Subject's heart is missing!\n" if(breathes && !M.getorganslot(ORGAN_SLOT_LUNGS)) - msg += "\tSubject's lungs have collapsed from trauma!\n" + msg += "Subject's lungs have collapsed from trauma!\n" if(has_stomach && !M.getorganslot(ORGAN_SLOT_STOMACH)) - msg += "\tSubject's stomach is missing!\n" + msg += "Subject's stomach is missing!\n" if(M.radiation) - msg += "\tSubject is irradiated.\n" - msg += "\tRadiation Level: [M.radiation] rad\n" + msg += "Subject is irradiated.\n" + msg += "Radiation Level: [M.radiation] rad\n" @@ -388,11 +388,11 @@ GENETICS SCANNER else if (S.flying_species != initial(S.flying_species)) mutant = TRUE - msg += "\tReported Species: [H.spec_trait_examine_font()][H.dna.custom_species ? H.dna.custom_species : S.name]\n" - msg += "\tBase Species: [H.spec_trait_examine_font()][S.name]\n" + msg += "\nReported Species: [H.spec_trait_examine_font()][H.dna.custom_species ? H.dna.custom_species : S.name]\n" + msg += "Base Species: [H.spec_trait_examine_font()][S.name]\n" if(mutant) - msg += "\tSubject has mutations present.\n" - msg += "\tBody temperature: [round(M.bodytemperature-T0C,0.1)] °C ([round(M.bodytemperature*1.8-459.67,0.1)] °F)\n" + msg += "Subject has mutations present.\n" + msg += "Body temperature: [round(M.bodytemperature-T0C,0.1)] °C ([round(M.bodytemperature*1.8-459.67,0.1)] °F)\n" // Time of death if(M.tod && (M.stat == DEAD || ((HAS_TRAIT(M, TRAIT_FAKEDEATH)) && !advanced))) @@ -538,12 +538,14 @@ GENETICS SCANNER var/render_list = "" for(var/i in patient.get_wounded_bodyparts()) + if(render_list == "") + render_list += "
" var/obj/item/bodypart/wounded_part = i render_list += "Warning: Physical trauma[LAZYLEN(wounded_part.wounds) > 1? "s" : ""] detected in [wounded_part.name]" for(var/k in wounded_part.wounds) var/datum/wound/W = k render_list += "
[W.get_scanner_description()]
\n" - render_list += "
" + render_list += "
" if(render_list == "") if(istype(scanner)) diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 595b24d214..2b0b8da670 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -205,6 +205,10 @@ if(!throw_item(target, I, user)) break + if(user) + shake_camera(user, (pressureSetting * 0.75 + 1), (pressureSetting * 0.75)) + + /obj/item/pneumatic_cannon/proc/throw_item(turf/target, obj/item/I, mob/user) if(!istype(I)) return FALSE diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index fc51c7d7cf..aa7bd5616d 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -1432,7 +1432,8 @@ /obj/item/storage/box/beakers/bluespace=1,\ /obj/item/storage/box/beakers/variety=1,\ /obj/item/storage/box/material=1,\ - /obj/item/storage/belt/medical/surgery_belt_adv=1 + /obj/item/storage/belt/medical/surgery_belt_adv=1, + /obj/item/debug/omnitool=1 ) generate_items_inside(items_inside, src) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 46248c1ff8..4ea25bec96 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -7,6 +7,8 @@ var/obj_flags = CAN_BE_HIT var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT. + var/minimap_override_color // allows this obj to set its own color on the minimap + var/damtype = BRUTE var/force = 0 diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index d48ddf880a..c1f20605a0 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -67,7 +67,7 @@ /obj/structure/proc/do_climb(atom/movable/A) if(climbable) density = FALSE - . = step(A,get_dir(A,src.loc)) + . = step(A, (A.loc == loc ? dir : get_dir(A,src.loc))) density = TRUE /obj/structure/proc/climb_structure(mob/living/user) diff --git a/code/game/say.dm b/code/game/say.dm index b7bfe540d0..205ddc2f0e 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -31,14 +31,37 @@ GLOBAL_LIST_INIT(freqtospan, list( /atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) +/atom/movable/proc/bark(list/hearers, distance, volume, pitch) + if(!vocal_bark) + if(!vocal_bark_id || !set_bark(vocal_bark_id)) //just-in-time bark generation + return + volume = min(volume, 100) + var/turf/T = get_turf(src) + for(var/mob/M in hearers) + M.playsound_local(T, vol = volume, vary = TRUE, frequency = pitch, max_distance = distance, falloff_distance = distance * 0.75, S = vocal_bark, distance_multiplier = 1) + /atom/movable/proc/can_speak() return 1 /atom/movable/proc/send_speech(message, range = 7, atom/movable/source = src, bubble_type, list/spans, datum/language/message_language = null, message_mode) var/rendered = compose_message(src, message_language, message, , spans, message_mode, source) - for(var/_AM in get_hearers_in_view(range, source)) + var/list/hearers = get_hearers_in_view(range, source) + for(var/_AM in hearers) var/atom/movable/AM = _AM AM.Hear(rendered, src, message_language, message, , spans, message_mode, source) + if(vocal_bark || vocal_bark_id) + for(var/mob/M in hearers) + if(!M.client) + continue + if(!(M.client.prefs.toggles & SOUND_BARK)) + hearers -= M + var/barks = min(round((LAZYLEN(message) / vocal_speed)) + 1, BARK_MAX_BARKS) + var/total_delay + for(var/i in 1 to barks) + if(total_delay > BARK_MAX_TIME) + break + addtimer(CALLBACK(src, .proc/bark, hearers, range, vocal_volume, BARK_DO_VARY(vocal_pitch, vocal_pitch_range)), total_delay) + total_delay += rand(DS2TICKS(vocal_speed / BARK_SPEED_BASELINE), DS2TICKS(vocal_speed / BARK_SPEED_BASELINE) + DS2TICKS(vocal_speed / BARK_SPEED_BASELINE)) TICKS /atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, face_name = FALSE, atom/movable/source) if(!source) diff --git a/code/game/sound.dm b/code/game/sound.dm index 38886e4908..02c2936f8d 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -110,7 +110,11 @@ distance_multiplier - Can be used to multiply the distance at which the sound is */ /mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff_exponent = SOUND_FALLOFF_EXPONENT, channel = 0, pressure_affected = TRUE, sound/S, max_distance, - falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, distance_multiplier = SOUND_DEFAULT_DISTANCE_MULTIPLIER, envwet = -10000, envdry = 0) + falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, distance_multiplier = SOUND_DEFAULT_DISTANCE_MULTIPLIER, envwet = -10000, envdry = 0, virtual_hearer) + if(audiovisual_redirect) + virtual_hearer = get_turf(src) + audiovisual_redirect.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, max_distance, falloff_distance, distance_multiplier, max(0, envwet), -10000, virtual_hearer) + //No return here, as we want to deliberately support the possibility of shenanigans in which mobs with clients can have active AV redirects to completely different players if(!client) return @@ -134,7 +138,7 @@ distance_multiplier - Can be used to multiply the distance at which the sound is S.frequency = get_rand_frequency() if(isturf(turf_source)) - var/turf/T = get_turf(src) + var/turf/T = virtual_hearer || get_turf(src) //sound volume falloff with distance var/distance = get_dist(T, turf_source) diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 9a74b63040..19201299c2 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -50,6 +50,10 @@ H.dna.features["flavor_text"] = "" //Oh no. H.dna.features["body_model"] = H.gender + H.set_bark(pick(GLOB.bark_random_list)) + H.vocal_pitch = BARK_PITCH_RAND(H.gender) + H.vocal_pitch_range = BARK_VARIANCE_RAND + SEND_SIGNAL(H, COMSIG_HUMAN_ON_RANDOMIZE) H.update_body(TRUE) diff --git a/code/modules/antagonists/gang/gang.dm b/code/modules/antagonists/gang/gang.dm index ea81c8b1af..050754a91e 100644 --- a/code/modules/antagonists/gang/gang.dm +++ b/code/modules/antagonists/gang/gang.dm @@ -67,6 +67,11 @@ if(handler) // if we have a handler, the handler should track this gang handler.gangs += my_gang my_gang.current_theme = handler.current_theme + else if(GLOB.families_override_theme) + my_gang.current_theme = new GLOB.families_override_theme + else + var/theme_to_use = pick(subtypesof(/datum/gang_theme)) + my_gang.current_theme = new theme_to_use my_gang.name = gang_name my_gang.gang_id = gang_id my_gang.acceptable_clothes = acceptable_clothes.Copy() diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index a6a30ba96e..1a3997272a 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -66,9 +66,21 @@ icon_state = "nuclearbomb_base" anchored = TRUE //stops it being moved +/obj/machinery/nuclearbomb/selfdestruct/Initialize(mapload) + . = ..() + if(SSevents.holidays && SSevents.holidays[PRIDE_MONTH] && prob(10)) + name = "station-wide gender-reveal terminal" + desc = "For when the whole sector deserves to know a gender. But of whom? Don't ask." + /obj/machinery/nuclearbomb/syndicate //ui_style = "syndicate" // actually the nuke op bomb is a stole nt bomb +/obj/machinery/nuclearbomb/syndicate/Initialize(mapload) + . = ..() + if(SSevents.holidays && SSevents.holidays[PRIDE_MONTH] && prob(50)) + name = "tactical gender-reveal device" + desc = "\"But whose gender is it revealing?\" you ponder. Don't worry. That comes later." + /obj/machinery/nuclearbomb/syndicate/get_cinematic_type(off_station) var/datum/game_mode/nuclear/NM = SSticker.mode switch(off_station) diff --git a/code/modules/atmospherics/auxgm/gas_types.dm b/code/modules/atmospherics/auxgm/gas_types.dm index cba5dce870..943fdeb14a 100644 --- a/code/modules/atmospherics/auxgm/gas_types.dm +++ b/code/modules/atmospherics/auxgm/gas_types.dm @@ -295,4 +295,4 @@ powermix = -1 transmit_modifier = -10 heat_penalty = -10 - price = 10 + price = 100 // it's kinda really hard to actually get it into a canister diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 122d30f33e..607274f71b 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -759,7 +759,18 @@ var/initial_energy = air.thermal_energy() for(var/g in air.get_gases()) air.set_moles(g, 0) - air.set_moles(GAS_QCD, initial_energy / (air.return_temperature() * GLOB.gas_data.specific_heats[GAS_QCD])) + var/amount = initial_energy / (air.return_temperature() * GLOB.gas_data.specific_heats[GAS_QCD]) + air.set_moles(GAS_QCD, amount) + var/list/largest_values = SSresearch.science_tech.largest_values + if(!(GAS_QCD in largest_values)) + largest_values[GAS_QCD] = 0 + var/previous_largest = largest_values[GAS_QCD] + var/research_amount = amount * QCD_RESEARCH_AMOUNT + if(previous_largest < research_amount) + SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, research_amount) + largest_values[GAS_QCD] = research_amount + else + SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, research_amount / 100) /datum/gas_reaction/dehagedorn priority = 50 @@ -781,11 +792,10 @@ var/list/gases = GLOB.gas_data.specific_heats.Copy() gases -= GAS_QCD gases -= GAS_TRITIUM // no refusing sorry - for(var/g in gases) - gases[g] = 10000 / gases[g] + gases -= GAS_HYPERNOB // makes it waaay too easy to stabilize it while(energy_remaining > 0) var/G = pick(gases) air.adjust_moles(G, max(0.1, energy_remaining / (gases[G] * new_temp * 20))) energy_remaining = initial_energy - air.thermal_energy() - air.adjust_heat(-energy_remaining) + air.set_temperature(initial_energy / air.heat_capacity()) return REACTING diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index d89cc7333c..15c511e9d8 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -237,6 +237,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/modified_limbs = list() //prosthetic/amputated limbs var/chosen_limb_id //body sprite selected to load for the users limbs, null means default, is sanitized when loaded + // Vocal bark prefs + var/bark_id = "mutedc3" + var/bark_speed = 4 + var/bark_pitch = 1 + var/bark_variance = 0.2 + COOLDOWN_DECLARE(bark_previewing) + /// Security record note section var/security_records /// Medical record note section @@ -960,16 +967,25 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "
Damage:BruteBurn
" - //END OF SKYRAT EDIT + //END OF SANDSTORM EDIT + dat += "" dat += "
" dat += "

Speech preferences

" dat += "Custom Speech Verb:
" - dat += "[custom_speech_verb]
" + dat += "[custom_speech_verb]
" dat += "Custom Tongue:
" - dat += "[custom_tongue]
" - //SKYRAT EDIT - additional language + runechat color + dat += "[custom_tongue]
" + //SANDSTORM EDIT - additional language + runechat color dat += "Additional Language
" var/list/languages_sorted = sortList(language) dat += "[language.len ? languages_sorted.Join(", ") : "None"]
" dat += "Custom runechat color: [enable_personal_chat_color ? "Enabled" : "Disabled"]
[enable_personal_chat_color ? "[personal_chat_color] Change" : ""]
" dat += "
" + dat += "

Vocal Bark preferences

" + var/datum/bark/B = GLOB.bark_list[bark_id] + dat += "Vocal Bark Sound:
" + dat += "[B ? initial(B.name) : "INVALID"]
" + dat += "Vocal Bark Speed: [bark_speed]
" + dat += "Vocal Bark Pitch: [bark_pitch]
" + dat += "Vocal Bark Variance: [bark_variance]
" + dat += "
Preview Bark
" dat += "
" @@ -1100,9 +1116,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) p_chaos = preferred_chaos dat += "Preferred Chaos Amount: [p_chaos]
" - dat += "

Splurt Preferences

" + dat += "

S.P.L.U.R.T. Preferences

" dat += "Be Antagonist Victim: [be_victim ? be_victim : BEVICTIM_ASK]
" dat += "Disable combat mode cursor: [disable_combat_cursor?"Yes":"No"]
" + dat += "Splashscreen Player Panel Style: [(toggles & TG_PLAYER_PANEL)?"TG":"Old"]
" dat += "
" dat += "" @@ -2887,6 +2904,43 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(selected_custom_speech_verb) custom_speech_verb = selected_custom_speech_verb + if("barksound") + var/list/woof_woof = list() + for(var/path in GLOB.bark_list) + var/datum/bark/B = GLOB.bark_list[path] + if(initial(B.ignore)) + continue + if(initial(B.ckeys_allowed)) + var/list/allowed = initial(B.ckeys_allowed) + if(!allowed.Find(user.client.ckey)) + continue + woof_woof[initial(B.name)] = initial(B.id) + var/new_bork = input(user, "Choose your desired vocal bark", "Character Preference") as null|anything in woof_woof + if(new_bork) + bark_id = woof_woof[new_bork] + var/datum/bark/B = GLOB.bark_list[bark_id] //Now we need sanitization to take into account bark-specific min/max values + bark_speed = round(clamp(bark_speed, initial(B.minspeed), initial(B.maxspeed)), 1) + bark_pitch = clamp(bark_pitch, initial(B.minpitch), initial(B.maxpitch)) + bark_variance = clamp(bark_variance, initial(B.minvariance), initial(B.maxvariance)) + + if("barkspeed") + var/datum/bark/B = GLOB.bark_list[bark_id] + var/borkset = input(user, "Choose your desired bark speed (Higher is slower, lower is faster). Min: [initial(B.minspeed)]. Max: [initial(B.maxspeed)]", "Character Preference") as null|num + if(borkset) + bark_speed = round(clamp(borkset, initial(B.minspeed), initial(B.maxspeed)), 1) + + if("barkpitch") + var/datum/bark/B = GLOB.bark_list[bark_id] + var/borkset = input(user, "Choose your desired baseline bark pitch. Min: [initial(B.minpitch)]. Max: [initial(B.maxpitch)]", "Character Preference") as null|num + if(borkset) + bark_pitch = clamp(borkset, initial(B.minpitch), initial(B.maxpitch)) + + if("barkvary") + var/datum/bark/B = GLOB.bark_list[bark_id] + var/borkset = input(user, "Choose your desired baseline bark pitch. Min: [initial(B.minvariance)]. Max: [initial(B.maxvariance)]", "Character Preference") as null|num + if(borkset) + bark_variance = clamp(borkset, initial(B.minvariance), initial(B.maxvariance)) + if("bodysprite") var/selected_body_sprite = input(user, "Choose your desired body sprite", "Character Preference") as null|anything in pref_species.allowed_limb_ids if(selected_body_sprite) @@ -3019,6 +3073,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) switch(href_list["preference"]) if("disable_combat_cursor") disable_combat_cursor = !disable_combat_cursor + if("tg_playerpanel") + toggles ^= TG_PLAYER_PANEL + to_chat(user, span_warning("Please relog in order to apply the changes")) + save_preferences() //CITADEL PREFERENCES EDIT - I can't figure out how to modularize these, so they have to go here. :c -Pooj if("genital_colour") features["genitals_use_skintone"] = !features["genitals_use_skintone"] @@ -3441,6 +3499,23 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("hud_toggle_flash") hud_toggle_flash = !hud_toggle_flash + if("barkpreview") + if(SSticker.current_state == GAME_STATE_STARTUP) //Timers don't tick at all during game startup, so let's just give an error message + to_chat(user, "Bark previews can't play during initialization!") + return + if(!COOLDOWN_FINISHED(src, bark_previewing)) + return + if(!parent || !parent.mob) + return + COOLDOWN_START(src, bark_previewing, (5 SECONDS)) + var/atom/movable/barkbox = new(get_turf(parent.mob)) + barkbox.set_bark(bark_id) + var/total_delay + for(var/i in 1 to (round((32 / bark_speed)) + 1)) + addtimer(CALLBACK(barkbox, /atom/movable/proc/bark, list(parent.mob), 7, 70, BARK_DO_VARY(bark_pitch, bark_variance)), total_delay) + total_delay += rand(DS2TICKS(bark_speed/4), DS2TICKS(bark_speed/4) + DS2TICKS(bark_speed/4)) TICKS + QDEL_IN(barkbox, total_delay) + if("save") save_preferences() save_character() @@ -3685,6 +3760,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(custom_speech_verb != "default") character.dna.species.say_mod = custom_speech_verb + character.set_bark(bark_id) + character.vocal_speed = bark_speed + character.vocal_pitch = bark_pitch + character.vocal_pitch_range = bark_variance + //limb stuff, only done when initially spawning in if(initial_spawn) //delete any existing prosthetic limbs to make sure no remnant prosthetics are left over - But DO NOT delete those that are species-related diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index b17fdcc923..293d21e847 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 54 +#define SAVEFILE_VERSION_MAX 55 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -42,6 +42,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //if your savefile is 3 months out of date, then 'tough shit'. /datum/preferences/proc/update_preferences(current_version, savefile/S) + if(current_version < 55) //Bitflag toggles don't set their defaults when they're added, always defaulting to off instead. + toggles |= SOUND_BARK if(current_version < 46) //If you remove this, remove force_reset_keybindings() too. force_reset_keybindings_direct(TRUE) addtimer(CALLBACK(src, .proc/force_reset_keybindings), 30) //No mob available when this is run, timer allows user choice. @@ -967,6 +969,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //SPLURT edit S["feature_naked_flavor_text"] >> features["naked_flavor_text"] //end + // Barks + S["bark_id"] >> bark_id + S["bark_speed"] >> bark_speed + S["bark_pitch"] >> bark_pitch + S["bark_variance"] >> bark_variance S["vore_flags"] >> vore_flags S["vore_taste"] >> vore_taste @@ -990,12 +997,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Sanitize - real_name = reject_bad_name(real_name) + real_name = reject_bad_name(real_name, TRUE) gender = sanitize_gender(gender, TRUE, TRUE) features["body_model"] = sanitize_gender(features["body_model"], FALSE, FALSE, gender == FEMALE ? FEMALE : MALE) if(!real_name) real_name = random_unique_name(gender) - custom_species = reject_bad_name(custom_species) + custom_species = reject_bad_name(custom_species, TRUE) for(var/custom_name_id in GLOB.preferences_custom_names) var/namedata = GLOB.preferences_custom_names[custom_name_id] custom_names[custom_name_id] = reject_bad_name(custom_names[custom_name_id],namedata["allow_numbers"]) @@ -1161,6 +1168,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car scars_list["4"] = sanitize_text(scars_list["4"]) scars_list["5"] = sanitize_text(scars_list["5"]) + bark_id = sanitize_inlist(bark_id, GLOB.bark_list, pick(GLOB.bark_random_list)) + var/datum/bark/bark_path = GLOB.bark_list[bark_id] + bark_speed = sanitize_num_clamp(bark_speed, initial(bark_path.minspeed), initial(bark_path.maxspeed), initial(bark_speed)) + bark_pitch = sanitize_num_clamp(bark_pitch, initial(bark_path.minpitch), initial(bark_path.maxpitch), BARK_PITCH_RAND(gender)) + bark_variance = sanitize_num_clamp(bark_variance, initial(bark_path.minvariance), initial(bark_path.maxvariance), BARK_VARIANCE_RAND) + joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole)) //Validate job prefs for(var/j in job_preferences) @@ -1227,6 +1240,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["species"] , pref_species.id) WRITE_FILE(S["custom_speech_verb"] , custom_speech_verb) WRITE_FILE(S["custom_tongue"] , custom_tongue) + WRITE_FILE(S["bark_id"] , bark_id) + WRITE_FILE(S["bark_speed"] , bark_speed) + WRITE_FILE(S["bark_pitch"] , bark_pitch) + WRITE_FILE(S["bark_variance"] , bark_variance) // records WRITE_FILE(S["security_records"] , security_records) diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index fde9a3e8d5..94d1bb2c42 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -226,6 +226,17 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggleprayersounds)() return C.prefs.toggles & SOUND_PRAYERS +TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggle_bark)() + set name = "Hear/Silence Vocal Barks" + set category = "Preferences" + set desc = "Hear Vocal Barks" + usr.client.prefs.toggles ^= SOUND_BARK + usr.client.prefs.save_preferences() + to_chat(usr, "You will now [(usr.client.prefs.toggles & SOUND_BARK) ? "hear" : "no longer hear"] vocal barks when other people talk.") + SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Vocal Barks", "[usr.client.prefs.toggles & SOUND_BARK ? "Enabled" : "Disabled"]")) +/datum/verbs/menu/Settings/Sound/toggle_bark/Get_checked(client/C) + return C.prefs.toggles & SOUND_BARK + /datum/verbs/menu/Settings/Sound/verb/stop_client_sounds() set name = "Stop Sounds" set category = "Preferences" diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 6fc0fabf31..d3ad2ca4c7 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -360,3 +360,12 @@ desc = "Thin, pretty gloves intended for use in sexy feminine attire. A tag on the hem claims they pair great with black stockings." icon_state = "eveningblack" item_state = "eveningblack" + +/obj/item/clothing/gloves/polymaid + name = "polychromic maid gloves" + desc = "Colourable maid gloves!" + icon_state = "maid_arms" + +/obj/item/clothing/gloves/polymaid/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#333333", "#FFFFFF"), 2) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 4e7ccb7111..f3868f703f 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -477,6 +477,15 @@ item_state = "maid" dynamic_hair_suffix = "" +/obj/item/clothing/head/maid/polychromic + name = "polychromic maid headband" + icon_state = "polymaid" + item_state = "polymaid" + +/obj/item/clothing/head/maid/polychromic/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#333333", "#FFFFFF"), 2) + /obj/item/clothing/head/widered name = "Wide red hat" desc = "It is both wide, and red. Stylish!" diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 7f4de22bb4..7ac2f65205 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -259,6 +259,15 @@ name = "Collar Key" desc = "A key for a tiny lock on a collar or bag." +/obj/item/clothing/neck/maid + name = "polychromic maid collar" + desc = "A collar that goes with the polychromic maid outfit." + icon_state = "maid_neck" + +/obj/item/clothing/neck/maid/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#333333", "#FFFFFF"), 2) + ////////////// //DOPE BLING// ////////////// diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index 41bdb3d5ca..6806f73c65 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -26,15 +26,12 @@ var/mob/living/carbon/human/M = loc if(ishuman(M) && M.w_uniform) var/obj/item/clothing/under/U = M.w_uniform - //SKYRAT EDIT + //SANDSTORM EDIT if(istype(U) && length(U.attached_accessories)) - var/please_overlay = FALSE for(var/obj/item/clothing/accessory/attached in U.attached_accessories) if(attached.above_suit) - please_overlay = TRUE - if(please_overlay) - . += U.accessory_overlay - //SKYRAT EDIT END + . += U.accessory_overlays + //SANDSTORM EDIT END /obj/item/clothing/suit/update_clothes_damaged_state() ..() diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index d9a090a9a7..c87095e5ff 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -22,11 +22,11 @@ var/adjusted = NORMAL_STYLE var/alt_covers_chest = FALSE // for adjusted/rolled-down jumpsuits, FALSE = exposes chest and arms, TRUE = exposes arms only var/dummy_thick = FALSE // is able to hold accessories on its item - //SKYRAT EDIT - Removed the old attached accessory system. We use a list of accessories instead. - var/list/obj/item/clothing/accessory/attached_accessories = list() + //SANDSTORM EDIT - Removed the old attached accessory system. We use a list of accessories instead. var/max_accessories = 3 - //SKYRAT EDIT END - var/mutable_appearance/accessory_overlay + var/list/obj/item/clothing/accessory/attached_accessories = list() + var/list/mutable_appearance/accessory_overlays = list() + //SANDSTORM EDIT END /obj/item/clothing/under/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = ..() @@ -36,8 +36,8 @@ . += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform") if(blood_DNA) . += mutable_appearance('icons/effects/blood.dmi', "uniformblood", color = blood_DNA_to_color(), blend_mode = blood_DNA_to_blend()) - if(accessory_overlay) - . += accessory_overlay + if(length(accessory_overlays)) + . += accessory_overlays /obj/item/clothing/under/attackby(obj/item/I, mob/user, params) if((sensordamage || (has_sensor < HAS_SENSORS && has_sensor != NO_SENSORS)) && istype(I, /obj/item/stack/cable_coil)) @@ -164,14 +164,18 @@ if((flags_inv & HIDEACCESSORY) || (A.flags_inv & HIDEACCESSORY)) return TRUE - //SKYRAT EDIT - accessory_overlay = mutable_appearance('icons/mob/clothing/accessories.dmi', "blank") + //SANDSTORM EDIT + accessory_overlays = list(mutable_appearance('icons/mob/clothing/accessories.dmi', "blank")) for(var/obj/item/clothing/accessory/attached_accessory in attached_accessories) - var/mutable_appearance/Y = mutable_appearance(attached_accessory.mob_overlay_icon, attached_accessory.icon_state, ABOVE_HUD_LAYER) - Y.alpha = attached_accessory.alpha - Y.color = attached_accessory.color - accessory_overlay.add_overlay(Y) - //SKYRAT EDIT END + var/datum/element/polychromic/polychromic = LAZYACCESS(attached_accessory.comp_lookup, "item_worn_overlays") + if(!polychromic) + var/mutable_appearance/accessory_overlay = mutable_appearance(attached_accessory.mob_overlay_icon, attached_accessory.item_state || attached_accessory.icon_state, ABOVE_HUD_LAYER) + accessory_overlay.alpha = attached_accessory.alpha + accessory_overlay.color = attached_accessory.color + accessory_overlays += accessory_overlay + else + polychromic.apply_worn_overlays(attached_accessory, FALSE, attached_accessory.mob_overlay_icon, attached_accessory.item_state || attached_accessory.icon_state, NONE, accessory_overlays) + //SANDSTORM EDIT END if(ishuman(loc)) var/mob/living/carbon/human/H = loc diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 63d09a89de..e39c48f80f 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -48,9 +48,9 @@ TakeComponent(detached_pockets) U.armor = U.armor.detachArmor(armor) - //SKYRAT EDIT + //SANDSTORM EDIT current_uniform = null - //SKYRAT EDIT END + //SANDSTORM EDIT END if(isliving(user)) on_uniform_dropped(U, user) @@ -61,18 +61,23 @@ pixel_y = 0 layer = initial(layer) plane = initial(plane) - U.accessory_overlay = null U.cut_overlays() U.attached_accessories -= src + U.accessory_overlays = list() if(length(U.attached_accessories)) - U.accessory_overlay = mutable_appearance('icons/mob/clothing/accessories.dmi', "blank", WRISTS_LAYER, U.plane) + U.accessory_overlays = list(mutable_appearance('icons/mob/clothing/accessories.dmi', "blank")) for(var/obj/item/clothing/accessory/attached_accessory in U.attached_accessories) attached_accessory.force_unto(U) - var/mutable_appearance/Y = mutable_appearance(attached_accessory.mob_overlay_icon, attached_accessory.icon_state, WRISTS_LAYER, U.plane) - Y.alpha = attached_accessory.alpha - Y.color = attached_accessory.color - U.accessory_overlay.add_overlay(Y) -//SKYRAT EDIT + var/datum/element/polychromic/polychromic = LAZYACCESS(attached_accessory.comp_lookup, "item_worn_overlays") + if(!polychromic) + var/mutable_appearance/accessory_overlay = mutable_appearance(attached_accessory.mob_overlay_icon, attached_accessory.item_state || attached_accessory.icon_state, ABOVE_HUD_LAYER) + accessory_overlay.alpha = attached_accessory.alpha + accessory_overlay.color = attached_accessory.color + U.accessory_overlays += accessory_overlay + else + polychromic.apply_worn_overlays(attached_accessory, FALSE, attached_accessory.mob_overlay_icon, attached_accessory.item_state || attached_accessory.icon_state, NONE, U.accessory_overlays) + +//SANDSTORM EDIT /obj/item/clothing/accessory/proc/force_unto(obj/item/clothing/under/U) layer = FLOAT_LAYER plane = FLOAT_PLANE @@ -98,7 +103,7 @@ pixel_x += rand(-16, 16) pixel_y += rand(-16, 16) U.add_overlay(src) -//SKYRAT EDIT END +//SANDSTORM EDIT END /obj/item/clothing/accessory/proc/on_uniform_equip(obj/item/clothing/under/U, user) return @@ -296,6 +301,15 @@ item_state = "maidapron" minimize_when_attached = FALSE +/obj/item/clothing/accessory/maidapron/polychromic + name = "polychromic maid apron" + icon_state = "polymaidapron" + item_state = "polymaidapron" + +/obj/item/clothing/accessory/maidapron/polychromic/ComponentInitialize() + . = ..() + AddElement(/datum/element/polychromic, list("#333333", "#FFFFFF"), 2) + /obj/item/clothing/accessory/sleevecrop name = "one sleeved crop top" desc = "Off the shoulder crop top, for those nights out partying." diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 363e263ad4..efd9809e1d 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -1016,8 +1016,8 @@ /datum/chemical_reaction/pinktea name = "Strawberry Tea" - id = /datum/reagent/consumable/pinktea - results = list(/datum/reagent/consumable/pinktea = 5) + id = /datum/reagent/consumable/tea/pink + results = list(/datum/reagent/consumable/tea/pink = 5) required_reagents = list(/datum/reagent/consumable/strawberryjuice = 1, /datum/reagent/consumable/tea/arnold_palmer = 1, /datum/reagent/consumable/sugar = 1) /datum/chemical_reaction/catnip_tea diff --git a/code/modules/mapping/minimaps.dm b/code/modules/mapping/minimaps.dm index 51fde1f8db..8768ddd1e8 100644 --- a/code/modules/mapping/minimaps.dm +++ b/code/modules/mapping/minimaps.dm @@ -47,21 +47,43 @@ var/meta_color = area_to_color[A] if(!meta_color) - meta_color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) // technically conflicts could happen but it's like very unlikely and it's not that big of a deal if one happens + var/meta_x = LAZYLEN(area_to_color) + 1 + var/meta_y = (((meta_x + 1) - ((meta_x + 1) % 255)) / 255) + var/meta_z = (((meta_y + 1) - ((meta_y + 1) % 255)) / 255) + meta_color = rgb(meta_x % 255, meta_y % 255, meta_z % 255) //This supports exactly 16,581,374 areas with no conflicts whatsoever before it just gives up area_to_color[A] = meta_color color_area_names[meta_color] = A.name meta_icon.DrawBox(meta_color, img_x, img_y) - if(istype(T, /turf/closed/wall)) + if(A.minimap_show_walls && istype(T, /turf/closed/wall)) map_icon.DrawBox("#000000", img_x, img_y) else if(!istype(A, /area/space)) - var/color = A.minimap_color || "#FF00FF" - if(locate(/obj/machinery/power/solar) in T) - color = "#02026a" + var/color = (A.minimap_color2 ? (((img_x + img_y) % 2) ? A.minimap_color2 : A.minimap_color ) : A.minimap_color) || "#FF00FF" + if(A.minimap_show_walls) + var/overridden + for(var/obj/structure/O in T) + if(O.minimap_override_color) + color = O.minimap_override_color + overridden = TRUE + break + else if(O.density && O.anchored) + color = BlendRGB(color, "#000000", 0.5) + overridden = TRUE + break + + //In an ideal world, we'd be able to get away with just doing for(var/obj/O in T) up there, and calling it a day. However. HOWEVER! + //Doing that causes the code to also loop through items. and that uh. Kinda bloats minimap gen time. A LOT. We're talking straight-up doubling the time it takes to gen. + //So instead we take our ctrl+c. We copy the above code. And we ctrl+v. It's awful. We hate it. But it works. It's faster. Funny mapgen go vroom + if(!overridden) + for(var/obj/machinery/O in T) + if(O.minimap_override_color) + color = O.minimap_override_color + break + else if(O.density && O.anchored) + color = BlendRGB(color, "#000000", 0.25) + break - if((locate(/obj/effect/spawner/structure/window) in T) || (locate(/obj/structure/grille) in T)) - color = BlendRGB(color, "#000000", 0.5) map_icon.DrawBox(color, img_x, img_y) map_icon.Crop(crop_x1, crop_y1, crop_x2, crop_y2) @@ -102,22 +124,48 @@ var/list/datas = list() var/list/info = list() - - for(var/i in 1 to length(minimaps))// OLD: for(var/i in 1 to length(minimaps)) + var/buttonfield = "" + var/totalmaps = length(minimaps) + for(var/i in 1 to totalmaps)// OLD: for(var/i in 1 to length(minimaps)) var/datum/minimap/M = minimaps[i] var/map_name = "minimap-[M.id].png" var/meta_name = "minimap-[M.id]-meta.png" M.send(user) info += {" -
+
+ [totalmaps > 1 ? "

Layer [i]

" : ""]
-
+ [totalmaps <= 1 ? "
" : ""]
"} datas += json_encode(M.color_area_names); + buttonfield += "Layer [i] " + + if(totalmaps > 1) + info += "
[buttonfield]
" + + //This is a hacky workaround; the status display is extremely buggy when multiple z-levels are present. We couldn't figure out how to fix this after 7 hours of banging our head against the wall + //We're coder + var/mousemove_bit = {" + canvas.onmousemove = function(e){ + var rect = canvas.getBoundingClientRect(); + var x = Math.floor(e.offsetX * img.width / rect.width); + var y = Math.floor(e.offsetY * img.height / rect.height); + + var color_idx = x * 4 + (y * 4 * imagedata.width); + var color = "#" + hexify(imagedata.data\[color_idx]) + hexify(imagedata.data\[color_idx+1]) + hexify(imagedata.data\[color_idx+2]); + + label.textContent = data\[color]; + canvas.title = data\[color]; + } + canvas.onmouseout = function(e){ + label.textContent = " "; + canvas.title = ""; + } + "} info = info.Join() //this is bad. Too bad! @@ -133,6 +181,14 @@ } return num; } + function switchmap(mapid) { + var targetblock = document.getElementById(mapid); + for(var i = 0; i < [length(minimaps)]; i++) { + var currentblock = document.getElementById("layer-" + (i + 1)); + currentblock.style.display = 'none'; + } + targetblock.style.display = ''; + } window.onload = function() { if(!window.HTMLCanvasElement) { var label = document.getElementById("label-1"); @@ -150,6 +206,7 @@ var canvas = document.createElement("canvas"); canvas.width = img.width * 2; canvas.height = img.height * 2; + canvas.id = "canvas-" + (i+1); var ctx = canvas.getContext('2d'); ctx.msImageSmoothingEnabled = false; @@ -158,31 +215,23 @@ ctx = document.createElement("canvas").getContext('2d'); ctx.canvas.width = img.width; ctx.canvas.height = img.height; + ctx.id = "ctx-" + (i+1); ctx.drawImage(document.getElementById("map-" + (i+1) + "-meta"), 0, 0); var imagedata = ctx.getImageData(0, 0, img.width, img.height); - canvas.onmousemove = function(e){ - var rect = canvas.getBoundingClientRect(); - var x = Math.floor(e.offsetX * img.width / rect.width); - var y = Math.floor(e.offsetY * img.height / rect.height); - - var color_idx = x * 4 + (y * 4 * imagedata.width); - var color = "#" + hexify(imagedata.data\[color_idx]) + hexify(imagedata.data\[color_idx+1]) + hexify(imagedata.data\[color_idx+2]); - var label = document.getElementById("label-" + (i+1)); //label-String(n) - - label.textContent = data\[color]; - canvas.title = data\[color]; - } - canvas.onmouseout = function(e){ - canvas.title = ""; - } + var label = document.getElementById("label-" + (i+1)); //label-String(n); + [totalmaps <= 1 ? mousemove_bit : ""] } } diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index e207a4e324..48d9b5a14d 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -367,6 +367,8 @@ if(QDELETED(src) || !src.client || this_is_like_playing_right != "Yes") ready = PLAYER_NOT_READY src << browse(null, "window=playersetup") //closes the player setup window + if(!(client?.prefs.toggles & TG_PLAYER_PANEL)) + new_player_panel() return FALSE var/mob/dead/observer/observer = new() diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index a9233938ab..378313311e 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -24,6 +24,9 @@ var/rando_race = pick(GLOB.roundstart_races) pref_species = new rando_race() features = random_features(pref_species?.id, gender) + bark_id = pick(GLOB.bark_random_list) + bark_pitch = BARK_PITCH_RAND(gender) + bark_variance = BARK_VARIANCE_RAND age = rand(AGE_MIN,AGE_MAX) /datum/preferences/proc/update_preview_icon(current_tab) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 53a4b0e997..2dcb8ef98f 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -121,7 +121,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) remove_verb(src, /mob/dead/observer/verb/boo) remove_verb(src, /mob/dead/observer/verb/possess) - animate(src, pixel_y = 2, time = 10, loop = -1) + animate(src, pixel_z = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE) + animate(pixel_z = -4, time = 10, loop = -1, flags = ANIMATION_RELATIVE) add_to_dead_mob_list() @@ -539,8 +540,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/stop_orbit(datum/component/orbiter/orbits) . = ..() //restart our floating animation after orbit is done. - pixel_y = 0 - animate(src, pixel_y = 2, time = 10, loop = -1) + pixel_z = 0 + animate(src, pixel_z = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE) + animate(pixel_z = -4, time = 10, loop = -1, flags = ANIMATION_RELATIVE) /mob/dead/observer/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak set category = "Ghost" diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm index 9563959ebc..ff4a7d2bba 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm @@ -51,7 +51,7 @@ // update_icons() //Handled in update_transform(), leaving this here as a reminder update_transform() -/mob/living/carbon/alien/humanoid/update_transform() //The old method of updating lying/standing was update_icons(). Aliens still expect that. +/mob/living/carbon/alien/humanoid/update_transform(do_animate) //The old method of updating lying/standing was update_icons(). Aliens still expect that. if(lying > 0) lying = 90 //Anything else looks silly ..() diff --git a/code/modules/mob/living/carbon/alien/larva/update_icons.dm b/code/modules/mob/living/carbon/alien/larva/update_icons.dm index e6e7e657e8..85416261c7 100644 --- a/code/modules/mob/living/carbon/alien/larva/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/larva/update_icons.dm @@ -21,7 +21,7 @@ else icon_state = "larva[state]" -/mob/living/carbon/alien/larva/update_transform() //All this is handled in update_icons() +/mob/living/carbon/alien/larva/update_transform(do_animate) //All this is handled in update_icons() ..() return update_icons() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 8af2b7742c..e323f97d73 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -292,6 +292,14 @@ if(ishuman(src)) S = dna.species + //SPLURT EDIT - Headpat traits + if(M.has_quirk(/datum/quirk/dominant_aura) && H.has_quirk(/datum/quirk/well_trained)) + if(H.has_quirk(/datum/quirk/headpat_hater)) + H.remove_quirk(/datum/quirk/headpat_hater) + if(!H.has_quirk(/datum/quirk/headpat_slut)) + H.add_quirk(/datum/quirk/headpat_slut) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "dom_trained", /datum/mood_event/dominant/good_boy) + if(HAS_TRAIT(H, TRAIT_DISTANT)) //No mood buff since you're not really liking it. M.visible_message("[M] gives [H] a pat on the head to make [p_them()] feel better! They seem annoyed...", \ "You give [H] a pat on the head to make [p_them()] feel better! They seem annoyed as they're now glaring towards you...") @@ -315,12 +323,13 @@ "You give [src] a pat on the head to make [p_them()] feel better! They seem to like it way too much..", target = src, target_message = "[M] gives you a pat on the head to make you feel better!") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "lewd_headpat", /datum/mood_event/lewd_headpat) - H.add_lust(5) //Headpats are hot af + H.handle_post_sex(5, null, null) //Headpats are hot af else M.visible_message("[M] gives [src] a pat on the head to make [p_them()] feel better!", \ "You give [src] a pat on the head to make [p_them()] feel better!", target = src, target_message = "[M] gives you a pat on the head to make you feel better!") SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat) + //SPLURT EDIT END if(!(client?.prefs.cit_toggles & NO_AUTO_WAG) && friendly_check) if(S?.can_wag_tail(src) && !dna.species.is_wagging_tail()) diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 9f85b94d03..2ef3aa36a6 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -157,11 +157,11 @@ . += "" . += "[t_He] [t_is] currently in [gender == MALE ? "rut" : "heat"]." - SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) - - if(length(.) > 1) + if(LAZYLEN(.) > 1) .[1] += "
" + SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) + /mob/living/carbon/examine_more(mob/user) if(!all_scars) return ..() diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 5a9a2ebf62..edb5de8188 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -516,10 +516,10 @@ else if(isobserver(user) && traitstring) . += "Traits: [traitstring]" - SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) //This also handles flavor texts now + if(LAZYLEN(.) > 2) //Want this to appear after species text + .[2] += "
" - if(length(.) > 1) - .[1] += "
" + SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) //This also handles flavor texts now /mob/living/proc/status_effect_examines(pronoun_replacement) //You can include this in any mob's examine() to show the examine texts of status effects! var/list/dat = list() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index e79a887dad..3f5b8819be 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -597,18 +597,18 @@ var/no_damage if(status == "OK" || status == "no damage") no_damage = TRUE - to_send += "\t Your [LB.name] [HAS_TRAIT(src, TRAIT_SELF_AWARE) ? "has" : "is"] [status].\n" + to_send += "Your [LB.name] [HAS_TRAIT(src, TRAIT_SELF_AWARE) ? "has" : "is"] [status].\n" for(var/thing in LB.wounds) var/datum/wound/W = thing var/msg switch(W.severity) if(WOUND_SEVERITY_TRIVIAL) - msg = "\t Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]." + msg = "Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]." if(WOUND_SEVERITY_MODERATE) - msg = "\t Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!" + msg = "Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!" if(WOUND_SEVERITY_SEVERE) - msg = "\t Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!" + msg = "Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!" if(WOUND_SEVERITY_CRITICAL) msg = "\t Your [LB.name] is suffering [W.a_or_from] [lowertext(W.name)]!!" to_send += "\n[msg]" diff --git a/code/modules/mob/living/carbon/monkey/punpun.dm b/code/modules/mob/living/carbon/monkey/punpun.dm index c8b8dbbc9d..8fd7b45b65 100644 --- a/code/modules/mob/living/carbon/monkey/punpun.dm +++ b/code/modules/mob/living/carbon/monkey/punpun.dm @@ -46,6 +46,7 @@ ..() /mob/living/carbon/monkey/punpun/proc/Read_Memory() + var/saved_color if(fexists("data/npc_saves/Punpun.sav")) //legacy compatability to convert old format to new var/savefile/S = new /savefile("data/npc_saves/Punpun.sav") S["ancestor_name"] >> ancestor_name @@ -62,6 +63,9 @@ ancestor_chain = json["ancestor_chain"] relic_hat = json["relic_hat"] relic_mask = json["relic_hat"] + saved_color = json["color"] + if(!isnull(saved_color)) + add_atom_colour(json_decode(saved_color), FIXED_COLOUR_PRIORITY) /mob/living/carbon/monkey/punpun/proc/Write_Memory(dead, gibbed) var/json_file = file("data/npc_saves/Punpun.json") @@ -71,10 +75,12 @@ file_data["ancestor_chain"] = null file_data["relic_hat"] = null file_data["relic_mask"] = null + file_data["color"] = null else file_data["ancestor_name"] = ancestor_name ? ancestor_name : name file_data["ancestor_chain"] = dead ? ancestor_chain + 1 : ancestor_chain file_data["relic_hat"] = head ? head.type : null file_data["relic_mask"] = wear_mask ? wear_mask.type : null + file_data["color"] = color ? json_encode(color) : null fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 6efa32b48b..e9150f202d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -81,6 +81,7 @@ //Called when we bump onto a mob /mob/living/proc/MobBump(mob/M) + SEND_SIGNAL(src, COMSIG_LIVING_MOB_BUMP, M) //Even if we don't push/swap places, we "touched" them, so spread fire spreadFire(M) @@ -88,6 +89,7 @@ return TRUE var/they_can_move = TRUE + if(isliving(M)) var/mob/living/L = M they_can_move = CHECK_MOBILITY(L, MOBILITY_MOVE) @@ -105,16 +107,16 @@ //Should stop you pushing a restrained person out of the way if(L.pulledby && L.pulledby != src && L.restrained()) if(!(world.time % 5)) - to_chat(src, "[L] is restrained, you cannot push past.") - return 1 + to_chat(src, span_warning("[L] is restrained, you cannot push past.")) + return TRUE if(L.pulling) if(ismob(L.pulling)) var/mob/P = L.pulling if(P.restrained()) if(!(world.time % 5)) - to_chat(src, "[L] is restraining [P], you cannot push past.") - return 1 + to_chat(src, span_warning("[L] is restraining [P], you cannot push past.")) + return TRUE //CIT CHANGES START HERE - makes it so resting stops you from moving through standing folks or over prone bodies without a short delay if(!CHECK_MOBILITY(src, MOBILITY_STAND)) @@ -142,7 +144,7 @@ //END OF CIT CHANGES if(moving_diagonally)//no mob swap during diagonal moves. - return 1 + return TRUE //handle micro bumping on help intent if(a_intent == INTENT_HELP) @@ -156,7 +158,8 @@ if(!too_strong) mob_swap = TRUE else - if(M.pulledby == src && a_intent == INTENT_GRAB) + //You can swap with the person you are dragging on grab intent, and restrained people in most cases + if(M.pulledby == src && !too_strong) mob_swap = TRUE //restrained people act if they were on 'help' intent to prevent a person being pulled from being separated from their puller else if((M.restrained() || M.a_intent == INTENT_HELP) && (restrained() || a_intent == INTENT_HELP)) @@ -164,8 +167,8 @@ if(mob_swap) //switch our position with M if(loc && !loc.Adjacent(M.loc)) - return 1 - now_pushing = 1 + return TRUE + now_pushing = TRUE var/oldloc = loc var/oldMloc = M.loc @@ -185,29 +188,33 @@ if(!M_passmob) M.pass_flags &= ~PASSMOB - now_pushing = 0 + now_pushing = FALSE if(!move_failed) - return 1 + return TRUE //okay, so we didn't switch. but should we push? //not if he's not CANPUSH of course if(!(M.status_flags & CANPUSH)) - return 1 + return TRUE if(handle_micro_bump_other(M)) return TRUE if(isliving(M)) var/mob/living/L = M if(HAS_TRAIT(L, TRAIT_PUSHIMMUNE)) - return 1 - //If they're a human, and they're not in help intent, block pushing - if(ishuman(M) && (M.a_intent != INTENT_HELP)) - return TRUE + return TRUE + if(M.a_intent != INTENT_HELP) + //If they're a human, and they're not in help intent, block pushing + if(ishuman(M)) + return TRUE + //if they are a cyborg, and they're alive and not in help intent, block pushing + if(iscyborg(M) && M.stat != DEAD) + return TRUE //anti-riot equipment is also anti-push for(var/obj/item/I in M.held_items) if(!istype(M, /obj/item/clothing)) if(prob(I.block_chance*2)) - return 1 + return TRUE /mob/living/get_photo_description(obj/item/camera/camera) var/list/mob_details = list() @@ -238,21 +245,40 @@ if(!client && (mob_size < MOB_SIZE_SMALL)) return now_pushing = TRUE - var/t = get_dir(src, AM) + SEND_SIGNAL(src, COMSIG_LIVING_PUSHING_MOVABLE, AM) + var/dir_to_target = get_dir(src, AM) + + // If there's no dir_to_target then the player is on the same turf as the atom they're trying to push. + // This can happen when a player is stood on the same turf as a directional window. All attempts to push + // the window will fail as get_dir will return 0 and the player will be unable to move the window when + // it should be pushable. + // In this scenario, we will use the facing direction of the /mob/living attempting to push the atom as + // a fallback. + if(!dir_to_target) + dir_to_target = dir + var/push_anchored = FALSE if((AM.move_resist * MOVE_FORCE_CRUSH_RATIO) <= force) - if(move_crush(AM, move_force, t)) + if(move_crush(AM, move_force, dir_to_target)) push_anchored = TRUE - if((AM.move_resist * MOVE_FORCE_FORCEPUSH_RATIO) <= force) //trigger move_crush and/or force_push regardless of if we can push it normally - if(force_push(AM, move_force, t, push_anchored)) + if((AM.move_resist * MOVE_FORCE_FORCEPUSH_RATIO) <= force) //trigger move_crush and/or force_push regardless of if we can push it normally + if(force_push(AM, move_force, dir_to_target, push_anchored)) push_anchored = TRUE + if(ismob(AM)) + var/mob/mob_to_push = AM + var/atom/movable/mob_buckle = mob_to_push.buckled + // If we can't pull them because of what they're buckled to, make sure we can push the thing they're buckled to instead. + // If neither are true, we're not pushing anymore. + if(mob_buckle && (mob_buckle.buckle_prevents_pull || (force < (mob_buckle.move_resist * MOVE_FORCE_PUSH_RATIO)))) + now_pushing = FALSE + return if((AM.anchored && !push_anchored) || (force < (AM.move_resist * MOVE_FORCE_PUSH_RATIO))) now_pushing = FALSE return - if (istype(AM, /obj/structure/window)) + if(istype(AM, /obj/structure/window)) var/obj/structure/window/W = AM if(W.fulltile) - for(var/obj/structure/window/win in get_step(W,t)) + for(var/obj/structure/window/win in get_step(W, dir_to_target)) now_pushing = FALSE return if(pulling == AM) @@ -260,8 +286,9 @@ var/current_dir if(isliving(AM)) current_dir = AM.dir - if(step(AM, t) && Process_Spacemove(t)) - step(src, t) + if(AM.Move(get_step(AM.loc, dir_to_target), dir_to_target, glide_size)) + AM.add_fingerprint(src) + Move(get_step(loc, dir_to_target), dir_to_target) if(current_dir) AM.setDir(current_dir) now_pushing = FALSE @@ -361,29 +388,33 @@ offset = GRAB_PIXEL_SHIFT_NECK if(GRAB_KILL) offset = GRAB_PIXEL_SHIFT_NECK - M.setDir(get_dir(M, src)) - switch(M.dir) - if(NORTH) - animate(M, pixel_x = 0, pixel_y = offset, 3) - if(SOUTH) - animate(M, pixel_x = 0, pixel_y = -offset, 3) - if(EAST) - if(M.lying == 270) //update the dragged dude's direction if we've turned - M.lying = 90 - M.update_transform() //force a transformation update, otherwise it'll take a few ticks for update_mobility() to do so - M.lying_prev = M.lying - animate(M, pixel_x = offset, pixel_y = 0, 3) - if(WEST) - if(M.lying == 90) - M.lying = 270 - M.update_transform() - M.lying_prev = M.lying - animate(M, pixel_x = -offset, pixel_y = 0, 3) + var/target_dir = get_dir(M, src) + M.setDir(target_dir) + var/target_x + var/target_y + if(target_dir & NORTH) + target_y += offset + if(target_dir & SOUTH) + target_y -= offset + if(target_dir & EAST) + target_x += offset + if(target_dir & WEST) + target_x -= offset + if(target_x || target_y) + if(0 < target_x && M.lying == 270) + M.lying = 90 + M.update_transform(FALSE) //force a transformation update, otherwise it'll take a few ticks for update_mobility() to do so + M.lying_prev = M.lying + if(0 > target_x && M.lying == 90) + M.lying = 270 + M.update_transform(FALSE) + M.lying_prev = M.lying + animate(M, pixel_x = target_x, pixel_y = target_y, time = 3, flags = ANIMATION_PARALLEL) /mob/living/proc/reset_pull_offsets(mob/living/M, override) if(!override && M.buckled) return - animate(M, pixel_x = 0, pixel_y = 0, 1) + animate(M, pixel_x = 0, pixel_y = 0, time = 3, flags = ANIMATION_PARALLEL) //mob verbs are a lot faster than object verbs //for more info on why this is not atom/pull, see examinate() in mob.dm @@ -901,12 +932,11 @@ if(anchored || (buckled && buckled.anchored)) fixed = 1 if(on && !(movement_type & FLOATING) && !fixed) - animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1) - sleep(10) - animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1) + animate(src, pixel_z = 2, time = 10, loop = -1, flags = ANIMATION_RELATIVE) + animate(pixel_z = -4, time = 10, loop = -1, flags = ANIMATION_RELATIVE) setMovetype(movement_type | FLOATING) else if(((!on || fixed) && (movement_type & FLOATING))) - animate(src, pixel_y = get_standard_pixel_y_offset(lying), time = 10) + animate(src, pixel_z = get_standard_pixel_y_offset(lying), time = 10) setMovetype(movement_type & ~FLOATING) // The src mob is trying to strip an item from someone @@ -1005,7 +1035,7 @@ var/pixel_y_diff = rand(-amplitude/3, amplitude/3) var/final_pixel_x = get_standard_pixel_x_offset(lying) var/final_pixel_y = get_standard_pixel_y_offset(lying) - animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6) + animate(src, pixel_x = pixel_x_diff, pixel_y = pixel_y_diff , time = 2, loop = 6, flags = ANIMATION_PARALLEL | ANIMATION_RELATIVE) animate(pixel_x = final_pixel_x , pixel_y = final_pixel_y , time = 2) floating_need_update = TRUE diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 49a60c0411..735f271133 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -249,7 +249,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( /mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) //parent calls can't overwrite the current proc args. - if(!client) + if(!client && !audiovisual_redirect) return var/deaf_message var/deaf_type @@ -308,8 +308,9 @@ GLOBAL_LIST_INIT(department_radio_keys, list( AM.Hear(rendered, src, message_language, message, null, spans, message_mode, source) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_LIVING_SAY_SPECIAL, src, message) - if(client && !eavesdrop_range && say_test(message) == "2") // Yell hook - process_yelling(listening, rendered, src, message_language, message, spans, message_mode, source) + var/is_yell = (say_test(message) == "2") + if(client && !eavesdrop_range && is_yell) // Yell hook + listening |= process_yelling(listening, rendered, src, message_language, message, spans, message_mode, source) //speech bubble var/list/speech_bubble_recipients = list() @@ -320,6 +321,22 @@ GLOBAL_LIST_INIT(department_radio_keys, list( I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA INVOKE_ASYNC(GLOBAL_PROC, /.proc/flick_overlay, I, speech_bubble_recipients, 30) + //Listening gets trimmed here if a vocal bark's present. If anyone ever makes this proc return listening, make sure to instead initialize a copy of listening in here to avoid wonkiness + if(vocal_bark || vocal_bark_id) + for(var/mob/M in listening) + if(!M.client) + continue + if(!(M.client.prefs.toggles & SOUND_BARK)) + listening -= M + var/barks = min(round((LAZYLEN(message) / vocal_speed)) + 1, BARK_MAX_BARKS) + var/total_delay + for(var/i in 1 to barks) + if(total_delay > BARK_MAX_TIME) + break + addtimer(CALLBACK(src, /atom/movable/proc/bark, listening, (message_range * (is_yell ? 4 : 1)), (vocal_volume * (is_yell ? 1.5 : 1)), BARK_DO_VARY(vocal_pitch, vocal_pitch_range)), total_delay) + total_delay += rand(DS2TICKS((vocal_speed / BARK_SPEED_BASELINE) * (is_yell ? 0.5 : 1)), DS2TICKS(vocal_speed / BARK_SPEED_BASELINE) + DS2TICKS((vocal_speed / BARK_SPEED_BASELINE) * (is_yell ? 0.5 : 1))) TICKS + + /atom/movable/proc/process_yelling(list/already_heard, rendered, atom/movable/speaker, datum/language/message_language, message, list/spans, message_mode, obj/source) if(last_yell > (world.time - 10)) to_chat(src, "Your voice doesn't project as far as you try to yell in such quick succession.") // yeah no, no spamming an expensive floodfill. @@ -344,6 +361,8 @@ GLOBAL_LIST_INIT(department_radio_keys, list( var/atom/movable/AM = _AM AM.Hear(rendered, speaker, message_language, message, null, spans, message_mode, source) + return overhearing + /mob/proc/binarycheck() return FALSE diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index 2a68668889..cb32b5c893 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -18,7 +18,7 @@ else if (!shunted && !client) . += "[src]Core.exe has stopped responding! NTOS is searching for a solution to the problem..." if(length(.) > 1) - .[1] += "\n
" + .[1] += "
" . += "
" diff --git a/code/modules/mob/living/silicon/examine.dm b/code/modules/mob/living/silicon/examine.dm index 7de281de5f..0840ea1191 100644 --- a/code/modules/mob/living/silicon/examine.dm +++ b/code/modules/mob/living/silicon/examine.dm @@ -1,5 +1,4 @@ /mob/living/silicon/examine(mob/user) //Displays a silicon's laws to ghosts - . = ..() if(laws && isobserver(user)) . += "[src] has the following laws:" for(var/law in laws.get_law_list(include_zeroth = TRUE)) diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index f8c3dd37e9..2aa9194dc8 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -49,10 +49,13 @@ if(DEAD) . += "It looks like its system is corrupted and requires a reset." + if(LAZYLEN(.) > 1) + .[2] = "
[.[2]]" + SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, usr, .) if(length(.) > 1) - .[1] += "\n
" + .[1] += "
" . += "" diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 13f1bea1e4..3b89413271 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -49,6 +49,9 @@ typing_indicator_state = /obj/effect/overlay/typing_indicator/machine + vocal_bark_id = "synth" + vocal_pitch_range = 0.1 + /mob/living/silicon/Initialize(mapload) . = ..() GLOB.silicon_mobs += src diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 0d04d4b562..a7bd8ca921 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -35,6 +35,9 @@ collar_type = "cat" var/held_icon = "cat2" footstep_type = FOOTSTEP_MOB_CLAW + vocal_bark_id = "mutedc4" + vocal_pitch = 1.4 + vocal_pitch_range = 0.4 /mob/living/simple_animal/pet/cat/Initialize(mapload) . = ..() @@ -136,6 +139,7 @@ ..() /mob/living/simple_animal/pet/cat/Runtime/proc/Read_Memory() + var/saved_color if(fexists("data/npc_saves/Runtime.sav")) //legacy compatability to convert old format to new var/savefile/S = new /savefile("data/npc_saves/Runtime.sav") S["family"] >> family @@ -146,14 +150,21 @@ return var/list/json = json_decode(file2text(json_file)) family = json["family"] + saved_color = json["color"] if(isnull(family)) family = list() + if(!isnull(saved_color)) + add_atom_colour(json_decode(saved_color), FIXED_COLOUR_PRIORITY) /mob/living/simple_animal/pet/cat/Runtime/proc/Write_Memory(dead) var/json_file = file("data/npc_saves/Runtime.json") var/list/file_data = list() family = list() if(!dead) + if(color) + file_data["color"] = json_encode(color) + else + file_data["color"] = null for(var/mob/living/simple_animal/pet/cat/kitten/C in children) if(istype(C,type) || C.stat || !C.z || !C.butcher_results) //That last one is a work around for hologram cats continue @@ -161,6 +172,8 @@ family[C.type] += 1 else family[C.type] = 1 + else + file_data["color"] = null file_data["family"] = family fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index bce46fe10d..fb8c937ea8 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -20,6 +20,9 @@ footstep_type = FOOTSTEP_MOB_CLAW + vocal_bark_id = "bullet" + vocal_speed = 6 + /mob/living/simple_animal/pet/dog/ComponentInitialize() . = ..() AddElement(/datum/element/wuv, "yaps happily!", EMOTE_AUDIBLE, /datum/mood_event/pet_animal, "growls!", EMOTE_AUDIBLE) @@ -436,6 +439,7 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list( /mob/living/simple_animal/pet/dog/corgi/Ian/proc/Read_Memory() set waitfor = FALSE + var/saved_color if(fexists("data/npc_saves/Ian.sav")) //legacy compatability to convert old format to new var/savefile/S = new /savefile("data/npc_saves/Ian.sav") S["age"] >> age @@ -450,12 +454,15 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list( age = json["age"] record_age = json["record_age"] saved_head = json["saved_head"] + saved_color = json["color"] if(isnull(age)) age = 0 if(isnull(record_age)) record_age = 1 if(saved_head) place_on_head(new saved_head) + if(!isnull(saved_color)) + add_atom_colour(json_decode(saved_color), FIXED_COLOUR_PRIORITY) /mob/living/simple_animal/pet/dog/corgi/Ian/proc/Write_Memory(dead) var/json_file = file("data/npc_saves/Ian.json") @@ -470,10 +477,15 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list( file_data["saved_head"] = inventory_head.type else file_data["saved_head"] = null + if(color) + file_data["color"] = json_encode(color) + else + file_data["color"] = null else file_data["age"] = 0 file_data["record_age"] = record_age file_data["saved_head"] = null + file_data["color"] = null fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) @@ -630,6 +642,8 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list( mob_size = MOB_SIZE_SMALL collar_type = "puppy" + vocal_pitch = 1.6 + //puppies cannot wear anything. /mob/living/simple_animal/pet/dog/corgi/puppy/Topic(href, href_list) if(href_list["remove_inv"] || href_list["add_inv"]) @@ -651,6 +665,8 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list( maxbodytemp = T0C + 40 held_icon = "void_puppy" + vocal_pitch = 0.6 + /mob/living/simple_animal/pet/dog/corgi/puppy/void/Process_Spacemove(movement_dir = 0) return 1 //Void puppies can navigate space. diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 0ec687c3e3..ca827c29e5 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -36,6 +36,7 @@ var/datum/reagent/milk_reagent = /datum/reagent/consumable/milk footstep_type = FOOTSTEP_MOB_SHOE + vocal_bark_id = "banjoc3" /mob/living/simple_animal/hostile/retaliate/goat/Initialize(mapload, /datum/reagent/milk_reagent) udder = new (null, milk_reagent) @@ -144,6 +145,8 @@ blood_volume = BLOOD_VOLUME_NORMAL footstep_type = FOOTSTEP_MOB_SHOE + vocal_bark_id = "mutedc2" + vocal_pitch = 1.2 /mob/living/simple_animal/cow/Initialize(mapload) udder = new(null, milk_reagent) @@ -248,6 +251,8 @@ gold_core_spawnable = FRIENDLY_SPAWN footstep_type = FOOTSTEP_MOB_CLAW + vocal_bark_id = "squeak" + vocal_pitch = 1.4 /mob/living/simple_animal/chick/Initialize(mapload) . = ..() @@ -310,6 +315,9 @@ var/static/chicken_count = 0 footstep_type = FOOTSTEP_MOB_CLAW + vocal_bark_id = "synthgrunt" + vocal_pitch = 1.4 + vocal_pitch_range = 0.4 /mob/living/simple_animal/chicken/Initialize(mapload) . = ..() @@ -404,6 +412,8 @@ var/static/kiwi_count = 0 footstep_type = FOOTSTEP_MOB_CLAW + vocal_bark_id = "squeak" + vocal_pitch = 1.4 /mob/living/simple_animal/kiwi/Destroy() --kiwi_count @@ -482,6 +492,8 @@ gold_core_spawnable = FRIENDLY_SPAWN footstep_type = FOOTSTEP_MOB_CLAW + vocal_bark_id = "squeak" + vocal_pitch = 1.4 /mob/living/simple_animal/babyKiwi/Initialize(mapload) . = ..() @@ -558,3 +570,4 @@ maxHealth = 75 blood_volume = BLOOD_VOLUME_NORMAL footstep_type = FOOTSTEP_MOB_SHOE + vocal_bark_id = "mutedc4" diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index 4e4fd7ccfc..475b50d44a 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -23,6 +23,11 @@ gold_core_spawnable = FRIENDLY_SPAWN footstep_type = FOOTSTEP_MOB_CLAW + vocal_bark_id = "bullet" + vocal_speed = 2 + vocal_pitch = 1.6 + vocal_pitch_range = 0.4 + /mob/living/simple_animal/pet/fox/ComponentInitialize() . = ..() AddElement(/datum/element/mob_holder, "fox") diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index d49eb1251d..f67c5dcb97 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -29,6 +29,8 @@ gold_core_spawnable = FRIENDLY_SPAWN var/chew_probability = 1 faction = list("rat") + vocal_bark_id = "squeak" + vocal_pitch = 1.4 /mob/living/simple_animal/mouse/Initialize(mapload) . = ..() diff --git a/code/modules/mob/living/simple_animal/friendly/plushie.dm b/code/modules/mob/living/simple_animal/friendly/plushie.dm index ff95e8fe86..4821695f45 100644 --- a/code/modules/mob/living/simple_animal/friendly/plushie.dm +++ b/code/modules/mob/living/simple_animal/friendly/plushie.dm @@ -29,6 +29,8 @@ 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 pressure_resistance = 200 + vocal_bark_id = "squeak" + vocal_pitch_range = 0.4 /mob/living/simple_animal/pet/plushie/ComponentInitialize() . = ..() diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 1f12195ad6..c05aba8227 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -910,11 +910,13 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( speak += pick("...[longest_survival].", "The things I've seen!", "I have lived many lives!", "What are you before me?") desc += " Old as sin, and just as loud. Claimed to be [rounds_survived]." speak_chance = 20 //His hubris has made him more annoying/easier to justify killing - add_atom_colour("#EEEE22", FIXED_COLOUR_PRIORITY) + if(!color) + add_atom_colour("#EEEE22", FIXED_COLOUR_PRIORITY) else if(rounds_survived == longest_deathstreak) speak += pick("What are you waiting for!", "Violence breeds violence!", "Blood! Blood!", "Strike me down if you dare!") desc += " The squawks of [-rounds_survived] dead parrots ring out in your ears..." - add_atom_colour("#BB7777", FIXED_COLOUR_PRIORITY) + if(!color) + add_atom_colour("#BB7777", FIXED_COLOUR_PRIORITY) else if(rounds_survived > 0) speak += pick("...again?", "No, It was over!", "Let me out!", "It never ends!") desc += " Over [rounds_survived] shifts without a \"terrible\" \"accident\"!" @@ -947,6 +949,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( ..(gibbed) /mob/living/simple_animal/parrot/Poly/proc/Read_Memory() + var/saved_color if(fexists("data/npc_saves/Poly.sav")) //legacy compatability to convert old format to new var/savefile/S = new /savefile("data/npc_saves/Poly.sav") S["phrases"] >> speech_buffer @@ -963,8 +966,11 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( rounds_survived = json["roundssurvived"] longest_survival = json["longestsurvival"] longest_deathstreak = json["longestdeathstreak"] + saved_color = json["color"] if(!islist(speech_buffer)) speech_buffer = list() + if(!isnull(saved_color)) + add_atom_colour(json_decode(saved_color), FIXED_COLOUR_PRIORITY) /mob/living/simple_animal/parrot/Poly/proc/Write_Memory(dead) var/json_file = file("data/npc_saves/Poly.json") @@ -978,6 +984,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( file_data["longestdeathstreak"] = rounds_survived - 1 else file_data["longestdeathstreak"] = longest_deathstreak + file_data["color"] = null else file_data["roundssurvived"] = rounds_survived + 1 if(rounds_survived + 1 > longest_survival) @@ -985,6 +992,10 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( else file_data["longestsurvival"] = longest_survival file_data["longestdeathstreak"] = longest_deathstreak + if(color) + file_data["color"] = json_encode(color) + else + file_data["color"] = null fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 5b487f503e..1671c4bca9 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -482,7 +482,7 @@ update_action_buttons_icon() return mobility_flags -/mob/living/simple_animal/update_transform() +/mob/living/simple_animal/update_transform(do_animate) var/matrix/ntransform = matrix(transform) //aka transform.Copy() var/changed = 0 diff --git a/code/modules/mob/living/update_icons.dm b/code/modules/mob/living/update_icons.dm index d3264c93a2..4ad861bf2b 100644 --- a/code/modules/mob/living/update_icons.dm +++ b/code/modules/mob/living/update_icons.dm @@ -1,5 +1,5 @@ //IMPORTANT: Multiple animate() calls do not stack well, so try to do them all at once if you can. -/mob/living/update_transform() +/mob/living/update_transform(do_animate = TRUE) var/matrix/ntransform = matrix(transform) //aka transform.Copy() var/final_pixel_y = pixel_y var/changed = 0 @@ -25,5 +25,9 @@ resize = RESIZE_DEFAULT_SIZE if(changed) - animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, easing = EASE_IN|EASE_OUT) + if(do_animate) + animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, easing = EASE_IN|EASE_OUT, flags = ANIMATION_PARALLEL) + else + transform = ntransform + pixel_y = final_pixel_y floating_need_update = TRUE diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index f22c87913f..cfc2a6822a 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -141,7 +141,7 @@ return hearers -= ignored_mobs - if(target_message && target && istype(target) && target.client) + if(target_message && target && istype(target) && (target.client || target.audiovisual_redirect)) hearers -= target if(omni) target.show_message(target_message) @@ -158,7 +158,7 @@ if(self_message) hearers -= src for(var/mob/M in hearers) - if(!M.client) + if(!M.client && !M.audiovisual_redirect) continue if(omni) M.show_message(message) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index a3bcdb0e55..f59ed15c88 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -229,17 +229,23 @@ It's fairly easy to fix if dealing with single letters but not so much with comp return copytext_char(sanitize(.),1,MAX_MESSAGE_LEN) /proc/shake_camera(mob/M, duration, strength=1) - if(!M || !M.client || duration < 1) + set waitfor = FALSE + if(!M || !M.client || duration <= 0) return var/client/C = M.client + if (C.prefs.screenshake==0) + return var/oldx = C.pixel_x var/oldy = C.pixel_y - var/max = strength*world.icon_size - var/min = -(strength*world.icon_size) + var/clientscreenshake = (C.prefs.screenshake * 0.01) + var/max = (strength*clientscreenshake) * world.icon_size + var/min = -((strength*clientscreenshake) * world.icon_size) + var/roundedduration = -round(-duration) // round() with only one arg will always round down. so uh. this is Something all right - for(var/i in 0 to duration-1) + for(var/i in 0 to roundedduration-1) + duration-- if (i == 0) - animate(C, pixel_x=rand(min,max), pixel_y=rand(min,max), time=1) + animate(C, pixel_x=(rand(min,max)*duration), pixel_y=(rand(min,max)*duration), time=1) else animate(pixel_x=rand(min,max), pixel_y=rand(min,max), time=1) animate(pixel_x=oldx, pixel_y=oldy, time=1) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index fad48b4854..27fb30a459 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -5,6 +5,7 @@ desc = "A solar panel. Generates electricity when in contact with sunlight." icon = 'goon/icons/obj/power.dmi' icon_state = "sp_base" + minimap_override_color = "#02026a" density = TRUE use_power = NO_POWER_USE idle_power_usage = 0 diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 836ed3b804..3f2f4d3e65 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -3,6 +3,7 @@ name = "projectile gun" icon_state = "pistol" w_class = WEIGHT_CLASS_NORMAL + recoil = 0.25 var/spawnwithmagazine = TRUE var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info var/obj/item/ammo_box/magazine/magazine diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index afb30631e0..fe42fc2d99 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -5,6 +5,7 @@ mag_type = /obj/item/ammo_box/magazine/internal/cylinder fire_sound = "sound/weapons/revolvershot.ogg" casing_ejector = FALSE + recoil = 0.5 /obj/item/gun/ballistic/revolver/Initialize(mapload) . = ..() @@ -285,6 +286,7 @@ item_state = "shotgun" w_class = WEIGHT_CLASS_BULKY weapon_weight = WEAPON_MEDIUM + recoil = 1 force = 10 flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BACK diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index c6fd27b103..25e4b6b12a 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -5,6 +5,7 @@ item_state = "shotgun" fire_sound = "sound/weapons/gunshotshotgunshot.ogg" w_class = WEIGHT_CLASS_BULKY + recoil = 1 force = 10 flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BACK diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index dd759f9e3c..03dfc46713 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -16,6 +16,7 @@ name = "energy gun" desc = "A basic energy-based gun." icon = 'icons/obj/guns/energy.dmi' + recoil = 0.1 var/obj/item/stock_parts/cell/cell //What type of power cell this uses var/cell_type = /obj/item/stock_parts/cell diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 3f41ac859f..9b10a843e8 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -8,6 +8,7 @@ item_flags = NONE obj_flags = UNIQUE_RENAME weapon_weight = WEAPON_LIGHT + recoil = 0.5 can_flashlight = 1 flight_x_offset = 15 flight_y_offset = 9 diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm index 07066023b3..8de7633a79 100644 --- a/code/modules/projectiles/guns/misc/syringe_gun.dm +++ b/code/modules/projectiles/guns/misc/syringe_gun.dm @@ -4,6 +4,7 @@ icon_state = "syringegun" item_state = "syringegun" w_class = WEIGHT_CLASS_NORMAL + recoil = 0.1 throw_speed = 3 throw_range = 7 force = 4 diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 3554fc7052..d91a336db0 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -1045,13 +1045,13 @@ glass_desc = "Delicious flavored strawberry syrup mixed with milk." value = REAGENT_VALUE_VERY_COMMON -/datum/reagent/consumable/tea/pinkmilk/on_mob_life(mob/living/carbon/M) +/datum/reagent/consumable/pinkmilk/on_mob_life(mob/living/carbon/M) if(prob(15)) to_chat(M, "[pick("You cant help to smile.","You feel nostalgia all of sudden.","You remember to relax.")]") ..() . = 1 -/datum/reagent/consumable/pinktea //Tiny Tim song +/datum/reagent/consumable/tea/pink //Tiny Tim song name = "Strawberry Tea" description = "A timeless classic!" color = "#f76aeb"//rgb(247, 106, 235) @@ -1061,7 +1061,7 @@ glass_name = "mug of strawberry tea" glass_desc = "Delicious traditional tea flavored with strawberries." -/datum/reagent/consumable/tea/pinktea/on_mob_life(mob/living/carbon/M) +/datum/reagent/consumable/tea/pink/on_mob_life(mob/living/carbon/M) if(prob(10)) to_chat(M, "[pick("Diamond skies where white deer fly.","Sipping strawberry tea.","Silver raindrops drift through timeless, Neverending June.","Crystal ... pearls free, with love!","Beaming love into me.")]") ..() diff --git a/code/modules/research/techweb/_techweb.dm b/code/modules/research/techweb/_techweb.dm index d542694236..dc07a5a184 100644 --- a/code/modules/research/techweb/_techweb.dm +++ b/code/modules/research/techweb/_techweb.dm @@ -17,7 +17,7 @@ var/list/obj/machinery/computer/rdconsole/consoles_accessing = list() var/id = "generic" var/list/research_logs = list() //IC logs. - var/largest_bomb_value = 0 + var/largest_values = list() var/organization = "Third-Party" //Organization name, used for display. var/list/next_income = list() //To be applied on the next passive techweb income var/list/last_bitcoins = list() //Current per-second production, used for display only. diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index 17b91fa23d..27df6a14f0 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -47,7 +47,20 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) promptAndCheckIn(user) /obj/item/hilbertshotel/proc/promptAndCheckIn(mob/user) - var/chosenRoomNumber = input(user, "What number room will you be checking into?", "Room Number") as null|num + //SPLURT EDIT - max infinidorms rooms + var/max_rooms = CONFIG_GET(number/max_infinidorms) + var/chosenRoomNumber + if(max_rooms == 0) + playsound(src, 'sound/machines/terminal_error.ogg', 15, 1) + to_chat(user, span_warning("We're currently not offering service, please come back another day!")) + return + + chosenRoomNumber = input(user, "What number room will you be checking into?", "Room Number") as null|num + if(max_rooms > 0 && mob_dorms[user]?.len >= max_rooms && !activeRooms["[chosenRoomNumber]"] && !storedRooms["[chosenRoomNumber]"]) + to_chat(user, span_warning("Your free trial of Hilbert's Hotel has ended! Please select one of the rooms you've already visited.")) + chosenRoomNumber = input(user, "Select one of your previous rooms", "Room number") as null|anything in mob_dorms[user] + + //SPLURT EDIT END if(!chosenRoomNumber || !user.CanReach(src)) return if(chosenRoomNumber > SHORT_REAL_LIMIT) diff --git a/code/modules/vehicles/mecha/combat/five_stars.dm b/code/modules/vehicles/mecha/combat/five_stars.dm index 6a73c3adde..def8e94cc8 100644 --- a/code/modules/vehicles/mecha/combat/five_stars.dm +++ b/code/modules/vehicles/mecha/combat/five_stars.dm @@ -4,7 +4,6 @@ icon = 'icons/mecha/mecha_96x96.dmi' icon_state = "five_stars" armor = list(MELEE = 100, BULLET = 50, LASER = 35, ENERGY = 35, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100) - step_in = 4 dir_in = 1 //Facing North. max_integrity = 800 pixel_x = -32 diff --git a/config/entries/general.txt b/config/entries/general.txt index dfadfddca9..4a0369313b 100644 --- a/config/entries/general.txt +++ b/config/entries/general.txt @@ -480,7 +480,7 @@ BOX_RANDOM_ENGINE Box TEG,3 BOX_RANDOM_ENGINE Box Empty,0 BOX_RANDOM_ENGINE Box Antimatter,1 BOX_RANDOM_ENGINE Box P.A.C.M.A.N,1 -BOX_RANDOM_ENGINE Box RBMK,1 +BOX_RANDOM_ENGINE Box RBMK,0 ## Whether the suicide verb is allowed. diff --git a/config/splurt/general.txt b/config/splurt/general.txt index 3f8f3b0516..9ba4dc93b5 100644 --- a/config/splurt/general.txt +++ b/config/splurt/general.txt @@ -3,3 +3,11 @@ ## The discord verification system makes use of https://github.com/optimumtact/orangescogs ## ## Needs a working database with the station's current schema ## #NEED_DISCORD_TO_JOIN + +# Enable global barks +# Uncomment this to allow player's speech barks # +ENABLE_GLOBAL_BARKS + +# Max number of infinidorms each mob can use +# -1 for infinite, 0 to deactivate infinidorms as a whole +MAX_INFINIDORMS 5 diff --git a/html/changelogs/archive/2022-06.yml b/html/changelogs/archive/2022-06.yml index 5a7c089847..46ed65f4bf 100644 --- a/html/changelogs/archive/2022-06.yml +++ b/html/changelogs/archive/2022-06.yml @@ -117,7 +117,172 @@ - rscadd: New cane for Plague Doctor - rscadd: More accurate mask - rscadd: Plague Doctor kit to Cargo Orders + BongaTheProto: + - tweak: Makes the new player panel a toggle so you can choose between the old one + and TG's current. Option in Game Preferences +2022-06-06: SandPoot: - refactor: Completely replaces the new player panel *not the admin one* with TG's. timothyteakettle: - rscadd: adds paper skin and glass bones quirks +2022-06-07: + Bhijn & Myr: + - rscadd: During pride month, station nukes are significantly more efficient at + revealing genders. + - rscadd: Station pets now retain their color between shifts! + - bugfix: Admin vote deobfuscation now properly displays votes as 0 if they were + simply never voted for. + - bugfix: Audiovisual redirection now works exactly as it used to. In laymen's terms, + this means folks in VR sleepers are aware of the world around them again! + - bugfix: The shake animation, jiggle animation, squish animation, jitter animation, + and float animation, have all been fixed. + - bugfix: This also means that storage animations are fully working again. It's + been a few years! + - bugfix: The pull animation no longer interrupts ongoing animations. + - tweak: The pull animation now supports diagonal directions (currently only applies + to the initial grab! pull code is spaghetti) + - bugfix: All screenshake sources now fully support the screenshake pref + - code_imp: cit_screenshake.dm has been fully merged into the base files. + - bugfix: You can no longer remotely apply fingerprints to storage objects by clicking + and dragging it around. Additionally, storage objects now rustle again when + clicking and dragging (only took like,, a year to fix) + - bugfix: The pickup animation now properly slides into your spaceman again, instead + of just kinda disappearing. + - tweak: When pulling a resting mob, they'll now skip the laying animation entirely, + fixing a visual oddity where they shrink and grow to flip. + - tweak: Alerts are now a little snappier and bouncier, as they've been swapped + from sine easing, to back easing. + - tweak: Radial menus now use sine easing, rather than linear easing. This just + looks a little prettier. + - tweak: Runechat now properly respects an object's X offset. Previously, it relied + on a hardcoded check for dogborgs. + - tweak: The float animation now uses pixel_z instead of pixel_y, fixing issues + where the Y offset gets wiped due to the float animation. This also makes floating + fully compatible with ctrl+WASD." + BongaTheProto: + - rscadd: New panting emote + - rscadd: Adds a recipe for the cum donut + - rscadd: Adds a panting emote + - rscadd: Adds Dominant Aura and Well-trained quirks + - rscadd: Snack alt title for assistants + - soundadd: Adds sounds for the kiss them deeply interaction + - soundadd: Adds moaning sounds for verb moans + - tweak: Changes bane syndrome's value to -2 + - tweak: Makes xenocommon a selectable language + - tweak: Fucking people's throats gives an actually harmful amount of oxyloss again + - tweak: If you have the voracious trait, the fat moodlet will become a positive + one. + - tweak: headpat slut will now give you an modified wuv element and possibly make + you cum + - bugfix: Fixes the notify verb so it actually removes you from the list if you + want it to + - bugfix: makes the cheesed moodlet actually check if you're a felinid + - bugfix: Gives Bane Syndrome its effects back + - bugfix: You can now actually dispense tea from the Soda Dispenser, rejoice! + - rscdel: deletes the double railing declaration in the code + - code_imp: changes some things to use the cooldown system + - code_imp: puts signal handlers in a couple procs where they needed to be + - code_imp: Adds a signal for when mobs use emotes + SandPoot: + - refactor: Does some extremely minor touches on pulling/pushing code. + timothyteakettle: + - rscadd: updates existing poly maid outfit with tg sprite but polychromatic + - rscadd: adds polychromic maid apron, gloves, collar, headband + - rscadd: adds support for polychromic accessories +2022-06-08: + SandPoot: + - tweak: The "MobInteraction" is now written on typescript. +2022-06-09: + Anonymous: + - rscadd: Players, who somehow ended up controlling a simple mob, now can change + their genital set just like robots and pAIs. + - rscdel: My sanity. +2022-06-10: + AshTheDerg: + - rscadd: Holgraphic Security Badges (Backpack loadout option for Security Department, + including Detectives) + - rscadd: Modular PC vendor + - rscadd: Rifle sling, craftable via biogenerator + - rscadd: Debug Omnitool (Admin-only, sorry) + - tweak: Enforcer Voidsuit now has armor equivalent to Security Winter Jackets + - tweak: Gave Detectives badges, too! +2022-06-11: + Bhijn & Myr: + - rscadd: The station minimap now features higher detail! Instead of just windows + and grilles being outlined, all dense+anchored structures and machinery are + shown on the minimap. + - rscadd: The station minimap now supports obfuscating entire areas, via the minimap_show_walls + var. + - rscadd: 'The station minimap now supports defining two area colors, allowing for + a checkerboard pattern! tweak: Hallways and maint have been given white and + gray colors, respectively, for ease of readability. tweak: Ruins are now obfuscated + on the minimap, and have been given a subtle, yet distinct, color pattern!' + - bugfix: The station minimap no longer errors when you mouse over it + - rscadd: 'The station minimap now supports multiz! (However, due to bugginess, + multiz minimaps won''t display area tooltips.) tweak: The station minimap now + features pixel-perfect scaling.' + - code_imp: The station minimap can now support managing data for up to 16,581,374 + areas without any conflicts at all! Before, BYOND's psuedorandom RNG meant that + it was somewhat common for areas to collide with each others' data. + - rscadd: Talking is now accompanied with fully-customizable sounds! You can modify + your character's speech under the speech tab in chargen, and you can toggle + these sounds via the "Hear/Silence Vocal Barks" verb under the preferences tab! + This also fully supports genetics. + - bugfix: Admittedly an unatomized change, but Cit's DNA blocks can now properly + be updated through genetics. Before, these required a complete genetics reset + to apply. + - rscadd: 'The chat now supports blockquotes! tweak: Examining, medical scanners, + self-checking, and mood checkups, have all been converted to make use of blockquotes.' + Bhijn & Myr (+ UI work and cleanup by Sandpoot!): + - rscadd: Colormates now have HSV coloration! + - tweak: Colormates have had their "please use white clothing" message removed, + as that recommendation's now mostly pointless + - tweak: The default mode for colormates is now HSV coloration + - tweak: The temp messages in colormates have been tweaked slightly to be more user-friendly, + as they're user-facing. + - tweak: The description for constants in the colormate matrix mode has been fixed; + the constant variables have nothing to do with contrast, they simply add color + - tweak: Matrix mode has been made a lot more usable; it's now clamped between -10 + and 10, and features a step of 0.01, making it much easier to simply click and + drag to adjust the values, rather than having to punch them in manually + Putnam3145: + - balance: QCD matter is now worth 10x as much and makes 2 research pointer per + mole + SandPoot: + - rscadd: Added a search box to all vending machine uis. + - qol: Vending machines have candystripes for better clarity. + - bugfix: Fixed items that use strip_mod and strip_silence (stripping people faster + or without giving them a message) + keronshb: + - bugfix: Families fixed from crashing +2022-06-12: + Anonymous: + - tweak: 'wip: Trencher''s coats are now able to hold detective-tier items, however + cargo costs for them are increased.' + AshTheDerg: + - rscadd: Sylveon Bow "horns" + - rscadd: Sylveon Ribbon "wings" + BongaTheProto: + - tweak: Now size normalizers will continuously normalize you and absorb the effect + of size changing mechanics in-game. Giving you all of the changes back when + you take off the clothing + - bugfix: Now you can actually give your character numbers in their names and species + - bugfix: Gives the syntech ring and band an actual ring path so they can be attached + to gloves (doesn't work if you use them this way tho) + - bugfix: Definitely fixes the bug where spawning with more than one size normalizer + locks you on size one _in case it still exists_ + - bugfix: "Fixes a bug with nanites, probably \xBF" + - code_imp: Makes the size normalizer code less snowflakey and now relies on a component +2022-06-13: + Bhijn & Myr: + - bugfix: Jukebox audio is now audible within closets, crates, etc! +2022-06-15: + AshTheDerg: + - rscadd: Added Syndicate Asteroid Listening Post + Ghost Role + - rscadd: Added Radio Station Ship +2022-06-16: + BongaTheProto: + - imageadd: New ear sprites + - tweak: Now subs will actually blush when examining doms + - server: Limits the amount of infinidorms each person can create for the sake of + helping the TD diff --git a/icons/mob/clothing/accessories.dmi b/icons/mob/clothing/accessories.dmi index 03849efa5a..f801c483f1 100644 Binary files a/icons/mob/clothing/accessories.dmi and b/icons/mob/clothing/accessories.dmi differ diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi index ca8a7312fa..9bd206e04e 100644 Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index 20b8576277..2b317737d7 100644 Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ diff --git a/icons/mob/clothing/uniform.dmi b/icons/mob/clothing/uniform.dmi index 04d9b20a75..ce25963360 100644 Binary files a/icons/mob/clothing/uniform.dmi and b/icons/mob/clothing/uniform.dmi differ diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi index 79cb2bff77..f633f030c3 100644 Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index d4cd4b4f2f..17073805c9 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi index 8540b2f392..c9491af6b2 100644 Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index c16b416cd8..de7dd234b1 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/modular_citadel/code/game/objects/cit_screenshake.dm b/modular_citadel/code/game/objects/cit_screenshake.dm deleted file mode 100644 index 222de37f82..0000000000 --- a/modular_citadel/code/game/objects/cit_screenshake.dm +++ /dev/null @@ -1,51 +0,0 @@ -//we vlambeer now - -/obj/proc/shake_camera(mob/M, duration, strength=1)//byond's wonky with this shit - set waitfor = FALSE - if(!M || !M.client || duration <= 0) - return - var/client/C = M.client - if (C.prefs.screenshake==0) - return - var/oldx = C.pixel_x - var/oldy = C.pixel_y - var/clientscreenshake = (C.prefs.screenshake * 0.01) - var/max = (strength*clientscreenshake) * world.icon_size - var/min = -((strength*clientscreenshake) * world.icon_size) - - for(var/i in 0 to duration-1) - if (i == 0) - animate(C, pixel_x=rand(min,max), pixel_y=rand(min,max), time=1) - else - animate(pixel_x=rand(min,max), pixel_y=rand(min,max), time=1) - animate(pixel_x=oldx, pixel_y=oldy, time=1) - -/obj/item/gun/energy - recoil = 0.1 - -/obj/item/gun/energy/kinetic_accelerator - recoil = 0.5 - -/obj/item/gun/ballistic - recoil = 0.25 - -/obj/item/gun/ballistic/shotgun - recoil = 1 - -/obj/item/gun/ballistic/revolver - recoil = 0.5 - -/obj/item/gun/ballistic/revolver/doublebarrel - recoil = 1 - -/obj/item/gun/syringe - recoil = 0.1 - -/obj/item/pneumatic_cannon/fire_items(turf/target, mob/user) - . = ..() - shake_camera(user, (pressureSetting * 0.75 + 1), (pressureSetting * 0.75)) - -/obj/item/attack_obj(obj/O, mob/living/user) - . = ..() - if(force >= 20) - shake_camera(user, ((force - 15) * 0.01 + 1), ((force - 15) * 0.01)) diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm index 3824993009..0573a1a22a 100644 --- a/modular_citadel/code/modules/client/loadout/backpack.dm +++ b/modular_citadel/code/modules/client/loadout/backpack.dm @@ -175,3 +175,9 @@ /datum/gear/backpack/necklace//this is here because loadout doesn't support proper accessories name = "A renameable necklace" path = /obj/item/clothing/accessory/necklace + +/datum/gear/backpack/polymaidapron //this is ALSO here because loadout doesn't support proper accessories + name = "Polychromic maid apron" + path = /obj/item/clothing/accessory/maidapron/polychromic + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#333333", "#FFFFFF") diff --git a/modular_citadel/code/modules/client/loadout/gloves.dm b/modular_citadel/code/modules/client/loadout/gloves.dm index 0b87ec65e6..766c6a7cac 100644 --- a/modular_citadel/code/modules/client/loadout/gloves.dm +++ b/modular_citadel/code/modules/client/loadout/gloves.dm @@ -13,3 +13,9 @@ /datum/gear/gloves/midnight name = "Midnight gloves" path = /obj/item/clothing/gloves/evening/black + +/datum/gear/gloves/maidpoly // WHAT DO YOU EVEN CALL THEM + name = "Polychromic maid gloves" + path = /obj/item/clothing/gloves/polymaid + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#333333", "#FFFFFF") diff --git a/modular_citadel/code/modules/client/loadout/head.dm b/modular_citadel/code/modules/client/loadout/head.dm index f2a7ead5be..d0563d2986 100644 --- a/modular_citadel/code/modules/client/loadout/head.dm +++ b/modular_citadel/code/modules/client/loadout/head.dm @@ -58,6 +58,12 @@ name = "Maid headband" path= /obj/item/clothing/head/maid +/datum/gear/head/maidband/poly + name = "Polychromic maid headband" + path= /obj/item/clothing/head/maid/polychromic + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#333333", "#FFFFFF") + /datum/gear/head/flakhelm name = "Flak Helmet" path = /obj/item/clothing/head/flakhelm diff --git a/modular_citadel/code/modules/client/loadout/neck.dm b/modular_citadel/code/modules/client/loadout/neck.dm index dc7735de2b..64d1fcdc1f 100644 --- a/modular_citadel/code/modules/client/loadout/neck.dm +++ b/modular_citadel/code/modules/client/loadout/neck.dm @@ -106,3 +106,9 @@ path = /obj/item/clothing/neck/cloak/cancloak/polychromic loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC loadout_initial_colors = list("#585858", "#373737", "#BEBEBE") + +/datum/gear/neck/maid + name = "Polychromatic Maid Collar" + path = /obj/item/clothing/neck/maid + loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC + loadout_initial_colors = list("#333333", "#FFFFFF") diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm index 4404d70bcd..c0c7846112 100644 --- a/modular_citadel/code/modules/client/loadout/uniform.dm +++ b/modular_citadel/code/modules/client/loadout/uniform.dm @@ -52,7 +52,7 @@ name = "Polychromic maid costume" path = /obj/item/clothing/under/rank/civilian/janitor/maid/polychromic loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC - loadout_initial_colors = list("#FFFFFF", "#000000") + loadout_initial_colors = list("#333333", "#FFFFFF") /datum/gear/uniform/mailmanuniform name = "Mailman's jumpsuit" diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/facefuck.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/facefuck.dm index e66cce7f28..8591f2f8a8 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/facefuck.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/facefuck.dm @@ -131,8 +131,8 @@ "slams in and out of \the [partner]'s mouth, [u_His] balls slapping off [t_His] face.")]" if(rand(3)) partner.emote("chokes on \the [user]") - if(prob(1) && istype(partner)) - partner.adjustOxyLoss(5) + /*if(prob(1) && istype(partner)) //Handled on modular_splurt + partner.adjustOxyLoss(5)*/ if(partner.a_intent == INTENT_HARM) // adjustBruteLoss(5) retaliation_message = pick( diff --git a/modular_sand/code/modules/client/preferences_savefile.dm b/modular_sand/code/modules/client/preferences_savefile.dm index ef6a14917a..1a604182c3 100644 --- a/modular_sand/code/modules/client/preferences_savefile.dm +++ b/modular_sand/code/modules/client/preferences_savefile.dm @@ -6,3 +6,14 @@ else var/tmp = language language = list(tmp) + +/datum/preferences/update_preferences(current_version, savefile/S) + // Citadel added a new bitfield to toggles, we need to push our prefs forward starting from the last bit + if(current_version < 55) + if(CHECK_BITFIELD(toggles, VERB_CONSENT)) + DISABLE_BITFIELD(toggles, VERB_CONSENT) + ENABLE_BITFIELD(toggles, LEWD_VERB_SOUNDS) + if(CHECK_BITFIELD(toggles, SOUND_BARK)) + DISABLE_BITFIELD(toggles, SOUND_BARK) + ENABLE_BITFIELD(toggles, VERB_CONSENT) + . = ..() diff --git a/modular_sand/code/modules/clothing/gloves/_gloves.dm b/modular_sand/code/modules/clothing/gloves/_gloves.dm index b1984e9770..65f7de4825 100644 --- a/modular_sand/code/modules/clothing/gloves/_gloves.dm +++ b/modular_sand/code/modules/clothing/gloves/_gloves.dm @@ -1,16 +1,14 @@ /obj/item/clothing/gloves var/dummy_thick = FALSE // is able to hold accessories on its item - // Sandstorm edit - Removed the old attached accessory system. We use a list of accessories instead. - var/list/obj/item/clothing/accessory/ring/attached_accessories = list() var/max_accessories = 1 - // Sandstorm edit END - var/mutable_appearance/accessory_overlay + var/list/obj/item/clothing/accessory/ring/attached_accessories = list() + var/list/mutable_appearance/accessory_overlays = list() /obj/item/clothing/gloves/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) . = ..() if(!isinhands) - if(accessory_overlay) - . += accessory_overlay + if(length(accessory_overlays)) + . += accessory_overlays /obj/item/clothing/gloves/attackby(obj/item/I, mob/user, params) if(!attach_accessory(I, user)) @@ -20,7 +18,7 @@ . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return - if(length(attached_accessories)) // Sandstorm edit + if(length(attached_accessories)) remove_accessory(user) /obj/item/clothing/gloves/equipped(mob/user, slot) @@ -70,14 +68,16 @@ if((flags_inv & HIDEACCESSORY) || (A.flags_inv & HIDEACCESSORY)) return TRUE - // Sandstorm edit - accessory_overlay = mutable_appearance(I.mob_overlay_icon, I.item_state) - for(var/obj/item/clothing/accessory/ring/attached_accessory in attached_accessories) - var/mutable_appearance/Y = mutable_appearance(attached_accessory.mob_overlay_icon, attached_accessory.icon_state, ABOVE_HUD_LAYER) - Y.alpha = attached_accessory.alpha - Y.color = attached_accessory.color - accessory_overlay.add_overlay(Y) - // Sandstorm edit END + accessory_overlays = list(mutable_appearance('icons/mob/clothing/accessories.dmi', "blank")) + for(var/obj/item/clothing/accessory/attached_accessory in attached_accessories) + var/datum/element/polychromic/polychromic = LAZYACCESS(attached_accessory.comp_lookup, "item_worn_overlays") + if(!polychromic) + var/mutable_appearance/accessory_overlay = mutable_appearance(attached_accessory.mob_overlay_icon, attached_accessory.item_state || attached_accessory.icon_state, ABOVE_HUD_LAYER) + accessory_overlay.alpha = attached_accessory.alpha + accessory_overlay.color = attached_accessory.color + accessory_overlays += accessory_overlay + else + polychromic.apply_worn_overlays(attached_accessory, FALSE, attached_accessory.mob_overlay_icon, attached_accessory.item_state || attached_accessory.icon_state, NONE, accessory_overlays) if(ishuman(loc)) var/mob/living/carbon/human/H = loc @@ -91,10 +91,8 @@ if(!can_use(user)) return - // Sandstorm edit if(length(attached_accessories)) var/obj/item/clothing/accessory/ring/A = attached_accessories[length(attached_accessories)] - // Sandstorm edit END A.detach(src, user) if(user.put_in_hands(A)) to_chat(user, "You detach [A] from [src].") diff --git a/modular_sand/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/modular_sand/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 5b80e1b91c..c0b7ce2ca5 100644 --- a/modular_sand/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/modular_sand/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -145,7 +145,7 @@ /datum/reagent/consumable/pinkmilk hydration = 4 -/datum/reagent/consumable/pinktea +/datum/reagent/consumable/tea/pink hydration = 4 /datum/reagent/consumable/monkey_energy diff --git a/modular_splurt/README.md b/modular_splurt/README.md index 1249b0be0f..c0c251cf64 100644 --- a/modular_splurt/README.md +++ b/modular_splurt/README.md @@ -1,5 +1,5 @@ # About modularizing defines -Since #define clauses can't be properly modularized and need to be loaded first than the rest of the code for it to catch them, the modular_splurt/code/_DEFINES/ folder has been deleted and all of its contents have been moved to code/__DEFINES/splurtcode/ +Since #define clauses can't be properly modularized and need to be loaded first than the rest of the code for it to catch them, the modular_splurt/code/_DEFINES/ folder has been deleted and all of its contents have been moved to code\\__SPLURTCODE\\DEFINES Please use this folder the same way you'd use the _DEFINES folder once found inside this directory diff --git a/modular_splurt/_maps/RandomRuins/SpaceRuins/radiostation.dmm b/modular_splurt/_maps/RandomRuins/SpaceRuins/radiostation.dmm new file mode 100644 index 0000000000..8da26c8a5c --- /dev/null +++ b/modular_splurt/_maps/RandomRuins/SpaceRuins/radiostation.dmm @@ -0,0 +1,1813 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aq" = ( +/obj/structure/closet/cabinet, +/turf/open/floor/carpet, +/area/ruin/space/radiostation/cabin) +"ar" = ( +/obj/machinery/door/airlock/glass{ + name = "Break Room" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/space/radiostation/break_room) +"aH" = ( +/turf/closed/wall, +/area/ruin/space/radiostation/break_room) +"aL" = ( +/obj/structure/table, +/obj/item/storage/box/donkpockets, +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/obj/item/reagent_containers/glass/beaker/waterbottle, +/obj/item/reagent_containers/glass/beaker/waterbottle, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/space/radiostation/break_room) +"bg" = ( +/obj/machinery/teleport/hub/syndicate, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"bz" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/engineering, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"bK" = ( +/obj/machinery/door/airlock/glass{ + name = "Control Room" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/carpet/blue, +/area/ruin/space/radiostation/control_room) +"bS" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/carpet/blue, +/area/ruin/space/radiostation/control_room) +"bU" = ( +/turf/open/floor/carpet/blue, +/area/ruin/space/radiostation/control_room) +"bV" = ( +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation/janitor) +"ca" = ( +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"cd" = ( +/obj/machinery/power/apc/auto_name/north{ + name = "Engines" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engines) +"dc" = ( +/obj/structure/closet, +/obj/item/mop, +/obj/item/reagent_containers/glass/bucket, +/obj/item/lightreplacer, +/obj/item/storage/bag/trash, +/obj/item/soap, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation/janitor) +"dd" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/carpet/blue, +/area/ruin/space/radiostation/control_room) +"dE" = ( +/obj/machinery/vending/cola, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"dQ" = ( +/obj/machinery/door/airlock{ + name = "Cabin" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/carpet, +/area/ruin/space/radiostation/cabin) +"ep" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"fm" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engines) +"gD" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation/janitor) +"gQ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/ruin/space/radiostation/solars) +"hr" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space/basic, +/area/ruin/space/radiostation/solars) +"hA" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/ruin/space/radiostation/break_room) +"hO" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/space/basic, +/area/ruin/space/radiostation/solars) +"hP" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/space/basic, +/area/ruin/space/radiostation/solars) +"ie" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/ruin/space/radiostation/janitor) +"ip" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/solar/fake, +/turf/open/floor/plasteel/solarpanel, +/area/ruin/space/radiostation/solars) +"is" = ( +/turf/open/floor/plasteel, +/area/ruin/space/radiostation/janitor) +"iB" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"iQ" = ( +/obj/structure/sink{ + pixel_y = -8 + }, +/turf/closed/wall, +/area/ruin/space/radiostation/janitor) +"ja" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/item/beacon, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"jO" = ( +/obj/structure/fans/tiny, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/external/glass, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"ma" = ( +/obj/machinery/power/apc/auto_name/north{ + name = "Break Room"; + areastring = "/area/ruin/space/radiostation/break_room" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/space/radiostation/break_room) +"mb" = ( +/turf/open/floor/carpet, +/area/ruin/space/radiostation/cabin) +"mC" = ( +/obj/machinery/power/apc/auto_name/north{ + name = "SMES Room"; + areastring = "/area/ruin/space/radiostation/engineering" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"mD" = ( +/obj/machinery/power/apc/auto_name/north{ + name = "Control Room"; + areastring = "/area/ruin/space/radiostation/control_room" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/carpet/blue, +/area/ruin/space/radiostation/control_room) +"nu" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/space/basic, +/area/ruin/space/radiostation/solars) +"nE" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"nG" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"nN" = ( +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"nQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/space/radiostation/break_room) +"oo" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"oT" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/carpet, +/area/ruin/space/radiostation/cabin) +"oZ" = ( +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"pd" = ( +/obj/machinery/vending/kink, +/turf/open/floor/carpet, +/area/ruin/space/radiostation/cabin) +"pn" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/solar/fake, +/turf/open/floor/plasteel/solarpanel, +/area/ruin/space/radiostation/solars) +"py" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical, +/obj/item/multitool, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"pz" = ( +/obj/machinery/light{ + light_color = "#cee5d2" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"qj" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/space/basic, +/area/ruin/space/radiostation/solars) +"ss" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"sR" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engines) +"tx" = ( +/turf/closed/wall, +/area/ruin/space/radiostation/cabin) +"tH" = ( +/obj/machinery/light{ + dir = 1; + light_color = "#cee5d2" + }, +/turf/open/floor/carpet, +/area/ruin/space/radiostation/cabin) +"tL" = ( +/obj/structure/cable, +/obj/machinery/power/solar/fake, +/turf/open/floor/plasteel/solarpanel, +/area/ruin/space/radiostation/solars) +"uF" = ( +/obj/structure/grille, +/obj/effect/spawner/structure/window/reinforced/indestructable, +/turf/open/floor/plating, +/area/ruin/space/radiostation/break_room) +"uY" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"vl" = ( +/obj/machinery/vending/sustenance, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/space/radiostation/break_room) +"vx" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"vN" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/carpet/blue, +/area/ruin/space/radiostation/control_room) +"wh" = ( +/obj/structure/sink/kitchen{ + dir = 4; + pixel_x = 19 + }, +/turf/closed/wall, +/area/ruin/space/radiostation/break_room) +"wp" = ( +/obj/machinery/light{ + light_color = "#cee5d2" + }, +/turf/open/floor/carpet/blue, +/area/ruin/space/radiostation/control_room) +"ws" = ( +/turf/closed/wall, +/area/ruin/space/radiostation/engineering) +"wI" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"xc" = ( +/obj/machinery/power/terminal, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"xk" = ( +/obj/structure/chair, +/turf/open/floor/carpet/blue, +/area/ruin/space/radiostation/control_room) +"xR" = ( +/obj/structure/table, +/obj/item/storage/firstaid, +/turf/open/floor/carpet/blue, +/area/ruin/space/radiostation/control_room) +"xS" = ( +/obj/machinery/door/airlock, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation/janitor) +"yu" = ( +/obj/machinery/light_switch, +/turf/closed/wall, +/area/ruin/space/radiostation) +"yE" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/solar/fake, +/turf/open/floor/plasteel/solarpanel, +/area/ruin/space/radiostation/solars) +"yM" = ( +/obj/machinery/power/smes/magical, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"yX" = ( +/obj/structure/janitorialcart, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation/janitor) +"zA" = ( +/turf/open/floor/plating, +/area/ruin/space/radiostation/engines) +"zR" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engines) +"An" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/space/radiostation/break_room) +"As" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation/janitor) +"AV" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet/blue, +/area/ruin/space/radiostation/control_room) +"BH" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engines) +"Cu" = ( +/turf/open/floor/plasteel/cafeteria, +/area/ruin/space/radiostation/break_room) +"Dd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"Dy" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/carpet/blue, +/area/ruin/space/radiostation/control_room) +"DE" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engines) +"EI" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"ET" = ( +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/power/solar/fake, +/turf/open/floor/plasteel/solarpanel, +/area/ruin/space/radiostation/solars) +"Ft" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/carpet/blue, +/area/ruin/space/radiostation/control_room) +"FB" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/carpet, +/area/ruin/space/radiostation/cabin) +"FF" = ( +/obj/structure/disposalpipe/trunk, +/obj/structure/disposaloutlet{ + dir = 1 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"Gr" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"Hb" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engines) +"Hc" = ( +/obj/machinery/power/apc/auto_name/south{ + name = "Cabin"; + areastring = "/area/ruin/space/radiostation/cabin" + }, +/obj/structure/cable, +/turf/open/floor/carpet, +/area/ruin/space/radiostation/cabin) +"HD" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/space/radiostation/break_room) +"Is" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light{ + light_color = "#cee5d2" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"IG" = ( +/obj/structure/grille, +/obj/effect/spawner/structure/window/reinforced/indestructable, +/turf/open/floor/plating, +/area/ruin/space/radiostation/control_room) +"IJ" = ( +/obj/structure/dresser, +/turf/open/floor/carpet, +/area/ruin/space/radiostation/cabin) +"IK" = ( +/turf/template_noop, +/area/template_noop) +"IO" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/engineering{ + name = "Engines" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engines) +"IW" = ( +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"Ke" = ( +/obj/machinery/light_switch, +/turf/closed/wall, +/area/ruin/space/radiostation/control_room) +"Kj" = ( +/obj/structure/table, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/space/radiostation/break_room) +"KD" = ( +/obj/machinery/power/apc/auto_name/north{ + name = "Custodial Closet"; + areastring = "/area/ruin/space/radiostation/janitor" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation/janitor) +"KP" = ( +/turf/closed/wall, +/area/ruin/space/radiostation/engines) +"KX" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/ruin/space/radiostation/solars) +"KY" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/space/nearstation) +"LA" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/space/radiostation/break_room) +"MG" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/telecomms/relay/preset{ + name = "NT Radio Relay" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"Ob" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/ruin/space/radiostation/solars) +"OH" = ( +/obj/structure/fans/tiny, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/external/glass, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"OK" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/space/nearstation) +"Pp" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engines) +"PG" = ( +/obj/structure/bed/double{ + dir = 1 + }, +/obj/item/bedsheet/blue/double{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/ruin/space/radiostation/cabin) +"PO" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/carpet/blue, +/area/ruin/space/radiostation/control_room) +"PQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"Qb" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"QM" = ( +/obj/item/radio/intercom{ + pixel_y = 8; + name = "Radio Broadcaster" + }, +/turf/closed/wall, +/area/ruin/space/radiostation/control_room) +"Rm" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/ruin/space/radiostation/solars) +"Rw" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"RP" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"RZ" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/disposaloutlet, +/turf/open/floor/plating, +/area/space/nearstation) +"Sv" = ( +/obj/machinery/shuttle/engine, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engines) +"Tv" = ( +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/space/radiostation/break_room) +"TG" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"Uh" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engines) +"Uk" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/ruin/space/radiostation/solars) +"UB" = ( +/obj/structure/window/plasma/reinforced/spawner/north, +/obj/structure/shuttle/engine/heater, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engines) +"UM" = ( +/obj/machinery/vending/snack, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"UT" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable, +/obj/machinery/power/solar/fake, +/turf/open/floor/plasteel/solarpanel, +/area/ruin/space/radiostation/solars) +"Va" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"Vc" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/space/basic, +/area/ruin/space/radiostation/solars) +"Vk" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/space/basic, +/area/ruin/space/radiostation/solars) +"VV" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/solar/fake, +/turf/open/floor/plasteel/solarpanel, +/area/ruin/space/radiostation/solars) +"Wf" = ( +/obj/machinery/light{ + light_color = "#cee5d2" + }, +/turf/open/floor/plasteel/cafeteria, +/area/ruin/space/radiostation/break_room) +"WF" = ( +/obj/machinery/computer/teleporter, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"Xt" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/ruin/space/radiostation/engineering) +"XD" = ( +/turf/closed/wall, +/area/ruin/space/radiostation/janitor) +"XQ" = ( +/turf/closed/wall, +/area/ruin/space/radiostation) +"XW" = ( +/obj/machinery/power/apc/auto_name/north{ + name = "Hallway"; + areastring = "/area/ruin/space/radiostation" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"Yj" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/space/basic, +/area/ruin/space/radiostation/solars) +"YH" = ( +/obj/machinery/teleport/station, +/turf/open/floor/plasteel, +/area/ruin/space/radiostation) +"YK" = ( +/turf/closed/wall, +/area/ruin/space/radiostation/control_room) +"Za" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space/basic, +/area/ruin/space/radiostation/solars) + +(1,1,1) = {" +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +"} +(2,1,1) = {" +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +tx +tx +tx +tx +XD +XD +XD +XD +XD +OK +IK +IK +IK +IK +IK +IK +IK +IK +"} +(3,1,1) = {" +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +tx +IJ +PG +mb +XD +dc +gD +bV +ie +KY +KY +RZ +IK +IK +IK +IK +IK +IK +"} +(4,1,1) = {" +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +tx +tH +FB +Hc +iQ +is +is +is +XD +OK +IK +IK +IK +IK +IK +IK +IK +IK +"} +(5,1,1) = {" +IK +IK +IK +IK +IK +IK +Rm +Rm +Rm +Rm +Rm +Rm +Rm +tx +aq +oT +pd +XD +KD +As +yX +XD +IK +IK +IK +IK +IK +IK +IK +IK +IK +"} +(6,1,1) = {" +IK +IK +IK +IK +IK +IK +Rm +ip +hO +UT +hO +tL +Rm +tx +tx +dQ +tx +XD +XD +xS +XD +XD +XQ +XQ +XQ +KP +KP +KP +KP +KP +IK +"} +(7,1,1) = {" +IK +IK +IK +IK +IK +IK +Rm +ip +hr +UT +hr +tL +Rm +XQ +nN +uY +EI +EI +EI +Gr +wI +nN +nN +nN +nN +KP +zA +Uh +UB +Sv +IK +"} +(8,1,1) = {" +IK +IK +IK +IK +IK +IK +Rm +ip +hr +UT +hr +tL +Rm +XQ +oZ +Dd +nN +nN +nN +nN +nN +nN +nN +nN +nN +KP +zA +sR +UB +Sv +IK +"} +(9,1,1) = {" +IK +IK +IK +IK +IK +IK +Rm +Rm +Ob +hP +nu +Rm +Rm +XQ +nN +Dd +YK +YK +IG +IG +IG +YK +YK +nN +pz +KP +zA +sR +UB +Sv +IK +"} +(10,1,1) = {" +IK +Rm +Rm +Rm +Rm +Rm +ws +ws +ws +OH +ws +ws +ws +XQ +nN +Dd +YK +Ft +bU +bU +bU +xR +YK +nN +nN +KP +fm +sR +UB +Sv +IK +"} +(11,1,1) = {" +IK +Rm +pn +pn +pn +Rm +ws +ca +Xt +Rw +ca +ca +ws +UM +nN +Dd +Ke +bU +bU +bU +bU +wp +YK +nN +nN +KP +cd +sR +UB +Sv +IK +"} +(12,1,1) = {" +IK +Rm +Uk +Za +Za +Vc +ws +vx +iB +nE +ca +ca +ws +nN +nN +Dd +YK +vN +xk +AV +AV +bU +YK +WF +nN +KP +Pp +sR +UB +Sv +IK +"} +(13,1,1) = {" +IK +Rm +yE +yE +yE +Uk +jO +xc +yM +iB +MG +iB +bz +EI +ja +ep +bK +dd +xk +AV +Dy +bU +QM +YH +ss +IO +zR +BH +UB +Sv +IK +"} +(14,1,1) = {" +IK +Rm +qj +KX +KX +nu +ws +Qb +iB +oo +Rw +ca +ws +nN +nN +Dd +YK +bS +xk +AV +AV +bU +YK +bg +Dd +KP +zA +Hb +UB +Sv +IK +"} +(15,1,1) = {" +IK +Rm +VV +VV +VV +Rm +ws +mC +iB +Va +IW +py +ws +dE +nN +Dd +YK +mD +bU +bU +bU +wp +YK +nN +Dd +KP +zA +Hb +UB +Sv +IK +"} +(16,1,1) = {" +IK +Rm +Rm +Rm +Rm +Rm +ws +ws +ws +OH +ws +ws +ws +XQ +XW +nG +YK +PO +bU +bU +bU +bU +YK +nN +Dd +KP +fm +Hb +UB +Sv +IK +"} +(17,1,1) = {" +IK +IK +IK +IK +IK +IK +Rm +Rm +Yj +Vk +Vc +Rm +Rm +yu +nN +Dd +YK +YK +IG +IG +IG +YK +YK +nN +Is +KP +zA +Hb +UB +Sv +IK +"} +(18,1,1) = {" +IK +IK +IK +IK +IK +IK +Rm +ip +gQ +ET +gQ +tL +Rm +XQ +oZ +Dd +nN +nN +nN +nN +nN +nN +nN +nN +Dd +KP +zA +Hb +UB +Sv +IK +"} +(19,1,1) = {" +IK +IK +IK +IK +IK +IK +Rm +ip +gQ +ET +gQ +tL +Rm +XQ +nN +TG +EI +EI +PQ +RP +EI +EI +EI +EI +Gr +KP +zA +DE +UB +Sv +IK +"} +(20,1,1) = {" +IK +IK +IK +IK +IK +IK +Rm +ip +Vk +ET +Vk +tL +Rm +XQ +XQ +XQ +aH +aH +aH +ar +wh +aH +aH +XQ +XQ +KP +KP +KP +KP +KP +IK +"} +(21,1,1) = {" +IK +IK +IK +IK +IK +IK +Rm +Rm +Rm +Rm +Rm +Rm +Rm +IK +IK +IK +aH +ma +nQ +HD +Cu +Cu +aH +IK +IK +IK +IK +IK +IK +IK +IK +"} +(22,1,1) = {" +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +aH +vl +Cu +Cu +Cu +Cu +aH +IK +IK +IK +IK +IK +IK +IK +IK +"} +(23,1,1) = {" +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +aH +aL +Cu +Cu +Cu +Wf +aH +IK +IK +IK +IK +IK +IK +IK +IK +"} +(24,1,1) = {" +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +OK +aH +Tv +Cu +LA +LA +LA +aH +IK +IK +IK +IK +IK +IK +IK +IK +"} +(25,1,1) = {" +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +FF +KY +KY +hA +An +Cu +Kj +Kj +Kj +aH +IK +IK +IK +IK +IK +IK +IK +IK +"} +(26,1,1) = {" +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +OK +aH +aH +uF +uF +uF +aH +aH +IK +IK +IK +IK +IK +IK +IK +IK +"} +(27,1,1) = {" +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +IK +"} diff --git a/modular_splurt/_maps/RandomRuins/SpaceRuins/syndielistenspace.dmm b/modular_splurt/_maps/RandomRuins/SpaceRuins/syndielistenspace.dmm new file mode 100644 index 0000000000..ed9b30357a --- /dev/null +++ b/modular_splurt/_maps/RandomRuins/SpaceRuins/syndielistenspace.dmm @@ -0,0 +1,1608 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ab" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 25 + }, +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/paper/fluff/ruins/listeningstation/reports/november, +/obj/item/pen, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"ae" = ( +/turf/template_noop, +/area/template_noop) +"ag" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/toilet{ + pixel_y = 18 + }, +/obj/structure/mirror{ + pixel_x = 28 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/space/syndielistenspace) +"ax" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 8; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plating/airless, +/area/ruin/space/syndielistenspace) +"bk" = ( +/obj/structure/rack{ + dir = 8; + layer = 2.9 + }, +/obj/item/mining_scanner, +/obj/item/pickaxe, +/obj/effect/decal/cleanable/dirt, +/obj/item/mop/advanced, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"bn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-2"; + pixel_y = 1 + }, +/obj/structure/reagent_dispensers/fueltank, +/obj/item/clothing/head/welding, +/obj/item/weldingtool/largetank, +/turf/open/floor/plating, +/area/ruin/space/syndielistenspace) +"bX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"ff" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay" + }, +/turf/open/floor/plasteel/white, +/area/ruin/space/syndielistenspace) +"fm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/medical1{ + req_access = null; + req_access_txt = "150" + }, +/turf/open/floor/plasteel/white, +/area/ruin/space/syndielistenspace) +"fs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"fW" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/meter, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/ruin/space/syndielistenspace) +"gu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"gN" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/firealarm{ + dir = 2; + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"hg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel/white/side{ + dir = 5 + }, +/area/ruin/space/syndielistenspace) +"hs" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 2; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"ia" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel/white/side, +/area/ruin/space/syndielistenspace) +"ii" = ( +/obj/machinery/computer/message_monitor{ + dir = 2 + }, +/obj/machinery/airalarm/syndicate{ + pixel_y = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/monitorkey, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"kd" = ( +/obj/structure/table, +/obj/item/storage/firstaid/regular, +/obj/item/clothing/neck/stethoscope, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white/side{ + dir = 10 + }, +/area/ruin/space/syndielistenspace) +"kE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet{ + pixel_y = -29 + }, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"kO" = ( +/obj/machinery/washing_machine{ + pixel_x = 4 + }, +/obj/structure/window{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"lp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"lW" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"mh" = ( +/obj/docking_port/stationary{ + dir = 4; + dwidth = 6; + height = 7; + id = "caravansyndicate3_listeningpost"; + name = "Syndicate Listening Post"; + width = 15 + }, +/obj/docking_port/stationary{ + dir = 4; + dwidth = 4; + height = 5; + id = "caravansyndicate1_listeningpost"; + name = "Syndicate Listening Post"; + width = 9 + }, +/turf/template_noop, +/area/template_noop) +"mU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"mZ" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/blood/OMinus{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/reagent_containers/blood/OMinus, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel/white/side{ + dir = 9 + }, +/area/ruin/space/syndielistenspace) +"pa" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/mob_spawn/human/space/syndicate/comms{ + dir = 8 + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/syndielistenspace) +"pV" = ( +/obj/machinery/light/small, +/obj/structure/sign/warning/vacuum{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/space/syndielistenspace) +"qp" = ( +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/space/syndielistenspace) +"qH" = ( +/obj/structure/table/wood, +/obj/item/ammo_box/magazine/m10mm, +/obj/item/paper/fluff/ruins/listeningstation/briefing, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/syndielistenspace) +"rr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/closed/wall/r_wall, +/area/ruin/space/syndielistenspace) +"rJ" = ( +/obj/machinery/vending/cola/random{ + extended_inventory = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/white/corner{ + dir = 8 + }, +/area/ruin/space/syndielistenspace) +"te" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + id_tag = "syndie_listeningpost_external"; + req_access_txt = "150" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/ruin/space/syndielistenspace) +"tg" = ( +/obj/structure/table, +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/storage/box/donkpockets{ + pixel_y = 3 + }, +/obj/item/storage/box/donkpockets{ + pixel_x = 2 + }, +/obj/item/reagent_containers/food/snacks/chocolatebar, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/random{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"ty" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"ui" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/tank_dispenser/oxygen{ + oxygentanks = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/syndielistenspace) +"ve" = ( +/obj/structure/sign/departments/medbay/alt, +/turf/closed/wall, +/area/ruin/space/syndielistenspace) +"vj" = ( +/obj/effect/turf_decal/stripes/red/corner{ + dir = 1 + }, +/obj/machinery/door/airlock{ + name = "Cabin" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"vH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/machinery/door/airlock{ + name = "Personal Quarters" + }, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"vJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/syndicate{ + dir = 4; + name = "Syndicate Listening Post APC"; + pixel_x = 24; + areastring = "/area/ruin/space/syndielistenspace" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/space/syndielistenspace) +"vP" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/ruin/space/syndielistenspace) +"wW" = ( +/obj/machinery/door/airlock{ + name = "Toilet" + }, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/space/syndielistenspace) +"xh" = ( +/obj/structure/rack{ + dir = 8 + }, +/obj/item/multitool, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"xw" = ( +/obj/structure/chair/stool, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"yi" = ( +/obj/machinery/syndicatebomb/self_destruct{ + anchored = 1 + }, +/obj/structure/sign/warning/securearea{ + desc = "A warning sign which reads 'DANGER: SELF DESTRUCT DEVICE'."; + name = "DANGER: SELF DESTRUCT DEVICE"; + pixel_x = 32 + }, +/obj/machinery/door/window/brigdoor{ + dir = 8; + req_access_txt = "150" + }, +/turf/open/floor/circuit/red, +/area/ruin/space/syndielistenspace) +"yy" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high/plus, +/obj/item/stack/cable_coil{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/syndicate{ + dir = 4; + pixel_x = -24 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"yA" = ( +/obj/structure/table, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = -26 + }, +/obj/machinery/microwave, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"yC" = ( +/obj/structure/table/reinforced, +/obj/machinery/firealarm{ + dir = 2; + pixel_y = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/libraryconsole/bookmanagement, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"yD" = ( +/turf/closed/mineral/random, +/area/awaymission) +"yS" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel/white/corner, +/area/ruin/space/syndielistenspace) +"zl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"Bm" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/machinery/door/airlock/hatch{ + name = "Telecommunications"; + req_access_txt = "150" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"Bo" = ( +/obj/machinery/airalarm/syndicate{ + pixel_y = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/baseturf_helper/asteroid/airless, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"BG" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/machinery/iv_drip, +/obj/machinery/light/small, +/obj/machinery/airalarm/syndicate{ + dir = 1; + pixel_y = -24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ + dir = 6 + }, +/area/ruin/space/syndielistenspace) +"CT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/ruin/space/syndielistenspace) +"Ds" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/smes/magical, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/ruin/space/syndielistenspace) +"DI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/syndielistenspace) +"DW" = ( +/obj/structure/rack{ + dir = 8 + }, +/obj/item/clothing/mask/gas{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/effect/turf_decal/stripes/line, +/obj/item/clothing/mask/gas, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/syndielistenspace) +"EZ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/machinery/door/airlock/hatch{ + name = "E.V.A. Equipment"; + req_access_txt = "150" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"GN" = ( +/turf/closed/wall/r_wall, +/area/ruin/space/syndielistenspace) +"Hl" = ( +/obj/effect/turf_decal/stripes/red/corner, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/machinery/airalarm/syndicate{ + dir = 8; + pixel_x = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"HF" = ( +/obj/structure/curtain, +/obj/machinery/shower{ + pixel_y = 14 + }, +/obj/machinery/light/small, +/obj/item/soap, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/showroomfloor, +/area/ruin/space/syndielistenspace) +"HX" = ( +/obj/structure/filingcabinet, +/obj/item/paper/fluff/ruins/listeningstation/reports/april, +/obj/item/paper/fluff/ruins/listeningstation/reports/may, +/obj/item/paper/fluff/ruins/listeningstation/reports/june, +/obj/item/paper/fluff/ruins/listeningstation/reports/july, +/obj/item/paper/fluff/ruins/listeningstation/reports/august, +/obj/item/paper/fluff/ruins/listeningstation/reports/september, +/obj/item/paper/fluff/ruins/listeningstation/reports/october, +/obj/item/paper/fluff/ruins/listeningstation/receipt, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/fluff/ruins/listeningstation/odd_report, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"JD" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/power/port_gen/pacman, +/turf/open/floor/plating, +/area/ruin/space/syndielistenspace) +"JN" = ( +/obj/machinery/light/small, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/emcloset/anchored, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"JU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"Kf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"Kg" = ( +/turf/closed/wall, +/area/ruin/space/syndielistenspace) +"Kn" = ( +/obj/structure/closet{ + icon_door = "black"; + name = "wardrobe" + }, +/obj/item/clothing/under/color/black{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/under/color/black{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/clothing/head/soft/black{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/head/soft/black{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/clothing/gloves/fingerless, +/obj/item/clothing/shoes/sneakers/black{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/shoes/sneakers/black{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/photo_album, +/obj/machinery/light/small, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/syndielistenspace) +"LZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27; + pixel_y = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/computer/arcade/tetris{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"Mk" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/caution/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"NF" = ( +/obj/structure/table, +/obj/item/storage/toolbox/syndicate, +/obj/item/flashlight{ + pixel_y = -12 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"Oa" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"Ow" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"Pk" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"Pr" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/button/door{ + id = "syndie_listeningpost_external"; + name = "External Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 24; + req_access_txt = "150"; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"Qp" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + id_tag = "syndie_listeningpost_external"; + req_access_txt = "150" + }, +/turf/open/floor/plating, +/area/ruin/space/syndielistenspace) +"RF" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4; + piping_layer = 3; + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"Sy" = ( +/obj/structure/table, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = -30 + }, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = -4; + pixel_y = 14 + }, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = 3; + pixel_y = 11 + }, +/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ + pixel_x = -3 + }, +/obj/item/lighter{ + pixel_x = 7; + pixel_y = -3 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"SC" = ( +/obj/structure/bookcase/random, +/turf/open/floor/plasteel/grimy, +/area/ruin/space/syndielistenspace) +"Tc" = ( +/obj/item/bombcore/badmin{ + anchored = 1; + invisibility = 100 + }, +/turf/closed/wall, +/area/ruin/space/syndielistenspace) +"VK" = ( +/obj/machinery/telecomms/relay/preset/ruskie{ + use_power = 0 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"VP" = ( +/obj/machinery/computer/camera_advanced{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/item/radio/intercom{ + freerange = 1; + name = "Syndicate Radio Intercom"; + pixel_x = -30 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"VX" = ( +/obj/machinery/vending/snack/random{ + extended_inventory = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/random{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ruin/space/syndielistenspace) +"YD" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/closet/crate, +/obj/item/stack/sheet/metal/twenty, +/obj/item/stack/sheet/glass{ + amount = 10 + }, +/obj/item/stack/rods/ten, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/lights/bulbs, +/obj/item/stock_parts/cell/high/plus, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/item/stack/sheet/mineral/plasma{ + amount = 20 + }, +/obj/item/wrench, +/turf/open/floor/plating, +/area/ruin/space/syndielistenspace) +"YY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) +"ZG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/med_data/syndie{ + dir = 4; + req_one_access = null + }, +/turf/open/floor/plasteel/dark, +/area/ruin/space/syndielistenspace) + +(1,1,1) = {" +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +"} +(2,1,1) = {" +ae +ae +yD +yD +yD +yD +yD +yD +yD +yD +yD +ae +yD +yD +yD +yD +yD +ae +ae +ae +"} +(3,1,1) = {" +ae +ae +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +ae +ae +"} +(4,1,1) = {" +ae +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +ae +"} +(5,1,1) = {" +ae +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +ae +"} +(6,1,1) = {" +ae +yD +yD +yD +yD +Kg +Kg +Kg +Kg +Kg +Kg +Kg +Kg +yD +yD +yD +yD +yD +yD +ae +"} +(7,1,1) = {" +yD +yD +yD +yD +yD +Kg +HF +Kg +LZ +yA +Sy +tg +Kg +Kg +Kg +yD +yD +yD +yD +ae +"} +(8,1,1) = {" +yD +yD +yD +yD +yD +Kg +ag +wW +Ow +ty +xw +lW +Kg +SC +Kg +Kg +yD +yD +yD +ae +"} +(9,1,1) = {" +yD +yD +yD +yD +Kg +Kg +Kg +Kg +kO +Pk +Hl +Mk +vj +DI +Kn +Kg +yD +yD +yD +ae +"} +(10,1,1) = {" +yD +yD +yD +Kg +Kg +VP +ZG +Kg +Kg +vH +Kg +yi +Kg +pa +qH +Kg +yD +yD +yD +ae +"} +(11,1,1) = {" +yD +yD +yD +Kg +ii +Oa +JU +HX +Kg +gu +Kg +Kg +Kg +Kg +Kg +Kg +Kg +yD +yD +ae +"} +(12,1,1) = {" +yD +yD +yD +Kg +yC +zl +mU +bX +Bm +hs +JN +Kg +Ds +bn +YD +JD +Kg +yD +yD +ae +"} +(13,1,1) = {" +yD +yD +yD +Kg +Kg +VK +ab +xh +Kg +Bo +fs +vP +CT +vJ +fW +qp +Kg +yD +yD +ae +"} +(14,1,1) = {" +yD +yD +yD +yD +Kg +Kg +Kg +Kg +Tc +RF +kE +Kg +Kg +Kg +Kg +Kg +Kg +yD +yD +ae +"} +(15,1,1) = {" +yD +yD +yD +Kg +Kg +NF +yy +bk +Kg +gN +yS +ve +mZ +kd +Kg +yD +yD +yD +yD +ae +"} +(16,1,1) = {" +yD +yD +yD +Kg +DW +YY +Pr +lp +EZ +Kf +ia +ff +hg +BG +Kg +yD +yD +yD +yD +ae +"} +(17,1,1) = {" +ae +yD +yD +Kg +Kg +Qp +Kg +ui +Kg +VX +rJ +Kg +fm +Kg +Kg +yD +yD +yD +yD +ae +"} +(18,1,1) = {" +ae +yD +yD +yD +GN +pV +GN +rr +GN +Kg +Kg +Kg +Kg +Kg +yD +yD +yD +yD +yD +ae +"} +(19,1,1) = {" +ae +yD +yD +yD +GN +te +GN +ax +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +ae +ae +"} +(20,1,1) = {" +ae +ae +ae +ae +ae +mh +ae +ae +ae +ae +ae +ae +ae +ae +ae +yD +yD +ae +ae +ae +"} diff --git a/modular_splurt/code/_onclick/hud/new_player.dm b/modular_splurt/code/_onclick/hud/new_player.dm index 8e2e92f77f..eb61ef3e29 100644 --- a/modular_splurt/code/_onclick/hud/new_player.dm +++ b/modular_splurt/code/_onclick/hud/new_player.dm @@ -1,3 +1,8 @@ +/datum/hud/new_player/populate_buttons(mob/dead/new_player/owner) + if(!(owner.client?.prefs.toggles & TG_PLAYER_PANEL)) + return + . = ..() + /atom/movable/screen/lobby/button/Click(location, control, params) if(owner != REF(usr)) //No idea what this even means but return ..() @@ -10,4 +15,7 @@ to_chat(usr, span_warning("You must link your discord account to your ckey in order to join the game. Join our discord and use the [CONFIG_GET(string/discordbotcommandprefix)][CONFIG_GET(string/verification_command)] command [CONFIG_GET(string/verification_channel) ? "as indicated in #[CONFIG_GET(string/verification_channel)] " : ""]. It won't take you more than two minutes :)
Ahelp or ask staff in the discord if this is an error.")) return + if(!(usr.client?.prefs.toggles & TG_PLAYER_PANEL)) + return + . = ..() diff --git a/modular_splurt/code/controllers/configuration/entries/splurt_general.dm b/modular_splurt/code/controllers/configuration/entries/splurt_general.dm index 7e34c3a007..c4e26c6d0a 100644 --- a/modular_splurt/code/controllers/configuration/entries/splurt_general.dm +++ b/modular_splurt/code/controllers/configuration/entries/splurt_general.dm @@ -1 +1,6 @@ /datum/config_entry/flag/need_discord_to_join + +/datum/config_entry/flag/enable_global_barks + +/datum/config_entry/number/max_infinidorms + config_entry_value = 5 diff --git a/modular_splurt/code/controllers/subsystem/ticker.dm b/modular_splurt/code/controllers/subsystem/ticker.dm new file mode 100644 index 0000000000..a2fd4a9be9 --- /dev/null +++ b/modular_splurt/code/controllers/subsystem/ticker.dm @@ -0,0 +1,6 @@ +//Everyone who wanted to be an observer gets made one now +/datum/controller/subsystem/ticker/proc/create_observers() + for(var/mob/dead/new_player/player in GLOB.player_list) + if(player.ready == PLAYER_READY_TO_OBSERVE && player.mind && !(player.client?.prefs.toggles & TG_PLAYER_PANEL)) + //Break chain since this has a sleep input in it + addtimer(CALLBACK(player, /mob/dead/new_player.proc/make_me_an_observer), 1) diff --git a/modular_splurt/code/datums/components/nanites.dm b/modular_splurt/code/datums/components/nanites.dm new file mode 100644 index 0000000000..f7eb5d3653 --- /dev/null +++ b/modular_splurt/code/datums/components/nanites.dm @@ -0,0 +1,2 @@ +/datum/component/nanites + max_nanites = 500 diff --git a/modular_splurt/code/datums/components/size_normalized.dm b/modular_splurt/code/datums/components/size_normalized.dm new file mode 100644 index 0000000000..d8a38a292d --- /dev/null +++ b/modular_splurt/code/datums/components/size_normalized.dm @@ -0,0 +1,49 @@ +/datum/component/size_normalized + dupe_mode = COMPONENT_DUPE_UNIQUE + var/obj/item/clothing/attached_wear + var/normal_resize = RESIZE_NORMAL + var/natural_size //The value of the wearer's body_size var in prefs. Unused for now. + var/recorded_size //the user's height prior to equipping + +//Set up the linked clothing +/datum/component/size_normalized/Initialize(obj/item/clothing/wear) + . = ..() + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + attached_wear = wear + +//Normalize the mob on add in case it's necessary +/datum/component/size_normalized/RegisterWithParent() + . = ..() + var/mob/living/wearer = parent + recorded_size = get_size(wearer) + if(recorded_size != normal_resize) + playsound(wearer, 'sound/effects/magic.ogg', 50, 1) + wearer.flash_lighting_fx(3, 3, LIGHT_COLOR_PURPLE) + wearer.visible_message("A flash of purple light engulfs \the [wearer], before [wearer.p_they()] jump[wearer.p_s()] to a more average size!","You feel warm for a moment, before everything scales to your size...") + wearer.update_size(normal_resize) + RegisterSignal(wearer, COMSIG_MOB_RESIZED, .proc/normalize_size) + +//Denormalize the mob when the component is destroyed (if needed) +/datum/component/size_normalized/UnregisterFromParent() + . = ..() + var/mob/living/wearer = parent + UnregisterSignal(wearer, COMSIG_MOB_RESIZED) + if(recorded_size == normal_resize) + return + playsound(wearer,'sound/weapons/emitter2.ogg', 50, 1) + wearer.flash_lighting_fx(3, 3, LIGHT_COLOR_YELLOW) + wearer.visible_message("Golden light engulfs \the [wearer], and [wearer.p_they()] shoot[wearer.p_s()] back to [wearer.p_their()] default height!","Energy rushes through your body, and you return to normal.") + wearer.update_size(recorded_size) + +//Make sure the size stays normalized while worn and add the change to the recorded size +/datum/component/size_normalized/proc/normalize_size(mob/living/source, new_size, cur_size) + SIGNAL_HANDLER + + . = TRUE + if(get_size(source) == normal_resize) + return FALSE + + recorded_size += new_size - cur_size + + source.update_size(normal_resize) diff --git a/modular_splurt/code/datums/elements/smalltalk.dm b/modular_splurt/code/datums/elements/smalltalk.dm index cc236e7036..9ffa626757 100644 --- a/modular_splurt/code/datums/elements/smalltalk.dm +++ b/modular_splurt/code/datums/elements/smalltalk.dm @@ -14,4 +14,6 @@ UnregisterSignal(source, COMSIG_MOB_SAY) /datum/element/smalltalk/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + speech_args[SPEECH_SPANS] |= SPAN_SMALL diff --git a/modular_splurt/code/datums/elements/wuv.dm b/modular_splurt/code/datums/elements/wuv.dm new file mode 100644 index 0000000000..de94b61992 --- /dev/null +++ b/modular_splurt/code/datums/elements/wuv.dm @@ -0,0 +1,13 @@ +/datum/element/wuv/headpat/pet_the_dog(mob/target, mob/user) //For instances where only the headpat applies + if(QDELETED(target) || QDELETED(user) || target.stat != CONSCIOUS) + return + if(!(check_zone(user.zone_selected) == BODY_ZONE_HEAD) || user == target) + return + new /obj/effect/temp_visual/heart(target.loc) + if(pet_emote) + target.emote("me", pet_type, pet_emote) + if(pet_moodlet && !(target.flags_1 & HOLOGRAM_1)) //prevents unlimited happiness petting park exploit. + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, target, pet_moodlet, target) + +/datum/element/wuv/headpat/kick_the_dog(mob/target, mob/user) + return //No kicking the dog >:(( (until I find an use for this that is) diff --git a/modular_splurt/code/datums/interactions/lewd/_lewd.dm b/modular_splurt/code/datums/interactions/lewd/_lewd.dm index 7f5ecffe14..85fabb32bf 100644 --- a/modular_splurt/code/datums/interactions/lewd/_lewd.dm +++ b/modular_splurt/code/datums/interactions/lewd/_lewd.dm @@ -1,6 +1,21 @@ /mob/living var/has_belly = FALSE +/mob/living/moan() + var/moaned = lastmoan + var/miming = mind ? mind?.miming : FALSE + . = ..() + if((moaned == lastmoan) || is_muzzled() || miming || !prob(50)) + return + var/list/moans + if(isalien(src)) + moans = list('sound/voice/hiss6.ogg') + else if(gender == FEMALE) + moans = list('modular_splurt/sound/voice/moan_f1.ogg', 'modular_splurt/sound/voice/moan_f2.ogg', 'modular_splurt/sound/voice/moan_f3.ogg', 'modular_splurt/sound/voice/moan_f4.ogg', 'modular_splurt/sound/voice/moan_f5.ogg', 'modular_splurt/sound/voice/moan_f6.ogg', 'modular_splurt/sound/voice/moan_f7.ogg') + else + moans = list('modular_splurt/sound/voice/moan_m1.ogg', 'modular_splurt/sound/voice/moan_m2.ogg', 'modular_splurt/sound/voice/moan_m3.ogg') + playlewdinteractionsound(src, pick(moans), 50, 1, 4, 1.2, ignored_mobs = get_unconsenting()) + /mob/living/proc/get_refraction_dif() //Got snapped in upstream, may delete later when I figure something out var/dif = (refractory_period - world.time) if(dif < 0) diff --git a/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm b/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm index b284be8e1f..c11b335955 100644 --- a/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm +++ b/modular_splurt/code/datums/interactions/lewd/lewd_datums.dm @@ -96,6 +96,11 @@ /datum/interaction/lewd/throatfuck/display_interaction(mob/living/carbon/human/user, mob/living/carbon/human/target) . = ..() + if(istype(target, /mob/living) && user.is_fucking(target, CUM_TARGET_THROAT)) + var/stat_before = target.stat + target.adjustOxyLoss(3) + if(target.stat == UNCONSCIOUS && stat_before != UNCONSCIOUS) + target.visible_message(message = "\The [target] passes out on \The [src]'s cock.", ignored_mobs = user.get_unconsenting()) if(!isclownjob(user)) return @@ -358,6 +363,15 @@ playlewdinteractionsound(target, 'sound/items/bikehorn.ogg', 40, 1, -1) +/datum/interaction/lewd/kiss/display_interaction(mob/living/user, mob/living/partner) + . = ..() + playlewdinteractionsound(partner, pick( + 'modular_splurt/sound/interactions/kiss/kiss1.ogg', + 'modular_splurt/sound/interactions/kiss/kiss2.ogg', + 'modular_splurt/sound/interactions/kiss/kiss3.ogg', + 'modular_splurt/sound/interactions/kiss/kiss4.ogg', + 'modular_splurt/sound/interactions/kiss/kiss5.ogg'), 50, 1, -1, ignored_mobs = user.get_unconsenting()) + //Own stuff /datum/interaction/lewd/oral/selfsuck description = "Suck yourself off." diff --git a/modular_splurt/code/datums/mood_events/dominant_events.dm b/modular_splurt/code/datums/mood_events/dominant_events.dm new file mode 100644 index 0000000000..f8e41e6b42 --- /dev/null +++ b/modular_splurt/code/datums/mood_events/dominant_events.dm @@ -0,0 +1,20 @@ +/datum/mood_event/dominant/need + description = span_warning("I need to be someone's good THING...\n") + mood_change = -2 + timeout = 3 MINUTES + +/datum/mood_event/dominant/good_boy + description = span_nicegreen("I feel like a good THING!\n") + mood_change = 2 + timeout = 3 MINUTES + +/datum/mood_event/dominant/add_effects(param) + . = ..() + var/mob/living/carbon/human/actual_owner = owner_mob() + var/good_x = "pet" + switch(actual_owner.gender) + if(MALE) + good_x = "boy" + if(FEMALE) + good_x = "girl" + description = replacetextEx(description, "THING", good_x) diff --git a/modular_splurt/code/datums/mood_events/generic_negative_events.dm b/modular_splurt/code/datums/mood_events/generic_negative_events.dm index 2e036154fe..c66f79e83d 100644 --- a/modular_splurt/code/datums/mood_events/generic_negative_events.dm +++ b/modular_splurt/code/datums/mood_events/generic_negative_events.dm @@ -7,11 +7,11 @@ /datum/mood_event/creampie/cheesed/add_effects(param) . = ..() - if(!ishuman(owner)) - return . - var/mob/living/carbon/human/H = owner + var/mob/living/carbon/human/actual_owner = owner_mob() - if(iscatperson(H)) + if(!ishuman(actual_owner)) + return . + if(iscatperson(actual_owner)) description = span_warning("CHEESE!!! WAAAAAAAAAAAAAAAAAAAAAAAAAAAA!!!") mood_change = -5 timeout = 5 MINUTES diff --git a/modular_splurt/code/datums/mood_events/mood_event.dm b/modular_splurt/code/datums/mood_events/mood_event.dm new file mode 100644 index 0000000000..961f0dc311 --- /dev/null +++ b/modular_splurt/code/datums/mood_events/mood_event.dm @@ -0,0 +1,8 @@ +/datum/mood_event/proc/owner_mob() + var/mob/living/carbon/human/actual_owner + var/datum/component/mood/wrong_declaration = owner + if(istype(wrong_declaration)) + actual_owner = wrong_declaration.parent + else + actual_owner = owner + return actual_owner diff --git a/modular_splurt/code/datums/mood_events/needs_events.dm b/modular_splurt/code/datums/mood_events/needs_events.dm new file mode 100644 index 0000000000..da5a575ebb --- /dev/null +++ b/modular_splurt/code/datums/mood_events/needs_events.dm @@ -0,0 +1,7 @@ +/datum/mood_event/fat/add_effects(param) + . = ..() + var/mob/living/carbon/human/actual_owner = owner_mob() + if(!HAS_TRAIT(actual_owner, TRAIT_VORACIOUS)) + return + description = span_nicegreen("MORE FOOD!!! MORE FOOD!!! MORE FOOD!!!") + mood_change = 8 diff --git a/modular_splurt/code/datums/traits/good.dm b/modular_splurt/code/datums/traits/good.dm index ba1fa91706..b89de22c36 100644 --- a/modular_splurt/code/datums/traits/good.dm +++ b/modular_splurt/code/datums/traits/good.dm @@ -33,3 +33,76 @@ quirk_holder.weather_immunities -= "ash" */ +/datum/quirk/dominant_aura + name = "Dominant Aura" + desc = "Your personality is assertive enough to appear as powerful to other people, so much in fact that the weaker kind can't help but throw themselves at your feet on command." + value = 2 + gain_text = "You feel like making someone your pet" + lose_text = "You feel less assertive than befpre" + +/datum/quirk/dominant_aura/add() + . = ..() + RegisterSignal(quirk_holder, COMSIG_PARENT_EXAMINE, .proc/on_examine_holder) + RegisterSignal(quirk_holder, COMSIG_MOB_EMOTE, .proc/handle_snap) + +/datum/quirk/dominant_aura/remove() + . = ..() + UnregisterSignal(quirk_holder, COMSIG_PARENT_EXAMINE) + UnregisterSignal(quirk_holder, COMSIG_MOB_EMOTE) + +/datum/quirk/dominant_aura/proc/on_examine_holder(atom/source, mob/user, list/examine_list) + SIGNAL_HANDLER + + if(!ishuman(user)) + return + var/mob/living/carbon/human/sub = user + if(!sub.has_quirk(/datum/quirk/well_trained) || (sub == quirk_holder)) + return + + examine_list += span_lewd("\nYou can't look at [quirk_holder.p_them()] for more than three seconds before flustering away.") + if(!TIMER_COOLDOWN_CHECK(user, COOLDOWN_DOMINANT_EXAMINE)) + to_chat(quirk_holder, span_notice("\The [user] tries to look at you but immediately looks away with a red face...")) + TIMER_COOLDOWN_START(user, COOLDOWN_DOMINANT_EXAMINE, 5 SECONDS) + sub.dir = turn(get_dir(sub, quirk_holder), pick(-90, 90)) + sub.emote("blush") + +/datum/quirk/dominant_aura/proc/handle_snap(datum/source, list/emote_args) + SIGNAL_HANDLER + + . = FALSE + var/datum/emote/E + E = E.emote_list[lowertext(emote_args[EMOTE_ACT])] + if(TIMER_COOLDOWN_CHECK(quirk_holder, COOLDOWN_DOMINANT_SNAP) || !findtext(E?.key, "snap")) + return + for(var/mob/living/carbon/human/sub in hearers(DOMINANT_DETECT_RANGE, quirk_holder)) + if(!sub.has_quirk(/datum/quirk/well_trained) || (sub == quirk_holder)) + continue + var/good_x = "pet" + switch(sub.gender) + if(MALE) + good_x = "boy" + if(FEMALE) + good_x = "girl" + switch(E?.key) + if("snap") + sub.dir = get_dir(sub, quirk_holder) + sub.emote(pick("blush", "pant")) + sub.visible_message(span_notice("\The [sub] turns shyly towards \the [quirk_holder]."), + span_lewd("You stare into \the [quirk_holder] submissively.")) + if("snap2") + sub.dir = get_dir(sub, quirk_holder) + sub.KnockToFloor() + sub.emote(pick("blush", "pant")) + sub.visible_message(span_lewd("\The [sub] submissively throws [sub.p_them()]self on the floor."), + span_lewd("You throw yourself on the floor like a dog on [quirk_holder]'s command.")) + if("snap3") + sub.KnockToFloor() + step(sub, get_dir(sub, quirk_holder)) + sub.emote(pick("blush", "pant")) + sub.do_jitter_animation(30) //You're being moved anyways + sub.visible_message(span_lewd("\The [sub] crawls closer to \the [quirk_holder] in all fours, following [quirk_holder.p_their()] command"), + span_lewd("You get on your fours and crawl towards \the [quirk_holder] like a good, submissive [good_x].")) + . = TRUE + + if(.) + TIMER_COOLDOWN_START(quirk_holder, COOLDOWN_DOMINANT_SNAP, DOMINANT_SNAP_COOLDOWN) diff --git a/modular_splurt/code/datums/traits/negative.dm b/modular_splurt/code/datums/traits/negative.dm index 0aa149375b..45dafa4261 100644 --- a/modular_splurt/code/datums/traits/negative.dm +++ b/modular_splurt/code/datums/traits/negative.dm @@ -57,3 +57,113 @@ var/datum/component/mood/mood = quirk_holder.GetComponent(/datum/component/mood) if(mood) mood.mood_modifier -= 0.5 + +/datum/quirk/masked_mook + name = "Bane Syndrome" + desc = "For some reason you don't feel well without wearing some kind of gas mask." + gain_text = "You start feeling unwell without any gas mask on." + lose_text = "You no longer have a need to wear some gas mask." + value = -2 + mood_quirk = TRUE + medical_record_text = "Patient feels more secure when wearing a gas mask." + processing_quirk = TRUE + var/mood_category = "masked_mook" + +/datum/quirk/masked_mook/on_process() + var/mob/living/carbon/human/H = quirk_holder + var/obj/item/clothing/mask/gas/gasmask = H.get_item_by_slot(ITEM_SLOT_MASK) + if(istype(gasmask)) + SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/masked_mook) + else + SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/masked_mook_incomplete) + +/datum/quirk/masked_mook/on_spawn() + . = ..() + var/mob/living/carbon/human/H = quirk_holder + var/obj/item/clothing/mask/gas/gasmask = new(get_turf(quirk_holder)) + H.equip_to_slot(gasmask, ITEM_SLOT_MASK) + H.regenerate_icons() + +/datum/quirk/well_trained + name = "Well-trained" + desc = "You absolutely love being dominated. The thought of someone with a stronger character than yours is enough to make you act up." + value = -2 + gain_text = "You feel like being someone's pet" + lose_text = "You no longer feel like being a pet..." + processing_quirk = TRUE + var/mood_category = "dom_trained" + var/notice_delay = 0 + var/mob/living/carbon/human/last_dom + +/datum/quirk/well_trained/add() + . = ..() + RegisterSignal(quirk_holder, COMSIG_PARENT_EXAMINE, .proc/on_examine_holder) + +/datum/quirk/well_trained/remove() + . = ..() + UnregisterSignal(quirk_holder, COMSIG_PARENT_EXAMINE) + +/datum/quirk/well_trained/proc/on_examine_holder(atom/source, mob/living/user, list/examine_list) + SIGNAL_HANDLER + + if(!istype(user)) + return + if(!user.has_quirk(/datum/quirk/dominant_aura)) + return + examine_list += span_lewd("You can sense submissiveness irradiating from [quirk_holder.p_them()]") + +/datum/quirk/well_trained/on_process() + . = ..() + if(!quirk_holder) + return + + var/good_x = "pet" + switch(quirk_holder.gender) + if(MALE) + good_x = "boy" + if(FEMALE) + good_x = "girl" + + //Check for possible doms with the dominant_aura quirk, and for the closest one if there is + . = FALSE + var/list/mob/living/carbon/human/doms = range(DOMINANT_DETECT_RANGE, quirk_holder) + var/closest_distance + for(var/mob/living/carbon/human/dom in doms) + if(dom != quirk_holder && dom.has_quirk(/datum/quirk/dominant_aura)) + if(!closest_distance || get_dist(quirk_holder, dom) <= closest_distance) + . = dom + closest_distance = get_dist(quirk_holder, dom) + + //Return if no dom is found + if(!.) + last_dom = null + return + + //Handle the mood + var/datum/component/mood/mood = quirk_holder.GetComponent(/datum/component/mood) + if(istype(mood.mood_events[mood_category], /datum/mood_event/dominant/good_boy)) + SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/dominant/good_boy) + else + SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, mood_category, /datum/mood_event/dominant/need) + + //Don't do anything if a previous dom was found + if(last_dom) + notice_delay = world.time + 15 SECONDS + return + + last_dom = . + + if(notice_delay > world.time) + return + + //Let them know they're near + var/list/notices = list( + "You feel someone's presence making you more submissive.", + "The thought of being commanded floods you with lust.", + "You really want to be called a good [good_x].", + "Someone's presence is making you all flustered.", + "You start getting excited and sweating." + ) + + to_chat(quirk_holder, span_lewd(pick(notices))) + notice_delay = world.time + 15 SECONDS diff --git a/modular_splurt/code/datums/traits/neutral.dm b/modular_splurt/code/datums/traits/neutral.dm index d816747e71..827432936b 100644 --- a/modular_splurt/code/datums/traits/neutral.dm +++ b/modular_splurt/code/datums/traits/neutral.dm @@ -49,6 +49,14 @@ value = 0 medical_record_text = "Patient seems overly affectionate." +/datum/quirk/headpat_slut/add() + . = ..() + quirk_holder.AddElement(/datum/element/wuv/headpat, null, null, /datum/mood_event/pet_animal) + +/datum/quirk/headpat_slut/remove() + . = ..() + quirk_holder.RemoveElement(/datum/element/wuv/headpat) + /datum/quirk/in_heat name = "In Heat" desc = "Your system burns with the desire to be bred. Satisfying your lust will make you happy, but ignoring it may cause you to become sad and needy." @@ -284,29 +292,3 @@ . = ..() var/obj/item/implant/genital_fluid/put_in = new put_in.implant(quirk_holder, null, TRUE, TRUE) - -/datum/quirk/masked_mook - name = "Bane Syndrome" - desc = "For some reason you don't feel well without wearing some kind of gas mask." - gain_text = "You start feeling unwell without any gas mask on." - lose_text = "You no longer have a need to wear some gas mask." - value = 0 - mood_quirk = TRUE - medical_record_text = "Patient feels more secure when wearing a gas mask." - -/datum/quirk/masked_mook/on_process() - var/mob/living/carbon/human/H = quirk_holder - var/obj/item/clothing/mask/gas/gasmask = H.get_item_by_slot(ITEM_SLOT_MASK) - if(istype(gasmask)) - SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "masked_mook_incomplete") - SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "masked_mook", /datum/mood_event/masked_mook) - else - SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "masked_mook") - SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "masked_mook_incomplete", /datum/mood_event/masked_mook_incomplete) - -/datum/quirk/masked_mook/on_spawn() - . = ..() - var/mob/living/carbon/human/H = quirk_holder - var/obj/item/clothing/mask/gas/gasmask = new(get_turf(quirk_holder)) - H.equip_to_slot(gasmask, ITEM_SLOT_MASK) - H.regenerate_icons() diff --git a/modular_splurt/code/game/area/areas/ruins/space.dm b/modular_splurt/code/game/area/areas/ruins/space.dm new file mode 100644 index 0000000000..1af32b50d8 --- /dev/null +++ b/modular_splurt/code/game/area/areas/ruins/space.dm @@ -0,0 +1,93 @@ +/area/ruin/space/radiostation + name = "Nanotrasen Radio Station" + icon_state = "DJ" + has_gravity = STANDARD_GRAVITY + +/area/ruin/space/radiostation/solars + name = "NT Radio Solars" + icon_state = "yellow" + +/area/ruin/space/radiostation/engineering + name = "NT Radio Engineering" + icon_state = "engine" + has_gravity = STANDARD_GRAVITY + +/area/ruin/space/radiostation/engines + name = "NT Radio Engines" + icon_state = "engine" + has_gravity = STANDARD_GRAVITY + +/area/ruin/space/radiostation/janitor + name = "NT Radio Custodial Closet" + icon_state = "janitor" + has_gravity = STANDARD_GRAVITY + +/area/ruin/space/radiostation/break_room + name = "NT Radio Break Room" + icon_state = "cafeteria" + has_gravity = STANDARD_GRAVITY + +/area/ruin/space/radiostation/control_room + name = "NT Radio Control Room" + icon_state = "DJ" + has_gravity = STANDARD_GRAVITY + +/area/ruin/space/radiostation/cabin + name = "NT Radio Cabin" + icon_state = "dorms" + has_gravity = STANDARD_GRAVITY + +/datum/map_template/ruin/space/radiostation + prefix = "modular_splurt/_maps/RandomRuins/SpaceRuins/" + id = "radiostation" + suffix = "radiostation.dmm" + name = "NT Radio Station" + description = "A mobile NT Radio Station ship." + + +/area/ruin/space/syndielistenspace + name = "Syndicate Listening Post" + icon_state = "yellow" + has_gravity = STANDARD_GRAVITY + +/datum/map_template/ruin/space/syndielistenspace + prefix = "modular_splurt/_maps/RandomRuins/SpaceRuins/" + id = "syndielistenspace" + suffix = "syndielistenspace.dmm" + name = "Syndicate Listening Outpost" + description = "A syndicate listening outpost cleverly disguised as an asteroid" + + +/obj/effect/mob_spawn/human/space/syndicate/special(mob/living/new_spawn) + new_spawn.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MIND) + +/obj/effect/mob_spawn/human/space/syndicate/comms + name = "Syndicate Comms Agent" + roundstart = FALSE + death = FALSE + icon = 'icons/obj/machines/sleeper.dmi' + icon_state = "sleeper_s" + outfit = /datum/outfit/syndicate_comms_space + assignedrole = "Space Syndicate Comms Agent" + job_description = "Space Syndicate Comms Agent" + short_desc = "You are a syndicate comms agent, employed to listen in on Nanotrasen Comms Chatter." + flavour_text = "Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!" + important_info = "DO NOT abandon the base." + canloadappearance = TRUE + +/datum/outfit/syndicate_comms_space + name = "Space Syndicate Comms Agent" + uniform = /obj/item/clothing/under/syndicate + suit = /obj/item/clothing/suit/armor/vest + mask = /obj/item/clothing/mask/chameleon + shoes = /obj/item/clothing/shoes/combat + gloves = /obj/item/clothing/gloves/tackler/combat/insulated + ears = /obj/item/radio/headset/syndicate/alt + back = /obj/item/storage/backpack + l_pocket = /obj/item/melee/transforming/energy/sword/saber + r_pocket = /obj/item/gun/ballistic/automatic/pistol + id = /obj/item/card/id/syndicate/anyone + implants = list(/obj/item/implant/weapons_auth) + +/datum/outfit/syndicate_empty/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) + H.faction |= ROLE_SYNDICATE diff --git a/modular_splurt/code/game/object/items/miscellaneous.dm b/modular_splurt/code/game/object/items/miscellaneous.dm index c44910d01b..72a24aa100 100644 --- a/modular_splurt/code/game/object/items/miscellaneous.dm +++ b/modular_splurt/code/game/object/items/miscellaneous.dm @@ -185,3 +185,8 @@ user.visible_message("[user] shows you: [icon2html(src, viewers(user))] [src.name].", \ "You show \the [src.name].") add_fingerprint(user) + +/obj/item/clothing/accessory/badge/holo + name = "Security Holo Badge" + desc = "A more futuristic hard-light badge" + icon_state = "security_badge_holo" diff --git a/modular_splurt/code/game/object/structures/railings.dm b/modular_splurt/code/game/object/structures/railings.dm deleted file mode 100644 index ca1e6e2c9e..0000000000 --- a/modular_splurt/code/game/object/structures/railings.dm +++ /dev/null @@ -1,198 +0,0 @@ -//ported from virgo - -/obj/structure/railing - name = "railing" - desc = "A railing to stop people from falling" - - icon = 'modular_splurt/icons/obj/railings.dmi' - var/icon_modifier = "grey_" - icon_state = "grey_railing0" - - density = FALSE - layer = 4 - anchored = TRUE - flags_1 = ON_BORDER_1 - max_integrity = 250 - var/heat_resistance = 800 - var/health = 70 - var/maxhealth = 70 - - - resistance_flags = ACID_PROOF - armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) - CanAtmosPass = ATMOS_PASS_PROC - var/real_explosion_block //ignore this, just use explosion_block - var/breaksound = "shatter" - var/hitsound = 'sound/effects/Glasshit.ogg' - rad_insulation = RAD_VERY_LIGHT_INSULATION - rad_flags = RAD_PROTECT_CONTENTS - var/check = 0 - var/static/list/freepass = typecacheof(list( - /obj/singularity, - /obj/effect/projectile, - /obj/effect/portal, - /obj/effect/abstract, - /obj/effect/hotspot, - /obj/effect/landmark, - /obj/effect/temp_visual, - /obj/effect/light_emitter/tendril, - /obj/effect/collapse, - /obj/effect/particle_effect/ion_trails, - /obj/effect/dummy/phased_mob, - /obj/effect/immovablerod, - /obj/effect/crystalline_reentry - )) //Gotta make sure certain things can phase through it otherwise the railings also block them. - -/obj/structure/railing/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && (mover.pass_flags & PASSGLASS) || is_type_in_typecache(mover, freepass)) - return 1 - if(get_dir(loc, target) == dir) - return 0 - return 1 - -/obj/structure/railing/CheckExit(atom/movable/O, turf/target) - if(istype(O) && (O.pass_flags & PASSGLASS) || is_type_in_typecache(O, freepass)) - return 1 - if(get_dir(O.loc, target) == dir) - return 0 - return 1 - -/obj/structure/railing/Initialize() - . = ..() - if(src.anchored) - update_icon(0) - -/obj/structure/railing/proc/NeighborsCheck(var/UpdateNeighbors = 1) - check = 0 - //if (!anchored) return - var/Rturn = turn(src.dir, -90) - var/Lturn = turn(src.dir, 90) - - for(var/obj/structure/railing/R in src.loc) - if ((R.dir == Lturn) && R.anchored) - check |= 32 - if (UpdateNeighbors) - R.update_icon(0) - if ((R.dir == Rturn) && R.anchored) - check |= 2 - if (UpdateNeighbors) - R.update_icon(0) - - for (var/obj/structure/railing/R in get_step(src, Lturn)) - if ((R.dir == src.dir) && R.anchored) - check |= 16 - if (UpdateNeighbors) - R.update_icon(0) - for (var/obj/structure/railing/R in get_step(src, Rturn)) - if ((R.dir == src.dir) && R.anchored) - check |= 1 - if (UpdateNeighbors) - R.update_icon(0) - - for (var/obj/structure/railing/R in get_step(src, (Lturn + src.dir))) - if ((R.dir == Rturn) && R.anchored) - check |= 64 - if (UpdateNeighbors) - R.update_icon(0) - for (var/obj/structure/railing/R in get_step(src, (Rturn + src.dir))) - if ((R.dir == Lturn) && R.anchored) - check |= 4 - if (UpdateNeighbors) - R.update_icon(0) - -/obj/structure/railing/update_icon(var/UpdateNeighgors = 1) - NeighborsCheck(UpdateNeighgors) - overlays.Cut() - if (!check || !anchored)//|| !anchored - icon_state = "[icon_modifier]railing0" - else - icon_state = "[icon_modifier]railing1" - if (check & 32) - overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]corneroverlay") - if ((check & 16) || !(check & 32) || (check & 64)) - overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]frontoverlay_l") - if (!(check & 2) || (check & 1) || (check & 4)) - overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]frontoverlay_r") - if(check & 4) - switch (src.dir) - if (NORTH) - overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_x = 32) - if (SOUTH) - overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_x = -32) - if (EAST) - overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_y = -32) - if (WEST) - overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_y = 32) - -/obj/structure/railing/examine(mob/user) - . = ..() - if(health < maxhealth) - switch(health / maxhealth) - if(0.0 to 0.5) - . += "It looks severely damaged!" - if(0.25 to 0.5) - . += "It looks damaged!" - if(0.5 to 1.0) - . += "It has a few scrapes and dents." - -/obj/structure/railing/take_damage(amount) - health -= amount - if(health <= 0) - visible_message("\The [src] breaks down!") - playsound(src, 'sound/effects/grillehit.ogg', 50, 1) - new /obj/item/stack/rods(get_turf(src)) - qdel(src) - -/obj/structure/railing/MouseDrop_T(mob/living/M, mob/living/user) - if(!istype(user)) - return - if(!isliving(user)) - return - - usr.visible_message("[user] starts climbing onto \the [src]!") - - if(!do_after(user, 15, target = src)) - return - - if(get_turf(user) == get_turf(src)) - usr.dir = get_dir(usr.loc, get_step(src, src.dir))//turn and face railing - usr.forceMove(get_step(src, src.dir)) - else - usr.dir = get_dir(usr.loc, loc)//turn and face railing - usr.forceMove(get_turf(src)) - - usr.visible_message("[user] climbed over \the [src]!") - usr.do_twist(targetangle = 45, timer = 8) - -/obj/structure/railing/handrail - name = "handrail" - desc = "A waist high handrail, perhaps you could climb over it." - - icon = 'modular_splurt/icons/obj/railings.dmi' - icon_modifier = "hand_" - icon_state = "hand_railing0" - max_integrity = 100 - -/obj/structure/railing/handrail/update_icon(var/UpdateNeighgors = 1) - NeighborsCheck(UpdateNeighgors) - overlays.Cut() - if (!check || !anchored)//|| !anchored - icon_state = "[icon_modifier]railing0" - else - icon_state = "[icon_modifier]railing1" - if (check & 32) - overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]corneroverlay") - if ((check & 16) || !(check & 32) || (check & 64)) - overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]frontoverlay_l") - if (!(check & 2) || (check & 1) || (check & 4)) - overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]frontoverlay_r") - if(check & 4) - switch (src.dir) - if (NORTH) - overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_x = 32) - if (SOUTH) - overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_x = -32) - if (EAST) - overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_y = -32) - if (WEST) - overlays += image ('modular_splurt/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_y = 32) diff --git a/modular_splurt/code/game/say.dm b/modular_splurt/code/game/say.dm new file mode 100644 index 0000000000..c6659e4d58 --- /dev/null +++ b/modular_splurt/code/game/say.dm @@ -0,0 +1,4 @@ +/atom/movable/bark(list/hearers, distance, volume, pitch) + if(!CONFIG_GET(flag/enable_global_barks)) + return + . = ..() diff --git a/modular_splurt/code/modules/cargo/packs/misc.dm b/modular_splurt/code/modules/cargo/packs/misc.dm index 49f7d788c0..3211d7e085 100644 --- a/modular_splurt/code/modules/cargo/packs/misc.dm +++ b/modular_splurt/code/modules/cargo/packs/misc.dm @@ -388,7 +388,7 @@ /datum/supply_pack/misc/goner name = "Trencher Outfits" desc = "Contains five trench uniforms, coats, gas masks, jackboots, four helmets and one officer cap. Corporate-made." - cost = 1850 // Debatable, probably + cost = 2050 // Debatable, probably contraband = TRUE contains = list( /obj/item/clothing/mask/gas/goner, @@ -422,7 +422,7 @@ /datum/supply_pack/misc/goner_red name = "Red Trencher Outfits" desc = "Contains an import of five trench uniforms, coats, gas masks, jackboots, four helmets and one officer cap. Made by pesky Reds." - cost = 1750 + cost = 2000 contraband = TRUE contains = list( /obj/item/clothing/mask/gas/goner, @@ -456,7 +456,7 @@ /datum/supply_pack/misc/goner_green name = "Green Trencher Outfits" desc = "Contains an import of five trench uniforms, coats, gas masks, jackboots, four helmets and one officer cap. Made by stupid Greens." - cost = 1700 + cost = 1950 contraband = TRUE contains = list( /obj/item/clothing/mask/gas/goner, @@ -490,7 +490,7 @@ /datum/supply_pack/misc/goner_blue name = "Blue Trencher Outfits" desc = "Contains an import of five trench uniforms, coats, gas masks, jackboots, four helmets and one officer cap. Made by dirty Blues." - cost = 1750 + cost = 2000 contraband = TRUE contains = list( /obj/item/clothing/mask/gas/goner, @@ -524,7 +524,7 @@ /datum/supply_pack/misc/goner_yellow name = "Yellow Trencher Outfits" desc = "Contains an import of five trench uniforms, coats, gas masks, jackboots, four helmets and one officer cap. Made by cursed Yellows." - cost = 1750 + cost = 2000 contraband = TRUE contains = list( /obj/item/clothing/mask/gas/goner, @@ -554,7 +554,7 @@ /obj/item/clothing/shoes/jackboots ) crate_name = "yellow trencher outfit crate" - + /datum/supply_pack/medical/plaguedoc name = "Plague Doctor Supply Crate" desc = "Survive any Pandemic in style with this authentic Plague Doctor outfit, bag, and cane!" diff --git a/modular_splurt/code/modules/cargo/packs/vending.dm b/modular_splurt/code/modules/cargo/packs/vending.dm index 8426d5441d..d53f162f47 100644 --- a/modular_splurt/code/modules/cargo/packs/vending.dm +++ b/modular_splurt/code/modules/cargo/packs/vending.dm @@ -1,2 +1,9 @@ /datum/supply_pack/vending/barkbox contraband = FALSE //i'm not responsible for citcode + +/datum/supply_pack/vending/modularpc + name = "Deluxe Silicate Solutions Supply Crate" + desc = "Contains a Deluxe Silicate Solutions restock unit!" + cost = 1500 + contains = list(/obj/item/vending_refill/modularpc) + crate_name = "deluxe silicate solutions supply crate" diff --git a/modular_splurt/code/modules/client/loadout/backpack.dm b/modular_splurt/code/modules/client/loadout/backpack.dm index d73b7537fb..8dcdac25a6 100644 --- a/modular_splurt/code/modules/client/loadout/backpack.dm +++ b/modular_splurt/code/modules/client/loadout/backpack.dm @@ -87,3 +87,13 @@ /datum/gear/backpack/nailpolish_purple name = "Purple Nail Polish" path = /obj/item/nailpolish/purple + +/datum/gear/backback/secbadge + name = "Security Badge" + path = /obj/item/clothing/accessory/badge + restricted_roles = list("Security Officer", "Warden", "Detective", "Head of Security") + +/datum/gear/backpack/holobadge + name = "Security Holo Badge" + path = /obj/item/clothing/accessory/badge/holo + restricted_roles = list("Security Officer", "Warden", "Detective", "Head of Security") diff --git a/modular_splurt/code/modules/client/loadout/gloves.dm b/modular_splurt/code/modules/client/loadout/gloves.dm index 891ece11d3..59fdf600c7 100644 --- a/modular_splurt/code/modules/client/loadout/gloves.dm +++ b/modular_splurt/code/modules/client/loadout/gloves.dm @@ -10,8 +10,8 @@ /datum/gear/gloves/syntech/ring name = "Normalizer Ring" - path = /obj/item/clothing/gloves/ring/syntech + path = /obj/item/clothing/accessory/ring/syntech /datum/gear/gloves/syntech/band name = "Normalizer Band" - path = /obj/item/clothing/gloves/ring/syntech/band + path = /obj/item/clothing/accessory/ring/syntech/band diff --git a/modular_splurt/code/modules/clothing/sizeaccessories.dm b/modular_splurt/code/modules/clothing/sizeaccessories.dm index 66ebe8766b..4f4e5ca423 100644 --- a/modular_splurt/code/modules/clothing/sizeaccessories.dm +++ b/modular_splurt/code/modules/clothing/sizeaccessories.dm @@ -1,43 +1,6 @@ -//Clothing vars and procs -/obj/item/clothing - var/normalize_size = RESIZE_NORMAL //This number is used as the "normal" height people will be given when wearing one of these accessories - var/natural_size = null //The value of the wearer's body_size var in prefs. Unused for now. - var/recorded_size = null //the user's height prior to equipping - -//For applying a normalization -/obj/item/clothing/proc/normalize_mob_size(mob/living/carbon/human/H) - if(H.normalized) //First we make a check to see if they're already normalized, from wearing another article of SynTech jewelry - to_chat(H, "This accessory buzzes, being overwritten by another.") - playsound(H, 'sound/machines/buzz-sigh.ogg', 50, 1) - return - recorded_size = get_size(H) //If not, grab their current size - playsound(H, 'sound/effects/magic.ogg', 50, 1) - flash_lighting_fx(3, 3, LIGHT_COLOR_PURPLE) - H.visible_message("A flash of purple light engulfs [H], before they change to normal!","You feel warm for a moment, before everything scales to your size...") - H.update_size(normalize_size) //Then apply the size - H.normalized = TRUE //And set normalization - -//For removing a normalization, and reverting back to normal -/obj/item/clothing/proc/denormalize_mob_size(mob/living/carbon/human/H) - if(H.normalized) //sanity check - playsound(H,'sound/weapons/emitter2.ogg', 50, 1) - flash_lighting_fx(3, 3, LIGHT_COLOR_YELLOW) - H.visible_message("Golden light engulfs [H], and they shoot back to their default height!","Energy rushes through your body, and you return to normal.") - H.update_size(recorded_size) - H.normalized = FALSE - - -//For storing normalization on mobs -/mob/living - var/normalized = FALSE - //normalized is a check for instances where more than one accessory of jewelry is worn. For all intensive purposes, only the first worn accessory stores the user's size. - //Anything else is just extra. - -//Clothing below. Code could be compressed more, but until I make jewelry slots, this will do. -Dahl - //GLOVE SLOT ITEMS... //SynTech ring -/obj/item/clothing/gloves/ring/syntech +/obj/item/clothing/accessory/ring/syntech name = "normalizer ring" desc = "An expensive, shimmering SynTech ring gilded with golden NanoTrasen markings. It will 'normalize' the size of the user to a specified height approved for work-conditions, as long as it is equipped. The artificial violet gem inside twinkles ominously." icon = 'modular_splurt/icons/obj/clothing/sizeaccessories.dmi' @@ -50,25 +13,25 @@ //These are already defined under the parent ring, but I wanna leave em here for reference purposes //For glove slots -/obj/item/clothing/gloves/ring/syntech/equipped(mob/living/user, slot) - if(ishuman(user)) - var/mob/living/carbon/human/human_target = user - if(slot == ITEM_SLOT_GLOVES) +/obj/item/clothing/accessory/ring/syntech/equipped(mob/living/user, slot) + if(slot != ITEM_SLOT_GLOVES) + return ..() - if(get_size(human_target) != normalize_size) - normalize_mob_size(human_target) + if(user.GetComponent(/datum/component/size_normalized)) + to_chat(user, "\The [src] buzzes, being overwritten by another accessory.") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) + else + user.AddComponent(/datum/component/size_normalized, wear=src) . = ..() -/obj/item/clothing/gloves/ring/syntech/dropped(mob/living/user, slot) - if(ishuman(user)) - var/mob/living/carbon/human/human_target = user - - if(human_target.normalized) - denormalize_mob_size(human_target) +/obj/item/clothing/accessory/ring/syntech/dropped(mob/living/user, slot) + var/datum/component/size_normalized/comp = user.GetComponent(/datum/component/size_normalized) + if(comp?.attached_wear == src) + qdel(comp) . = ..() //SynTech Wristband -/obj/item/clothing/gloves/ring/syntech/band +/obj/item/clothing/accessory/ring/syntech/band //I mean, you realistically *can* put a band over your gloves name = "normalizer wristband" desc = "An expensive technological wristband cast in SynTech purples with shimmering NanoTrasen golds. It will 'normalize' the size of the user to a specified height for approved work-conditions, as long as it is equipped. There is a small screen buzzing with information." icon = 'modular_splurt/icons/obj/clothing/sizeaccessories.dmi' @@ -89,20 +52,20 @@ //For neck items /obj/item/clothing/neck/syntech/equipped(mob/living/user, slot) - if(ishuman(user)) - var/mob/living/carbon/human/human_target = user - if(slot == ITEM_SLOT_NECK) + if(slot != ITEM_SLOT_NECK) + return ..() - if(get_size(human_target) != normalize_size) - normalize_mob_size(human_target) + if(user.GetComponent(/datum/component/size_normalized)) + to_chat(user, "\The [src] buzzes, being overwritten by another accessory.") + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) + else + user.AddComponent(/datum/component/size_normalized, wear=src) . = ..() /obj/item/clothing/neck/syntech/dropped(mob/living/user, slot) - if(ishuman(user)) - var/mob/living/carbon/human/human_target = user - - if(human_target.normalized) - denormalize_mob_size(human_target) + var/datum/component/size_normalized/comp = user.GetComponent(/datum/component/size_normalized) + if(comp?.attached_wear == src) + qdel(comp) . = ..() //Syntech Choker diff --git a/modular_splurt/code/modules/clothing/suits/miscellaneous.dm b/modular_splurt/code/modules/clothing/suits/miscellaneous.dm index 67014218e4..2e608aec41 100644 --- a/modular_splurt/code/modules/clothing/suits/miscellaneous.dm +++ b/modular_splurt/code/modules/clothing/suits/miscellaneous.dm @@ -93,9 +93,14 @@ /obj/item/clothing/suit/hooded/corpus/s //sec name = "Enforcer Voidsuit" - desc = "Delux issue grofit voidsuit. Let the middle class know You're in charge." + desc = "Deluxe issue armored voidsuit. Let the middle class bask in your grofit!" icon_state = "corpuss" + armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, WOUND = 10) hoodtype = /obj/item/clothing/head/hooded/corpus/s //Enjoy this nice red outfit Nanotrasen! There is NO NEED for a pink one! xoxo -VivI Fanteriso + +/obj/item/clothing/suit/hooded/corpus/s/Initialize(mapload) + . = ..() + allowed = GLOB.security_wintercoat_allowed /obj/item/clothing/suit/hooded/corpus/c //command name = "Commander Voidsuit" @@ -132,6 +137,10 @@ heat_protection = CHEST|GROIN|LEGS|ARMS armor = list(MELEE = 25, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 5, BIO = 5, RAD = 5, FIRE = 5, ACID = 45) // Det's armor value + 5 BOMB&BIO&RAD&FIRE +/obj/item/clothing/suit/goner/Initialize(mapload) + . = ..() + allowed = GLOB.detective_vest_allowed // I am probably gonna get fire-line'd for this... But suggestion is a suggestion. Can always revert the changes, right? + /obj/item/clothing/suit/goner/fake name = "trencher coat replica" desc = "A 90% replica of No Man's Land-type coat." diff --git a/modular_splurt/code/modules/clothing/suits/vest.dm b/modular_splurt/code/modules/clothing/suits/vest.dm index 6c22975d38..a4451f5664 100644 --- a/modular_splurt/code/modules/clothing/suits/vest.dm +++ b/modular_splurt/code/modules/clothing/suits/vest.dm @@ -84,3 +84,21 @@ item_state = "peacekeeper_trench_hos" icon = 'modular_splurt/icons/obj/clothing/suits.dmi' mob_overlay_icon = 'modular_splurt/icons/mob/clothing/suit.dmi' + +/obj/item/clothing/suit/sling + name = "rifle sling" + desc = "A sling with universal clips for holding various longarms, or even internals tanks." + icon = 'icons/obj/clothing/belts.dmi' + mob_overlay_icon = 'icons/mob/clothing/belt.dmi' + icon_state = "bandolier" + item_state = "bandolier" + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON + allowed = list(/obj/item/tank/internals, /obj/item/gun/ballistic/shotgun/varmintrifle, /obj/item/gun/ballistic/shotgun/huntingrifle, /obj/item/gun/ballistic/shotgun/hunting, /obj/item/gun/ballistic/shotgun/doublebarrel, /obj/item/gun/ballistic/revolver/doublebarrel/sawn, /obj/item/gun/ballistic/shotgun/leveraction, /obj/item/gun/ballistic/shotgun/brush, /obj/item/gun/ballistic/shotgun/brush2, /obj/item/gun/energy/e_gun) + +/datum/design/s_holster + name = "Rifle Sling" + id = "r_sling" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 600) + build_path = /obj/item/clothing/suit/sling + category = list("initial","Organic Materials") diff --git a/modular_splurt/code/modules/discord/toggle_notify.dm b/modular_splurt/code/modules/discord/toggle_notify.dm index cc08974060..ddfd3dc8db 100644 --- a/modular_splurt/code/modules/discord/toggle_notify.dm +++ b/modular_splurt/code/modules/discord/toggle_notify.dm @@ -23,11 +23,11 @@ return else // Linked - for(var/member in SSdiscord.notify_members) // If they are in the list, take them out - if(member == "[stored_id]") - SSdiscord.notify_members -= "<@[stored_id]>" // The list uses strings because BYOND cannot handle a 17 digit integer - to_chat(src, span_notice("You will no longer be notified when the server restarts")) - return // This is necassary so it doesnt get added again, as it relies on the for loop being unsuccessful to tell us if they are in the list or not + var/mention_index = SSdiscord.notify_members.Find("<@[stored_id]>") + if(mention_index) // If they are in the list, take them out + SSdiscord.notify_members -= SSdiscord.notify_members[mention_index] // The list uses strings because BYOND cannot handle a 17 digit integer + to_chat(src, span_notice("You will no longer be notified when the server restarts")) + return // This is necassary so it doesnt get added again, as it relies on the for loop being unsuccessful to tell us if they are in the list or not // If we got here, they arent in the list. Chuck 'em in! to_chat(src, span_notice("You will now be notified when the server restarts")) diff --git a/modular_splurt/code/modules/food_and_drinks/recipes/tablecraft/recipes_donut.dm b/modular_splurt/code/modules/food_and_drinks/recipes/tablecraft/recipes_donut.dm new file mode 100644 index 0000000000..3bf6f19d95 --- /dev/null +++ b/modular_splurt/code/modules/food_and_drinks/recipes/tablecraft/recipes_donut.dm @@ -0,0 +1,7 @@ +/datum/crafting_recipe/food/donut/cum + name = "\"cream\" donut" + reqs = list( + /datum/reagent/consumable/semen = 10, + /obj/item/reagent_containers/food/snacks/donut/plain = 1 + ) + result = /obj/item/reagent_containers/food/snacks/donut/semen diff --git a/modular_splurt/code/modules/jobs/job_types/_job_alt_titles.dm b/modular_splurt/code/modules/jobs/job_types/_job_alt_titles.dm index 37d905e0ae..6cf1d15bee 100644 --- a/modular_splurt/code/modules/jobs/job_types/_job_alt_titles.dm +++ b/modular_splurt/code/modules/jobs/job_types/_job_alt_titles.dm @@ -79,7 +79,8 @@ "Tourist", "Clerk", "Blacksmith", - "Bard" + "Bard", + "Snack" ) LAZYADD(alt_titles, extra_titles) diff --git a/modular_splurt/code/modules/jobs/job_types/security_officer.dm b/modular_splurt/code/modules/jobs/job_types/security_officer.dm index 48466a9b6c..785856d86b 100644 --- a/modular_splurt/code/modules/jobs/job_types/security_officer.dm +++ b/modular_splurt/code/modules/jobs/job_types/security_officer.dm @@ -1,6 +1,6 @@ /datum/outfit/job/security/New() . = ..() - backpack_contents += list(/obj/item/choice_beacon/copgun=1, /obj/item/device/hailer, /obj/item/clothing/accessory/badge) + backpack_contents += list(/obj/item/choice_beacon/copgun=1, /obj/item/device/hailer) /datum/outfit/job/detective/New() . = ..() @@ -8,8 +8,8 @@ /datum/outfit/job/warden/New() . = ..() - backpack_contents += list(/obj/item/device/hailer, /obj/item/clothing/accessory/badge) + backpack_contents += list(/obj/item/device/hailer) /datum/outfit/job/hos/New() . = ..() - backpack_contents += list(/obj/item/device/hailer, /obj/item/clothing/accessory/badge) + backpack_contents += list(/obj/item/device/hailer) diff --git a/modular_splurt/code/modules/language/xenocommon.dm b/modular_splurt/code/modules/language/xenocommon.dm new file mode 100644 index 0000000000..c0cf0d69c6 --- /dev/null +++ b/modular_splurt/code/modules/language/xenocommon.dm @@ -0,0 +1,2 @@ +/datum/language/xenocommon + restricted = FALSE //sand, you sometimes know no fun fr diff --git a/modular_splurt/code/modules/mob/dead/new_player/login.dm b/modular_splurt/code/modules/mob/dead/new_player/login.dm new file mode 100644 index 0000000000..13876801b3 --- /dev/null +++ b/modular_splurt/code/modules/mob/dead/new_player/login.dm @@ -0,0 +1,4 @@ +/mob/dead/new_player/Login() + . = ..() + if(!(client?.prefs.toggles & TG_PLAYER_PANEL)) + new_player_panel() diff --git a/modular_splurt/code/modules/mob/dead/new_player/new_player.dm b/modular_splurt/code/modules/mob/dead/new_player/new_player.dm new file mode 100644 index 0000000000..5ef70df5ea --- /dev/null +++ b/modular_splurt/code/modules/mob/dead/new_player/new_player.dm @@ -0,0 +1,160 @@ +/mob/dead/new_player/proc/new_player_panel() + if(client?.prefs.toggles & TG_PLAYER_PANEL) + return + var/output = "

Welcome, [client ? client.prefs.real_name : "Unknown User"]

" + output += "

Setup Character

" + + if(SSticker.current_state <= GAME_STATE_PREGAME) + switch(ready) + if(PLAYER_NOT_READY) + output += "

\[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | Not Ready | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]

" + if(PLAYER_READY_TO_PLAY) + output += "

\[ Ready | [LINKIFY_READY("Not Ready", PLAYER_NOT_READY)] | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]

" + if(PLAYER_READY_TO_OBSERVE) + output += "

\[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | [LINKIFY_READY("Not Ready", PLAYER_NOT_READY)] | Observe \]

" + else + output += "

View the Crew Manifest

" + output += "

Join Game!

" + output += "

[LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)]

" + + if(!IsGuestKey(src.key)) + output += playerpolls() + + output += "
" + + //src << browse(output,"window=playersetup;size=210x240;can_close=0") + var/datum/browser/popup = new(src, "playersetup", "
New Player Options
", 250, 265) + popup.set_window_options("can_close=0") + popup.set_content(output) + popup.open(FALSE) + +/mob/dead/new_player/proc/playerpolls() + var/output = "" //hey tg why is this a list? + if (SSdbcore.Connect()) + var/isadmin = FALSE + if(client?.holder) + isadmin = TRUE + var/datum/db_query/query_get_new_polls = SSdbcore.NewQuery({" + SELECT id FROM [format_table_name("poll_question")] + WHERE (adminonly = 0 OR :isadmin = 1) + AND Now() BETWEEN starttime AND endtime + AND deleted = 0 + AND id NOT IN ( + SELECT pollid FROM [format_table_name("poll_vote")] + WHERE ckey = :ckey + AND deleted = 0 + ) + AND id NOT IN ( + SELECT pollid FROM [format_table_name("poll_textreply")] + WHERE ckey = :ckey + AND deleted = 0 + ) + "}, list("isadmin" = isadmin, "ckey" = ckey)) + var/rs = REF(src) + if(!query_get_new_polls.Execute()) + qdel(query_get_new_polls) + return + if(query_get_new_polls.NextRow()) + output += "

Show Player Polls (NEW!)

" + else + output += "

Show Player Polls

" + qdel(query_get_new_polls) + if(QDELETED(src)) + return + return output + +/mob/dead/new_player/Topic(href, list/href_list) + if(src != usr) + return ..() + + if(!client) + return ..() + + //don't let people get to this unless they are specifically not verified + if(href_list["Month"] && (CONFIG_GET(flag/age_verification) && !check_rights_for(client, R_ADMIN) && !(client.ckey in GLOB.bunker_passthrough))) + return ..() + + if(!age_verify()) + return ..() + + //Handle discord verification + var/vibe_check = SSdiscord?.check_login(src) + if(isnull(vibe_check)) + to_chat(usr, span_notice("The server is still starting up. Please wait... ")) + return + if(href_list["ready"]) + var/tready = text2num(href_list["ready"]) + if(tready != PLAYER_NOT_READY && !vibe_check) + ready = PLAYER_NOT_READY + to_chat(src, span_warning("You must link your discord account to your ckey in order to join the game. Join our discord and use the [CONFIG_GET(string/discordbotcommandprefix)][CONFIG_GET(string/verification_command)] command [CONFIG_GET(string/verification_channel) ? "as indicated in #[CONFIG_GET(string/verification_channel)] " : ""]. It won't take you more than two minutes :)
Ahelp or ask staff in the discord if this is an error.")) + return + if(href_list["late_join"] || href_list["SelectedJob"] || href_list["JoinAsGhostRole"]) + if(!vibe_check) + to_chat(src, span_warning("You must link your discord account to your ckey in order to join the game. Join our discord and use the [CONFIG_GET(string/discordbotcommandprefix)][CONFIG_GET(string/verification_command)] command [CONFIG_GET(string/verification_channel) ? "as indicated in #[CONFIG_GET(string/verification_channel)] " : ""]. It won't take you more than two minutes :)
Ahelp or ask staff in the discord if this is an error.")) + return + + if(client?.prefs.toggles & TG_PLAYER_PANEL) + return ..() + + //Determines Relevant Population Cap + var/relevant_cap + var/hpc = CONFIG_GET(number/hard_popcap) + var/epc = CONFIG_GET(number/extreme_popcap) + if(hpc && epc) + relevant_cap = min(hpc, epc) + else + relevant_cap = max(hpc, epc) + + if(href_list["show_preferences"]) + client.prefs.ShowChoices(src) + return 1 + + if(href_list["ready"]) + var/tready = text2num(href_list["ready"]) + //Avoid updating ready if we're after PREGAME (they should use latejoin instead) + //This is likely not an actual issue but I don't have time to prove that this + //no longer is required + if(SSticker.current_state <= GAME_STATE_PREGAME) + ready = tready + //if it's post initialisation and they're trying to observe we do the needful + if(!SSticker.current_state < GAME_STATE_PREGAME && tready == PLAYER_READY_TO_OBSERVE) + ready = tready + make_me_an_observer() + return + + if(href_list["refresh"]) + src << browse(null, "window=playersetup") //closes the player setup window + new_player_panel() + + if(href_list["late_join"]) + if(!SSticker || !SSticker.IsRoundInProgress()) + return ..() + + if(href_list["late_join"] == "override") + LateChoices() + return + + if(SSticker.queued_players.len || (relevant_cap && living_player_count() >= relevant_cap && !(ckey(usr.key) in GLOB.admin_datums))) + to_chat(usr, span_danger("[CONFIG_GET(string/hard_popcap_message)]")) + + var/queue_position = SSticker.queued_players.Find(usr) + if(queue_position == 1) + to_chat(usr, span_notice("You are next in line to join the game. You will be notified when a slot opens up.")) + else if(queue_position) + to_chat(usr, span_notice("There are [queue_position-1] players in front of you in the queue to join the game.")) + else + SSticker.queued_players += usr + to_chat(usr, span_notice("You have been added to the queue to join the game. Your position in queue is [SSticker.queued_players.len].")) + return + + if(href_list["manifest"]) + ViewManifest() + + else if(!href_list["late_join"]) + new_player_panel() + + if(href_list["showpoll"]) + handle_player_polling() + return + + . = ..() diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/ears.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/ears.dm index 4b8f76e265..5e5fb17c33 100644 --- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/ears.dm +++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/ears.dm @@ -1,5 +1,3 @@ -//Hyperstation Ears - /datum/sprite_accessory/ears/human/gret name = "Gret" icon_state = "gret" @@ -78,3 +76,8 @@ name = "Shadekin" icon_state = "shadekin" color_src = MUTCOLORS + +/datum/sprite_accessory/ears/mam_ears/eros/cat_normal + name = "Cat, normal" + icon_state = "catnormal" + matrixed_sections = MATRIX_RED_GREEN diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/horns.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/horns.dm index c468f60e69..b797a3ab08 100644 --- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/horns.dm +++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/horns.dm @@ -2,6 +2,14 @@ name = "Demon" icon = 'modular_splurt/icons/mob/mutant_bodyparts.dmi' icon_state = "demon" + +/datum/sprite_accessory/horns/sylveon + name = "Sylveon Bow" + icon = 'modular_splurt/icons/mob/mutant_bodyparts.dmi' + icon_state = "sylveon_bow" + color_src = MATRIXED + matrixed_sections = MATRIX_ALL + relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) //ripped from skyrat /datum/sprite_accessory/horns/broken diff --git a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/wings.dm b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/wings.dm index 672582d515..2bde7f9a4b 100644 --- a/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/wings.dm +++ b/modular_splurt/code/modules/mob/dead/new_player/sprite_accesories/wings.dm @@ -100,3 +100,11 @@ icon_state = "delirious" icon = 'modular_splurt/icons/mob/wings.dmi' upgrade_to = SPECIES_WINGS_MOTH + +/datum/sprite_accessory/deco_wings/sylveon + name = "Sylveon Ribbons" + icon_state = "sylveon_bow" + icon = 'modular_splurt/icons/mob/wings.dmi' + color_src = MATRIXED + matrixed_sections = MATRIX_ALL + relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) diff --git a/modular_splurt/code/modules/mob/emote.dm b/modular_splurt/code/modules/mob/emote.dm new file mode 100644 index 0000000000..a8caa144f9 --- /dev/null +++ b/modular_splurt/code/modules/mob/emote.dm @@ -0,0 +1,3 @@ +/mob/emote(act, m_type, message, intentional) + . = ..() + SEND_SIGNAL(src, COMSIG_MOB_EMOTE, args) diff --git a/modular_splurt/code/modules/mob/living/simple_animal/simple_animal.dm b/modular_splurt/code/modules/mob/living/simple_animal/simple_animal.dm new file mode 100644 index 0000000000..acb57b6c00 --- /dev/null +++ b/modular_splurt/code/modules/mob/living/simple_animal/simple_animal.dm @@ -0,0 +1,23 @@ +/mob/living/simple_animal/verb/toggle_gender() + set name = "Set Gender" + set desc = "Allows you to set your gender." + set category = "IC" + + var/choice = tgui_alert(usr, "Select Gender.", "Gender", list("Both", "Male", "Female", "None")) + switch(choice) + if("Both") + has_penis = TRUE + has_balls = TRUE + has_vagina = TRUE + if("Male") + has_penis = TRUE + has_balls = TRUE + has_vagina = FALSE + if("Female") + has_penis = FALSE + has_balls = FALSE + has_vagina = TRUE + if("None") + has_penis = FALSE + has_balls = FALSE + has_vagina = FALSE diff --git a/modular_splurt/code/modules/mob/splurt_emotes.dm b/modular_splurt/code/modules/mob/splurt_emotes.dm index f7c4bbfe2b..f75a0cecca 100644 --- a/modular_splurt/code/modules/mob/splurt_emotes.dm +++ b/modular_splurt/code/modules/mob/splurt_emotes.dm @@ -1,3 +1,4 @@ +//Main code edits /datum/emote/living/audio_emote/laugh/run_emote(mob/user, params) . = ..() if(. && iscarbon(user)) @@ -27,11 +28,8 @@ message = "farts out shitcode." emote_type = EMOTE_AUDIBLE -/mob/living - var/fart_cooldown = 0 - /datum/emote/living/fart/run_emote(mob/living/user, params, type_override, intentional) - if(user.fart_cooldown) + if(TIMER_COOLDOWN_CHECK(user, COOLDOWN_EMOTE_FART)) to_chat(user, "You try your hardest, but no shart comes out.") return var/list/fart_emotes = list( //cope goonies @@ -82,17 +80,8 @@ . = ..() if(.) playsound(user, pick(GLOB.brap_noises), 50, 1, -1) - var/delay = 3 SECONDS - user.fart_cooldown = TRUE - addtimer(CALLBACK(GLOBAL_PROC, .proc/_fart_renew_msg, user), delay) + TIMER_COOLDOWN_START(user, COOLDOWN_EMOTE_FART, 3 SECONDS) -/proc/_fart_renew_msg(mob/living/user) - if(QDELETED(user)) - return - //to_chat(user, "Your ass feels full, again.") //full o shit you mean - user.fart_cooldown = 0 - -// Hyperstation Emotes /datum/emote/living/cackle key = "cackle" key_third_person = "cackles" @@ -541,3 +530,18 @@ return user.nextsoundemote = world.time + 10 playsound(user, pick('modular_splurt/sound/voice/aauugghh1.ogg', 'modular_splurt/sound/voice/aauugghh2.ogg'), 40, 1, -1) + +/datum/emote/living/pant + key = "pant" + key_third_person = "pants" + message = "pants!" + +/datum/emote/living/pant/run_emote(mob/user, params, type_override, intentional) + var/list/pants = list( + "pants!", + "pants like a dog.", + "lets out soft pants.", + "pulls [user.p_their()] tongue out, panting." + ) + message = pick(pants) + . = ..() diff --git a/modular_splurt/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/modular_splurt/code/modules/ruins/spaceruin_code/hilbertshotel.dm index ada721b558..0cb2f7b023 100644 --- a/modular_splurt/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/modular_splurt/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -1,5 +1,11 @@ /obj/item/hilbertshotel w_class = WEIGHT_CLASS_GIGANTIC + var/list/list/mob_dorms = list() + +/obj/item/hilbertshotel/sendToNewRoom(roomNumber, mob/user) + . = ..() + if(!mob_dorms[user]?.Find(roomNumber)) + LAZYADD(mob_dorms[user], roomNumber) // Better SPLURT version of hilbert's /datum/map_template/hilbertshotel diff --git a/modular_splurt/code/modules/vending/kinkmate.dm b/modular_splurt/code/modules/vending/kinkmate.dm index 59a1ccffff..6d67f336d1 100644 --- a/modular_splurt/code/modules/vending/kinkmate.dm +++ b/modular_splurt/code/modules/vending/kinkmate.dm @@ -15,7 +15,12 @@ /obj/item/clothing/neck/petcollar/holo = 5, /obj/item/clothing/neck/petcollar/casino = 5, /obj/item/clothing/gloves/latexsleeves = 3, - /obj/item/genital_equipment/sounding = 4 + /obj/item/genital_equipment/sounding = 4, + /obj/item/clothing/accessory/ring/syntech = 4, + /obj/item/clothing/accessory/ring/syntech/band = 4, + /obj/item/clothing/neck/syntech = 4, + /obj/item/clothing/neck/syntech/choker = 4, + /obj/item/clothing/neck/syntech/collar = 4 ) var/list/extra_contraband = list( //Lewd-Clothes diff --git a/modular_splurt/code/modules/vending/modularpc.dm b/modular_splurt/code/modules/vending/modularpc.dm new file mode 100644 index 0000000000..16af43d7c7 --- /dev/null +++ b/modular_splurt/code/modules/vending/modularpc.dm @@ -0,0 +1,35 @@ +/obj/machinery/vending/modularpc + name = "\improper Deluxe Silicate Solutions" + desc = "Your dream PC, just a few credits away!." + icon_state = "modularpc" + icon_deny = "modularpc-deny" + light_mask = "modular-light-mask" + products = list(/obj/item/computer_hardware/hard_drive/micro = 5, + /obj/item/computer_hardware/hard_drive/small = 5, + /obj/item/computer_hardware/hard_drive = 5, + /obj/item/computer_hardware/processor_unit/small = 4, + /obj/item/computer_hardware/processor_unit = 4, + /obj/item/computer_hardware/network_card = 4, + /obj/item/computer_hardware/network_card/wired = 4, + /obj/item/computer_hardware/battery = 5, + /obj/item/stock_parts/cell/computer/micro = 5, + /obj/item/stock_parts/cell/computer = 5, + /obj/item/computer_hardware/printer/mini = 3, + /obj/item/computer_hardware/card_slot = 5, + /obj/item/computer_hardware/radio_card = 4) + premium = list(/obj/item/computer_hardware/recharger/apc_recharger = 3, + /obj/item/computer_hardware/hard_drive/advanced = 3, + /obj/item/computer_hardware/network_card/advanced = 3, + /obj/item/computer_hardware/ai_slot = 2, + /obj/item/stock_parts/cell/computer/advanced = 3, + /obj/item/computer_hardware/processor_unit/photonic/small = 3, + /obj/item/computer_hardware/processor_unit/photonic = 2, + /obj/item/computer_hardware/printer = 2) + refill_canister = /obj/item/vending_refill/modularpc + default_price = PRICE_CHEAP + extra_price = PRICE_ABOVE_NORMAL + payment_department = ACCOUNT_SCI + +/obj/item/vending_refill/modularpc + machine_name = "Deluxe Silicate Solutions" + icon_state = "refill_parts" diff --git a/modular_splurt/icons/mob/mam_ears.dmi b/modular_splurt/icons/mob/mam_ears.dmi index 93a8fb5480..8aec29bf29 100644 Binary files a/modular_splurt/icons/mob/mam_ears.dmi and b/modular_splurt/icons/mob/mam_ears.dmi differ diff --git a/modular_splurt/icons/mob/mutant_bodyparts.dmi b/modular_splurt/icons/mob/mutant_bodyparts.dmi index c73dea93e3..f1cbf6eb03 100644 Binary files a/modular_splurt/icons/mob/mutant_bodyparts.dmi and b/modular_splurt/icons/mob/mutant_bodyparts.dmi differ diff --git a/modular_splurt/icons/mob/wings.dmi b/modular_splurt/icons/mob/wings.dmi index e81553e462..2aa8cf7c41 100644 Binary files a/modular_splurt/icons/mob/wings.dmi and b/modular_splurt/icons/mob/wings.dmi differ diff --git a/modular_splurt/icons/obj/badge.dmi b/modular_splurt/icons/obj/badge.dmi index 9e1dcb855d..c71de9bc54 100644 Binary files a/modular_splurt/icons/obj/badge.dmi and b/modular_splurt/icons/obj/badge.dmi differ diff --git a/modular_splurt/sound/interactions/kiss/kiss1.ogg b/modular_splurt/sound/interactions/kiss/kiss1.ogg new file mode 100644 index 0000000000..f4bd734338 Binary files /dev/null and b/modular_splurt/sound/interactions/kiss/kiss1.ogg differ diff --git a/modular_splurt/sound/interactions/kiss/kiss2.ogg b/modular_splurt/sound/interactions/kiss/kiss2.ogg new file mode 100644 index 0000000000..18f12d6f04 Binary files /dev/null and b/modular_splurt/sound/interactions/kiss/kiss2.ogg differ diff --git a/modular_splurt/sound/interactions/kiss/kiss3.ogg b/modular_splurt/sound/interactions/kiss/kiss3.ogg new file mode 100644 index 0000000000..0f89617f00 Binary files /dev/null and b/modular_splurt/sound/interactions/kiss/kiss3.ogg differ diff --git a/modular_splurt/sound/interactions/kiss/kiss4.ogg b/modular_splurt/sound/interactions/kiss/kiss4.ogg new file mode 100644 index 0000000000..a7c47dd8af Binary files /dev/null and b/modular_splurt/sound/interactions/kiss/kiss4.ogg differ diff --git a/modular_splurt/sound/interactions/kiss/kiss5.ogg b/modular_splurt/sound/interactions/kiss/kiss5.ogg new file mode 100644 index 0000000000..31a48c4d62 Binary files /dev/null and b/modular_splurt/sound/interactions/kiss/kiss5.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 95fe96d7ac..1a33cd1bca 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -154,6 +154,8 @@ #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\signals.dm" #include "code\__DEFINES\dcs\signals\signals_subsystem.dm" +#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movement.dm" +#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_living.dm" #include "code\__DEFINES\mapping\maploader.dm" #include "code\__DEFINES\material\worth.dm" #include "code\__DEFINES\mobs\innate_abilities.dm" @@ -245,11 +247,14 @@ #include "code\__SPLURTCODE\DEFINES\atmospherics.dm" #include "code\__SPLURTCODE\DEFINES\cit_defines.dm" #include "code\__SPLURTCODE\DEFINES\click.dm" +#include "code\__SPLURTCODE\DEFINES\cooldowns.dm" #include "code\__SPLURTCODE\DEFINES\genital_defines.dm" #include "code\__SPLURTCODE\DEFINES\hud.dm" #include "code\__SPLURTCODE\DEFINES\is_helpers.dm" #include "code\__SPLURTCODE\DEFINES\lewd.dm" +#include "code\__SPLURTCODE\DEFINES\login.dm" #include "code\__SPLURTCODE\DEFINES\mobs.dm" +#include "code\__SPLURTCODE\DEFINES\quirks.dm" #include "code\__SPLURTCODE\DEFINES\radiation.dm" #include "code\__SPLURTCODE\DEFINES\say.dm" #include "code\__SPLURTCODE\DEFINES\signals.dm" @@ -259,6 +264,7 @@ #include "code\__SPLURTCODE\DEFINES\subsystems.dm" #include "code\__SPLURTCODE\DEFINES\traits.dm" #include "code\__SPLURTCODE\DEFINES\arousal\genitals.dm" +#include "code\__SPLURTCODE\DEFINES\dcs\signals.dm" #include "code\__SPLURTCODE\DEFINES\zeros\species.dm" #include "code\__SPLURTCODE\DEFINES\zeros\traits.dm" #include "code\_globalvars\admin.dm" @@ -479,6 +485,7 @@ #include "code\datums\action.dm" #include "code\datums\ai_laws.dm" #include "code\datums\armor.dm" +#include "code\datums\bark.dm" #include "code\datums\beam.dm" #include "code\datums\beepsky_fashion.dm" #include "code\datums\browser.dm" @@ -3731,6 +3738,7 @@ #include "code\modules\vehicles\mecha\mecha_wreckage.dm" #include "code\modules\vehicles\mecha\combat\combat.dm" #include "code\modules\vehicles\mecha\combat\durand.dm" +#include "code\modules\vehicles\mecha\combat\five_stars.dm" #include "code\modules\vehicles\mecha\combat\gygax.dm" #include "code\modules\vehicles\mecha\combat\honker.dm" #include "code\modules\vehicles\mecha\combat\marauder.dm" @@ -3801,7 +3809,6 @@ #include "interface\skin.dmf" #include "modular_citadel\code\datums\components\souldeath.dm" #include "modular_citadel\code\datums\status_effects\chems.dm" -#include "modular_citadel\code\game\objects\cit_screenshake.dm" #include "modular_citadel\code\game\objects\effects\temporary_visuals\souldeath.dm" #include "modular_citadel\code\modules\admin\holder2.dm" #include "modular_citadel\code\modules\admin\secrets.dm" @@ -4224,6 +4231,7 @@ #include "modular_splurt\code\controllers\configuration\entries\splurt_server.dm" #include "modular_splurt\code\controllers\subsystem\discord.dm" #include "modular_splurt\code\controllers\subsystem\redbot.dm" +#include "modular_splurt\code\controllers\subsystem\ticker.dm" #include "modular_splurt\code\datums\ai_laws.dm" #include "modular_splurt\code\datums\dna.dm" #include "modular_splurt\code\datums\mind.dm" @@ -4231,6 +4239,8 @@ #include "modular_splurt\code\datums\status_effects.dm" #include "modular_splurt\code\datums\world_topic.dm" #include "modular_splurt\code\datums\components\chasm.dm" +#include "modular_splurt\code\datums\components\nanites.dm" +#include "modular_splurt\code\datums\components\size_normalized.dm" #include "modular_splurt\code\datums\components\crafting\recipes\recipes_misc.dm" #include "modular_splurt\code\datums\components\crafting\recipes\recipes_primal.dm" #include "modular_splurt\code\datums\components\crafting\recipes\recipes_robot.dm" @@ -4238,14 +4248,18 @@ #include "modular_splurt\code\datums\elements\crawl_under.dm" #include "modular_splurt\code\datums\elements\smalltalk.dm" #include "modular_splurt\code\datums\elements\spooky.dm" +#include "modular_splurt\code\datums\elements\wuv.dm" #include "modular_splurt\code\datums\interactions\cuddling.dm" #include "modular_splurt\code\datums\interactions\lewd\_lewd.dm" #include "modular_splurt\code\datums\interactions\lewd\lewd_datums.dm" #include "modular_splurt\code\datums\interactions\lewd\lewd_interactions.dm" #include "modular_splurt\code\datums\looping_sounds\machinery_sounds.dm" +#include "modular_splurt\code\datums\mood_events\dominant_events.dm" #include "modular_splurt\code\datums\mood_events\drug_events.dm" #include "modular_splurt\code\datums\mood_events\generic_negative_events.dm" #include "modular_splurt\code\datums\mood_events\generic_positive_events.dm" +#include "modular_splurt\code\datums\mood_events\mood_event.dm" +#include "modular_splurt\code\datums\mood_events\needs_events.dm" #include "modular_splurt\code\datums\mutations\telekenisis.dm" #include "modular_splurt\code\datums\ruins\lavaland.dm" #include "modular_splurt\code\datums\ruins\station.dm" @@ -4255,12 +4269,14 @@ #include "modular_splurt\code\datums\traits\neutral.dm" #include "modular_splurt\code\game\atoms.dm" #include "modular_splurt\code\game\data_huds.dm" +#include "modular_splurt\code\game\say.dm" #include "modular_splurt\code\game\area\areas\centcom.dm" #include "modular_splurt\code\game\area\areas\layenia.dm" #include "modular_splurt\code\game\area\areas\maintenance.dm" #include "modular_splurt\code\game\area\areas\shuttles.dm" #include "modular_splurt\code\game\area\areas\station_areas.dm" #include "modular_splurt\code\game\area\areas\ruins\lavaland.dm" +#include "modular_splurt\code\game\area\areas\ruins\space.dm" #include "modular_splurt\code\game\gamemodes\objectives.dm" #include "modular_splurt\code\game\machinery\chem_alert.dm" #include "modular_splurt\code\game\machinery\cryopod.dm" @@ -4321,7 +4337,6 @@ #include "modular_splurt\code\game\object\structures\ghost_role_spawners.dm" #include "modular_splurt\code\game\object\structures\micro_bricks.dm" #include "modular_splurt\code\game\object\structures\pole.dm" -#include "modular_splurt\code\game\object\structures\railings.dm" #include "modular_splurt\code\game\object\structures\signs.dm" #include "modular_splurt\code\game\object\structures\statues.dm" #include "modular_splurt\code\game\object\structures\table_frames.dm" @@ -4477,6 +4492,7 @@ #include "modular_splurt\code\modules\food_and_drinks\food\snacks_pastry.dm" #include "modular_splurt\code\modules\food_and_drinks\recipes\drink_recipes.dm" #include "modular_splurt\code\modules\food_and_drinks\recipes\tablecraft\recipes_burger.dm" +#include "modular_splurt\code\modules\food_and_drinks\recipes\tablecraft\recipes_donut.dm" #include "modular_splurt\code\modules\hydroponics\grown\towercap.dm" #include "modular_splurt\code\modules\jobs\job_types\_job_alt_titles.dm" #include "modular_splurt\code\modules\jobs\job_types\blueshield.dm" @@ -4490,14 +4506,18 @@ #include "modular_splurt\code\modules\jobs\job_types\security_officer.dm" #include "modular_splurt\code\modules\jobs\job_types\service.dm" #include "modular_splurt\code\modules\keybindings\keybind\movement.dm" +#include "modular_splurt\code\modules\language\xenocommon.dm" #include "modular_splurt\code\modules\mapping\mapping_helpers\baseturf.dm" #include "modular_splurt\code\modules\mining\shelters.dm" #include "modular_splurt\code\modules\mining\equipment\kinetic_crusher.dm" #include "modular_splurt\code\modules\mining\equipment\survival_pod.dm" +#include "modular_splurt\code\modules\mob\emote.dm" #include "modular_splurt\code\modules\mob\mob.dm" #include "modular_splurt\code\modules\mob\mob_defines.dm" #include "modular_splurt\code\modules\mob\splurt_emotes.dm" #include "modular_splurt\code\modules\mob\dead\dead.dm" +#include "modular_splurt\code\modules\mob\dead\new_player\login.dm" +#include "modular_splurt\code\modules\mob\dead\new_player\new_player.dm" #include "modular_splurt\code\modules\mob\dead\new_player\sprite_accesories\body_markings.dm" #include "modular_splurt\code\modules\mob\dead\new_player\sprite_accesories\ears.dm" #include "modular_splurt\code\modules\mob\dead\new_player\sprite_accesories\frills.dm" @@ -4529,6 +4549,7 @@ #include "modular_splurt\code\modules\mob\living\silicon\robot\dogborg_equipment.dm" #include "modular_splurt\code\modules\mob\living\silicon\robot\robot.dm" #include "modular_splurt\code\modules\mob\living\silicon\robot\robot_modules.dm" +#include "modular_splurt\code\modules\mob\living\simple_animal\simple_animal.dm" #include "modular_splurt\code\modules\mob\living\simple_animal\bot\medbot.dm" #include "modular_splurt\code\modules\mob\living\simple_animal\friendly\mouse.dm" #include "modular_splurt\code\modules\mob\living\simple_animal\gremlin\gremlin.dm" @@ -4603,6 +4624,7 @@ #include "modular_splurt\code\modules\vending\clothesmate.dm" #include "modular_splurt\code\modules\vending\engineering.dm" #include "modular_splurt\code\modules\vending\kinkmate.dm" +#include "modular_splurt\code\modules\vending\modularpc.dm" #include "modular_splurt\code\modules\vending\security.dm" #include "modular_splurt\code\modules\vending\wardrobes.dm" #include "tools\Redirector\textprocs.dm" diff --git a/tgui/packages/tgui-panel/styles/components/Chat.scss b/tgui/packages/tgui-panel/styles/components/Chat.scss index b439ace8c5..a199963fd0 100644 --- a/tgui/packages/tgui-panel/styles/components/Chat.scss +++ b/tgui/packages/tgui-panel/styles/components/Chat.scss @@ -98,3 +98,24 @@ $color-bg-section: base.$color-bg-section !default; pointer-events: none; } } + +blockquote { + background-color: rgba($text-color, 0.05); + border-left: 0.15em solid; + border-color: $text-color; + padding-left: 0.3em; + padding-right: 0.3em; + margin-bottom: 0.15em; + margin-left: 0.3em; + margin-right: 0em; +} + +hr { + background-color: rgba($text-color, 0.25); + height: 0.15em; + border-style: none; + margin-left: 1em; + margin-right: 2em; + margin-bottom: 0.3em; + margin-top: 0.3em; +} diff --git a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss index 049b7464ee..2d31efcae1 100644 --- a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss @@ -447,6 +447,10 @@ em { font-style: italic; } +blockquote.warning { + border-color: #c51e1e; +} + .alertwarning { color: #FF0000; font-weight: bold; @@ -486,10 +490,18 @@ em { color: #9ab0ff; } +blockquote.info { + border-color: #9ab0ff; +} + .notice { color: #6685f5; } +blockquote.notice { + border-color: #6685f5; +} + .tinynotice { color: #6685f5; font-size: 85%; @@ -545,18 +557,34 @@ em { color: #059223; } +blockquote.green { + border-color: #059223; +} + .red { color: #FF0000; } +blockquote.red { + border-color: #FF0000; +} + .blue { color: #215cff; } +blockquote.blue { + border-color: #215cff; +} + .nicegreen { color: #059223; } +blockquote.nicegreen { + border-color: #059223; +} + /* hornichems */ .userlove { color: #ff42a6; @@ -579,6 +607,10 @@ em { color: #973e3b; } +blockquote.cult { + border-color: #973e3b; +} + .cultitalic { color: #973e3b; font-style: italic; @@ -634,6 +666,10 @@ em { color: #9956d3; } +blockquote.purple { + border-color: #9956d3; +} + .holoparasite { color: #88809c; } @@ -697,6 +733,10 @@ em { color: #BE8700; } +blockquote.brass { + border-color: #BE8700; +} + .heavy_brass { color: #BE8700; font-weight: bold; diff --git a/tgui/packages/tgui-panel/styles/goon/chat-light.scss b/tgui/packages/tgui-panel/styles/goon/chat-light.scss index 54646e7f4a..69db6e9026 100644 --- a/tgui/packages/tgui-panel/styles/goon/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/goon/chat-light.scss @@ -484,6 +484,10 @@ h1.alert, h2.alert { font-style: italic; } +blockquote.warning { + border-color: #ff0000; +} + .alertwarning { color: #FF0000; font-weight: bold; @@ -522,11 +526,18 @@ h1.alert, h2.alert { .info { color: #0000CC; } +blockquote.info { + border-color: #0000CC; +} .notice { color: #000099; } +blockquote.notice { + border-color: #000099; +} + .tinynotice { color: #000099; font-size: 85%; @@ -582,18 +593,33 @@ h1.alert, h2.alert { color: #03ff39; } +blockquote.green { + border-color: #03ff39; +} + .red { color: #FF0000; } +blockquote.red { + border-color: #FF0000; +} .blue { color: #0000FF; } +blockquote.blue { + border-color: #0000FF; +} + .nicegreen { color: #14a833; } +blockquote.nicegreen { + border-color: #14a833; +} + /* hornichems */ .userlove { color: #FF1493; @@ -616,6 +642,10 @@ h1.alert, h2.alert { color: #973e3b; } +blockquote.cult { + border-color: #973e3b; +} + .cultitalic { color: #973e3b; font-style: italic; @@ -671,6 +701,10 @@ h1.alert, h2.alert { color: #5e2d79; } +blockquote.purple { + border-color: #5e2d79; +} + .holoparasite { color: #35333a; } @@ -735,6 +769,10 @@ h1.alert, h2.alert { color: #BE8700; } +blockquote.brass { + border-color: #BE8700; +} + .heavy_brass { color: #BE8700; font-weight: bold; diff --git a/tgui/packages/tgui/interfaces/Colormate.js b/tgui/packages/tgui/interfaces/Colormate.js index f376547102..02810f2943 100644 --- a/tgui/packages/tgui/interfaces/Colormate.js +++ b/tgui/packages/tgui/interfaces/Colormate.js @@ -1,115 +1,120 @@ import { useBackend } from '../backend'; -import { Button, Flex, Icon, NoticeBox, NumberInput, Section, Tabs } from '../components'; +import { Button, Icon, NoticeBox, NumberInput, Section, Table, Tabs, Slider } from '../components'; import { Window } from '../layouts'; export const Colormate = (props, context) => { const { act, data } = useBackend(context); - const { matrixactive, temp } = data; + const { activemode, temp } = data; const item = data.item || []; return ( - {temp ? ( - {temp} - ) : (null)} - {Object.keys(item).length ? ( - <> - -
-
Item:
- -
-
-
Preview:
- -
-
-
+
+ {temp ? ( + {temp} + ) : (null)} + {Object.keys(item).length ? ( + <> + + +
+
Item:
+ +
+
+ +
+
Preview:
+ +
+
+
act('switch_modes', { - mode: "0", + mode: 1, })} > - Regular coloring + Tint coloring (Simple) act('switch_modes', { - mode: "1", + mode: 2, })} > - Matrixed coloring + HSV coloring (Normal) + + act('switch_modes', { + mode: 3, + })} > + Matrix coloring (Advanced) - {matrixactive ? ( - <> -
Coloring: {item.name}
- - - ) : ( - <> -
Coloring: {item.name}
- - - )} -
- - ) : ( -
+
Coloring: {item.name}
+ + +
+ + ) : (
No item inserted.
-
- )} + )} +
); }; -export const ColormateNoMatrix = (props, context) => { +export const ColormateTint = (props, context) => { const { act, data } = useBackend(context); return ( -
- - -
+