diff --git a/code/__DEFINES/__game.dm b/code/__DEFINES/__game.dm index f84b3d316d3c..ee98bcc9385b 100644 --- a/code/__DEFINES/__game.dm +++ b/code/__DEFINES/__game.dm @@ -32,6 +32,7 @@ #define MAP_ICE_COLONY_V3 "Shivas Snowball" //Ice Rework, low pop enabled. #define MAP_RUNTIME "USS Runtime" #define MAP_LV522_CHANCES_CLAIM "LV-522 Chance's Claim" +#define MAP_LV759_HYBRISA_PROSPERA "LV-759 Hybrisa Prospera" // Highpop Only #define MAP_NEW_VARADERO "New Varadero"//ice colony underground but as its own map #define MAP_CHINOOK "Chinook 91 GSO" //admin level diff --git a/code/__DEFINES/conflict.dm b/code/__DEFINES/conflict.dm index 17fd8b32c280..67b6f47a74a4 100644 --- a/code/__DEFINES/conflict.dm +++ b/code/__DEFINES/conflict.dm @@ -242,6 +242,7 @@ //Health of various items #define HEALTH_WALL 3000 #define HEALTH_WALL_REINFORCED 9000 +#define HEALTH_WALL_ULTRA_REINFORCED 12000 #define HEALTH_WALL_XENO 900 #define HEALTH_WALL_XENO_WEAK 100 #define HEALTH_WALL_XENO_THICK 1350 diff --git a/code/__DEFINES/dcs/signals/atom/mob/living/signals_living.dm b/code/__DEFINES/dcs/signals/atom/mob/living/signals_living.dm index cea905dd1011..fd6cc5f22a50 100644 --- a/code/__DEFINES/dcs/signals/atom/mob/living/signals_living.dm +++ b/code/__DEFINES/dcs/signals/atom/mob/living/signals_living.dm @@ -45,3 +45,8 @@ /// from base of /mob/living/apply_status_effect(): (datum/status_effect/new_effect) #define COMSIG_LIVING_APPLY_EFFECT "living_apply_effect" + +/// from /datum/component/shimmy_around/proc/on_mob_move to determine if layer should be reset +#define COMSIG_LIVING_SHIMMY_LAYER "structure_shimmy_layer" + /// Sent when a shimmy component is currently overriding the layer + #define COMSIG_LIVING_SHIMMY_LAYER_CANCEL (1<<0) diff --git a/code/__DEFINES/dcs/signals/atom/signals_obj.dm b/code/__DEFINES/dcs/signals/atom/signals_obj.dm index 35aa07a63563..d2f5992b0f36 100644 --- a/code/__DEFINES/dcs/signals/atom/signals_obj.dm +++ b/code/__DEFINES/dcs/signals/atom/signals_obj.dm @@ -31,6 +31,9 @@ #define COMSIG_STRUCTURE_WRENCHED "structure_wrenched" #define COMSIG_STRUCTURE_UNWRENCHED "structure_unwrenched" +/// from /obj/structure/Collided() if not overriden for /datum/component/shimmy_around +#define COMSIG_STRUCTURE_COLLIDED "structure_collided" + #define COMSIG_TENT_COLLAPSING "tent_collapsing" /// from /obj/proc/afterbuckle() diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm index ab27821bf3e0..870426ea12fa 100644 --- a/code/__DEFINES/job.dm +++ b/code/__DEFINES/job.dm @@ -249,6 +249,18 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST) #define CMB_GRUNT_LIST list(JOB_CMB, JOB_CMB_TL) +//-------- NSPA --------// +#define JOB_NSPA_CST "NSPA Constable" +#define JOB_NSPA_SC "NSPA Senior Constable" +#define JOB_NSPA_SGT "NSPA Sergeant" +#define JOB_NSPA_INSP "NSPA Inspector" +#define JOB_NSPA_CINSP "NSPA Chief Inspector" +#define JOB_NSPA_CMD "NSPA Commander" +#define JOB_NSPA_DCO "NSPA Deputy Commissioner" +#define JOB_NSPA_COM "NSPA Commissioner" + +#define NSPA_GRUNT_LIST list(JOB_NSPA_CST, JOB_NSPA_SC, JOB_NSPA_SGT) + //-------- FORECON --------// #define JOB_FORECON_CO "Reconnaissance Commander" @@ -378,6 +390,12 @@ GLOBAL_LIST_INIT(job_command_roles, JOB_COMMAND_ROLES_LIST) #define JOB_PLAYTIME_TIER_2 (25 HOURS) #define JOB_PLAYTIME_TIER_3 (70 HOURS) #define JOB_PLAYTIME_TIER_4 (175 HOURS) +#define JOB_PLAYTIME_TIER_5 (350 HOURS) +#define JOB_PLAYTIME_TIER_6 (600 HOURS) +#define JOB_PLAYTIME_TIER_7 (1000 HOURS) +#define JOB_PLAYTIME_TIER_8 (1500 HOURS) +#define JOB_PLAYTIME_TIER_9 (2100 HOURS) +#define JOB_PLAYTIME_TIER_10 (2800 HOURS) #define XENO_NO_AGE -1 #define XENO_YOUNG 0 diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index ee958d87f580..a508010deb81 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -130,6 +130,8 @@ #define ABOVE_XENO_LAYER 4.12 /// For facehuggers #define FACEHUGGER_LAYER 4.13 +/// For Signs above everything but below weather +#define BILLBOARD_LAYER 4.13 /// For WEATHER #define WEATHER_LAYER 4.14 diff --git a/code/__DEFINES/minimap.dm b/code/__DEFINES/minimap.dm index b1e775bb8e49..2e8b248313b7 100644 --- a/code/__DEFINES/minimap.dm +++ b/code/__DEFINES/minimap.dm @@ -79,3 +79,16 @@ GLOBAL_LIST_INIT(all_minimap_flags, bitfield2list(MINIMAP_FLAG_ALL)) #define TACMAP_BASE_OCCLUDED "Occluded" #define TACMAP_BASE_OPEN "Open" + +// Hybrisa +#define MINIMAP_AREA_COLONY_STREETS "#4e6d67ae" +#define MINIMAP_AREA_COLONY_SPACE_PORT "#a54b01ee" +#define MINIMAP_AREA_COLONY_HOSPITAL "#029982e7" +#define MINIMAP_AREA_COLONY_ENGINEERING "#888404e7" +#define MINIMAP_AREA_COLONY_MARSHALLS "#880404e7" +#define MINIMAP_AREA_COLONY_RESANDCOM "#91bdcfe7" +#define MINIMAP_AREA_HYBRISACAVES "#390192ee" +#define MINIMAP_AREA_HYBRISARESEARCH "#856600ee" +#define MINIMAP_AREA_DERELICT "#920190ee" +#define MINIMAP_AREA_OOB "#3a3a3a" +#define MINIMAP_AREA_COMMS "#00b3ffe7" diff --git a/code/__DEFINES/mob_hud.dm b/code/__DEFINES/mob_hud.dm index a39160cc2247..d735e432c147 100644 --- a/code/__DEFINES/mob_hud.dm +++ b/code/__DEFINES/mob_hud.dm @@ -49,6 +49,7 @@ #define MOB_HUD_HUNTER_CLAN 17 #define MOB_HUD_EXECUTE 18 #define MOB_HUD_NEW_PLAYER 19 +#define MOB_HUD_FACTION_NSPA 20 //for SL/FTL/LZ targeting on locator huds #define TRACKER_SL "track_sl" diff --git a/code/__DEFINES/mode.dm b/code/__DEFINES/mode.dm index 2f54513c4e23..74aacf9ebf40 100644 --- a/code/__DEFINES/mode.dm +++ b/code/__DEFINES/mode.dm @@ -267,6 +267,7 @@ DEFINE_BITFIELD(whitelist_status, list( #define FACTION_PMC "PMC" #define FACTION_CONTRACTOR "VAI" #define FACTION_MARSHAL "Colonial Marshal" +#define FACTION_NSPA "NSPA" #define FACTION_WY_DEATHSQUAD "WY Death Squad" #define FACTION_MERCENARY "Mercenary" #define FACTION_FREELANCER "Freelancer" @@ -299,6 +300,7 @@ DEFINE_BITFIELD(whitelist_status, list( #define FACTION_LIST_MARINE_UPP list(FACTION_MARINE, FACTION_UPP) #define FACTION_LIST_MARINE_TWE list(FACTION_MARINE, FACTION_TWE) #define FACTION_LIST_YAUTJA list(FACTION_YAUTJA) +#define FACTION_LIST_NSPA list(FACTION_NSPA, FACTION_TWE) // Xenomorphs #define FACTION_PREDALIEN "Predalien" diff --git a/code/__DEFINES/paygrade_defs/civilian.dm b/code/__DEFINES/paygrade_defs/civilian.dm index ed25a3f50af5..c0a803733df8 100644 --- a/code/__DEFINES/paygrade_defs/civilian.dm +++ b/code/__DEFINES/paygrade_defs/civilian.dm @@ -7,6 +7,9 @@ /// CNUR, Nurse #define PAY_SHORT_CNUR "CNUR" +///CPARA, Paramedic +#define PAY_SHORT_CPARA "CPARA" + /// CDOC, Doctor #define PAY_SHORT_CDOC "CDOC" diff --git a/code/__DEFINES/paygrade_defs/nspa.dm b/code/__DEFINES/paygrade_defs/nspa.dm new file mode 100644 index 000000000000..d15e17f2a62f --- /dev/null +++ b/code/__DEFINES/paygrade_defs/nspa.dm @@ -0,0 +1,27 @@ +// Paygrade shorthand defines, to allow clearer designation. + +// NSPA - (Neroid Sector Policing Authority) - TWE style Police, like the CMB but for heavy TWE focused colonies. + +/// CST, Constable +#define PAY_SHORT_CST "CST" + +/// SC, Senior Constable +#define PAY_SHORT_SC "SC" + +/// SGT, Sergeant +#define PAY_SHORT_SGT "SGT" + +/// INSP, Inspector +#define PAY_SHORT_INSP "INSP" + +/// CINSP, Chief Inspector +#define PAY_SHORT_CINSP "CINSP" + +/// CMD, Commander +#define PAY_SHORT_CMD "CMD" + +/// DCO, Deputy Commissioner +#define PAY_SHORT_DCO "DCO" + +/// COM, Commissioner +#define PAY_SHORT_COM "COM" diff --git a/code/__DEFINES/paygrade_defs/weyland.dm b/code/__DEFINES/paygrade_defs/weyland.dm index dd65caa6db00..7ffcfb7b90ad 100644 --- a/code/__DEFINES/paygrade_defs/weyland.dm +++ b/code/__DEFINES/paygrade_defs/weyland.dm @@ -7,6 +7,9 @@ /// WYC2, Junior Executive #define PAY_SHORT_WYC2 "WYC2" +/// WYC2, Pilot - Captain +#define PAY_SHORT_WYPO2 "WYPO2" + /// WYC3, Executive #define PAY_SHORT_WYC3 "WYC3" diff --git a/code/__DEFINES/sounds.dm b/code/__DEFINES/sounds.dm index 35f388f351ea..aac1ffc9585b 100644 --- a/code/__DEFINES/sounds.dm +++ b/code/__DEFINES/sounds.dm @@ -112,3 +112,22 @@ #define SCAPE_PL_ENG list('sound/soundscape/engamb1.ogg', 'sound/soundscape/engamb2.ogg', 'sound/soundscape/engamb3.ogg', 'sound/soundscape/engamb4.ogg', 'sound/soundscape/engamb5.ogg', 'sound/soundscape/engamb6.ogg', 'sound/soundscape/engamb7.ogg', ) #define SCAPE_PL_HANGAR list('sound/soundscape/hangaramb1.ogg', 'sound/soundscape/hangaramb2.ogg', 'sound/soundscape/hangaramb3.ogg', 'sound/soundscape/hangaramb4.ogg', 'sound/soundscape/hangaramb5.ogg', 'sound/soundscape/hangaramb6.ogg', 'sound/soundscape/hangaramb7.ogg', 'sound/soundscape/hangaramb8.ogg', 'sound/soundscape/hangaramb9.ogg', 'sound/soundscape/hangaramb10.ogg', ) #define SCAPE_PL_ARES list('sound/soundscape/mother.ogg') + +// Hybrisa Soundscapes + +#define AMBIENCE_CITY 'sound/ambience/city_on_fire.ogg' +#define AMBIENCE_DERELICT 'sound/ambience/derelict_ambience.ogg' +#define AMBIENCE_LAB 'sound/ambience/lab_ambience.ogg' +#define AMBIENCE_LAB_2 'sound/ambience/lab_ambience_2.ogg' +#define AMBIENCE_LAB_HALLWAY 'sound/ambience/lab_ambience_hallway.ogg' +#define AMBIENCE_WEYMART 'sound/ambience/weymart.ogg' +#define AMBIENCE_HYBRISA_INTERIOR 'sound/ambience/hybrisa_interior.ogg' +#define AMBIENCE_HYBRISA_CAVES 'sound/ambience/caves_ambience.ogg' +#define AMBIENCE_HYBRISA_CAVES_ALARM 'sound/ambience/caves_ambience_alarm.ogg' + +#define SCAPE_PL_LV759_OUTDOORS list('sound/soundscape/lv759/outdoors/wind4.ogg','sound/soundscape/lv759/outdoors/wind5.ogg','sound/soundscape/lv759/outdoors/wind6.ogg','sound/soundscape/lv759/outdoors/wind7.ogg','sound/soundscape/lv759/outdoors/wind8.ogg','sound/soundscape/lv759/outdoors/wind9.ogg','sound/soundscape/lv759/outdoors/wind10.ogg','sound/soundscape/lv759/outdoors/wind11.ogg','sound/soundscape/lv759/outdoors/wind12.ogg','sound/soundscape/lv759/outdoors/wind13.ogg','sound/soundscape/lv759/outdoors/wind14.ogg','sound/soundscape/lv759/outdoors/wind15.ogg','sound/soundscape/lv759/outdoors/wind16.ogg','sound/soundscape/lv759/outdoors/wind17.ogg','sound/soundscape/lv759/outdoors/wind18.ogg','sound/soundscape/lv759/outdoors/wind19.ogg','sound/soundscape/lv759/outdoors/wind20.ogg','sound/soundscape/lv759/outdoors/wind21.ogg','sound/soundscape/lv759/outdoors/wind22.ogg','sound/soundscape/lv759/outdoors/wind23.ogg','sound/soundscape/lv759/outdoors/wind24.ogg','sound/soundscape/lv759/outdoors/wind25.ogg','sound/soundscape/lv759/outdoors/wind26.ogg','sound/soundscape/lv759/outdoors/wind27.ogg','sound/soundscape/lv759/outdoors/wind28.ogg',) +#define SCAPE_PL_LV759_INDOORS list('sound/soundscape/lv522/indoors/indoor_wind.ogg','sound/soundscape/lv522/indoors/indoor_wind2.ogg','sound/soundscape/lv759/indoors/vent_1.ogg','sound/soundscape/lv759/indoors/vent_2.ogg','sound/soundscape/lv759/indoors/vent_3.ogg','sound/soundscape/lv759/indoors/vent_4.ogg','sound/soundscape/lv759/indoors/vent_5.ogg','sound/soundscape/lv759/indoors/vent_6.ogg','sound/soundscape/lv759/indoors/vent_7.ogg','sound/soundscape/lv759/indoors/vent_6.ogg','sound/soundscape/lv759/indoors/distant_sounds_1.ogg','sound/soundscape/lv759/indoors/distant_sounds_2.ogg','sound/soundscape/lv759/indoors/distant_sounds_3.ogg','sound/soundscape/lv759/indoors/distant_sounds_4.ogg','sound/soundscape/lv759/indoors/distant_sounds_5.ogg','sound/soundscape/lv759/indoors/distant_sounds_6.ogg','sound/soundscape/lv759/indoors/distant_sounds_7.ogg','sound/soundscape/lv759/indoors/distant_sounds_8.ogg','sound/soundscape/lv759/indoors/distant_sounds_9.ogg','sound/soundscape/lv759/indoors/distant_sounds_10.ogg','sound/soundscape/engamb1.ogg','sound/soundscape/engamb2.ogg','sound/soundscape/engamb3.ogg','sound/soundscape/engamb4.ogg','sound/soundscape/engamb5.ogg','sound/soundscape/engamb6.ogg','sound/soundscape/engamb7.ogg',) +#define SCAPE_PL_LV759_DERELICTSHIP list('sound/soundscape/lv759/indoors/derelict1.ogg','sound/soundscape/lv759/indoors/derelict2.ogg','sound/soundscape/lv759/indoors/derelict3.ogg','sound/soundscape/lv759/indoors/derelict4.ogg','sound/soundscape/lv759/indoors/derelict5.ogg','sound/soundscape/lv759/indoors/derelict6.ogg','sound/soundscape/lv759/indoors/derelict7.ogg','sound/soundscape/lv759/indoors/derelict8.ogg') +#define SCAPE_PL_LV759_DEEPCAVES list('sound/soundscape/lv759/outdoors/deepcave1.ogg','sound/soundscape/lv759/outdoors/deepcave2.ogg') +#define SCAPE_PL_LV759_CAVES list('sound/soundscape/lv759/outdoors/windy_caverns_1.ogg','sound/soundscape/lv759/outdoors/windy_caverns_2.ogg','sound/soundscape/lv759/outdoors/windy_caverns_3.ogg',) +#define SCAPE_PL_LV759_PLATEAU_OUTDOORS list('sound/soundscape/lv759/outdoors/derelict_plateau_1.ogg','sound/soundscape/lv759/outdoors/derelict_plateau_2.ogg',) diff --git a/code/__DEFINES/weather.dm b/code/__DEFINES/weather.dm index c67575f80720..f5dcc894d9c6 100644 --- a/code/__DEFINES/weather.dm +++ b/code/__DEFINES/weather.dm @@ -6,6 +6,7 @@ #define PROB_WEATHER_BIG_RED 30 #define PROB_WEATHER_LV624 30 #define PROB_WEATHER_NEW_VARADERO 100 +#define PROB_WEATHER_LV759 100 #define WEATHER_TYPE_NO_WEATHER 0 #define WEATHER_TYPE_SNOW 1 diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 32ea0f5ec32e..97935dbb0a6e 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -41,12 +41,19 @@ return list[index] return -//Checks for specific types in a list -/proc/is_type_in_list(atom/A, list/L) - for(var/type in L) - if(istype(A, type)) - return 1 - return 0 +///Checks if the needle atom is any type in the type_list +/proc/is_type_in_list(atom/needle, list/type_list) + for(var/type in type_list) + if(istype(needle, type)) + return TRUE + return FALSE + +///Checks if the needle path derives from any in the path_list +/proc/is_path_in_list(needle, list/path_list) + for(var/path in path_list) + if(ispath(needle, path)) + return TRUE + return FALSE //Removes any null entries from the list /proc/listclearnulls(list/list) diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 505b1876e3af..06b865ae73a3 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -8,11 +8,14 @@ if (!screen || screen.type != type) // needs to be recreated clear_fullscreen(category, FALSE) - fullscreens[category] = screen = new type() + fullscreens[category] = screen = type ? new type() : null else if ((!severity || severity == screen.severity) && (!client || screen.screen_loc != "CENTER-7,CENTER-7" || screen.fs_view == client.view)) // doesn't need to be updated return screen + if(!screen) + return + screen.icon_state = "[initial(screen.icon_state)][severity]" screen.severity = severity if (client && screen.should_show_to(src)) @@ -55,7 +58,7 @@ var/atom/movable/screen/fullscreen/screen for(var/category in fullscreens) screen = fullscreens[category] - if(screen.should_show_to(src)) + if(screen?.should_show_to(src)) screen.update_for_view(client.view) client.add_to_screen(screen) else diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm index a3fdfe509a96..6a022c052907 100644 --- a/code/controllers/subsystem/weather.dm +++ b/code/controllers/subsystem/weather.dm @@ -202,3 +202,6 @@ SUBSYSTEM_DEF(weather) /obj/effect/weather_vfx_holder/rain icon_state = "strata_storm" alpha = 50 +/obj/effect/weather_vfx_holder/hybrisa_rain + icon_state = "hybrisa_rain" + alpha = 50 diff --git a/code/datums/_atmos_setup.dm b/code/datums/_atmos_setup.dm index 3075e98ac464..b4120b1725ce 100644 --- a/code/datums/_atmos_setup.dm +++ b/code/datums/_atmos_setup.dm @@ -13,8 +13,9 @@ #define PIPE_COLOR_GREEN "#00ff00" #define PIPE_COLOR_YELLOW "#ffcc00" #define PIPE_COLOR_PURPLE "#5c1ec0" +#define PIPE_COLOR_DARKGREY "#a6aeab" -GLOBAL_LIST_INIT(pipe_colors, list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_RED, "blue" = PIPE_COLOR_BLUE, "cyan" = PIPE_COLOR_CYAN, "green" = PIPE_COLOR_GREEN, "yellow" = PIPE_COLOR_YELLOW, "purple" = PIPE_COLOR_PURPLE)) +GLOBAL_LIST_INIT(pipe_colors, list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_RED, "blue" = PIPE_COLOR_BLUE, "cyan" = PIPE_COLOR_CYAN, "green" = PIPE_COLOR_GREEN, "yellow" = PIPE_COLOR_YELLOW, "purple" = PIPE_COLOR_PURPLE, "darkgrey" = PIPE_COLOR_DARKGREY)) /proc/pipe_color_lookup(color) for(var/C in GLOB.pipe_colors) diff --git a/code/datums/ammo/bullet/smg.dm b/code/datums/ammo/bullet/smg.dm index 0e8983a33a87..e4618acff22d 100644 --- a/code/datums/ammo/bullet/smg.dm +++ b/code/datums/ammo/bullet/smg.dm @@ -145,3 +145,23 @@ penetration = ARMOR_PENETRATION_TIER_4 damage_falloff = DAMAGE_FALLOFF_TIER_6 scatter = SCATTER_AMOUNT_TIER_6 + +/datum/ammo/bullet/smg/p90 + name = "submachinegun bullet" + + damage = 22 + accurate_range = 5 + effective_range_max = 8 + penetration = ARMOR_PENETRATION_TIER_2 + damage_falloff = DAMAGE_FALLOFF_TIER_6 + scatter = SCATTER_AMOUNT_TIER_6 + +/datum/ammo/bullet/smg/p90/twe_ap + name = "armor-piercing submachinegun bullet" + + damage = 26 + accurate_range = 5 + effective_range_max = 8 + penetration = ARMOR_PENETRATION_TIER_4 + damage_falloff = DAMAGE_FALLOFF_TIER_6 + scatter = SCATTER_AMOUNT_TIER_6 diff --git a/code/datums/components/shimmy_around.dm b/code/datums/components/shimmy_around.dm new file mode 100644 index 000000000000..7532463b9c20 --- /dev/null +++ b/code/datums/components/shimmy_around.dm @@ -0,0 +1,306 @@ +/// The maximum duration we allow the animations to tween +#define MAX_ANIMATE_TIME (3.55 DECISECONDS) + +/** + * A component to act on the signal COMSIG_STRUCTURE_COLLIDED to shimmy around a dense structure + * NOTE: If any part of the Collided proc chain is overriden from obj/structure you must ensure the signal is sent + */ +/datum/component/shimmy_around + /// The structure that we are bound to + var/obj/structure/parent_structure + /// Approachable directions bitfield + var/approach_dirs = NORTH|SOUTH|EAST|WEST + /// Approach directions bitfield that override the mob's layer to be above our structure's + var/approach_dirs_layer_override = NORTH|SOUTH|EAST|WEST + /// The pixel_x offset when approaching and facing NORTH + var/north_offset = 12 + /// The pixel_x offset when approaching and facing SOUTH + var/south_offset = -12 + /// The pixel_y offset when approaching and facing EAST + var/east_offset = -5 + /// The pixel_y offset when approaching and facing WEST + var/west_offset = -5 + /// Whether to adjust the offset using the structure's offset as well + var/additional_offset = TRUE + /// Extra time added to next_move to shimmy around + var/extra_delay = 1 DECISECONDS + +/datum/component/shimmy_around/Initialize(\ + approach_dirs = NORTH|SOUTH|EAST|WEST,\ + approach_dirs_layer_override = NORTH|SOUTH|EAST|WEST,\ + north_offset = 12,\ + south_offset = -12,\ + east_offset = -5,\ + west_offset = -5,\ + additional_offset = TRUE,\ + extra_delay = 1 DECISECONDS) + + parent_structure = parent + if(!istype(parent_structure)) + return COMPONENT_INCOMPATIBLE + + src.approach_dirs = approach_dirs + src.approach_dirs_layer_override = approach_dirs_layer_override + src.north_offset = north_offset + src.south_offset = south_offset + src.east_offset = east_offset + src.west_offset = west_offset + src.additional_offset = additional_offset + src.extra_delay = extra_delay + +/datum/component/shimmy_around/Destroy(force, silent) + . = ..() + parent_structure = null + +/datum/component/shimmy_around/RegisterWithParent() + RegisterSignal(parent_structure, COMSIG_STRUCTURE_COLLIDED, PROC_REF(on_collide)) + +/datum/component/shimmy_around/UnregisterFromParent() + if(parent_structure) + UnregisterSignal(parent_structure, COMSIG_STRUCTURE_COLLIDED) + +/// Determines whether the user can move to some turf relative to us +/datum/component/shimmy_around/proc/can_move(mob/living/user, direction) + // Check turf + atoms with our parent_structure + var/turf/parent_turf = get_turf(parent_structure) + if(!can_move_internal(user, parent_turf, direction)) + return FALSE + + // Check turf + atoms on the other side too + if(can_move_internal(user, get_step(parent_structure, direction), direction, ignore_exit = TRUE)) + return TRUE + + // Determine the alternate directions + var/alt_direction = 0 + var/tertiary_direction = 0 + switch(direction) + if(NORTH) + if(north_offset < 0) + alt_direction = WEST + tertiary_direction = EAST + else + alt_direction = EAST + tertiary_direction = WEST + if(SOUTH) + if(south_offset < 0) + alt_direction = WEST + tertiary_direction = EAST + else + alt_direction = EAST + tertiary_direction = WEST + if(EAST) + if(east_offset < 0) + alt_direction = SOUTH + tertiary_direction = NORTH + else + alt_direction = NORTH + tertiary_direction = SOUTH + if(WEST) + if(west_offset < 0) + alt_direction = SOUTH + tertiary_direction = NORTH + else + alt_direction = NORTH + tertiary_direction = SOUTH + + // Try an alternate direction + if(can_move_internal(user, get_step(parent_structure, alt_direction), alt_direction, ignore_exit = TRUE)) + if(can_move_internal(user, parent_turf, alt_direction)) + return TRUE + + // Try a tertiary direction + if(can_move_internal(user, get_step(parent_structure, tertiary_direction), tertiary_direction, ignore_exit = TRUE)) + if(can_move_internal(user, parent_turf, tertiary_direction)) + return TRUE + + return FALSE + +/datum/component/shimmy_around/proc/can_move_internal(mob/living/user, turf/turf, direction, ignore_exit) + if(turf.density) + return FALSE + + for(var/atom/exit_atom in turf) + if(!exit_atom.density) + continue + + if(exit_atom.GetComponent(type)) + continue + + if(istype(exit_atom, /atom/movable)) + var/atom/movable/moveable_exit_atom = exit_atom + // Assume we can move the atom over or something when it's not anchored + if(!moveable_exit_atom.anchored) + continue + + if(exit_atom.BlockedPassDirs(user, direction)) + return FALSE + + if(!ignore_exit && exit_atom.BlockedExitDirs(user, direction)) + return FALSE + + return TRUE + +/// Signal handler for COMSIG_STRUCTURE_COLLIDED to start a shimmy +/datum/component/shimmy_around/proc/on_collide(atom/source, atom/movable/collided_atom) + SIGNAL_HANDLER + + var/mob/living/mob = collided_atom + if(!istype(mob)) + return + + // See if we allow this approach direction + var/direction = get_dir(mob, parent_structure) + if(!(direction & approach_dirs)) + return + + // See if the exit is blocked + if(!can_move(mob, direction)) + return + + // Determine if the layer will need to change + var/desired_layer = round(parent_structure.layer + 0.05, 0.01) // Byond floats are garbage + if(desired_layer == XENO_HIDING_LAYER) + desired_layer += 0.01 + var/layer_changing = mob.plane == parent_structure.plane && (direction & approach_dirs_layer_override) && initial(mob.layer) < desired_layer + if(layer_changing) + RegisterSignal(mob, COMSIG_LIVING_SHIMMY_LAYER, PROC_REF(on_mob_shimmy_layer)) + + // Actually move them (opting to just make this structure not dense so Move can handle pushing & pulling) + var/turf/destination = get_turf(parent_structure) + var/prev_density = parent_structure.density + parent_structure.density = FALSE + mob.Move(destination, direction) + parent_structure.density = prev_density + if(mob.loc != destination) + if(layer_changing) + UnregisterSignal(mob, COMSIG_LIVING_SHIMMY_LAYER) + return // Merely checking the return value for Move is insufficent to detect a mob swap + + // Override their layer if needed + var/animate_time = min(mob.move_delay + extra_delay, MAX_ANIMATE_TIME) + if(layer_changing) + if(mob.layer == XENO_HIDING_LAYER && isxeno(mob)) + var/datum/action/xeno_action/onclick/xenohide/hide = get_action(mob, /datum/action/xeno_action/onclick/xenohide) + if(hide) + hide.post_attack() + if(mob.layer > desired_layer) + // Delayed since our layer already satisfies the requirement and we might be moving off of another shimmy + addtimer(VARSET_CALLBACK(mob, layer, desired_layer), animate_time * 0.5) + else + mob.layer = desired_layer + + // Offset them + switch(direction) + if(NORTH) + var/extra_offset = additional_offset ? parent_structure.pixel_x : 0 + animate(mob, time = animate_time, pixel_x = mob.pixel_x + north_offset + extra_offset) + if(SOUTH) + var/extra_offset = additional_offset ? parent_structure.pixel_x : 0 + animate(mob, time = animate_time, pixel_x = mob.pixel_x + south_offset + extra_offset) + if(EAST) + var/extra_offset = additional_offset ? parent_structure.pixel_y : 0 + animate(mob, time = animate_time, pixel_y = mob.pixel_y + east_offset + extra_offset) + if(WEST) + var/extra_offset = additional_offset ? parent_structure.pixel_y : 0 + animate(mob, time = animate_time, pixel_y = mob.pixel_y + west_offset + extra_offset) + + // Delay them if needed + if(extra_delay && mob.client) + mob.client.move_delay += extra_delay + + // Reset their offset once they move + RegisterSignal(mob, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_mob_pre_move)) + RegisterSignal(mob, COMSIG_MOVABLE_MOVED, PROC_REF(on_mob_move)) + +/// Signal handler for COMSIG_LIVING_SHIMMY_LAYER to prevent layer reset from another shimmy component +/datum/component/shimmy_around/proc/on_mob_shimmy_layer(mob/living/source) + SIGNAL_HANDLER + return COMSIG_LIVING_SHIMMY_LAYER_CANCEL + +/// Signal handler for COMSIG_MOVABLE_PRE_MOVE to prevent movement into us +/datum/component/shimmy_around/proc/on_mob_pre_move(atom/movable/source, new_loc) + SIGNAL_HANDLER + + var/mob/living/mob = source + var/animate_time = min(mob.move_delay + extra_delay, MAX_ANIMATE_TIME) + var/new_direction = get_dir(mob, new_loc) + var/offset_x = mob.pixel_x - initial(mob.pixel_x) + var/offset_y = mob.pixel_y - initial(mob.pixel_y) + if(additional_offset) + // compensate for any additional adjustment we made + if(offset_x) + offset_x -= parent_structure.pixel_x + else if(offset_y) + offset_y -= parent_structure.pixel_y + + // Block movement into parent, but swing around instead + if(offset_x) + if(offset_x > 0) + if(new_direction & WEST) + var/extra_offset = additional_offset ? parent_structure.pixel_y : 0 + animate(mob, time = animate_time, pixel_x = initial(mob.pixel_x), pixel_y = mob.pixel_y + west_offset + extra_offset) + . = COMPONENT_CANCEL_MOVE + else + if(new_direction & EAST) + var/extra_offset = additional_offset ? parent_structure.pixel_y : 0 + animate(mob, time = animate_time, pixel_x = initial(mob.pixel_x), pixel_y = mob.pixel_y + east_offset + extra_offset) + . = COMPONENT_CANCEL_MOVE + else if(offset_y) + if(offset_y > 0) + if(new_direction & SOUTH) + var/extra_offset = additional_offset ? parent_structure.pixel_x : 0 + animate(mob, time = animate_time, pixel_y = initial(mob.pixel_y), pixel_x = mob.pixel_x + south_offset + extra_offset) + . = COMPONENT_CANCEL_MOVE + else + if(new_direction & NORTH) + var/extra_offset = additional_offset ? parent_structure.pixel_x : 0 + animate(mob, time = animate_time, pixel_y = initial(mob.pixel_y), pixel_x = mob.pixel_x + north_offset + extra_offset) + . = COMPONENT_CANCEL_MOVE + + // If we are swinging them around, so set dir, delay, and layer as needed + if(. == COMPONENT_CANCEL_MOVE) + source.dir = new_direction + if(extra_delay && mob.client) + mob.client.move_delay += extra_delay + var/desired_layer = round(parent_structure.layer + 0.05, 0.01) // Byond floats are garbage + if(desired_layer == XENO_HIDING_LAYER) + desired_layer += 0.01 + var/layer_changing = mob.plane == parent_structure.plane && (new_direction & approach_dirs_layer_override) && initial(mob.layer) < desired_layer + if(layer_changing) + RegisterSignal(mob, COMSIG_LIVING_SHIMMY_LAYER, PROC_REF(on_mob_shimmy_layer), override = TRUE) // Override because we're just ensuring its set if not already set + if(mob.layer == XENO_HIDING_LAYER && isxeno(mob)) + var/datum/action/xeno_action/onclick/xenohide/hide = get_action(mob, /datum/action/xeno_action/onclick/xenohide) + if(hide) + hide.post_attack() + mob.layer = desired_layer + else + UnregisterSignal(mob, COMSIG_LIVING_SHIMMY_LAYER) + if(mob.layer != XENO_HIDING_LAYER || !isxeno(mob)) + mob.layer = initial(mob.layer) + + return . + +/// Signal handler for COMSIG_MOVABLE_MOVED to reset their pixel offsets +/datum/component/shimmy_around/proc/on_mob_move(atom/movable/source, atom/old_loc, dir, forced) + SIGNAL_HANDLER + + var/mob/living/mob = source + UnregisterSignal(source, list(COMSIG_MOVABLE_PRE_MOVE, COMSIG_MOVABLE_MOVED, COMSIG_LIVING_SHIMMY_LAYER)) + + // Undo changes + var/animate_time = min(mob.move_delay + extra_delay, MAX_ANIMATE_TIME) + animate(mob, time = animate_time, pixel_x = initial(mob.pixel_x), pixel_y = initial(mob.pixel_y)) + + // Undo layer change only if we aren't shimmying again + if(!(SEND_SIGNAL(mob, COMSIG_LIVING_SHIMMY_LAYER) & COMSIG_LIVING_SHIMMY_LAYER_CANCEL)) + if(mob.layer != XENO_HIDING_LAYER || !isxeno(mob)) + if(dir & NORTH) + mob.layer = initial(mob.layer) + else + addtimer(VARSET_CALLBACK(mob, layer, initial(mob.layer)), animate_time * 0.5) + + // Delay them if needed + if(extra_delay && mob.client) + mob.client.move_delay += extra_delay + +#undef MAX_ANIMATE_TIME diff --git a/code/datums/factions/nspa.dm b/code/datums/factions/nspa.dm new file mode 100644 index 000000000000..776cd5c3bc91 --- /dev/null +++ b/code/datums/factions/nspa.dm @@ -0,0 +1,31 @@ +/datum/faction/nspa + name = "Neroid Sector Policing Authority" + faction_tag = FACTION_NSPA + +/datum/faction/nspa/modify_hud_holder(image/holder, mob/living/carbon/human/human) + var/hud_icon_state + var/obj/item/card/id/ID = human.get_idcard() + var/_role + if(human.mind) + _role = human.job + else if(ID) + _role = ID.rank + switch(_role) + if(JOB_NSPA_CST) + hud_icon_state = "con" + if(JOB_NSPA_SC) + hud_icon_state = "con" + if(JOB_NSPA_SGT) + hud_icon_state = "con" + if(JOB_NSPA_INSP) + hud_icon_state = "sgt" + if(JOB_NSPA_CINSP) + hud_icon_state = "sgt" + if(JOB_NSPA_CMD) + hud_icon_state = "sgt" + if(JOB_NSPA_DCO) + hud_icon_state = "sgt" + if(JOB_NSPA_COM) + hud_icon_state = "sgt" + if(hud_icon_state) + holder.overlays += image('icons/mob/hud/marine_hud.dmi', human, "nspa_[hud_icon_state]") diff --git a/code/datums/mob_hud.dm b/code/datums/mob_hud.dm index 64ad6e31280a..001f3a7ae9b8 100644 --- a/code/datums/mob_hud.dm +++ b/code/datums/mob_hud.dm @@ -21,6 +21,7 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list( MOB_HUD_HUNTER_CLAN = new /datum/mob_hud/hunter_clan(), MOB_HUD_EXECUTE = new /datum/mob_hud/execute_hud(), MOB_HUD_NEW_PLAYER = new /datum/mob_hud/new_player(), + MOB_HUD_FACTION_NSPA = new /datum/mob_hud/faction/nspa() )) /datum/mob_hud @@ -216,6 +217,9 @@ GLOBAL_LIST_INIT_TYPED(huds, /datum/mob_hud, list( /datum/mob_hud/faction/pmc faction_to_check = FACTION_PMC +/datum/mob_hud/faction/nspa + faction_to_check = FACTION_NSPA + /datum/mob_hud/faction/observer hud_icons = list(FACTION_HUD, ORDER_HUD, HUNTER_CLAN, HOLOCARD_HUD) diff --git a/code/datums/paygrades/factions/other/civilian.dm b/code/datums/paygrades/factions/other/civilian.dm index 95213542f33b..e8bcaa2483e6 100644 --- a/code/datums/paygrades/factions/other/civilian.dm +++ b/code/datums/paygrades/factions/other/civilian.dm @@ -12,6 +12,12 @@ name = "Nurse" prefix = "Nrs." +/datum/paygrade/civilian/paramedic + paygrade = PAY_SHORT_CPARA + name = "Paramedic" + prefix = "EMT-P" + pay_multiplier = 0.6 + /datum/paygrade/civilian/doctor paygrade = PAY_SHORT_CDOC name = "Doctor" diff --git a/code/datums/paygrades/factions/twe/nspa.dm b/code/datums/paygrades/factions/twe/nspa.dm new file mode 100644 index 000000000000..312487285a63 --- /dev/null +++ b/code/datums/paygrades/factions/twe/nspa.dm @@ -0,0 +1,59 @@ + +// NSPA - (Neroid Sector Policing Authority) - TWE style Police, like the CMB but for heavy TWE focused colonies. + +/datum/paygrade/nspa + name = "NSPA Paygrade" + pay_multiplier = 1.4 // Government work. Nice benefits. + default_faction = FACTION_NSPA + +/datum/paygrade/nspa/constable + paygrade = PAY_SHORT_CST + name = "Constable" + prefix = "Cst." + +/datum/paygrade/nspa/senior_constable + paygrade = PAY_SHORT_SC + name = "Senior Constable" + prefix = "Sr. Cst." + pay_multiplier = 1.6 + +/datum/paygrade/nspa/sergeant + paygrade = PAY_SHORT_SGT + name = "Sergeant" + prefix = "Sgt." + pay_multiplier = 1.7 + +/datum/paygrade/nspa/inspector + paygrade = PAY_SHORT_INSP + name = "Inspector" + prefix = "Insp." + officer_grade = GRADE_OFFICER + pay_multiplier = 1.8 + +/datum/paygrade/nspa/chief_inspector + paygrade = PAY_SHORT_CINSP + name = "Chief Inspector" + prefix = "Ch. Insp." + officer_grade = GRADE_OFFICER + pay_multiplier = 2 + +/datum/paygrade/nspa/commander + paygrade = PAY_SHORT_CMD + name = "Commander" + prefix = "Cmdr." + officer_grade = GRADE_OFFICER + pay_multiplier = 3 + +/datum/paygrade/nspa/deputy_commissioner + paygrade = PAY_SHORT_DCO + name = "Deputy Commissioner" + prefix = "Dep. Com." + officer_grade = GRADE_OFFICER + pay_multiplier = 4 + +/datum/paygrade/nspa/commissioner + paygrade = PAY_SHORT_COM + name = "Commissioner" + prefix = "Com." + officer_grade = GRADE_OFFICER + pay_multiplier = 5 diff --git a/code/datums/paygrades/factions/wy/wy.dm b/code/datums/paygrades/factions/wy/wy.dm index 17b46ff5790e..42c55a37e39e 100644 --- a/code/datums/paygrades/factions/wy/wy.dm +++ b/code/datums/paygrades/factions/wy/wy.dm @@ -16,6 +16,13 @@ ranking = 1 pay_multiplier = 2 +/datum/paygrade/wy_ranks/wycPO + paygrade = PAY_SHORT_WYPO2 + name = "Captain" + prefix = "Capt." + ranking = 1 + pay_multiplier = 2 + /datum/paygrade/wy_ranks/wyc3 paygrade = PAY_SHORT_WYC3 name = "Executive" diff --git a/code/datums/skills/civilian.dm b/code/datums/skills/civilian.dm index ff9cadf02913..883437062cbd 100644 --- a/code/datums/skills/civilian.dm +++ b/code/datums/skills/civilian.dm @@ -216,6 +216,40 @@ CIVILIAN SKILL_VEHICLE = SKILL_VEHICLE_SMALL, ) +/datum/skills/civilian/survivor/wy_pilot + name = "Survivor - Weyland Yutani - Pilot" + additional_skills = list( + SKILL_PILOT = SKILL_PILOT_EXPERT, + SKILL_LEADERSHIP = SKILL_LEAD_TRAINED, + ) + +/datum/skills/civilian/survivor/paramedic + name = "Survivor - Paramedic" + additional_skills = list( + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + SKILL_MEDICAL = SKILL_MEDICAL_DOCTOR, + SKILL_SURGERY = SKILL_SURGERY_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + +/datum/skills/civilian/survivor/fire_fighter + name = "Survivor - Fire Protection Specialist" + additional_skills = list( + SKILL_ENGINEER = SKILL_ENGINEER_TRAINED, + SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, + ) + +/datum/skills/civilian/survivor/pizza_delivery_driver + name = "Survivor - Pizza Galaxy Delivery Driver" + additional_skills = list( + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_TRAINED, + SKILL_ENDURANCE = SKILL_ENDURANCE_SURVIVOR, + SKILL_FIREMAN = SKILL_FIREMAN_TRAINED, + SKILL_VEHICLE = SKILL_VEHICLE_SMALL, + ) + /datum/skills/civilian/survivor/gangleader name = "Survivor Gang Leader" additional_skills = list( diff --git a/code/datums/skills/skills.dm b/code/datums/skills/skills.dm index 5d1a69e174ed..0e8ade89a011 100644 --- a/code/datums/skills/skills.dm +++ b/code/datums/skills/skills.dm @@ -181,13 +181,13 @@ /datum/skills /// The name of the skillset var/name - // The mob that has this skillset + /// The mob that has this skillset var/mob/owner - // List of skill datums. - // Also, if this is populated when the datum is created, it will set the skill levels automagically + /// List of skill datums. + /// Also, if this is populated when the datum is created, it will set the skill levels automagically var/list/skills = list() - // Same as above, but for children of parents that just add a lil something else + /// Same as above, but for children of parents that just add a lil something else var/list/additional_skills = list() /datum/skills/New(mob/skillset_owner) diff --git a/code/datums/supply_packs/black_market.dm b/code/datums/supply_packs/black_market.dm index aeede447e0f9..2ca841c8a62c 100644 --- a/code/datums/supply_packs/black_market.dm +++ b/code/datums/supply_packs/black_market.dm @@ -256,6 +256,19 @@ Additionally, weapons that are way too good to put in the basically-flavor black dollar_cost = 25 containertype = /obj/structure/largecrate/black_market +/datum/supply_packs/contraband/seized/p90 + name = "FN P90 submachinegun crate (x5 magazines included)" + contains = list( + /obj/item/weapon/gun/smg/p90, + /obj/item/ammo_magazine/smg/p90, + /obj/item/ammo_magazine/smg/p90, + /obj/item/ammo_magazine/smg/p90, + /obj/item/ammo_magazine/smg/p90, + /obj/item/ammo_magazine/smg/p90, + ) + dollar_cost = 20 + containertype = /obj/structure/largecrate/black_market + /datum/supply_packs/contraband/seized/mp27 name = "MP-27 submachinegun crate (x5 magazines included)" contains = list( @@ -786,6 +799,12 @@ USCM spare items, miscellaneous gear that's too niche and distant (or restricted contains = list(/obj/item/ammo_box/magazine/fp9000) containertype = /obj/structure/largecrate/black_market +/datum/supply_packs/contraband/ammo/p90 + name = "Magazines box (FN P90, 10x mags)" + dollar_cost = 30 + contains = list(/obj/item/ammo_box/magazine/p90) + containertype = /obj/structure/largecrate/black_market + /datum/supply_packs/contraband/ammo/mp27 name = "Magazines box (MP-27, 12x mags)" dollar_cost = 45 diff --git a/code/datums/vehicles.dm b/code/datums/vehicles.dm index 08c977b63fb6..c524f8e7144b 100644 --- a/code/datums/vehicles.dm +++ b/code/datums/vehicles.dm @@ -34,6 +34,14 @@ name = "Van" interior_id = "van" +/datum/map_template/interior/box_van + name = "Box Van" + interior_id = "box_van" + +/datum/map_template/interior/pizza_van + name = "Pizza-Galaxy Van" + interior_id = "pizza_van" + /datum/map_template/interior/arc name = "ARC" interior_id = "arc" diff --git a/code/datums/weather/weather_events/lv759_hybrisa_prospera.dm b/code/datums/weather/weather_events/lv759_hybrisa_prospera.dm new file mode 100644 index 000000000000..79d76c702e9b --- /dev/null +++ b/code/datums/weather/weather_events/lv759_hybrisa_prospera.dm @@ -0,0 +1,37 @@ +/datum/weather_event/hybrisa_light_rain + name = "Hybrisa Light Rain" + + display_name = "Light Rain" + + length = 15 MINUTES + + lightning_chance = 4 + + fire_smothering_strength = 1 + + turf_overlay_icon_state = "hybrisa_rain" + turf_overlay_alpha = 40 + + effect_message = null + damage_per_tick = 0 + + ambience = 'sound/ambience/rainandthunderlong.ogg' + +/datum/weather_event/hybrisa_very_light_rain + name = "Hybrisa Very Light Rain" + + display_name = "Very Light Rain" + + length = 15 MINUTES + + lightning_chance = 2 + + fire_smothering_strength = 0 + + turf_overlay_icon_state = "hybrisa_rain" + turf_overlay_alpha = 25 + + effect_message = null + damage_per_tick = 0 + + ambience = 'sound/ambience/rainandthunderlong.ogg' diff --git a/code/datums/weather/weather_map_holders/lv759_hybrisa_prospera.dm b/code/datums/weather/weather_map_holders/lv759_hybrisa_prospera.dm new file mode 100644 index 000000000000..e06abe87ed98 --- /dev/null +++ b/code/datums/weather/weather_map_holders/lv759_hybrisa_prospera.dm @@ -0,0 +1,20 @@ +/datum/weather_ss_map_holder/lv759_hybrisa_prospera + name = "LV-759 Map Holder" + + warn_time = 1 MINUTES + min_time_between_events = 12 MINUTES + min_time_between_checks = 0 + min_check_variance = 0 + + no_weather_turf_icon_state = "strata_clearsky" + + potential_weather_events = list( + /datum/weather_event/hybrisa_light_rain, + /datum/weather_event/hybrisa_very_light_rain, + ) + +/datum/weather_ss_map_holder/lv759_hybrisa_prospera/should_affect_area(area/A) + return !CEILING_IS_PROTECTED(A.ceiling, CEILING_GLASS) + +/datum/weather_ss_map_holder/lv759_hybrisa_prospera/should_start_event() + return prob(PROB_WEATHER_LV759) diff --git a/code/game/area/LV759_Hybrisa_Prospera.dm b/code/game/area/LV759_Hybrisa_Prospera.dm new file mode 100644 index 000000000000..a68218015066 --- /dev/null +++ b/code/game/area/LV759_Hybrisa_Prospera.dm @@ -0,0 +1,1299 @@ +//lv759 AREAS--------------------------------------// + +/area/lv759 + name = "LV-759 Hybrisa Prospera" + icon = 'icons/turf/hybrisareas.dmi' + icon_state = "hybrisa" + can_build_special = TRUE + powernet_name = "ground" + minimap_color = MINIMAP_AREA_COLONY_RESANDCOM + +//parent types + +/area/lv759/indoors + name = "Hybrisa - Indoors" + icon_state = "cliff_blocked"//because this is a PARENT TYPE and you should not be using it and should also be changing the icon!!! + ceiling = CEILING_METAL + soundscape_playlist = SCAPE_PL_LV759_INDOORS + ambience_exterior = AMBIENCE_HYBRISA_INTERIOR + +/area/lv759/outdoors + name = "Hybrisa - Outdoors" + icon_state = "cliff_blocked"//because this is a PARENT TYPE and you should not be using it and should also be changing the icon!!! + ceiling = CEILING_NONE + soundscape_playlist = SCAPE_PL_LV759_OUTDOORS + ambience_exterior = AMBIENCE_CITY + soundscape_interval = 25 + +/area/lv759/oob + name = "Out Of Bounds" + icon_state = "oob" + ceiling = CEILING_MAX + is_resin_allowed = FALSE + flags_area = AREA_NOTUNNEL + minimap_color = MINIMAP_AREA_OOB + +/area/lv759/bunker + name = "Out Of Bounds" + icon_state = "oob" + ceiling = CEILING_MAX + is_resin_allowed = FALSE + flags_area = AREA_NOTUNNEL + minimap_color = MINIMAP_AREA_OOB + +/area/lv759/bunker/gonzo + name = "Gonzo's hide-out" + icon_state = "cliff_blocked" + ceiling = CEILING_MAX + is_resin_allowed = FALSE + flags_area = AREA_NOTUNNEL + minimap_color = MINIMAP_AREA_OOB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + ambience_exterior = AMBIENCE_HYBRISA_INTERIOR + +/area/lv759/bunker/checkpoint + name = "Checkpoint & Hidden Bunker - Entrance" + icon_state = "cliff_blocked" + ceiling = CEILING_MAX + is_resin_allowed = FALSE + flags_area = AREA_NOTUNNEL + minimap_color = MINIMAP_AREA_OOB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + ambience_exterior = AMBIENCE_HYBRISA_INTERIOR + +// Landing Zone 1 + +/area/lv759/outdoors/landing_zone_1 + name = "Nova Medica Hospital Complex - Emergency Response - Landing Zone One" + icon_state = "medical_lz1" + is_resin_allowed = FALSE + is_landing_zone = TRUE + minimap_color = MINIMAP_AREA_LZ + ceiling = CEILING_NONE + linked_lz = DROPSHIP_LZ1 + +/area/lv759/indoors/landing_zone_1/flight_control_room + name = "Nova Medica Hospital Complex - Emergency Response - Landing Zone One - Flight Control Room" + icon_state = "hybrisa" + ceiling = CEILING_METAL + is_landing_zone = TRUE + +/area/lv759/indoors/landing_zone_1/lz1_console + name = "Nova Medica Hospital Complex - Emergency Response - Landing Zone One - Dropship Alamo Console" + icon_state = "hybrisa" + requires_power = FALSE + ceiling = CEILING_METAL + is_landing_zone = TRUE + +// Landing Zone 2 + +/area/lv759/outdoors/landing_zone_2 + name = "KMCC Interstellar Freight Hub - Landing Zone Two" + icon_state = "mining_lz2" + is_resin_allowed = FALSE + is_landing_zone = TRUE + minimap_color = MINIMAP_AREA_LZ + ceiling = CEILING_NONE + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/landing_zone_2/kmcc_hub_flight_control_room + name = "KMCC Interstellar Freight Hub - Flight Control Room" + icon_state = "hybrisa" + ceiling = CEILING_METAL + +/area/lv759/indoors/landing_zone_2/kmcc_hub_security + name = "KMCC Interstellar Freight Hub - Security Checkpoint Office" + icon_state = "security_checkpoint" + ceiling = CEILING_METAL + +/area/lv759/indoors/landing_zone_2/kmcc_hub_lounge_north + name = "KMCC Interstellar Freight Hub - Passenger Departures - Lounge North" + icon_state = "hybrisa" + ceiling = CEILING_METAL + +/area/lv759/indoors/landing_zone_2/kmcc_hub_fuel + name = "KMCC Interstellar Freight Hub - Fuel Storage & Maintenance - North" + icon_state = "hybrisa" + ceiling = CEILING_METAL + +/area/lv759/indoors/landing_zone_2/kmcc_hub_lounge_south + name = "KMCC Interstellar Freight Hub - Passenger Departures - Lounge South" + icon_state = "hybrisa" + ceiling = CEILING_METAL + +/area/lv759/indoors/landing_zone_2/kmcc_hub_lounge_hallway + name = "KMCC Interstellar Freight Hub - Passenger Departures - Hallway" + icon_state = "hybrisa" + ceiling = CEILING_METAL + +/area/lv759/indoors/landing_zone_2/kmcc_hub_south_office + name = "KMCC Interstellar Freight Hub - Passenger Departures - South Office" + icon_state = "hybrisa" + ceiling = CEILING_METAL + +/area/lv759/indoors/landing_zone_2/kmcc_hub_maintenance + name = "KMCC Interstellar Freight Hub - Passenger Departures - Maintenance" + icon_state = "hybrisa" + ceiling = CEILING_METAL + +/area/lv759/indoors/landing_zone_2/kmcc_hub/lz2_console + name = "KMCC Interstellar Freight Hub - Dropship Normandy Console" + icon_state = "hybrisa" + requires_power = FALSE + ceiling = CEILING_METAL + +/area/lv759/indoors/landing_zone_2/kmcc_hub_cargo + name = "KMCC Interstellar Freight Hub - Cargo Processing Center" + icon_state = "mining_cargo" + ceiling = CEILING_METAL + minimap_color = MINIMAP_AREA_COLONY_RESANDCOM + +/area/lv759/indoors/landing_zone_2/kmcc_hub_maintenance_north + name = "KMCC Interstellar Freight Hub - Cargo Processing Center - Maintenance" + icon_state = "mining" + ceiling = CEILING_METAL + minimap_color = MINIMAP_AREA_COLONY_RESANDCOM + +/area/lv759/outdoors/landing_zone_2/kmcc_hub_cargo_entrance_south + name = "KMCC Interstellar Freight Hub - Cargo Processing Center - Main Entrance & South Unloading Platform" + icon_state = "mining" + ceiling = CEILING_NONE + minimap_color = MINIMAP_AREA_COLONY + +// Derelict Ship + +/area/lv759/indoors/derelict_ship + name = "Derelict Ship" + icon_state = "derelictship" + ceiling = CEILING_REINFORCED_METAL + flags_area = AREA_NOTUNNEL + ambience_exterior = AMBIENCE_DERELICT + soundscape_playlist = SCAPE_PL_LV759_DERELICTSHIP + ceiling_muffle = FALSE + minimap_color = MINIMAP_AREA_HYBRISACAVES + unoviable_timer = FALSE + +// Caves + +/area/lv759/indoors/caves/wy_research_complex_entrance + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - North Main Entrance" + icon_state = "wylab" + ceiling = CEILING_UNDERGROUND_BLOCK_CAS + ambience_exterior = AMBIENCE_HYBRISA_CAVES_ALARM + soundscape_playlist = SCAPE_PL_LV759_DEEPCAVES + ceiling_muffle = FALSE + minimap_color = MINIMAP_AREA_HYBRISACAVES + +/area/lv759/indoors/caves/west_caves + name = "Caverns - West" + icon_state = "caves_west" + ceiling = CEILING_UNDERGROUND_BLOCK_CAS + ambience_exterior = AMBIENCE_HYBRISA_CAVES + soundscape_playlist = SCAPE_PL_LV759_CAVES + ceiling_muffle = FALSE + minimap_color = MINIMAP_AREA_HYBRISACAVES + +/area/lv759/indoors/caves/west_caves_alarm + name = "Caverns - West" + icon_state = "caves_west" + ceiling = CEILING_UNDERGROUND_BLOCK_CAS + ambience_exterior = AMBIENCE_HYBRISA_CAVES_ALARM + soundscape_playlist = SCAPE_PL_LV759_CAVES + ceiling_muffle = FALSE + minimap_color = MINIMAP_AREA_HYBRISACAVES + +/area/lv759/indoors/caves/east_caves + name = "Caverns - East" + icon_state = "caves_east" + ceiling = CEILING_UNDERGROUND_BLOCK_CAS + ambience_exterior = AMBIENCE_HYBRISA_CAVES + soundscape_playlist = SCAPE_PL_LV759_DEEPCAVES + ceiling_muffle = FALSE + minimap_color = MINIMAP_AREA_HYBRISACAVES + +/area/lv759/indoors/caves/south_caves + name = "Caverns - South" + icon_state = "caves_south" + ceiling = CEILING_UNDERGROUND_BLOCK_CAS + ambience_exterior = AMBIENCE_HYBRISA_CAVES + soundscape_playlist = SCAPE_PL_LV759_DEEPCAVES + ceiling_muffle = FALSE + minimap_color = MINIMAP_AREA_HYBRISACAVES + +/area/lv759/indoors/caves/south_east_caves + name = "Caverns - Southeast" + icon_state = "caves_southeast" + ceiling = CEILING_UNDERGROUND_BLOCK_CAS + ambience_exterior = AMBIENCE_HYBRISA_CAVES + soundscape_playlist = SCAPE_PL_LV759_DEEPCAVES + ceiling_muffle = FALSE + minimap_color = MINIMAP_AREA_HYBRISACAVES + +/area/lv759/indoors/caves/south_west_caves + name = "Caverns - Southwest" + icon_state = "caves_southwest" + ceiling = CEILING_UNDERGROUND_BLOCK_CAS + ambience_exterior = AMBIENCE_HYBRISA_CAVES + soundscape_playlist = SCAPE_PL_LV759_DEEPCAVES + ceiling_muffle = FALSE + minimap_color = MINIMAP_AREA_HYBRISACAVES + +/area/lv759/indoors/caves/south_west_caves_alarm + name = "Caverns - Southwest" + icon_state = "wylab" + ceiling = CEILING_UNDERGROUND_BLOCK_CAS + ambience_exterior = AMBIENCE_HYBRISA_CAVES_ALARM + soundscape_playlist = SCAPE_PL_LV759_DEEPCAVES + ceiling_muffle = FALSE + minimap_color = MINIMAP_AREA_HYBRISARESEARCH + +/area/lv759/indoors/caves/north_west_caves + name = "Caverns - Northwest" + icon_state = "caves_northwest" + ceiling = CEILING_UNDERGROUND_BLOCK_CAS + ambience_exterior = AMBIENCE_HYBRISA_CAVES + soundscape_playlist = SCAPE_PL_LV759_DEEPCAVES + ceiling_muffle = FALSE + minimap_color = MINIMAP_AREA_HYBRISACAVES + +/area/lv759/outdoors/caves/north_west_caves_outdoors + name = "Caverns - Northwest" + icon_state = "caves_northwest" + ceiling = CEILING_NONE + ambience_exterior = AMBIENCE_HYBRISA_CAVES + soundscape_playlist = SCAPE_PL_LV759_CAVES + ceiling_muffle = FALSE + minimap_color = MINIMAP_AREA_HYBRISACAVES + +/area/lv759/indoors/caves/north_east_caves + name = "Caverns - Northeast" + icon_state = "caves_northeast" + ceiling = CEILING_UNDERGROUND_BLOCK_CAS + ambience_exterior = AMBIENCE_HYBRISA_CAVES + soundscape_playlist = SCAPE_PL_LV759_CAVES + ceiling_muffle = FALSE + minimap_color = MINIMAP_AREA_HYBRISACAVES + linked_lz = DROPSHIP_LZ1 + +/area/lv759/indoors/caves/north_east_caves/south + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/caves/north_caves + name = "Caverns - North" + icon_state = "caves_north" + ceiling = CEILING_UNDERGROUND_BLOCK_CAS + ambience_exterior = AMBIENCE_HYBRISA_CAVES + soundscape_playlist = SCAPE_PL_LV759_DEEPCAVES + ceiling_muffle = FALSE + minimap_color = MINIMAP_AREA_HYBRISACAVES + +/area/lv759/indoors/caves/north_caves/east + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/caves/central_caves + name = "Caverns - Central" + icon_state = "caves_central" + ceiling = CEILING_UNDERGROUND_BLOCK_CAS + ambience_exterior = AMBIENCE_HYBRISA_CAVES + soundscape_playlist = SCAPE_PL_LV759_CAVES + ceiling_muffle = FALSE + minimap_color = MINIMAP_AREA_HYBRISACAVES + +/area/lv759/indoors/caves/north_east_caves_comms + name = "KMCC - Mining Outpost - East - Subspace-Communications" + icon_state = "comms_1" + ceiling = CEILING_NONE + minimap_color = MINIMAP_AREA_COMMS + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/caves/north_east_caves_comms_2 + name = "NMHC - Emergency Response - Landing Zone One - Caverns - Northeast - Subspace-Communications" + icon_state = "comms_1" + minimap_color = MINIMAP_AREA_COMMS + linked_lz = DROPSHIP_LZ1 + +// Caves Central Plateau + +/area/lv759/outdoors/caveplateau + name = "Caverns - Plateau" + icon_state = "caves_plateau" + ceiling = CEILING_NONE + ambience_exterior = AMBIENCE_HYBRISA_CAVES + soundscape_playlist = SCAPE_PL_LV759_PLATEAU_OUTDOORS + minimap_color = MINIMAP_AREA_HYBRISACAVES + +// Colony Streets + +/area/lv759/outdoors/colony_streets + name = "Colony Streets" + icon_state = "colonystreets_north" + ceiling = CEILING_NONE + minimap_color = MINIMAP_AREA_COLONY_STREETS + +/area/lv759/outdoors/colony_streets/central_streets + name = "Central Street - West" + icon_state = "colonystreets_west" + +/area/lv759/outdoors/colony_streets/east_central_street + name = "Central Street - East" + icon_state = "colonystreets_east" + linked_lz = DROPSHIP_LZ1 + +/area/lv759/outdoors/colony_streets/east_central_street_left + name = "Central Street - East" + icon_state = "colonystreets_east" + +/area/lv759/outdoors/colony_streets/south_street + name = "Colony Streets - South" + icon_state = "colonystreets_south" + +/area/lv759/outdoors/colony_streets/south_east_street + name = "Colony Streets - Southeast" + icon_state = "colonystreets_southeast" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/outdoors/colony_streets/south_west_street + name = "Colony Streets - Southwest - WY Checkpoint Passthrough" + icon_state = "colonystreets_southwest" + ceiling = CEILING_NONE + ambience_exterior = AMBIENCE_HYBRISA_CAVES + soundscape_playlist = SCAPE_PL_LV759_CAVES + +/area/lv759/outdoors/colony_streets/south_east_street_comms + name = "Colony Streets - Southeast - Subspace-Communications" + icon_state = "comms_1" + ceiling = CEILING_NONE + minimap_color = MINIMAP_AREA_COMMS + linked_lz = DROPSHIP_LZ2 + +/area/lv759/outdoors/colony_streets/north_west_street + name = "Colony Streets - Northwest" + icon_state = "colonystreets_northwest" + +/area/lv759/outdoors/colony_streets/north_east_street + name = "Colony Streets - Northeast" + icon_state = "colonystreets_northeast" + linked_lz = DROPSHIP_LZ1 + +/area/lv759/outdoors/colony_streets/north_east_street_LZ + name = "Colony Streets - Northeast" + icon_state = "colonystreets_northeast" + is_landing_zone = TRUE + linked_lz = DROPSHIP_LZ1 + +/area/lv759/outdoors/colony_streets/north_street + name = "Colony Streets - North" + icon_state = "colonystreets_north" + +//Spaceport Indoors + +/area/lv759/indoors/spaceport + minimap_color = MINIMAP_AREA_COLONY_SPACE_PORT + unoviable_timer = FALSE + +/area/lv759/indoors/spaceport/hallway_northeast + name = "Weyland-Yutani Celestia Gateway Space-Port - Hallway - Northeast" + icon_state = "WYSpaceport" + +/area/lv759/indoors/spaceport/hallway_north + name = "Weyland-Yutani Celestia Gateway Space-Port - Hallway - North" + icon_state = "WYSpaceport" + +/area/lv759/indoors/spaceport/hallway_northwest + name = "Weyland-Yutani Celestia Gateway Space-Port - Hallway - Northwest" + icon_state = "WYSpaceport" + +/area/lv759/indoors/spaceport/hallway_east + name = "Weyland-Yutani Celestia Gateway Space-Port - Hallway - East" + icon_state = "WYSpaceport" + +/area/lv759/indoors/spaceport/heavyequip + name = "Weyland-Yutani Celestia Gateway Space-Port - Heavy Equipment Storage" + icon_state = "WYSpaceport" + +/area/lv759/indoors/spaceport/engineering + name = "Weyland-Yutani Celestia Gateway Space-Port - Fuel Storage & Processing" + icon_state = "WYSpaceport" + +/area/lv759/indoors/spaceport/janitor + name = "Weyland-Yutani Celestia Gateway Space-Port - Janitorial Storage Room" + icon_state = "WYSpaceport" + +/area/lv759/indoors/spaceport/maintenance_east + name = "Weyland-Yutani Celestia Gateway Space-Port - Maintenance - East" + icon_state = "WYSpaceport" + +/area/lv759/indoors/spaceport/communications_office + name = "Weyland-Yutani Celestia Gateway Space-Port - Communications & Administration Office" + icon_state = "WYSpaceportadmin" + +/area/lv759/indoors/spaceport/flight_control_room + name = "Weyland-Yutani Celestia Gateway Space-Port - Flight Control Room" + icon_state = "WYSpaceportadmin" + +/area/lv759/indoors/spaceport/security + name = "Weyland-Yutani Celestia Gateway Space-Port - Security- Observation & Office" + icon_state = "security_checkpoint" + +/area/lv759/indoors/spaceport/security_office + name = "Weyland-Yutani Celestia Gateway Space-Port - Office" + icon_state = "security_checkpoint" + +/area/lv759/indoors/spaceport/cargo + name = "Weyland-Yutani Celestia Gateway Space-Port - Cargo Bay" + icon_state = "WYSpaceportcargo" + +/area/lv759/indoors/spaceport/cargo_maintenance + name = "Weyland-Yutani Celestia Gateway Space-Port - Cargo - Maintenance" + icon_state = "WYSpaceportcargo" + +/area/lv759/indoors/spaceport/baggagehandling + name = "Weyland-Yutani Celestia Gateway Space-Port - Baggage Storage & Handling" + icon_state = "WYSpaceportbaggage" + +/area/lv759/indoors/spaceport/cuppajoes + name = "Weyland-Yutani Celestia Gateway Space-Port - Cuppa Joe's" + icon_state = "cuppajoes" + +/area/lv759/indoors/spaceport/kitchen + name = "Weyland-Yutani Celestia Gateway Space-Port - Kitchen" + icon_state = "WYSpaceportblue" + +/area/lv759/indoors/spaceport/docking_bay_2 + name = "Weyland-Yutani Celestia Gateway Space-Port - Docking Bay: 2 - Refueling and Maintenance" + icon_state = "WYSpaceportblue" + +/area/lv759/indoors/spaceport/docking_bay_1 + name = "Weyland-Yutani Celestia Gateway Space-Port - Docking Bay: 1" + icon_state = "WYSpaceport" + +// Ships + +/area/lv759/indoors/spaceport/starglider + name = "WY-LWI StarGlider SG-200" + icon_state = "wydropship" + requires_power = FALSE + minimap_color = MINIMAP_AREA_COLONY + +/area/lv759/indoors/spaceport/horizon_runner + name = "WY-LWI Horizon Runner HR-150" + icon_state = "wydropship" + requires_power = FALSE + minimap_color = MINIMAP_AREA_COLONY + +// Garage + +/area/lv759/indoors/garage_reception + name = "Garage - Reception" + icon_state = "garage" + +/area/lv759/indoors/garage_workshop + name = "Garage - Workshop" + icon_state = "garage" + +/area/lv759/indoors/garage_workshop_storage + name = "Garage - Workshop - Storage Room" + icon_state = "garage" + +/area/lv759/indoors/garage_managersoffice + name = "Garage - Managers Office" + icon_state = "garage" + +/area/lv759/indoors/garage_restroom + name = "Garage - Restroom" + icon_state = "garage" + +// Meridian Offices & Factory Floor + +/area/lv759/indoors/meridian/meridian_foyer + name = "Meridian - Foyer" + icon_state = "meridian" + +/area/lv759/indoors/meridian/meridian_showroom + name = "Meridian - Showroom" + icon_state = "meridian" + +/area/lv759/indoors/meridian/meridian_office + name = "Meridian - Offices" + icon_state = "meridian" + +/area/lv759/indoors/meridian/meridian_managersoffice + name = "Meridian - Manager's Office" + icon_state = "meridian" + +/area/lv759/indoors/meridian/meridian_factory + name = "Meridian - Factory Floor" + icon_state = "meridian_factory" + +/area/lv759/indoors/meridian/meridian_restroom + name = "Meridian - Restroom" + icon_state = "meridian" + +/area/lv759/indoors/meridian/meridian_maintenance + name = "Meridian - Maintenance" + icon_state = "meridian" + +/area/lv759/indoors/meridian/meridian_maintenance_east + name = "Meridian - Factory Floor - Maintenance" + icon_state = "meridian" + +// Apartments (Dorms) + +/area/lv759/indoors/apartment + minimap_color = MINIMAP_AREA_COLONY_RESANDCOM + +/area/lv759/indoors/apartment/westfoyer + name = "Westhaven Apartment Complex - West - Foyer" + icon_state = "apartments" + +/area/lv759/indoors/apartment/westhallway + name = "Westhaven Apartment Complex - West - Hallway" + icon_state = "apartments" + +/area/lv759/indoors/apartment/westbedrooms + name = "Westhaven Apartment Complex - West - Apartments" + icon_state = "apartments" + +/area/lv759/indoors/apartment/westshowers + name = "Westhaven Apartment Complex - West - Showers" + icon_state = "apartments" + +/area/lv759/indoors/apartment/westrestroom + name = "Westhaven Apartment Complex - West - Restrooms" + icon_state = "apartments" + +/area/lv759/indoors/apartment/westentertainment + name = "Westhaven Apartment Complex - West - Recreation Hub" + icon_state = "apartments" + +/area/lv759/indoors/apartment/eastentrance + name = "Westhaven Apartment Complex - East - Entrance Room" + icon_state = "apartments" + +/area/lv759/indoors/apartment/eastfoyer + name = "Westhaven Apartment Complex - East - Foyer" + icon_state = "apartments" + +/area/lv759/indoors/apartment/eastrestroomsshower + name = "Westhaven Apartment Complex - East - Restrooms & Showers" + icon_state = "apartments" + +/area/lv759/indoors/apartment/eastbedrooms + name = "Westhaven Apartment Complex - East - Bedrooms" + icon_state = "apartments" + +/area/lv759/indoors/apartment/eastbedroomsstorage + name = "Westhaven Apartment Complex - East - Bedrooms - Storage Room" + icon_state = "apartments" + +/area/lv759/indoors/apartment/northfoyer + name = "Westhaven Apartment Complex - North - Foyer" + icon_state = "apartments" + +/area/lv759/indoors/apartment/northhallway + name = "Westhaven Apartment Complex - North - Hallway" + icon_state = "apartments" + +/area/lv759/indoors/apartment/northapartments + name = "Westhaven Apartment Complex - North - Apartments" + icon_state = "apartments" + +// Weyland-Yutani Offices + +/area/lv759/indoors/weyyu_office + name = "Weyland-Yutani Offices - Reception Hallway" + icon_state = "wyoffice" + minimap_color = MINIMAP_AREA_COMMAND + +/area/lv759/indoors/weyyu_office/hallway + name = "Weyland-Yutani Offices - West Foyer" + icon_state = "wyoffice" + +/area/lv759/indoors/weyyu_office/floor + name = "Weyland-Yutani Offices - Main Office Floor" + +/area/lv759/indoors/weyyu_office/breakroom + name = "Weyland-Yutani Offices - Breakroom" + +/area/lv759/indoors/weyyu_office/vip + name = "Weyland-Yutani Offices - Conference Room" + +/area/lv759/indoors/weyyu_office/pressroom + name = "Weyland-Yutani Offices - Assembly Hall" + +/area/lv759/indoors/weyyu_office/supervisor + name = "Weyland-Yutani Offices - Colony Supervisors Office" + +// Bar & Entertainment Complex + +/area/lv759/indoors/bar + name = "Bar" + icon_state = "bar" + +/area/lv759/indoors/bar/entertainment + name = "Bar - Entertainment Subsection" + +/area/lv759/indoors/bar/bathroom + name = "Bar - Restrooms" + +/area/lv759/indoors/bar/maintenance + name = "Bar - Maintenance" + +/area/lv759/indoors/bar/kitchen + name = "Bar - Kitchen" + +//Botany + +/area/lv759/indoors/botany/botany_greenhouse + name = "Botany - Greenhouse" + icon_state = "botany" + +/area/lv759/indoors/botany/botany_hallway + name = "Botany - Hallway" + icon_state = "botany" + +/area/lv759/indoors/botany/botany_maintenance + name = "Botany - Maintenance" + icon_state = "botany" + +/area/lv759/indoors/botany/botany_mainroom + name = "Botany - Main Room" + icon_state = "botany" + +// Hotel + +/area/lv759/indoors/hotel + minimap_color = MINIMAP_AREA_COLONY_RESANDCOM + +/area/lv759/indoors/hotel/hotel_hallway + name = "Prospera Grand Hotel - Hallway" + icon_state = "apartments" + +/area/lv759/indoors/hotel/hotel_rooms + name = "Prospera Grand Hotel - Room" + icon_state = "apartments" + +// Hosptial + +/area/lv759/indoors/hospital + icon_state = "medical" + minimap_color = MINIMAP_AREA_MEDBAY + linked_lz = DROPSHIP_LZ1 + +/area/lv759/indoors/hospital/paramedics_garage + name = "Nova Medica Hospital Complex - Paramedic's Garage" + +/area/lv759/indoors/hospital/cryo_room + name = "Nova Medica Hospital Complex - Cryo Ward" + +/area/lv759/indoors/hospital/emergency_room + name = "Nova Medica Hospital Complex - Emergency Room" + +/area/lv759/indoors/hospital/reception + name = "Nova Medica Hospital Complex - Reception" + +/area/lv759/indoors/hospital/cmo_office + name = "Nova Medica Hospital Complex - Chief Medical Officer's Office" + +/area/lv759/indoors/hospital/maintenance + name = "Nova Medica Hospital Complex - Subspace Communications & Electrical Systems" + icon_state = "comms_1" + minimap_color = MINIMAP_AREA_COMMS + +/area/lv759/indoors/hospital/break_room + name = "Nova Medica Hospital Complex - Breakroom" + +/area/lv759/indoors/hospital/pharmacy + name = "Nova Medica Hospital Complex - Pharmacy & Outgoing Foyer" + +/area/lv759/indoors/hospital/outgoing + name = "Nova Medica Hospital Complex - Outgoing Ward" + +/area/lv759/indoors/hospital/central_hallway + name = "Nova Medica Hospital Complex - Central Hallway" + +/area/lv759/indoors/hospital/east_hallway + name = "Nova Medica Hospital Complex - East Hallway" + +/area/lv759/indoors/hospital/medical_storage + name = "Nova Medica Hospital Complex - Medical Storage" + +/area/lv759/indoors/hospital/operation + name = "Nova Medica Hospital Complex - Operation Theatres & Observation" + +/area/lv759/indoors/hospital/patient_ward + name = "Nova Medica Hospital Complex - Patient Ward" + +/area/lv759/indoors/hospital/virology + name = "Nova Medica Hospital Complex - Virology" + +/area/lv759/indoors/hospital/morgue + name = "Nova Medica Hospital Complex - Morgue" + +/area/lv759/indoors/hospital/icu + name = "Nova Medica Hospital Complex - Intensive Care Ward" + +/area/lv759/indoors/hospital/storage + name = "Nova Medica Hospital Complex - Office" + +/area/lv759/indoors/hospital/maintenance_north + name = "Nova Medica Hospital Complex - Maintenance North" + +/area/lv759/indoors/hospital/maintenance_south + name = "Nova Medica Hospital Complex - Unisex-Restroom" + +/area/lv759/indoors/hospital/janitor + name = "Nova Medica Hospital Complex - Janitors Closet" + +// Mining + +/area/lv759/indoors/mining_outpost + icon_state = "mining" + minimap_color = MINIMAP_AREA_MINING + +/area/lv759/indoors/mining_outpost/north + name = "KMCC - Mining Outpost - North" + icon_state = "mining" + +/area/lv759/indoors/mining_outpost/north_maint + name = "KMCC - Mining Outpost - North - Maintenance" + icon_state = "mining" + +/area/lv759/indoors/mining_outpost/northeast + name = "KMCC - Mining Outpost - Northeast" + icon_state = "mining" + is_landing_zone = TRUE + linked_lz = DROPSHIP_LZ1 + +/area/lv759/indoors/mining_outpost/south + name = "KMCC - Mining Outpost - Southeast" + icon_state = "mining" + +/area/lv759/indoors/mining_outpost/vehicledeployment + name = "KMCC - Mining Outpost - South - Vehicle Deployment" + icon_state = "mining" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/mining_outpost/processing + name = "KMCC - Mining Outpost - South - Processing & Storage" + icon_state = "mining" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/mining_outpost/east + name = "KMCC - Mining Outpost - East" + icon_state = "mining" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/mining_outpost/east_dorms + name = "KMCC - Mining Outpost - East - Dorms" + icon_state = "mining" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/mining_outpost/east_deploymentbay + name = "KMCC - Mining Outpost - East - Deployment Bay" + icon_state = "mining" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/mining_outpost/east_command + name = "KMCC - Mining Outpost - East - Command Center" + icon_state = "mining" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/mining_outpost/cargo_maint + name = "KMCC - Mining Outpost - East - Maintenance" + icon_state = "mining" + +/area/lv759/outdoors/mining_outpost/south_entrance + name = "KMCC - Mining Outpost - South - Vehicle Deployment Entrance" + icon_state = "mining" + ceiling = CEILING_NONE + minimap_color = MINIMAP_AREA_COLONY + linked_lz = DROPSHIP_LZ2 + +// Electrical Substations + +/area/lv759/indoors/electical_systems + minimap_color = MINIMAP_AREA_COLONY_ENGINEERING + +/area/lv759/indoors/electical_systems/substation1 + name = "Electrical Systems - Substation One - Control Room" + icon_state = "power0" + +/area/lv759/indoors/electical_systems/substation2 + name = "Electrical Systems - Substation Two" + icon_state = "power0" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/electical_systems/substation3 + name = "Electrical Systems - Substation Three" + icon_state = "power0" + linked_lz = DROPSHIP_LZ1 + +// Power-Plant (Engineering) + +/area/lv759/indoors/power_plant + name = "Weyland-Yutani DynaGrid Nexus - Central Hallway" + icon_state = "power0" + minimap_color = MINIMAP_AREA_COLONY_ENGINEERING + +/area/lv759/indoors/power_plant/Hallway_East + name = "Weyland-Yutani DynaGrid Nexus - East Hallway" + icon_state = "power0" + minimap_color = MINIMAP_AREA_COLONY_ENGINEERING + linked_lz = DROPSHIP_LZ1 + +/area/lv759/indoors/power_plant/south_hallway + name = "Weyland-Yutani DynaGrid Nexus - South Hallway" + +/area/lv759/indoors/power_plant/geothermal_generators + name = "Weyland-Yutani DynaGrid Nexus - Geothermal Generators Room" + +/area/lv759/indoors/power_plant/power_storage + name = "Weyland-Yutani DynaGrid Nexus - Power Storage Room" + +/area/lv759/outdoors/power_plant/transformers_north + name = "Weyland-Yutani DynaGrid Nexus - Transformers - North" + minimap_color = MINIMAP_AREA_COLONY_RESANDCOM + linked_lz = DROPSHIP_LZ1 + +/area/lv759/outdoors/power_plant/transformers_south + name = "Weyland-Yutani DynaGrid Nexus - Transformers - South" + minimap_color = MINIMAP_AREA_COLONY_RESANDCOM + linked_lz = DROPSHIP_LZ1 + +/area/lv759/indoors/power_plant/transformers_north + name = "Weyland-Yutani DynaGrid Nexus - Transformers - North" + +/area/lv759/indoors/power_plant/transformers_south + name = "Weyland-Yutani DynaGrid Nexus - Transformers - South" + +/area/lv759/indoors/power_plant/gas_generators + name = "Weyland-Yutani DynaGrid Nexus - Gas Mixing & Storage " + +/area/lv759/indoors/power_plant/fusion_generators + name = "Weyland-Yutani DynaGrid Nexus - Control Center" + +/area/lv759/indoors/power_plant/telecomms + icon_state = "comms_1" + name = "Weyland-Yutani DynaGrid Nexus - Telecommunications" + minimap_color = MINIMAP_AREA_COMMS + linked_lz = DROPSHIP_LZ1 + +/area/lv759/indoors/power_plant/workers_canteen + name = "Weyland-Yutani DynaGrid Nexus - Worker's Canteen" + linked_lz = DROPSHIP_LZ1 + +/area/lv759/indoors/power_plant/workers_canteen_kitchen + name = "Weyland-Yutani DynaGrid Nexus - Worker's Canteen - Kitchen" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/power_plant/equipment_east + name = "Weyland-Yutani DynaGrid Nexus - Equipment Storage Room - East" + +/area/lv759/indoors/power_plant/equipment_west + name = "Weyland-Yutani DynaGrid Nexus - Equipment Storage Room - West" + +// Marshalls (NSPA) + +/area/lv759/indoors/colonial_marshals + name = "NSPA - Ironbridge Precinct" + icon_state = "security_hub" + minimap_color = MINIMAP_AREA_COLONY_MARSHALLS + +/area/lv759/indoors/colonial_marshals/prisoners_cells + name = "NSPA - Ironbridge Precinct - Maximum Security Ward - Cells" + +/area/lv759/indoors/colonial_marshals/prisoners_foyer + name = "NSPA - Ironbridge Precinct - Maximum Security Ward - Foyer" + +/area/lv759/indoors/colonial_marshals/prisoners_recreation_area + name = "NSPA - Ironbridge Precinct - Maximum Security Ward - Recreation Area & Shower Room" + +/area/lv759/indoors/colonial_marshals/garage + name = "NSPA - Ironbridge Precinct - Vehicle Deployment & Maintenace" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/colonial_marshals/armory_foyer + name = "NSPA - Ironbridge Precinct - Armory Foyer" + +/area/lv759/indoors/colonial_marshals/armory + name = "NSPA - Ironbridge Precinct - Armory" + +/area/lv759/indoors/colonial_marshals/armory_firingrange + name = "NSPA - Ironbridge Precinct - Firing Range" + +/area/lv759/indoors/colonial_marshals/armory_evidenceroom + name = "NSPA - Ironbridge Precinct - Evidence Room" + +/area/lv759/indoors/colonial_marshals/office + name = "NSPA - Ironbridge Precinct - Office" + +/area/lv759/indoors/colonial_marshals/reception + name = "NSPA - Ironbridge Precinct - Reception Office" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/colonial_marshals/hallway_central + name = "NSPA - Ironbridge Precinct - Central Hallway" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/colonial_marshals/hallway_south + name = "NSPA - Ironbridge Precinct - South Hallway" + +/area/lv759/indoors/colonial_marshals/hallway_reception + name = "NSPA - Ironbridge Precinct - Reception Hallway" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/colonial_marshals/hallway_north + name = "NSPA - Ironbridge Precinct - North Hallway" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/colonial_marshals/hallway_north_locker + name = "NSPA - Ironbridge Precinct - North Hallway - Locker Room" + +/area/lv759/indoors/colonial_marshals/holding_cells + name = "NSPA - Ironbridge Precinct - Holding Cells" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/colonial_marshals/head_office + name = "NSPA - Ironbridge Precinct - Forensics Office" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/colonial_marshals/north_office + name = "NSPA - Ironbridge Precinct - North Office" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/colonial_marshals/wardens_office + name = "NSPA - Ironbridge Precinct - Wardens Office" + +/area/lv759/indoors/colonial_marshals/interrogation + name = "NSPA - Ironbridge Precinct - Interrogation" + +/area/lv759/indoors/colonial_marshals/press_room + name = "NSPA - Ironbridge Precinct - Court Room" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/colonial_marshals/changing_room + name = "NSPA - Ironbridge Precinct - Changing Room" + +/area/lv759/indoors/colonial_marshals/restroom + name = "NSPA - Ironbridge Precinct - Restroom & Showers" + +/area/lv759/indoors/colonial_marshals/south_maintenance + name = "NSPA - Ironbridge Precinct - Maintenance - South" + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/colonial_marshals/north_maintenance + name = "NSPA - Ironbridge Precinct - Maintenance - North" + +/area/lv759/indoors/colonial_marshals/southwest_maintenance + name = "NSPA - Ironbridge Precinct - Maintenance - Southwest" + + +// Jack's Surplus + +/area/lv759/indoors/jacks_surplus + name = "Jack's Military Surplus" + icon_state = "jacks" + minimap_color = MINIMAP_AREA_COLONY_RESANDCOM + linked_lz = DROPSHIP_LZ2 + +//Weyland-Yutani - Resource Recovery Facility + +/area/lv759/indoors/recycling_plant + name = "Weyland-Yutani - Resource Recovery Facility" + icon_state = "recycling" + minimap_color = MINIMAP_AREA_COLONY_RESANDCOM + linked_lz = DROPSHIP_LZ1 + +/area/lv759/indoors/recycling_plant/garage + name = "Weyland-Yutani - Resource Recovery Facility - Garage" + +/area/lv759/indoors/recycling_plant/synthetic_storage + name = "Synthetic Storage" + icon_state = "synthetic" + +/area/lv759/indoors/recycling_plant_office + name = "Weyland-Yutani - Resource Recovery Facility - Office" + icon_state = "recycling" + +/area/lv759/indoors/recycling_plant_waste_disposal_incinerator + name = "Weyland-Yutani - Resource Recovery Facility - Waste Disposal Incinerating Room" + icon_state = "recycling" + +// Restrooms + +/area/lv759/indoors/south_public_restroom + name = "Public Restroom - South" + icon_state = "restroom" + minimap_color = MINIMAP_AREA_COLONY_RESANDCOM + linked_lz = DROPSHIP_LZ2 + +/area/lv759/indoors/southwest_public_restroom + name = "Public Restroom - Southwest" + icon_state = "restroom" + minimap_color = MINIMAP_AREA_COLONY_RESANDCOM + linked_lz = DROPSHIP_LZ2 + +//Nightgold Casino + +/area/lv759/indoors/casino + name = "Night Gold Casino" + icon_state = "nightgold" + minimap_color = MINIMAP_AREA_COLONY_RESANDCOM + +/area/lv759/indoors/casino/casino_office + name = "Night Gold Casino - Managers Office" + icon_state = "nightgold" + +/area/lv759/indoors/casino/casino_restroom + name = "Night Gold Casino - Restroom" + icon_state = "nightgold" + +/area/lv759/indoors/casino/casino_vault + name = "Night Gold Casino - Vault" + icon_state = "nightgold" + +// Pizza + +/area/lv759/indoors/pizzaria + name = "Pizza Galaxy - Outpost Zeta" + icon_state = "pizza" + minimap_color = MINIMAP_AREA_COLONY_RESANDCOM + +//T-comms + +/area/lv759/indoors/tcomms_northwest + name = "Telecommunications Substation - West" + icon_state = "comms_1" + minimap_color = MINIMAP_AREA_COMMS + +// Weymart + +/area/lv759/indoors/weymart + name = "Weymart" + icon_state = "weymart" + minimap_color = MINIMAP_AREA_COLONY_RESANDCOM + ambience_exterior = AMBIENCE_WEYMART + +/area/lv759/indoors/weymart/backrooms + name = "Weymart - Backrooms" + icon_state = "weymartbackrooms" + +/area/lv759/indoors/weymart/maintenance + name = "Weymart - Maintenance" + icon_state = "weymartbackrooms" + +// WY Security Checkpoints + +/area/lv759/indoors/wy_security + minimap_color = MINIMAP_AREA_COLONY_MARSHALLS + +/area/lv759/indoors/wy_security/checkpoint_northeast + name = "Weyland-Yutani Security Checkpoint - North East" + icon_state = "security_checkpoint_northeast" + is_landing_zone = TRUE + linked_lz = DROPSHIP_LZ1 + +/area/lv759/indoors/wy_security/checkpoint_east + name = "Weyland-Yutani Security Checkpoint - East" + icon_state = "security_checkpoint_east" + linked_lz = DROPSHIP_LZ1 + +/area/lv759/indoors/wy_security/checkpoint_central + name = "Weyland-Yutani Security Checkpoint - Central" + icon_state = "security_checkpoint_central" + +/area/lv759/indoors/wy_security/checkpoint_west + name = "Weyland-Yutani Security Checkpoint - West" + icon_state = "security_checkpoint_west" + +/area/lv759/indoors/wy_security/checkpoint_northwest + name = "Weyland-Yutani Security Checkpoint - North West" + icon_state = "security_checkpoint_northwest" + +// Misc + +/area/lv759/indoors/hobosecret + name = "Hidden Hobo Haven" + icon_state = "hobo" + ceiling = CEILING_REINFORCED_METAL + is_resin_allowed = FALSE + flags_area = AREA_NOTUNNEL + linked_lz = DROPSHIP_LZ2 + +// Weyland-Yutani Advanced Bio-Genomic Research Complex + +/area/lv759/indoors/wy_research_complex + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex" + icon_state = "wylab" + minimap_color = MINIMAP_AREA_HYBRISARESEARCH + ceiling = CEILING_METAL + +/area/lv759/indoors/wy_research_complex/medical_annex + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Medical Annex Building" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/reception + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Reception & Administration" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB_HALLWAY + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/cargo + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Requisitions & Cargo" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/researchanddevelopment + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Technology Research & Development Lab" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/mainlabs + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Advanced Chemical Testing & Research Lab" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/xenobiology + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Advanced Xenobiology Lab" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB_2 + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/weaponresearchlab + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Advanced Weapon Research Lab" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/weaponresearchlabtesting + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Advanced Weapon Research Lab - Weapons Testing Range" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/xenoarcheology + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Xenoarcheology Research Lab" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/vehicledeploymentbay + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Vehicle Deployment & Maintenance Bay" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/janitor + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Janitorial Supplies Storage" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/cafeteria + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Cafeteria" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/cafeteriakitchen + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Cafeteria - Kitchen" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/dormsfoyer + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Dorms Foyer" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/dormsbedroom + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Dorms" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/securitycommand + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Security Command Center & Deployment" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/securityarmory + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Armory" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/hangarbay + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Hangar Bay" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB_HALLWAY + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/hangarbayshuttle + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Hangar Bay - Weyland-Yutani PMC ERT Shuttle" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + minimap_color = MINIMAP_AREA_COLONY + +/area/lv759/indoors/wy_research_complex/hallwaynorth + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - North Hallway" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB_HALLWAY + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/hallwaynorthexit + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - North Hallway - Personnel Exit East" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB_HALLWAY + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/hallwayeast + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Hallway East" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB_HALLWAY + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/hallwaycentral + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Central Hallway" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB_HALLWAY + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/hallwaysouthwest + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - South West Hallway" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB_HALLWAY + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/hallwaysoutheast + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - South East Hallway" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB_HALLWAY + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/southeastexit + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - South East Maintenace & Emergency Exit" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/changingroom + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Locker Room" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS + +/area/lv759/indoors/wy_research_complex/head_research_office + name = "Weyland-Yutani - Advanced Bio-Genomic Research Complex - Head of Research's Office" + icon_state = "wylab" + ambience_exterior = AMBIENCE_LAB + soundscape_playlist = SCAPE_PL_LV759_INDOORS diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index 30f55b9f5bf5..38ea4e25bb9e 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -167,5 +167,5 @@ network = list(CAMERA_NET_SIMULATION) invuln = TRUE view_range = 14 - use_power = FALSE + use_power = USE_POWER_NONE invisibility = INVISIBILITY_MAXIMUM diff --git a/code/game/machinery/colony_floodlights.dm b/code/game/machinery/colony_floodlights.dm index e8f59ad643d7..91ebbb28fb99 100644 --- a/code/game/machinery/colony_floodlights.dm +++ b/code/game/machinery/colony_floodlights.dm @@ -1,5 +1,6 @@ -//Putting these here since it's power-related -/obj/structure/machinery/colony_floodlight_switch +GLOBAL_LIST_INIT(all_breaker_switches, list()) + +/obj/structure/machinery/colony_floodlight_switch // TODO: Repath to just breaker_switch name = "colony floodlight switch" icon = 'icons/obj/structures/machinery/power.dmi' icon_state = "panelnopower" @@ -10,59 +11,82 @@ unslashable = TRUE unacidable = TRUE power_machine = TRUE + idle_power_usage = 0 + is_on = FALSE var/ispowered = FALSE - var/turned_on = FALSE //has to be toggled in engineering - ///All floodlights under our control - var/list/floodlist = list() + ///All machinery under our control + var/list/machinery_list = list() + ///The types of machinery we control (define this) + var/list/machinery_type_whitelist = list(/obj/structure/machinery/colony_floodlight) + ///The types of machinery we don't control (generated automatically) + var/list/machinery_type_blacklist = list() /obj/structure/machinery/colony_floodlight_switch/Initialize(mapload, ...) . = ..() + for(var/obj/structure/machinery/colony_floodlight_switch/other_switch as anything in GLOB.all_breaker_switches) + // blacklist anything other switches whitelist if theres subtype overlap + for(var/other_whitelisted in other_switch.machinery_type_whitelist) + if(is_path_in_list(other_whitelisted, machinery_type_whitelist)) + machinery_type_blacklist |= other_whitelisted + for(var/our_whitelisted in machinery_type_whitelist) + if(is_path_in_list(our_whitelisted, other_switch.machinery_type_whitelist)) + other_switch.machinery_type_blacklist |= our_whitelisted + + GLOB.all_breaker_switches += src return INITIALIZE_HINT_LATELOAD /obj/structure/machinery/colony_floodlight_switch/LateInitialize() . = ..() - for(var/obj/structure/machinery/colony_floodlight/floodlight in GLOB.machines) - floodlist += floodlight - floodlight.fswitch = src + if(length(machinery_type_whitelist)) + for(var/obj/structure/machinery/machine as anything in GLOB.machines) + if(machine.breaker_switch != null) + continue + if(!is_type_in_list(machine, machinery_type_whitelist)) + continue + if(is_type_in_list(machine, machinery_type_blacklist)) + continue + machinery_list += machine + machine.breaker_switch = src start_processing() /obj/structure/machinery/colony_floodlight_switch/Destroy() - for(var/obj/structure/machinery/colony_floodlight/floodlight as anything in floodlist) - floodlight.fswitch = null - floodlist = null + for(var/obj/structure/machinery/machine as anything in machinery_list) + if(machine.breaker_switch == src) + machine.breaker_switch = null + machinery_list = null + GLOB.all_breaker_switches -= src return ..() /obj/structure/machinery/colony_floodlight_switch/update_icon() if(!ispowered) icon_state = "panelnopower" - else if(turned_on) + else if(is_on) icon_state = "panelon" else icon_state = "paneloff" /obj/structure/machinery/colony_floodlight_switch/process() - var/lightpower = 0 - for(var/obj/structure/machinery/colony_floodlight/floodlight as anything in floodlist) - if(!floodlight.is_lit) + var/machinepower = calculate_current_power_usage() + for(var/obj/structure/machinery/machine as anything in machinery_list) + if(!machine.is_on) continue - lightpower += floodlight.power_tick - use_power(lightpower) + machinepower += machine.active_power_usage + use_power(machinepower) /obj/structure/machinery/colony_floodlight_switch/power_change() ..() if((stat & NOPOWER)) - if(ispowered && turned_on) - toggle_lights() + if(ispowered && is_on) + toggle_machines() ispowered = FALSE - turned_on = FALSE - update_icon() + set_is_on(FALSE) else ispowered = TRUE update_icon() -/obj/structure/machinery/colony_floodlight_switch/proc/toggle_lights() - for(var/obj/structure/machinery/colony_floodlight/floodlight as anything in floodlist) - addtimer(CALLBACK(floodlight, TYPE_PROC_REF(/obj/structure/machinery/colony_floodlight, toggle_light)), rand(0, 5 SECONDS)) +/obj/structure/machinery/colony_floodlight_switch/proc/toggle_machines() + for(var/obj/structure/machinery/machine as anything in machinery_list) + addtimer(CALLBACK(machine, TYPE_PROC_REF(/obj/structure/machinery, toggle_is_on)), rand(0, 5 SECONDS)) /obj/structure/machinery/colony_floodlight_switch/attack_hand(mob/user as mob) if(!ishuman(user)) @@ -73,9 +97,8 @@ return FALSE playsound(src,'sound/items/Deconstruct.ogg', 30, 1) use_power(5) - toggle_lights() - turned_on = !turned_on - update_icon() + toggle_is_on() + toggle_machines() return TRUE @@ -96,28 +119,18 @@ unacidable = TRUE use_power = USE_POWER_NONE //It's the switch that uses the actual power, not the lights needs_power = FALSE + is_on = FALSE //Whether the floodlight is switched to on or off. Does not necessarily mean it emits light. + health = 150 + active_power_usage = 50 //The power each floodlight takes up per process ///Whether it has been smashed by xenos var/damaged = FALSE - ///Whether the floodlight is switched to on or off. Does not necessarily mean it emits light. - var/is_lit = FALSE - ///The power each floodlight takes up per process - var/power_tick = 50 - ///Reverse lookup for power grabbing in area - var/obj/structure/machinery/colony_floodlight_switch/fswitch = null var/lum_value = 7 var/repair_state = FLOODLIGHT_REPAIR_UNSCREW - health = 150 - -/obj/structure/machinery/colony_floodlight/Destroy() - if(fswitch) - fswitch.floodlist -= src - fswitch = null - . = ..() /obj/structure/machinery/colony_floodlight/update_icon() if(damaged) icon_state = "flood_s_dmg" - else if(is_lit) + else if(is_on) icon_state = "flood_s_on" else icon_state = "flood_s_off" @@ -154,7 +167,7 @@ health = initial(health) user.visible_message(SPAN_NOTICE("[user] screws [src]'s maintenance hatch closed."), \ SPAN_NOTICE("You screw [src]'s maintenance hatch closed.")) - if(is_lit) + if(is_on) set_light(lum_value) update_icon() return TRUE @@ -261,7 +274,7 @@ if(ishuman(user)) if(damaged) to_chat(user, SPAN_WARNING("[src] is damaged.")) - else if(!is_lit) + else if(!is_on) to_chat(user, SPAN_WARNING("Nothing happens. Looks like it's powered elsewhere.")) return FALSE return ..() @@ -278,7 +291,7 @@ if(FLOODLIGHT_REPAIR_WELD) . += SPAN_INFO("You must weld the damage to it.") if(FLOODLIGHT_REPAIR_CABLE) . += SPAN_INFO("You must replace its damaged cables.") if(FLOODLIGHT_REPAIR_SCREW) . += SPAN_INFO("You must screw its maintenance hatch closed.") - else if(!is_lit) + else if(!is_on) . += SPAN_INFO("It doesn't seem powered.") /obj/structure/machinery/colony_floodlight/ex_act(severity) @@ -298,16 +311,15 @@ /obj/structure/machinery/colony_floodlight/proc/set_damaged() playsound(src, "glassbreak", 70, 1) damaged = TRUE - if(is_lit) + if(is_on) set_light(0) update_icon() -/obj/structure/machinery/colony_floodlight/proc/toggle_light() - is_lit = !is_lit +/obj/structure/machinery/colony_floodlight/toggle_is_on() + . = ..() if(!damaged) - set_light(is_lit ? lum_value : 0) - update_icon() - return is_lit + set_light(is_on ? lum_value : 0) + return . #undef FLOODLIGHT_REPAIR_UNSCREW #undef FLOODLIGHT_REPAIR_CROWBAR diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index d1c590507842..33c9bff8d4f1 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -265,3 +265,37 @@ /obj/structure/machinery/door_control/cl/quarter/windows name = "Quarter Windows Shutters" id = "cl_quarter_windows" + +// Hybrisa lockdown announcements + +/obj/structure/machinery/door_control/colony_lockdown + var/used = FALSE + var/colony_lockdown_time = 25 MINUTES + +/obj/structure/machinery/door_control/colony_lockdown/use_button(mob/living/user,force) + if(world.time < SSticker.mode.round_time_lobby + colony_lockdown_time) + to_chat(user, SPAN_WARNING("The colony-wide lockdown cannot be lifted yet. Please wait another [floor((SSticker.mode.round_time_lobby + colony_lockdown_time-world.time)/600)] minutes before trying again.")) + return + if(used) + to_chat(user, SPAN_WARNING("The colony-wide lockdown has already been lifted.")) + return + . = ..() + marine_announcement("The colony-wide lockdown protocols have been lifted.") + used = TRUE + +// Research + +/obj/structure/machinery/door_control/research_lockdown + var/used = FALSE + var/colony_lockdown_time = 10 MINUTES + +/obj/structure/machinery/door_control/research_lockdown/use_button(mob/living/user,force) + if(world.time < SSticker.mode.round_time_lobby + colony_lockdown_time) + to_chat(user, SPAN_WARNING("The WY-Research-Facility lockdown cannot be lifted yet. Please wait another [floor((SSticker.mode.round_time_lobby + colony_lockdown_time-world.time)/600)] minutes before trying again.")) + return + if(used) + to_chat(user, SPAN_WARNING("The WY-Research-Facility lockdown has already been lifted.")) + return + . = ..() + marine_announcement("The WY-Research-Facility lockdown protocols have been lifted.") + used = TRUE diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 52c904e81ded..745aa205aa62 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -566,12 +566,52 @@ /obj/structure/machinery/door/airlock/almayer/generic/autoname autoname = TRUE +/obj/structure/machinery/door/airlock/almayer/generic/rusted + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/rusted_door.dmi' + +/obj/structure/machinery/door/airlock/almayer/generic/autoname/rusted + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/rusted_door.dmi' + +/obj/structure/machinery/door/airlock/almayer/generic/rusted_white + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/white_rusted_solid.dmi' + +/obj/structure/machinery/door/airlock/almayer/generic/autoname/rusted_wite + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/white_rusted_solid.dmi' + /obj/structure/machinery/door/airlock/almayer/generic/glass name = "\improper Airlock" icon = 'icons/obj/structures/doors/personaldoor_glass.dmi' opacity = FALSE glass = TRUE +/obj/structure/machinery/door/airlock/almayer/generic/glass/rusted_window + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/rusted_door_window.dmi' + opacity = FALSE + glass = TRUE + +/obj/structure/machinery/door/airlock/almayer/generic/glass/rusted_window_small + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/rusted_door_windowsmall.dmi' + opacity = FALSE + glass = TRUE + +/obj/structure/machinery/door/airlock/almayer/generic/autoname/glass/rusted_window + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/rusted_door_window.dmi' + opacity = FALSE + glass = TRUE + +/obj/structure/machinery/door/airlock/almayer/generic/autoname/glass/rusted_window_small + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/rusted_door_windowsmall.dmi' + opacity = FALSE + glass = TRUE + /obj/structure/machinery/door/airlock/almayer/generic/corporate name = "Corporate Liaison's Quarters" icon = 'icons/obj/structures/doors/personaldoor.dmi' @@ -914,3 +954,126 @@ dir = SOUTH +// Hybrisa + +/obj/structure/machinery/door/airlock/hybrisa + openspeed = 4 + +/obj/structure/machinery/door/airlock/hybrisa/generic + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/hybrisa/hybrisa_generic_glass.dmi' + opacity = FALSE + glass = TRUE + req_access = null + +/obj/structure/machinery/door/airlock/hybrisa/generic/autoname + req_access = null + opacity = FALSE + glass = TRUE + autoname = TRUE + +/obj/structure/machinery/door/airlock/hybrisa/generic_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/hybrisa/hybrisa_generic.dmi' + opacity = TRUE + glass = FALSE + req_access = null + +/obj/structure/machinery/door/airlock/hybrisa/generic_solid/autoname + autoname = TRUE + opacity = TRUE + glass = FALSE + req_access = null + +// Medical + +/obj/structure/machinery/door/airlock/hybrisa/medical + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/hybrisa/hybrisa_medidoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_access = null + +/obj/structure/machinery/door/airlock/hybrisa/medical/autoname + autoname = TRUE + opacity = FALSE + glass = TRUE + req_access = null + +/obj/structure/machinery/door/airlock/hybrisa/medical_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/hybrisa/hybrisa_medidoor.dmi' + opacity = TRUE + glass = FALSE + req_access = null + req_one_access = list(ACCESS_CIVILIAN_MEDBAY, ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_CIVILIAN_PUBLIC) + +/obj/structure/machinery/door/airlock/hybrisa/medical_solid/autoname + autoname = TRUE + opacity = TRUE + glass = FALSE + req_access = null + req_one_access = list(ACCESS_CIVILIAN_MEDBAY, ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_CIVILIAN_PUBLIC) + +// Personal + +/obj/structure/machinery/door/airlock/hybrisa/personal + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/hybrisa/hybrisa_personaldoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_access = null + +/obj/structure/machinery/door/airlock/hybrisa/personal/autoname + autoname = TRUE + opacity = FALSE + glass = TRUE + req_access = null + +/obj/structure/machinery/door/airlock/hybrisa/personal_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/hybrisa/hybrisa_personaldoor.dmi' + opacity = TRUE + glass = FALSE + req_access = null + req_one_access = list(ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) + +/obj/structure/machinery/door/airlock/hybrisa/personal_solid/autoname + autoname = TRUE + req_access = null + opacity = TRUE + glass = FALSE + req_one_access = list(ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) + +// Personal White + +/obj/structure/machinery/door/airlock/hybrisa/personal_white + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/hybrisa/hybrisa_personaldoor_glass_white.dmi' + opacity = FALSE + glass = TRUE + req_access = null + req_one_access = list(ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) + +/obj/structure/machinery/door/airlock/hybrisa/personal_white/autoname + autoname = TRUE + req_access = null + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) + + +/obj/structure/machinery/door/airlock/hybrisa/personal_solid_white + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/hybrisa/hybrisa_personaldoor_white.dmi' + opacity = TRUE + glass = FALSE + req_access = null + req_one_access = list(ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) + +/obj/structure/machinery/door/airlock/hybrisa/personal_solid_white/autoname + autoname = TRUE + opacity = TRUE + glass = FALSE + req_access = null + req_one_access = list(ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm index 2b05e2c77772..60aaa1af461f 100644 --- a/code/game/machinery/doors/multi_tile.dm +++ b/code/game/machinery/doors/multi_tile.dm @@ -631,3 +631,150 @@ icon = 'icons/obj/structures/doors/2x1almayerdoor_glass.dmi' opacity = FALSE glass = TRUE + +// Hybrisa + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa + openspeed = 4 + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/generic + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/hybrisa/hybrisa_2x1generic.dmi' + opacity = FALSE + glass = TRUE + req_access = null + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/generic/autoname + req_access = null + opacity = FALSE + glass = TRUE + autoname = TRUE + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/generic_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/hybrisa/hybrisa_2x1generic_solid.dmi' + opacity = TRUE + glass = FALSE + req_access = null + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/generic_solid/autoname + autoname = TRUE + opacity = TRUE + glass = FALSE + req_access = null + +// Medical + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/medical + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/hybrisa/hybrisa_2x1medidoor.dmi' + opacity = FALSE + glass = TRUE + req_access = null + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/medical/autoname + autoname = TRUE + opacity = FALSE + glass = TRUE + req_access = null + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/medical_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/hybrisa/hybrisa_2x1medidoor_solid.dmi' + opacity = TRUE + glass = FALSE + req_access = null + req_one_access = list(ACCESS_CIVILIAN_MEDBAY, ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_CIVILIAN_PUBLIC) + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/medical_solid/autoname + autoname = TRUE + opacity = TRUE + glass = FALSE + req_access = null + req_one_access = list(ACCESS_CIVILIAN_MEDBAY, ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_CIVILIAN_PUBLIC) + +// Personal +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/personal + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/hybrisa/hybrisa_2x1personaldoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_access = null + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/personal/autoname + autoname = TRUE + opacity = FALSE + glass = TRUE + req_access = null + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/personal_solid + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/hybrisa/hybrisa_2x1personaldoor.dmi' + opacity = TRUE + glass = FALSE + req_access = null + req_one_access = list(ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/personal_solid/autoname + autoname = TRUE + opacity = TRUE + glass = FALSE + req_access = null + req_one_access = list(ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) + +// Personal White + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/personal_white + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/hybrisa/hybrisa_2x1personaldoor_glass_white.dmi' + opacity = FALSE + glass = TRUE + req_access = null + req_one_access = list(ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/personal_white/autoname + autoname = TRUE + opacity = FALSE + glass = TRUE + req_access = null + req_one_access = list(ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) + + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/personal_solid_white + name = "\improper Airlock" + icon = 'icons/obj/structures/doors/hybrisa/hybrisa_2x1personaldoor_white.dmi' + opacity = TRUE + glass = FALSE + req_access = null + req_one_access = list(ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/personal_solid_white/autoname + autoname = TRUE + opacity = TRUE + glass = FALSE + req_access = null + req_one_access = list(ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) + +// Black Research Doors + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/black_double + icon = 'icons/obj/structures/doors/2x1almayerdoor_glass.dmi' + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/black_double/autoname + autoname = TRUE + opacity = FALSE + glass = TRUE + req_one_access = list(ACCESS_CIVILIAN_RESEARCH, ACCESS_CIVILIAN_COMMAND, ACCESS_WY_COLONIAL) + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/black_double/solid + icon = 'icons/obj/structures/doors/2x1almayerdoor.dmi' + opacity = TRUE + glass = FALSE + +/obj/structure/machinery/door/airlock/multi_tile/hybrisa/black_double/solid/autoname + autoname = TRUE + opacity = TRUE + glass = FALSE diff --git a/code/game/machinery/doors/poddoor/poddoor.dm b/code/game/machinery/doors/poddoor/poddoor.dm index 84bc8d91cd69..86932a3e7441 100644 --- a/code/game/machinery/doors/poddoor/poddoor.dm +++ b/code/game/machinery/doors/poddoor/poddoor.dm @@ -115,3 +115,117 @@ icon_state = "" unslashable = TRUE unacidable = TRUE + +// Hybrisa Shutters + +/obj/structure/machinery/door/poddoor/hybrisa + icon = 'icons/obj/structures/doors/hybrisashutters.dmi' + icon_state = "almayer_pdoor1" + base_icon_state = "almayer_pdoor" + openspeed = 4 + /// Whether this can be destroyed by a vehicle bump + var/vehicle_resistant = TRUE + +/obj/structure/machinery/door/poddoor/hybrisa/open_shutters/Initialize() + . = ..() + if(opacity) + set_opacity(0) + +/obj/structure/machinery/door/poddoor/hybrisa/open_shutters/open() + if(operating) //doors can still open when emag-disabled + return + + if(!density) // We check density instead of opacity + return TRUE + + operating = TRUE + + playsound(loc, 'sound/machines/blastdoor.ogg', 20, 0) + flick("[base_icon_state]c0", src) + icon_state = "[base_icon_state]0" + set_opacity(0) + + addtimer(CALLBACK(src, PROC_REF(finish_open)), openspeed) + return TRUE + +/obj/structure/machinery/door/poddoor/hybrisa/open_shutters + name = "\improper shutters" + desc = null + icon_state = "almayer_pdoor1" + base_icon_state = "almayer_pdoor" + opacity = FALSE + vehicle_resistant = FALSE + unslashable = FALSE + gender = PLURAL + health = 200 + +/obj/structure/machinery/door/poddoor/hybrisa/open_shutters/bullet_act(obj/projectile/P) + health -= P.damage + ..() + healthcheck() + return TRUE + +/obj/structure/machinery/door/poddoor/hybrisa/open_shutters/proc/explode() + visible_message(SPAN_DANGER("[src] breaks apart!"), max_distance = 1) + deconstruct(FALSE) + +/obj/structure/machinery/door/poddoor/hybrisa/open_shutters/proc/healthcheck() + if(health <= 0) + explode() + +/obj/structure/machinery/door/poddoor/hybrisa/open_shutters/ex_act(severity) + switch(severity) + if(EXPLOSION_THRESHOLD_LOW to EXPLOSION_THRESHOLD_MEDIUM) + if(prob(50)) + deconstruct(FALSE) + if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) + deconstruct(FALSE) + +/obj/structure/machinery/door/poddoor/hybrisa/open_shutters/attack_alien(mob/living/carbon/xenomorph/current_xenomorph) + if(unslashable) + return XENO_NO_DELAY_ACTION + current_xenomorph.animation_attack_on(src) + playsound(src, 'sound/effects/metalhit.ogg', 25, 1) + current_xenomorph.visible_message(SPAN_DANGER("[current_xenomorph] slashes at [src]!"), + SPAN_DANGER("You slash at [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT) + update_health(rand(current_xenomorph.melee_damage_lower, current_xenomorph.melee_damage_upper)) + return XENO_ATTACK_ACTION + + +/obj/structure/machinery/door/poddoor/hybrisa/shutters + name = "\improper shutters" + desc = null + icon_state = "shutter1" + base_icon_state = "shutter" + gender = PLURAL + vehicle_resistant = FALSE + +/obj/structure/machinery/door/poddoor/hybrisa/white + name = null + desc = "That looks like it doesn't open easily." + icon_state = "w_almayer_pdoor1" + base_icon_state = "w_almayer_pdoor" + unslashable = TRUE + +/obj/structure/machinery/door/poddoor/hybrisa/secure_red_door + desc = "That looks like it doesn't open easily." + icon_state = "pdoor1" + base_icon_state = "pdoor" + unslashable = TRUE + emp_proof = TRUE + +/obj/structure/machinery/door/poddoor/hybrisa/secure_red_door/emp_act(power, severity) + ..() + return TRUE + +/obj/structure/machinery/door/poddoor/hybrisa/ultra_reinforced_door + desc = "A heavily reinforced metal-alloy door, designed to be virtually indestructible—nothing can penetrate its defenses." + icon_state = "udoor1" + base_icon_state = "udoor" + unslashable = TRUE + emp_proof = TRUE + openspeed = 6 + +/obj/structure/machinery/door/poddoor/hybrisa/ultra_reinforced_door/emp_act(power, severity) + ..() + return TRUE diff --git a/code/game/machinery/doors/runed_sandstone.dm b/code/game/machinery/doors/runed_sandstone.dm index e51877395d75..20a149494be2 100644 --- a/code/game/machinery/doors/runed_sandstone.dm +++ b/code/game/machinery/doors/runed_sandstone.dm @@ -4,7 +4,7 @@ mineral = "runed sandstone" no_panel = TRUE not_weldable = TRUE - use_power = FALSE + use_power = USE_POWER_NONE autoclose = FALSE locked = TRUE icon_state = "door_locked" diff --git a/code/game/machinery/fusion_engine.dm b/code/game/machinery/fusion_engine.dm index ab84f7b89c94..ea8f0068cbf9 100644 --- a/code/game/machinery/fusion_engine.dm +++ b/code/game/machinery/fusion_engine.dm @@ -20,8 +20,6 @@ power_machine = TRUE throwpass = FALSE - ///Whether the reactor is functional - var/is_on = TRUE ///Whether the reactor is on the ship var/is_ship_reactor = FALSE ///If the generator is overloaded diff --git a/code/game/machinery/hybrisa_lights.dm b/code/game/machinery/hybrisa_lights.dm new file mode 100644 index 000000000000..d3f35f35e3b6 --- /dev/null +++ b/code/game/machinery/hybrisa_lights.dm @@ -0,0 +1,142 @@ +// Hybrisa Electrical Stuff +/obj/structure/machinery/colony_floodlight_switch/electrified_fence_switch + name = "colony electrified fence switch" + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "panelnopower" + desc = "This switch controls the electrified fences. It only functions when there is power." + machinery_type_whitelist = null + /// The power each fence takes up per process + var/power_usage_per_fence = 5 + +/obj/structure/machinery/colony_floodlight_switch/electrified_fence_switch/LateInitialize() + . = ..() + for(var/obj/structure/fence/electrified/fence as anything in GLOB.all_electric_fences) + fence.breaker_switch = src + +/obj/structure/machinery/colony_floodlight_switch/electrified_fence_switch/Destroy() + for(var/obj/structure/fence/electrified/fence as anything in GLOB.all_electric_fences) + if(fence.breaker_switch == src) + fence.breaker_switch = null + return ..() + +/obj/structure/machinery/colony_floodlight_switch/electrified_fence_switch/process() + var/machinepower = calculate_current_power_usage() + if(is_on) + machinepower += length(GLOB.all_electric_fences) + use_power(machinepower) + +/obj/structure/machinery/colony_floodlight_switch/electrified_fence_switch/update_icon() + if(!ispowered) + icon_state = "panelnopower" + else if(is_on) + icon_state = "panelon" + else + icon_state = "paneloff" + +/obj/structure/machinery/colony_floodlight_switch/electrified_fence_switch/proc/toggle_fences() + for(var/obj/structure/fence/electrified/fence as anything in GLOB.all_electric_fences) + fence.toggle_power() + +/obj/structure/machinery/colony_floodlight_switch/electrified_fence_switch/attack_hand(mob/user as mob) + if(..()) + toggle_fences() + return TRUE + return FALSE + +// Hybrisa Streetlights +/obj/structure/machinery/colony_floodlight/street + name = "colony streetlight" + icon = 'icons/obj/structures/props/64x64_hybrisarandomprops.dmi' + icon_state = "street_off" + layer = BILLBOARD_LAYER + +/obj/structure/machinery/colony_floodlight/street/Initialize(mapload, ...) + . = ..() + AddComponent(/datum/component/shimmy_around, east_offset = -15, west_offset = -15) + +/obj/structure/machinery/colony_floodlight/street/update_icon() + if(damaged) + icon_state = "street_dmg" + else if(is_on) + icon_state = "street_on" + else + icon_state = "street_off" + +// Traffic +/obj/structure/machinery/colony_floodlight/traffic + lum_value = 0 + name = "traffic light" + desc = "A traffic light" + icon = 'icons/obj/structures/props/64x64_hybrisarandomprops.dmi' + icon_state = "trafficlight" + bound_width = 32 + bound_height = 32 + density = TRUE + health = 200 + layer = BILLBOARD_LAYER + +/obj/structure/machinery/colony_floodlight/traffic/Initialize(mapload, ...) + . = ..() + AddComponent(/datum/component/shimmy_around, east_offset = -15, west_offset = -15) + +/obj/structure/machinery/colony_floodlight/traffic/update_icon() + if(damaged) + icon_state = "trafficlight_damaged" + else if(is_on) + icon_state = "trafficlight_on" + else + icon_state = "trafficlight" + +/obj/structure/machinery/colony_floodlight/traffic/alt + icon_state = "trafficlight_alt" + +/obj/structure/machinery/colony_floodlight/traffic/alt/update_icon() + if(damaged) + icon_state = "trafficlight_alt_damaged" + else if(is_on) + icon_state = "trafficlight_alt_on" + else + icon_state = "trafficlight_alt" + +// Engineer Floor lights +/obj/structure/machinery/colony_floodlight_switch/engineerconsole_switch + name = "giant alien console" + icon = 'icons/obj/structures/props/64x64_hybrisarandomprops.dmi' + icon_state = "engineerconsole" + desc = "A giant alien console of some kind, unlike anything you've ever seen before. Who knows the purpose of this strange technology..." + use_power = USE_POWER_NONE + needs_power = FALSE + ispowered = TRUE + machinery_type_whitelist = list(/obj/structure/machinery/colony_floodlight/engineer_circular) + +/obj/structure/machinery/colony_floodlight_switch/engineerconsole_switch/LateInitialize() + . = ..() + stop_processing() + +/obj/structure/machinery/colony_floodlight_switch/engineerconsole_switch/update_icon() + return + +/obj/structure/machinery/colony_floodlight_switch/engineerconsole_switch/power_change() + return // It just works + +/obj/structure/machinery/colony_floodlight/engineer_circular + name = "circular light" + icon_state = "engineerlight_off" + desc = "A huge circular light" + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + density = FALSE + unslashable = TRUE + unacidable = TRUE + wrenchable = FALSE + layer = TURF_LAYER + light_color = "#00ffa0" + lum_value = 14 + light_power = 6 + +/obj/structure/machinery/colony_floodlight/engineer_circular/update_icon() + if(damaged) + icon_state = "engineerlight_off" + else if(is_on) + icon_state = "engineerlight_on" + else + icon_state = "engineerlight_off" diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 78f076874652..06aedd911590 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -103,12 +103,15 @@ Class Procs: var/mob/living/carbon/human/operator = null //Had no idea where to put this so I put this here. Used for operating machines with RELAY_CLICK //EQUIP,ENVIRON or LIGHT var/list/component_parts //list of all the parts used to build it, if made from certain kinds of frames. - var/manual = 0 layer = OBJ_LAYER var/machine_processing = 0 // whether the machine is busy and requires process() calls in scheduler. // Please replace this by DF_ISPROCESSING in another refactor --fira - throwpass = 1 + throwpass = TRUE projectile_coverage = PROJECTILE_COVERAGE_MEDIUM var/power_machine = FALSE //Whether the machine should process on power, or normal processor + /// Reverse lookup for a breaker_switch that if specified is controlling us + var/obj/structure/machinery/colony_floodlight_switch/breaker_switch + /// Whether this is toggled on + var/is_on = TRUE /obj/structure/machinery/vv_get_dropdown() . = ..() @@ -140,6 +143,9 @@ Class Procs: var/area/A = get_area(src) if(A) A.remove_machine(src) //takes care of removing machine from power usage + if(breaker_switch) + breaker_switch.machinery_list -= src + breaker_switch = null . = ..() /obj/structure/machinery/initialize_pass_flags(datum/pass_flags_container/PF) @@ -324,6 +330,14 @@ Class Procs: /obj/structure/machinery/proc/get_repair_move_text(include_name = TRUE) return +/obj/structure/machinery/proc/set_is_on(is_on) + src.is_on = is_on + update_icon() + +/obj/structure/machinery/proc/toggle_is_on() + set_is_on(!is_on) + return is_on + // UI related procs \\ /obj/structure/machinery/ui_state(mob/user) diff --git a/code/game/machinery/sentry_holder.dm b/code/game/machinery/sentry_holder.dm index bcea62922bea..e64ea9ea2953 100644 --- a/code/game/machinery/sentry_holder.dm +++ b/code/game/machinery/sentry_holder.dm @@ -117,9 +117,10 @@ turret_path = /obj/structure/machinery/defenses/sentry/premade/deployable/colony /obj/structure/machinery/sentry_holder/wy - health = 200 + health = 400 + icon = 'icons/obj/structures/props/sentry_holder_wy.dmi' desc = "A box that deploys a sentry turret for protecting Weyland-Yutani personnel" - turret_path = /obj/structure/machinery/defenses/sentry/premade/deployable/wy + turret_path = /obj/structure/machinery/defenses/sentry/premade/deployable/colony/wy /obj/structure/machinery/sentry_holder/almayer icon_state = "floor_sentry_installed" diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index db2e58cf325b..c6b01a1d345d 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -20,7 +20,7 @@ desc = "A monitor depicting the ship's current status. It flickers every so often." anchored = TRUE density = FALSE - use_power = FALSE + use_power = USE_POWER_NONE idle_power_usage = 10 var/mode = 0 // 0 = Blank // 1 = Shuttle timer diff --git a/code/game/machinery/vending/cm_vending.dm b/code/game/machinery/vending/cm_vending.dm index 0e27e804d12a..a21bc9fd49fa 100644 --- a/code/game/machinery/vending/cm_vending.dm +++ b/code/game/machinery/vending/cm_vending.dm @@ -73,7 +73,7 @@ IN_USE used for vending/denying . = ..() cm_build_inventory(get_listed_products(), 1, 3) -/obj/structure/machinery/power_change(area/master_area = null) +/obj/structure/machinery/cm_vending/power_change(area/master_area = null) ..() update_icon() diff --git a/code/game/objects/effects/decals/hybrisa_decals.dm b/code/game/objects/effects/decals/hybrisa_decals.dm new file mode 100644 index 000000000000..3137e70e4722 --- /dev/null +++ b/code/game/objects/effects/decals/hybrisa_decals.dm @@ -0,0 +1,214 @@ +/// Hybrisa Decals + +/obj/effect/hybrisa + icon = 'icons/effects/64x64hybrisa_decals.dmi' + icon_state = "weylandyutanilogo1" + layer = TURF_LAYER + plane = FLOOR_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +//Roadlines + +/obj/effect/hybrisa/decal/road + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "Z_W1" +/obj/effect/hybrisa/decal/road/lines1 + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "Z_W1" +/obj/effect/hybrisa/decal/road/lines2 + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "Z_N2" +/obj/effect/hybrisa/decal/road/lines3 + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "Z_S3" +/obj/effect/hybrisa/decal/road/lines4 + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "Z_E4" +/obj/effect/hybrisa/decal/road/lines5 + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "Z_M1" +/obj/effect/hybrisa/decal/road/lines6 + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "Z_M2" +/obj/effect/hybrisa/decal/road/corner + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "Z_corner" +/obj/effect/hybrisa/decal/road/roadmiddle + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "roadlinesmiddle" + + +// Dam Roadlines smaller +/obj/effect/hybrisa/decal/road/road_edge + name = "road" + icon_state = "road_edge_decal1" +/obj/effect/hybrisa/decal/road/road_stop + name = "road" + icon_state = "stop_decal1" + +// Double Roadlines +/obj/effect/hybrisa/decal/doubleroad + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "ZD_W1" +/obj/effect/hybrisa/decal/doubleroad/lines1 + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "ZD_W1" +/obj/effect/hybrisa/decal/doubleroad/lines2 + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "ZD_N2" +/obj/effect/hybrisa/decal/doubleroad/lines3 + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "ZD_S3" +/obj/effect/hybrisa/decal/doubleroad/lines4 + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "ZD_E4" +/obj/effect/hybrisa/decal/doubleroad/lines5 + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "ZD_M1" +/obj/effect/hybrisa/decal/doubleroad/lines6 + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "ZD_M2" + +//Gold lines +/obj/effect/hybrisa/decal/gold + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "Z_S" +/obj/effect/hybrisa/decal/gold/line1 + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "Z_S" +/obj/effect/hybrisa/decal/gold/line2 + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "Z_E" +/obj/effect/hybrisa/decal/gold/line3 + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "Z_N" +/obj/effect/hybrisa/decal/gold/line4 + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "Z_W" + +// Red & White Warning Stripes + +/obj/effect/hybrisa/decal/warning/redandwhite_SEcorner + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "red_SE-out" +/obj/effect/hybrisa/decal/warning/redandwhite_S + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "red_S" +/obj/effect/hybrisa/decal/warning/redandwhite_SWcorner + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "red_SW-out" +/obj/effect/hybrisa/decal/warning/redandwhite_E + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "red_E" +/obj/effect/hybrisa/decal/warning/redandwhite_W + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "red_W" +/obj/effect/hybrisa/decal/warning/redandwhite_NEcorner + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "red_NE-out" +/obj/effect/hybrisa/decal/warning/redandwhite_N + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "red_N" +/obj/effect/hybrisa/decal/warning/redandwhite_NWcorner + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "red_NW-out" + +// Angled Warning-Stripes +/obj/effect/hybrisa/decal/warningstripes_angled + name = "warning stripes" + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "warningstripes_angled" +/obj/effect/hybrisa/decal/warningstripes_angled_corner + name = "warning stripes" + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "warningstripes_angled_corner" + +// Grate + +/obj/effect/hybrisa/decal/grate + name = "solid metal grate" + desc = "A metal grate." + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "zhalfgrate1" + +// 64x64 Decals + +/obj/effect/hybrisa/decal/WY/WY1 + icon = 'icons/effects/64x64hybrisa_decals.dmi' + icon_state = "weylandyutanilogo1" + +/obj/effect/hybrisa/decal/WY/WYworn + icon = 'icons/effects/64x64hybrisa_decals.dmi' + icon_state = "weylandyutanilogo2" + +/obj/effect/hybrisa/decal/roadcross + icon = 'icons/effects/64x64hybrisa_decals.dmi' + icon_state = "roadcross" +/obj/effect/hybrisa/decal/checkpoint_decal + icon = 'icons/effects/64x64hybrisa_decals.dmi' + icon_state = "checkpoint_decal" +/obj/effect/hybrisa/decal/workers_decal + icon = 'icons/effects/64x64hybrisa_decals.dmi' + icon_state = "workers_decal" + +// 128 x 64 Decals + +/obj/effect/hybrisa/decal/wy_huge_logo + name = "Weyland-Yutani Corp. - Building Better Worlds" + icon = 'icons/effects/WY_huge_logo.dmi' + icon_state = "wy_huge_logo" + +/obj/effect/hybrisa/decal/wy_huge_logo/lines + icon_state = "wy_huge_logo_lines" + +// 64x128 Decals +/obj/effect/hybrisa/decal/meridianlogo + icon = 'icons/effects/meridianlogo.dmi' + icon_state = "meridian_left" +/obj/effect/hybrisa/decal/meridianlogo/meridianlogo_left + icon_state = "meridian_left" +/obj/effect/hybrisa/decal/meridianlogo/meridianlogo_right + icon_state = "meridian_right" + +/// Dirt & Grime + +/obj/effect/hybrisa/decal/dirt + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "dirt" + +/obj/effect/hybrisa/decal/dirt_2 + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "dirt_2" + +/obj/effect/hybrisa/decal/bloodtrail + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "bloodtrail" + +/obj/effect/hybrisa/decal/tiretrack + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "tiremarks" + +/obj/effect/hybrisa/decal/trash + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "trash_1" + +/// Engineer_ship +/obj/effect/hybrisa/decal/engineership_corners + icon = 'icons/effects/hybrisa_decals.dmi' + icon_state = "engPlatform_corners" + +/obj/effect/hybrisa/decal/egg_base + name = "strange goop" + desc = null + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "egg_base" + +// Colorable Rug + +/obj/effect/hybrisa/decal/colorable_rug + name = "rug" + icon = 'icons/obj/structures/props/64x64_hybrisarandomprops.dmi' + desc = null + icon_state = "colorable_rug" + layer = TURF_LAYER + density = FALSE diff --git a/code/game/objects/effects/decals/posters.dm b/code/game/objects/effects/decals/posters.dm index f13244cbc058..17e4305a2d34 100644 --- a/code/game/objects/effects/decals/posters.dm +++ b/code/game/objects/effects/decals/posters.dm @@ -125,14 +125,14 @@ icon_state = "poster7" /obj/structure/sign/poster/ad/Initialize() - serial_number = pick(7,8,9,10,11,13,18,22,35,36,37) + serial_number = pick(7,8,9,10,11,13,18,22,35,36,37,43,45,47,48,56,59,70,72) .=..() /obj/structure/sign/poster/art icon_state = "poster6" /obj/structure/sign/poster/art/Initialize() - serial_number = pick(6,23,24) + serial_number = pick(6,23,24,57,58) .=..() /obj/structure/sign/poster/blacklight @@ -174,14 +174,14 @@ icon_state = "poster4" /obj/structure/sign/poster/propaganda/Initialize() - serial_number = pick(4,14,15,20,21,40,41) + serial_number = pick(4,14,15,20,21,40,41,42,49,64,65,73,74,77,79) .=..() /obj/structure/sign/poster/safety icon_state = "poster27" /obj/structure/sign/poster/safety/Initialize() - serial_number = pick(27,28,30,31) + serial_number = pick(27,28,30,31,44,66,68,69,71,75,78,80,81,84) .=..() /obj/structure/sign/poster/io @@ -200,3 +200,46 @@ /obj/structure/sign/poster/hero/voteno/Initialize() serial_number = 40 .=..() + + +//////////////// +//Hybrisa Posters// +//////////////// + +/obj/structure/sign/poster/corporate + icon_state = "poster50" + +/obj/structure/sign/poster/corporate/Initialize() + serial_number = pick(50,51,60,61,62,63,67,76,82,83) + .=..() +/obj/structure/sign/poster/kellandmining + icon_state = "poster46" + +/obj/structure/sign/poster/kellandmining/Initialize() + serial_number = 46 + .=..() +/obj/structure/sign/poster/marshalls + icon_state = "poster52" + +/obj/structure/sign/poster/marshalls/Initialize() + serial_number = pick(52,53) + .=..() +/obj/structure/sign/poster/wylogo + icon_state = "poster55" + +/obj/structure/sign/poster/wylogo/Initialize() + serial_number = pick(18,55) + .=..() +/obj/structure/sign/poster/pimp + icon_state = "poster54" + +/obj/structure/sign/poster/pimp/Initialize() + serial_number = 54 + .=..() + +/obj/structure/sign/poster/nspa + icon_state = "poster87" + +/obj/structure/sign/poster/nspa/Initialize() + serial_number = pick(85,86,87) + .=..() diff --git a/code/game/objects/effects/decals/posters/poster_list.dm b/code/game/objects/effects/decals/posters/poster_list.dm index 27d8a06a4125..1d7700ec1070 100644 --- a/code/game/objects/effects/decals/posters/poster_list.dm +++ b/code/game/objects/effects/decals/posters/poster_list.dm @@ -213,3 +213,236 @@ Template icon_state="poster41" name = "Falling Falcons" desc = "Promotional material for the 2nd Company of the 2nd Battalion of the 4th Brigade, the Falling Falcons. Designed by an unknown artist and printed in an effort to bolster the ranks of the Falling Falcons." + +// Hybrisa Posters // + +/// Alien Isolation & Dark Descent - posters used as reference (direct downscale of the image for some) /// +/datum/poster/poster_42 + icon_state="poster42" + name = "Colonial Marines poster" + desc = "Join the Colonial Marines. Enlist today, protect tomorrow!" + +/datum/poster/poster_43 + icon_state="poster43" + name = "Koorlander Gold" + desc = "Koorlander - lovingly machine-rolled for YOUR pleasure." + +/datum/poster/poster_44 + icon_state="poster44" + name = "Safety poster" + desc = "WASTE damages PROFIT - Think On!" + +/datum/poster/poster_45 + icon_state="poster45" + name = "Pizza Galaxy poster" + desc = "This poster depicts a delicious looking slice of Pizza, Yum." + +/datum/poster/poster_46 + icon_state="poster46" + name = "Kelland Mining co. poster" + desc = "A simplified version of the Kelland Mining co. logo.The Kelland Mining Company is owned by Prospectia, a sub-division of the San Rei Corporation, which is in turn owned by the Weyland-Yutani Corporation." + +/datum/poster/poster_47 + icon_state="poster47" + name = "EAT" + desc = "This is less of a poster and more of an advertisement for those gross power bars." + +/datum/poster/poster_48 + icon_state="poster48" + name = "Classic Cola poster" + desc = "This poster depicts a classic cola can. With a taste that's been around for centuries. Nobody can beat it." + +/datum/poster/poster_49 + icon_state="poster49" + name = "Colonial Marines poster" + desc = "Join the Colonial Marines. Enlist today, protect tomorrow!" + +/datum/poster/poster_50 + icon_state="poster50" + name = "Synthetic 'Daniel' poster" + desc = "An ominous forward facing profile of the Synthetic model 'Daniel'. Not quite a second generation model but something inbetween, suited for the needs of colonists. The poster is more art then an advertisement." + +/datum/poster/poster_51 + icon_state="poster51" + name = "Synthetic 'Daniel' poster" + desc = "An ominous side facing profile of the Synthetic model 'Daniel'. Not quite a second generation model but something inbetween, suited for the needs of colonists. The poster is more art then an advertisement." + +/datum/poster/poster_52 + icon_state="poster52" + name = "Colonial Marshalls poster" + desc = "To live, to serve, wherever humanity roams." + +/datum/poster/poster_53 + icon_state="poster53" + name = "Colonial Marshalls poster" + desc = "The laws of Earth stretch beyond the Sol: The Colonial Marshals." + +/datum/poster/poster_54 + icon_state="poster54" + name = "Pimp Clown poster" + desc = "Always returning. Always watching." + +/datum/poster/poster_55 + icon_state="poster55" + name = "Weyland-Yutani poster" + desc = "You don't have much choice in brand loyalty when there's basically only one brand." + +/datum/poster/poster_56 + icon_state="poster56" + name = "Koorlander Gold" + desc = "Koorlander Golds, lovingly machine rolled for YOUR pleasure." + +/datum/poster/poster_57 + icon_state="poster57" + name = "art?" + desc = "This poster depicts some curved lines that some pretentious art snob valued at over $12,000,000. Too bad this is just a low-resolution print." + +/datum/poster/poster_58 + icon_state="poster58" + name = "art?" + desc = "This poster depicts outsider geometric postmodern ascetic abject social expressionism art...you think." + +/datum/poster/poster_59 + icon_state="poster59" + name = "Davenport Gin poster" + desc = "On your way back home? Toast your return with Davenport gin." + +/datum/poster/poster_60 + icon_state="poster60" + name = "Weyland Yutani - 'Daniel' Model Synthetic poster" + desc = "A poster depicting a child in the arms of a Weyland Yutani 'Daniel' model Synthetic, Who thought this was a good idea?" + +/datum/poster/poster_61 + icon_state="poster61" + name = "Safety poster" + desc = "Silence is not a Virtue - Do Not Share Sensitive Information..." + +/datum/poster/poster_62 + icon_state="poster62" + name = "Synthetic 'Daniel' poster" + desc = "An ominous forward facing profile of the Synthetic model 'Daniel'. Not quite a second generation model but something inbetween, suited for the needs of colonists. The poster is more art then an advertisement." + +/datum/poster/poster_63 + icon_state="poster63" + name = "Synthetic 'Daniel' poster" + desc = "An ominous side facing profile of the Synthetic model 'Daniel'. Not quite a second generation model but something inbetween, suited for the needs of colonists. The poster is more art then an advertisement." + +/datum/poster/poster_64 + icon_state="poster64" + name = "Colonial Marine Corps poster" + desc = "Every Paycheck a Fortune! Every Formation a Parade! - Join the Colonial Marines!" + +/datum/poster/poster_65 + icon_state="poster65" + name = "Colonial Marine Corps poster" + desc = "This poster depicts the logo of the Colonial Marine Corps, Oorah!" + +/datum/poster/poster_66 + icon_state="poster66" + name = "Safety poster" + desc = "Save Resources! Switch Off Before You Clock Off." + +/datum/poster/poster_67 + icon_state="poster67" + name = "Weyland Yutani - 'Daniel' Model Synthetic poster" + desc = "A poster depicting a child holding the hands of a Weyland Yutani 'Daniel' model Synthetic, Who thought this was a good idea?" + +/datum/poster/poster_68 + icon_state="poster68" + name = "Safety poster" + desc = "Clutter Clouds the Mind - Clean Workstation = Clear Head!" + +/datum/poster/poster_69 + icon_state="poster69" + name = "Safety poster" + desc = "NO foreign objects allowed - that means YOU Smokey Joe!" + +/datum/poster/poster_70 + icon_state="poster70" + name = "Souto Blue" + desc = "Souto Blue. If you don't drink Souto, you probably do stuff like floss and value your kidneys...wimp. Printed in Havana." + +/datum/poster/poster_71 + icon_state="poster71" + name = "Safety poster" + desc = "REMEMBER - Check Once, Twice, Thrice!" + +/datum/poster/poster_72 + icon_state="poster72" + name = "Souto Lime" + desc = "Souto Lime. If you don't drink Souto, you probably do stuff like floss and value your kidneys...wimp. Printed in Havana." + +/datum/poster/poster_73 + icon_state="poster73" + name = "Colonial Marine Corps poster" + desc = "YOU GIVE US WINGS, WINGS OF LIBERTY - United States Colonial Marines." + +/datum/poster/poster_74 + icon_state="poster74" + name = "Colonial Marine Corps poster" + desc = "USCM MARINES - FIRST TO FIGHT." + +/datum/poster/poster_75 + icon_state="poster75" + name = "Safety poster" + desc = "DO NOT APPROACH SUSPICIOUS OBJECTS - CALL SECURITY." + +/datum/poster/poster_76 + icon_state="poster76" + name = "Weyland Yutani - 'Daniel' Model Synthetic poster" + desc = "All that matters is YOUR comfort. Our Artificial Humans are watching your back." + +/datum/poster/poster_77 + icon_state="poster77" + name = "Colonial Marine Corps poster" + desc = "Join the elite 'Recon Division of the United States Colonial Marine Corps', and become the unseen force that strikes fear into the hearts of our enemies. Harness your instinct, adaptability, and unwavering focus as you navigate hostile territories on distant planets." + +/datum/poster/poster_78 + icon_state="poster78" + name = "Safety poster" + desc = "CLEAN UP AFTER YOURSELF! CLEAN SPACE - CLEAR MIND." + +/datum/poster/poster_79 + icon_state="poster79" + name = "Colonial Marine Corps poster" + desc = "No one stands alone with the United States Colonial Marines - JOIN US!" + +/datum/poster/poster_80 + icon_state="poster80" + name = "Safety poster" + desc = "DON'T OPEN UNKNOWN CONTAINERS - AVOID VERMIN!" + +/datum/poster/poster_81 + icon_state="poster81" + name = "Safety poster" + desc = "THIS IS A QUIET ZONE - PLEASE TALK SOFTLY." + +/datum/poster/poster_82 + icon_state="poster82" + name = "Weyland-Yutani propaganda poster" + desc = "TOGETHER - EXTRASOLAR COLONIZATION - WEAPON - PROTECTION - HIGH TECHNOLOGY - MANUFACTURING SYNTHETICS - FUTURE - SPACE STATION. Weyland Yutani - Building better Worlds." + +/datum/poster/poster_83 + icon_state="poster83" + name = "Weyland-Yutani propaganda poster" + desc = "LET'S WORK - TOGETHER WE BUILD A BETTER FUTURE." + +/datum/poster/poster_84 + icon_state="poster84" + name = "Safety poster" + desc = "GERMS HATE SOAP - DON'T forget to wash your hands." + +/datum/poster/poster_85 + icon_state="poster85" + name = "NSPA poster" + desc = "A recruitment poster for the NSPA. Integrity, Justice, Unity—Together, We Keep the Peace." + +/datum/poster/poster_86 + icon_state="poster86" + name = "NSPA poster" + desc = "A recruitment poster for the NSPA. Serve with Honor, Protect with Strength." + +/datum/poster/poster_87 + icon_state="poster87" + name = "NSPA poster" + desc = "A recruitment poster for the NSPA. One Law, One Duty, One Force—Join the NSPA." diff --git a/code/game/objects/effects/landmarks/corpsespawner.dm b/code/game/objects/effects/landmarks/corpsespawner.dm index cbcd8f906ec8..c715298589bd 100644 --- a/code/game/objects/effects/landmarks/corpsespawner.dm +++ b/code/game/objects/effects/landmarks/corpsespawner.dm @@ -88,6 +88,7 @@ name = "Burst Weyland-Yutani Corporate Security Lead" equip_path = /datum/equipment_preset/corpse/pmc/goon/lead/burst + ///CM specific jobs/// /obj/effect/landmark/corpsespawner/colonist //default is a colonist @@ -210,3 +211,144 @@ /obj/effect/landmark/corpsespawner/forecon_spotter name = "USCM Reconnaissance Spotter" equip_path = /datum/equipment_preset/corpse/forecon_spotter + + +/////////////////////// +/////// HYBRISA /////// +/////////////////////// + +// Hybrisa - Goons + +/obj/effect/landmark/corpsespawner/hybrisa_goon + name = "Weyland-Yutani Corporate Security Officer" + equip_path = /datum/equipment_preset/corpse/pmc/hybrisa_goon + +/obj/effect/landmark/corpsespawner/hybrisa_goon/burst + name = "Burst Weyland-Yutani Corporate Security Officer" + equip_path = /datum/equipment_preset/corpse/pmc/hybrisa_goon/lead/burst + +/obj/effect/landmark/corpsespawner/hybrisa_goon/lead + name = "Weyland-Yutani Corporate Security Lead" + equip_path = /datum/equipment_preset/corpse/pmc/hybrisa_goon/lead + +/obj/effect/landmark/corpsespawner/hybrisa_goon/lead/burst + name = "Burst Weyland-Yutani Corporate Security Lead" + equip_path = /datum/equipment_preset/corpse/pmc/hybrisa_goon/lead/burst + +//*****************************************************************************************************/ + +// Civilian + +/obj/effect/landmark/corpsespawner/hybrisa/civilian + name = "Corpse - Civilian" + equip_path = /datum/equipment_preset/corpse/hybrisa/civilian + +/obj/effect/landmark/corpsespawner/hybrisa/civilian/burst + name = "Corpse - Burst - Civilian" + equip_path = /datum/equipment_preset/corpse/hybrisa/civilian/burst + +/obj/effect/landmark/corpsespawner/hybrisa/civilian_office + name = "Corpse - Civilian - Office Worker" + equip_path = /datum/equipment_preset/corpse/hybrisa/civilian_office + +/obj/effect/landmark/corpsespawner/hybrisa/civilian_office/burst + name = "Corpse - Burst - Civilian - Office Worker" + equip_path = /datum/equipment_preset/corpse/hybrisa/civilian_office/burst + +// Weymart + +/obj/effect/landmark/corpsespawner/hybrisa/weymart + name = "Corpse - Civilian - Weymart Employee" + equip_path = /datum/equipment_preset/corpse/hybrisa/weymart + +/obj/effect/landmark/corpsespawner/hybrisa/weymart/burst + name = "Corpse - Burst - Civilian - Weymart Employee" + equip_path = /datum/equipment_preset/corpse/hybrisa/weymart/burst + +// Sanitation + +/obj/effect/landmark/corpsespawner/hybrisa/sanitation + name = "Corpse - Civilian - Material Reprocessing Technician" + equip_path = /datum/equipment_preset/corpse/hybrisa/sanitation + +/obj/effect/landmark/corpsespawner/hybrisa/sanitation/burst + name = "Corpse - Burst - Civilian - Material Reprocessing Technician" + equip_path = /datum/equipment_preset/corpse/hybrisa/sanitation/burst + +// Pizza Galaxy + +/obj/effect/landmark/corpsespawner/hybrisa/pizza_galaxy + name = "Corpse - Civilian - Pizza Galaxy Delivery Driver" + equip_path = /datum/equipment_preset/corpse/hybrisa/pizza_galaxy + +/obj/effect/landmark/corpsespawner/hybrisa/pizza_galaxy/burst + name = "Corpse - Burst - Civilian - Pizza Galaxy Delivery Driver" + equip_path = /datum/equipment_preset/corpse/hybrisa/pizza_galaxy/burst + +//*****************************************************************************************************/ + +// Colonial Marshals + +/obj/effect/landmark/corpsespawner/hybrisa/nspa_constable + name = "Corpse - NSPA Constable" + equip_path = /datum/equipment_preset/corpse/hybrisa/nspa_constable + +/obj/effect/landmark/corpsespawner/hybrisa/nspa_constable/burst + name = "Corpse - Burst - NSPA Constable" + equip_path = /datum/equipment_preset/corpse/hybrisa/nspa_constable/burst + +//*****************************************************************************************************/ + +// KMCC Mining + +/obj/effect/landmark/corpsespawner/hybrisa/kelland_miner + name = "Corpse - KMCC - Miner" + equip_path = /datum/equipment_preset/corpse/hybrisa/kelland_miner + +/obj/effect/landmark/corpsespawner/hybrisa/kelland_miner/burst + name = "Corpse - Burst - KMCC - Miner" + equip_path = /datum/equipment_preset/corpse/hybrisa/kelland_miner/burst + +//*****************************************************************************************************/ + +// Medical + +/obj/effect/landmark/corpsespawner/hybrisa/medical_doctor_corpse + + name = "Corpse - Civilian - Medical Doctor" + equip_path = /datum/equipment_preset/corpse/hybrisa/medical_doctor_corpse + +/obj/effect/landmark/corpsespawner/hybrisa/medical_doctor_corpse/burst + + name = "Corpse - Burst - Civilian - Medical Doctor" + equip_path = /datum/equipment_preset/corpse/hybrisa/medical_doctor_corpse/burst + +//*****************************************************************************************************/ + +// Science + +// Xenobiologist + +/obj/effect/landmark/corpsespawner/hybrisa/scientist_xenobiologist + + name = "Corpse - Civilian - Xenobiologist" + equip_path = /datum/equipment_preset/corpse/hybrisa/scientist_xenobiologist + +/obj/effect/landmark/corpsespawner/hybrisa/scientist_xenobiologist/burst + + name = "Corpse - Burst - Civilian - Xenobiologist" + equip_path = /datum/equipment_preset/corpse/hybrisa/scientist_xenobiologist/burst + +// Xenoarchaeologist + +/obj/effect/landmark/corpsespawner/hybrisa/scientist_xenoarchaeologist + + name = "Corpse - Civilian - Xenoarchaeologist" + equip_path = /datum/equipment_preset/corpse/hybrisa/scientist_xenoarchaeologist + +/obj/effect/landmark/corpsespawner/hybrisa/scientist_xenoarchaeologist/burst + + name = "Corpse - Burst - Civilian - Xenoarchaeologist" + equip_path = /datum/equipment_preset/corpse/hybrisa/scientist_xenoarchaeologist/burst + +//*****************************************************************************************************/ diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 0d6704207629..c958b1ad6ea9 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -264,6 +264,9 @@ cases. Override_icon_state should be a list.*/ if("classic") icon_state = new_icon_state ? new_icon_state : "c_" + icon_state item_state = new_item_state ? new_item_state : "c_" + item_state + if("urban") + icon_state = new_icon_state ? new_icon_state : "u_" + icon_state + item_state = new_item_state ? new_item_state : "u_" + item_state if(new_protection) min_cold_protection_temperature = new_protection diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 8316da964ae8..8807f2ef2032 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -251,6 +251,27 @@ icon_state = "cmbdep" paygrade = PAY_SHORT_CMBD +/obj/item/card/id/nspa_silver + name = "\improper NSPA silver badge" + desc = "The silver badge which represents that the wearer is a NSPA Constable. It is a sign of justice, authority, and protection. Protecting those who can't. This badge represents a commitment to a sworn oath always kept." + icon_state = "nspa_silver" + item_state = "silver_id" + paygrade = PAY_SHORT_CST + +/obj/item/card/id/nspa_silver_gold + name = "\improper NSPA silver & gold badge" + desc = "The silver with gold accents badge which represents that the wearer is a NSPA Senior Constable to Sergeant. It is a sign of justice, authority, and protection. Protecting those who can't. This badge represents a commitment to a sworn oath always kept." + icon_state = "nspa_silverandgold" + item_state = "silver_id" + paygrade = PAY_SHORT_SGT + +/obj/item/card/id/nspa_gold + name = "\improper NSPA gold badge" + desc = "A gold badge signifying that the wearer is one of the higher ranks of the NSPA, usually Inspectors and above. It is a sign of justice, authority, and protection. Protecting those who can't. This badge represents a commitment to a sworn oath always kept." + icon_state = "nspa_gold" + item_state = "gold_id" + paygrade = PAY_SHORT_CINSP + /obj/item/card/id/general name = "general officer holo-badge" desc = "Top brass of the top brass. Issued to only the most dedicated." diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 5842b3204f47..4cda12833ade 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -1133,6 +1133,16 @@ icon_state = "wy_headset" initial_keys = list(/obj/item/device/encryptionkey/WY, /obj/item/device/encryptionkey/cmb) +/obj/item/device/radio/headset/distress/NSPA + name = "NSPA Headset" + desc = "NSPA headset." + frequency = RMC_FREQ + icon_state = "vai_headset" + initial_keys = list(/obj/item/device/encryptionkey/public, /obj/item/device/encryptionkey/royal_marine) + has_hud = TRUE + hud_type = MOB_HUD_FACTION_NSPA + volume = RADIO_VOLUME_IMPORTANT + /obj/item/device/radio/headset/almayer/highcom name = "USCM High Command headset" desc = "Issued to members of USCM High Command and their immediate subordinates. Channels are as follows: :v - marine command, :p - military police, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad, :n - engineering, :m - medbay, :u - requisitions, :j - JTAC, :t - intel, :z - HighCom" diff --git a/code/game/objects/items/explosives/plastic.dm b/code/game/objects/items/explosives/plastic.dm index c6a3dfaed5f9..9c9f2f446fc1 100644 --- a/code/game/objects/items/explosives/plastic.dm +++ b/code/game/objects/items/explosives/plastic.dm @@ -392,3 +392,7 @@ return FALSE . = ..() +/obj/item/explosive/plastic/hybrisa/mining + var/id = 1 + anchored = TRUE + unacidable = TRUE diff --git a/code/game/objects/items/reagent_containers/food/drinks.dm b/code/game/objects/items/reagent_containers/food/drinks.dm index 0a350aa851e2..21dc57fc182a 100644 --- a/code/game/objects/items/reagent_containers/food/drinks.dm +++ b/code/game/objects/items/reagent_containers/food/drinks.dm @@ -382,3 +382,11 @@ desc = "A matte gray coffee mug bearing the Weyland-Yutani logo on its front. Either issued as corporate standard, or bought as a souvenir for people who love the Company oh so dearly. Probably the former." icon_state = "wycup" +// Hybrisa + +/obj/item/reagent_container/food/drinks/coffee/cuppa_joes + name = "Cuppa Joe's coffee" + desc = "Have you got the CuppaJoe Smile? Stay perky! Freeze-dried CuppaJoe's Coffee." + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "coffeecuppajoe" + center_of_mass = "x=15;y=10" diff --git a/code/game/objects/items/reagent_containers/food/snacks.dm b/code/game/objects/items/reagent_containers/food/snacks.dm index 4e00f32a9b13..373ecf1959f3 100644 --- a/code/game/objects/items/reagent_containers/food/snacks.dm +++ b/code/game/objects/items/reagent_containers/food/snacks.dm @@ -2927,6 +2927,45 @@ boxes += extra update_icon() +// Pizza Galaxy Pizza + +/obj/item/pizzabox/pizza_galaxy + icon = 'icons/obj/items/pizza_galaxy_pizza.dmi' + +/obj/item/pizzabox/pizza_galaxy/margherita/Initialize() + . = ..() + pizza = new /obj/item/reagent_container/food/snacks/sliceable/pizza/margherita(src) + boxtag = "Margherita Deluxe" + +/obj/item/pizzabox/pizza_galaxy/vegetable/Initialize() + . = ..() + pizza = new /obj/item/reagent_container/food/snacks/sliceable/pizza/vegetablepizza(src) + boxtag = "Gourmet Vegatable" + +/obj/item/pizzabox/pizza_galaxy/mushroom/Initialize() + . = ..() + pizza = new /obj/item/reagent_container/food/snacks/sliceable/pizza/mushroompizza(src) + boxtag = "Mushroom Special" + +/obj/item/pizzabox/pizza_galaxy/meat/Initialize() + . = ..() + pizza = new /obj/item/reagent_container/food/snacks/sliceable/pizza/meatpizza(src) + boxtag = "Meatlover's Supreme" + +/// Mystery Pizza, made with random ingredients! +/obj/item/pizzabox/pizza_galaxy/mystery/Initialize(mapload, ...) + . = ..() + pizza = new /obj/item/reagent_container/food/snacks/sliceable/pizza/mystery(src) + boxtag = "Mystery Pizza" + +// Pre-stacked boxes for reqs +/obj/item/pizzabox/pizza_galaxy/mystery/stack/Initialize(mapload, ...) + . = ..() + for(var/i in 1 to 2) + var/obj/item/pizzabox/pizza_galaxy/mystery/extra = new(src) + boxes += extra + update_icon() + /////////////////////////////////////////// // new old food stuff from bs12 /////////////////////////////////////////// diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index b2a23549c65f..5bcd2b871666 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -350,6 +350,8 @@ GLOBAL_LIST_INIT_TYPED(cardboard_recipes, /datum/stack_recipe, list ( \ null, \ new/datum/stack_recipe("empty magazine box (FN FP9000)", /obj/item/ammo_box/magazine/fp9000/empty), \ null, \ + new/datum/stack_recipe("empty magazine box (FN P90)", /obj/item/ammo_box/magazine/p90/empty), \ + null, \ new/datum/stack_recipe("empty magazine box (Type19)", /obj/item/ammo_box/magazine/type19/empty), \ null, \ new/datum/stack_recipe("empty magazine box (ZhNK-72)", /obj/item/ammo_box/magazine/zhnk/empty), \ diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 805f0ecf4030..0e50f572aec4 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -678,6 +678,13 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r worn_accessible = TRUE xeno_types = null +/obj/item/storage/backpack/marine/smock/select_gamemode_skin() + . = ..() + switch(SSmapping.configs[GROUND_MAP].camouflage_type) + if("urban") + name = "\improper M60 Sniper Cloak" + desc = "A specially-designed cloak with thermal dampering waterproof coating, designed for urban environments. Doesn't have the optical camouflage electronics that more advanced M68 cloak has." + /obj/item/storage/backpack/marine/marsoc name = "\improper USCM SOF IMP tactical rucksack" icon_state = "tacrucksack" @@ -754,7 +761,6 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r unacidable = TRUE explo_proof = TRUE uniform_restricted = list(/obj/item/clothing/suit/storage/marine/M3S) //Need to wear Scout armor and helmet to equip this. - has_gamemode_skin = FALSE //same sprite for all gamemode. var/camo_active = FALSE var/camo_alpha = 10 var/allow_gun_usage = FALSE @@ -762,6 +768,14 @@ GLOBAL_LIST_EMPTY_TYPED(radio_packs, /obj/item/storage/backpack/marine/satchel/r actions_types = list(/datum/action/item_action/specialist/toggle_cloak) +/obj/item/storage/backpack/marine/satchel/scout_cloak/select_gamemode_skin(expected_type, list/override_icon_state, list/override_protection) + . = ..() + switch(SSmapping.configs[GROUND_MAP].camouflage_type) + if("urban") + icon_state = "u_scout_cloak" + else + icon_state = "scout_cloak" + /obj/item/storage/backpack/marine/satchel/scout_cloak/dropped(mob/user) if(ishuman(user) && !issynth(user)) deactivate_camouflage(user, FALSE) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 624628dbf826..89e922335040 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -1082,6 +1082,8 @@ gun_underlay = image(icon, "d_" + current_gun.base_gun_icon) if("classic") gun_underlay = image(icon, "c_" + current_gun.base_gun_icon) + if("urban") + gun_underlay = image(icon, "u_" + current_gun.base_gun_icon) gun_underlay.pixel_x = holster_slots[slot]["icon_x"] gun_underlay.pixel_y = holster_slots[slot]["icon_y"] gun_underlay.color = current_gun.color diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm index c04de364baf7..9ee3927e84f4 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/storage.dm @@ -271,8 +271,9 @@ GLOBAL_LIST_EMPTY_TYPED(item_storage_box_cache, /datum/item_storage_box) click_border_start.Add(startpoint) click_border_end.Add(endpoint) - if(!GLOB.item_storage_box_cache[isb_index]) - var/datum/item_storage_box/box = new() + var/datum/item_storage_box/ISB = GLOB.item_storage_box_cache[isb_index] + if(QDELETED(ISB)) + ISB = new() var/matrix/M_start = matrix() var/matrix/M_continue = matrix() var/matrix/M_end = matrix() @@ -280,13 +281,12 @@ GLOBAL_LIST_EMPTY_TYPED(item_storage_box_cache, /datum/item_storage_box) M_continue.Scale((endpoint-startpoint-stored_cap_width*2)/32,1) M_continue.Translate(startpoint+stored_cap_width+(endpoint-startpoint-stored_cap_width*2)/2 - 16,0) M_end.Translate(endpoint-stored_cap_width,0) - box.start.apply_transform(M_start) - box.continued.apply_transform(M_continue) - box.end.apply_transform(M_end) - box.index = isb_index - GLOB.item_storage_box_cache[isb_index] = box + ISB.start.apply_transform(M_start) + ISB.continued.apply_transform(M_continue) + ISB.end.apply_transform(M_end) + ISB.index = isb_index + GLOB.item_storage_box_cache[isb_index] = ISB - var/datum/item_storage_box/ISB = GLOB.item_storage_box_cache[isb_index] stored_ISB = ISB storage_start.overlays += ISB.start @@ -841,8 +841,8 @@ W is always an item. stop_warning prevents messaging. user may be null.**/ QDEL_NULL(storage_start) QDEL_NULL(storage_continue) QDEL_NULL(storage_end) - QDEL_NULL(stored_ISB) QDEL_NULL(closer) + stored_ISB = null return ..() /obj/item/storage/emp_act(severity) diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index d9d40e003c7a..75f67cfa16dc 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -204,3 +204,60 @@ w_class = SIZE_SMALL throw_speed = SPEED_VERY_FAST throw_range = 5 + + +// Hybrisa +/obj/item/trash/hybrisa + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "coffeecuppajoelid" + +// Cuppa Joe's Trash +/obj/item/trash/hybrisa/cuppa_joes/lid + name = "Cuppa Joe's coffee cup lid" + desc = "Have you got the CuppaJoe Smile? Stay perky! Freeze-dried CuppaJoe's Coffee." + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "coffeecuppajoelid" + w_class = SIZE_TINY + throwforce = 1 +/obj/item/trash/hybrisa/cuppa_joes/empty_cup + name = "Empty Cuppa Joe's coffee cup" + desc = "Have you got the CuppaJoe Smile? Stay perky! Freeze-dried CuppaJoe's Coffee." + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "coffeecuppajoenolid" + w_class = SIZE_TINY + throwforce = 1 +/obj/item/trash/hybrisa/cuppa_joes/Initialize() + . = ..() + pixel_x = rand(-10,10) + pixel_y = rand(-10,10) + apply_transform(turn(transform,rand(0,360))) + +// Cuppa Joes no random axis +/obj/item/trash/hybrisa/cuppa_joes_static/lid + name = "Cuppa Joe's coffee cup lid" + desc = "Have you got the CuppaJoe Smile? Stay perky! Freeze-dried CuppaJoe's Coffee." + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "coffeecuppajoelid" + w_class = SIZE_TINY + throwforce = 1 +/obj/item/trash/hybrisa/cuppa_joes_static/empty_cup + name = "Empty Cuppa Joe's coffee cup" + desc = "Have you got the CuppaJoe Smile? Stay perky! Freeze-dried CuppaJoe's Coffee." + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "coffeecuppajoenolid" + w_class = SIZE_TINY + throwforce = 1 +/obj/item/trash/hybrisa/cuppa_joes_static/empty_cup_stack + name = "Empty Cuppa Joe's coffee cup stack" + desc = "Have you got the CuppaJoe Smile? Stay perky! Freeze-dried CuppaJoe's Coffee." + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "coffeecuppajoestacknolid" + w_class = SIZE_TINY + throwforce = 1 +/obj/item/trash/hybrisa/cuppa_joes_static/lid_stack + name = "Cuppa Joe's coffee cup lid stack" + desc = "Have you got the CuppaJoe Smile? Stay perky! Freeze-dried CuppaJoe's Coffee." + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "coffeecuppajoelidstack" + w_class = SIZE_TINY + throwforce = 1 diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 232936c263ae..fe9e873d5a2b 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -114,8 +114,8 @@ var/active = 0 /obj/item/weapon/shield/riot/metal - name = "metal shield" - name = "A metal riot shield effective, but heavy." + name = "metal riot shield" + desc = "A metal riot shield effective, but heavy." icon_state = "riotmetal" item_state = "riotmetal" base_icon_state = "riotmetal" diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 9e0fcf297346..a488b53db28b 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -232,3 +232,8 @@ return -1 return 4 SECONDS + +/obj/structure/Collided(atom/movable/AM) + ..() + // NOTE: We aren't requiring a parent call to ensure this signal is sent + SEND_SIGNAL(src, COMSIG_STRUCTURE_COLLIDED, AM) diff --git a/code/game/objects/structures/barricade/handrail.dm b/code/game/objects/structures/barricade/handrail.dm index 2fde8de3fe98..849d9c133002 100644 --- a/code/game/objects/structures/barricade/handrail.dm +++ b/code/game/objects/structures/barricade/handrail.dm @@ -206,3 +206,87 @@ can_be_reinforced = FALSE projectile_coverage = PROJECTILE_COVERAGE_LOW layer = MOB_LAYER + 0.01 + +/obj/structure/barricade/handrail/pizza + name = "\improper diner half-wall" + icon_state = "hr_sandstone" //temp, getting sprites soontm + color = "#b51c0b" + can_be_reinforced = FALSE + projectile_coverage = PROJECTILE_COVERAGE_LOW + layer = MOB_LAYER + 0.01 + +// Hybrisa Barricades + +/obj/structure/barricade/handrail/hybrisa + icon_state = "plasticroadbarrierred" + stack_amount = 0 //we do not want it to drop any stuff when destroyed + destroyed_stack_amount = 0 + +// Plastic +/obj/structure/barricade/handrail/hybrisa/road/plastic + name = "plastic road barrier" + icon_state = "plasticroadbarrierred" + barricade_hitsound = 'sound/effects/thud.ogg' + +/obj/structure/barricade/handrail/hybrisa/road/plastic/red + name = "plastic road barrier" + icon_state = "plasticroadbarrierred" + +/obj/structure/barricade/handrail/hybrisa/road/plastic/blue + name = "plastic road barrier" + icon_state = "plasticroadbarrierblue" + +/obj/structure/barricade/handrail/hybrisa/road/plastic/black + name = "plastic road barrier" + icon_state = "plasticroadbarrierblack" + +//Wood + +/obj/structure/barricade/handrail/hybrisa/road/wood + name = "wood road barrier" + icon_state = "roadbarrierwood" + barricade_hitsound = 'sound/effects/woodhit.ogg' +/obj/structure/barricade/handrail/hybrisa/road/wood/orange + name = "wood road barrier" + icon_state = "roadbarrierwood" +/obj/structure/barricade/handrail/hybrisa/road/wood/blue + name = "wood road barrier" + icon_state = "roadbarrierpolice" + +// Metal Road Barrier + +/obj/structure/barricade/handrail/hybrisa/road/metal + name = "metal road barrier" + icon_state = "centerroadbarrier" + +/obj/structure/barricade/handrail/hybrisa/road/metal/metaltan + name = "metal road barrier" + icon_state = "centerroadbarrier" + +/obj/structure/barricade/handrail/hybrisa/road/metal/metaltan/middle + name = "metal road barrier" + icon_state = "centerroadbarrier_middle" + +/obj/structure/barricade/handrail/hybrisa/road/metal/metaldark + name = "metal road barrier" + icon_state = "centerroadbarrier2" + +/obj/structure/barricade/handrail/hybrisa/road/metal/metaldark/middle + name = "metal road barrier" + icon_state = "centerroadbarrier2_middle" + +/obj/structure/barricade/handrail/hybrisa/road/metal/metaldark2 + name = "metal road barrier" + icon_state = "centerroadbarrier3" + +/obj/structure/barricade/handrail/hybrisa/road/metal/metaldark2/middle + name = "metal road barrier" + icon_state = "centerroadbarrier3_middle" + +/obj/structure/barricade/handrail/hybrisa/road/metal/double + name = "metal road barrier" + icon_state = "centerroadbarrierdouble" + +/obj/structure/barricade/handrail/hybrisa/handrail + name = "handrail" + icon_state = "handrail_hybrisa" diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index ed18c28de6f7..a22b4d1de616 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -75,7 +75,8 @@ LINEN BINS /obj/item/bedsheet/brown icon_state = "sheetbrown" - +/obj/item/bedsheet/colorable + icon_state = "sheetce" /obj/structure/bedsheetbin diff --git a/code/game/objects/structures/crates_lockers/closets/phonebox.dm b/code/game/objects/structures/crates_lockers/closets/phonebox.dm new file mode 100644 index 000000000000..9dcd05b439cf --- /dev/null +++ b/code/game/objects/structures/crates_lockers/closets/phonebox.dm @@ -0,0 +1,208 @@ +/obj/structure/closet/phonebox + name = "phonebox" + desc = "It's a phonebox, outdated but realiable technology. These are used to communicate throughout the colony and connected colonies without interference. As reliable as they are, it seems the line is down." + icon = 'icons/obj/structures/props/phonebox.dmi' + icon_state = "phonebox_on_empty_closed" + density = TRUE + bound_width = 32 + bound_height = 64 + material = MATERIAL_METAL + anchored = TRUE + layer = BETWEEN_OBJECT_ITEM_LAYER + exit_stun = 1 + health = 750 + + open_sound = 'sound/effects/metal_door_open.ogg' + close_sound = 'sound/effects/metal_door_close.ogg' + +/obj/structure/closet/phonebox/update_icon() + icon_state = "phonebox_on_open" + if(!opened) + icon_state = "phonebox_on_empty_closed" + for(var/mob/M in src) + icon_state = "phonebox_on_full_closed" + +/obj/structure/closet/phonebox/off + name = "phonebox" + desc = "It's a phonebox, outdated but realiable technology. These are used to communicate throughout the colony and connected colonies without interference. As reliable as they are, the bulb has been smashed and it seems the line is down." + icon = 'icons/obj/structures/props/phonebox.dmi' + icon_state = "phonebox_off_empty_closed" + density = TRUE + bound_width = 32 + bound_height = 64 + material = MATERIAL_METAL + anchored = TRUE + layer = BETWEEN_OBJECT_ITEM_LAYER + exit_stun = 1 + health = 250 + + open_sound = 'sound/effects/metal_door_open.ogg' + close_sound = 'sound/effects/metal_door_close.ogg' + +/obj/structure/closet/phonebox/off/update_icon() + icon_state = "phonebox_off_open" + if(!opened) + icon_state = "phonebox_off_empty_closed" + for(var/mob/M in src) + icon_state = "phonebox_off_full_closed" + +/obj/structure/closet/phonebox/proc/explode() + visible_message(SPAN_DANGER("[src] breaks apart!"), max_distance = 1) + deconstruct(FALSE) + +/obj/structure/closet/phonebox/proc/healthcheck() + if(health <= 0) + explode() + +/obj/structure/closet/phonebox/ex_act(severity) + switch(severity) + if(EXPLOSION_THRESHOLD_LOW to EXPLOSION_THRESHOLD_MEDIUM) + if(prob(50)) + deconstruct(FALSE) + if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) + deconstruct(FALSE) + +/obj/structure/closet/phonebox/attack_alien(mob/living/carbon/xenomorph/current_xenomorph) + if(unslashable) + return XENO_NO_DELAY_ACTION + current_xenomorph.animation_attack_on(src) + playsound(src, 'sound/effects/metalhit.ogg', 25, 1) + current_xenomorph.visible_message(SPAN_DANGER("[current_xenomorph] slashes at [src]!"), + SPAN_DANGER("You slash at [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT) + update_health(rand(current_xenomorph.melee_damage_lower, current_xenomorph.melee_damage_upper)) + return XENO_ATTACK_ACTION + +// Not currently working fully (don't use) +/obj/structure/machinery/phonebox + name = "phonebox" + icon = 'icons/obj/structures/props/phonebox.dmi' + icon_state = "phonebox_off_empty_closed" + desc = "It's a phonebox, outdated but realiable technology. These are used to communicate throughout the colony and connected colonies without interference. As reliable as they are, it seems the line is down." + bound_width = 32 + bound_height = 64 + density = TRUE + anchored = TRUE + use_power = 0 + can_buckle = TRUE + /// the borg inside + var/mob/living/occupant = null + var/icon_update_tick = 0 + ///stun time upon exiting, if at all + var/exit_stun = 1 + var/open = TRUE + +/obj/structure/machinery/phonebox/Initialize(mapload, ...) + . = ..() + update_icon() + flags_atom |= USES_HEARING + +/obj/structure/machinery/recharge_station/Destroy() + if(occupant) + to_chat(occupant, SPAN_NOTICE(" [name] colapses around you.")) + go_out() + return ..() + +/obj/structure/machinery/phonebox/initialize_pass_flags(datum/pass_flags_container/PF) + ..() + if (PF) + PF.flags_can_pass_all = PASS_HIGH_OVER_ONLY|PASS_AROUND|PASS_OVER_THROW_ITEM + +/obj/structure/machinery/phonebox/process() + update_icon() + +/obj/structure/machinery/phonebox/stop_processing() + update_icon() + +/obj/structure/machinery/phonebox/allow_drop() + return FALSE + +/obj/structure/machinery/phonebox/relaymove(mob/user as mob) + if(user.stat) + return + go_out() + return + +/obj/structure/machinery/phonebox/update_icon() + ..() + if(stat & NOPOWER) + if(!open) + icon_state = "phonebox_off_empty_closed" + if(occupant) + icon_state = "phonebox_off_full_closed" + else + icon_state = "phonebox_off_open" + else + if(!open) + icon_state = "phonebox_on_empty_closed" + if(occupant) + icon_state = "phonebox_on_full_closed" + else + icon_state = "phonebox_on_open" + +/obj/structure/machinery/phonebox/proc/go_out() + if(!occupant) + return + var/mob/living/synth = occupant + if(synth.client) + synth.client.eye = synth.client.mob + synth.client.perspective = MOB_PERSPECTIVE + + synth.forceMove(loc) + if(exit_stun) + synth.Stun(exit_stun) //Action delay when going out of a closet + if(synth.mobility_flags & MOBILITY_MOVE) + synth.visible_message(SPAN_WARNING("[synth] suddenly gets out of [src]!"), SPAN_WARNING("You get out of [src] and get your bearings!")) + + occupant = null + open = TRUE + update_icon() + +/obj/structure/machinery/phonebox/do_buckle(mob/target, mob/user) + return move_mob_inside(target) + +/obj/structure/machinery/phonebox/verb/move_mob_inside(mob/living/M) + if(!open) + return FALSE + if (occupant) + return FALSE + M.stop_pulling() + if(M && M.client) + M.client.perspective = EYE_PERSPECTIVE + M.client.eye = src + M.forceMove(src) + occupant = M + start_processing() + add_fingerprint(usr) + open = FALSE + update_icon() + return TRUE + +/obj/structure/machinery/phonebox/verb/move_eject() + set category = "Object" + set name = "Eject" + + set src in oview(1) + if (usr.stat != 0) + return + go_out() + add_fingerprint(usr) + return + +/obj/structure/machinery/phonebox/attack_hand(mob/living/user) + if(open) + open = FALSE + else + open = TRUE + go_out() + update_icon() + + + +#ifdef OBJECTS_PROXY_SPEECH +// Transfers speech to occupant +/obj/structure/machinery/phonebox/hear_talk(mob/living/sourcemob, message, verb, language, italics) + if(!QDELETED(occupant) && istype(occupant) && occupant.stat != DEAD) + proxy_object_heard(src, sourcemob, occupant, message, verb, language, italics) + else + ..(sourcemob, message, verb, language, italics) +#endif // ifdef OBJECTS_PROXY_SPEECH diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 5620f106b560..4b6cfd1c318c 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -338,6 +338,26 @@ GLOBAL_LIST_INIT(rbarrel_color_list, list(COLOR_SILVER, desc = "A white storage barrel." icon_state = "barrel_white" +/obj/structure/largecrate/random/barrel/medical + name = "white barrel" + desc = "A white storage barrel." + icon_state = "barrel_medical" + +/obj/structure/largecrate/random/barrel/black + name = "black barrel" + desc = "A black storage barrel." + icon_state = "barrel_wy" + +/obj/structure/largecrate/random/barrel/brown + name = "brown barrel" + desc = "A brown storage barrel." + icon_state = "barrel_tan" + +/obj/structure/largecrate/random/barrel/purewhite + name = "white barrel" + desc = "A white storage barrel." + icon_state = "barrel_purewhite" + /obj/structure/largecrate/random/secure name = "secure supply crate" desc = "A secure crate." diff --git a/code/game/objects/structures/crates_lockers/largecrate_supplies.dm b/code/game/objects/structures/crates_lockers/largecrate_supplies.dm index 28f5f5cb3b81..9fc22452d9f6 100644 --- a/code/game/objects/structures/crates_lockers/largecrate_supplies.dm +++ b/code/game/objects/structures/crates_lockers/largecrate_supplies.dm @@ -459,3 +459,49 @@ qdel(src) return TRUE + +// Empty + +/obj/structure/largecrate/empty/secure + name = "secure supply crate" + desc = "A secure crate." + icon_state = "secure_crate_strapped" + var/strapped = TRUE + +/obj/structure/largecrate/empty/secure/attackby(obj/item/W as obj, mob/user as mob) + if (!strapped) + ..() + return + + if (!W.sharp) + to_chat(user, SPAN_NOTICE("You need something sharp to cut off the straps.")) + return + + to_chat(user, SPAN_NOTICE("You begin to cut the straps off [src]...")) + + if (do_after(user, 1.5 SECONDS, INTERRUPT_ALL, BUSY_ICON_GENERIC)) + playsound(loc, 'sound/items/Wirecutter.ogg', 25, 1) + to_chat(user, SPAN_NOTICE("You cut the straps away.")) + icon_state = "secure_crate" + strapped = FALSE + +/obj/structure/largecrate/empty/case + name = "storage case" + desc = "A black storage case." + icon_state = "case" + +/obj/structure/largecrate/empty/case/double + name = "cases" + desc = "A stack of black storage cases." + icon_state = "case_double" + +/obj/structure/largecrate/empty/case/double/unpack() + if(parts_type) + new parts_type(loc, 2) + for(var/obj/thing in contents) + thing.forceMove(loc) + new /obj/structure/largecrate/empty/case(loc) + playsound(src, unpacking_sound, 35) + qdel(src) + +//----------------------------------------------------// diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index 7b08f7520139..337a27ba33c1 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -68,3 +68,34 @@ /obj/structure/curtain/red name = "red curtain" icon_state = "red" + +// Colorable + +/obj/structure/curtain/colorable + name = "curtain" + icon_state = "colorable" + +/obj/structure/curtain/colorable_transparent + name = "blinds" + icon_state = "colorable_transparent" + alpha = 200 + +// Open + +/obj/structure/curtain/open/colorable + name = "curtain" + icon_state = "colorable" + +/obj/structure/curtain/open/colorable_transparent + name = "blinds" + icon_state = "colorable_transparent" + alpha = 200 + +/obj/structure/curtain/open/red + name = "red curtain" + icon_state = "red" + +/obj/structure/curtain/Initialize() + . = ..() + if(alpha) + set_opacity(0) diff --git a/code/game/objects/structures/fence.dm b/code/game/objects/structures/fence.dm index 93d9d7727e5d..8400612fb4d7 100644 --- a/code/game/objects/structures/fence.dm +++ b/code/game/objects/structures/fence.dm @@ -14,6 +14,7 @@ var/cut = 0 //Cut fences can be passed through var/junction = 0 //Because everything is terrible, I'm making this a fence-level var var/basestate = "fence" + var/forms_junctions = TRUE /obj/structure/fence/initialize_pass_flags(datum/pass_flags_container/PF) ..() @@ -68,9 +69,9 @@ /obj/structure/fence/attack_hand(mob/user as mob) if(ishuman(user) && user.a_intent == INTENT_HARM) - var/mob/living/carbon/human/H = user - if(H.species.can_shred(H)) - attack_generic(H, 25) + var/mob/living/carbon/human/human = user + if(human.species.can_shred(human)) + attack_generic(human, 25) //Used by attack_animal /obj/structure/fence/proc/attack_generic(mob/living/user, damage = 0) @@ -80,10 +81,12 @@ healthcheck(1, 1, user) /obj/structure/fence/attack_animal(mob/user as mob) - if(!isanimal(user)) return - var/mob/living/simple_animal/M = user - if(M.melee_damage_upper <= 0) return - attack_generic(M, M.melee_damage_upper) + if(!isanimal(user)) + return + var/mob/living/simple_animal/simple = user + if(simple.melee_damage_upper <= 0) + return + attack_generic(simple, simple.melee_damage_upper) /obj/structure/fence/attackby(obj/item/W, mob/user) @@ -91,26 +94,26 @@ if(!skillcheck(user, SKILL_CONSTRUCTION, SKILL_CONSTRUCTION_ENGI)) to_chat(user, SPAN_WARNING("You don't have the skill needed to fix [src]'s wiring.")) return - var/obj/item/stack/barbed_wire/R = W + var/obj/item/stack/barbed_wire/wire = W var/amount_needed = 2 if(health) amount_needed = 1 - if(R.amount >= amount_needed) - user.visible_message(SPAN_NOTICE("[user] starts repairing [src] with [R]."), - SPAN_NOTICE("You start repairing [src] with [R].")) + if(wire.amount >= amount_needed) + user.visible_message(SPAN_NOTICE("[user] starts repairing [src] with [wire]."), + SPAN_NOTICE("You start repairing [src] with [wire].")) playsound(src.loc, 'sound/items/Wirecutter.ogg', 25, 1) if(do_after(user, 30 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL, BUSY_ICON_FRIENDLY)) - if(R.amount < amount_needed) + if(wire.amount < amount_needed) to_chat(user, SPAN_WARNING("You need more barbed wire to repair [src].")) return - R.use(amount_needed) + wire.use(amount_needed) health = health_max - cut = 0 + cut = FALSE density = TRUE update_icon() playsound(loc, 'sound/items/Wirecutter.ogg', 25, 1) - user.visible_message(SPAN_NOTICE("[user] repairs [src] with [R]."), - SPAN_NOTICE("You repair [src] with [R].")) + user.visible_message(SPAN_NOTICE("[user] repairs [src] with [wire]."), + SPAN_NOTICE("You repair [src] with [wire].")) return else to_chat(user, SPAN_WARNING("You need more barbed wire to repair [src].")) @@ -131,36 +134,37 @@ return if(istype(W, /obj/item/grab) && get_dist(src, user) < 2) - var/obj/item/grab/G = W - if(istype(G.grabbed_thing, /mob/living)) - var/mob/living/M = G.grabbed_thing + var/obj/item/grab/grabby = W + if(istype(grabby.grabbed_thing, /mob/living)) + var/mob/living/grabbed_mob = grabby.grabbed_thing var/state = user.grab_level user.drop_held_item() switch(state) if(GRAB_PASSIVE) - M.visible_message(SPAN_WARNING("[user] slams [M] against \the [src]!")) - M.apply_damage(7) + grabbed_mob.visible_message(SPAN_WARNING("[user] slams [grabbed_mob] against \the [src]!")) + grabbed_mob.apply_damage(7) health -= 10 if(GRAB_AGGRESSIVE) - M.visible_message(SPAN_DANGER("[user] bashes [M] against \the [src]!")) + grabbed_mob.visible_message(SPAN_DANGER("[user] bashes [grabbed_mob] against \the [src]!")) if(prob(50)) - M.apply_effect(1, WEAKEN) - M.apply_damage(10) + grabbed_mob.apply_effect(1, WEAKEN) + grabbed_mob.apply_damage(10) health -= 25 if(GRAB_CHOKE) - M.visible_message(SPAN_DANGER("[user] crushes [M] against \the [src]!")) - M.apply_effect(5, WEAKEN) - M.apply_damage(20) + grabbed_mob.visible_message(SPAN_DANGER("[user] crushes [grabbed_mob] against \the [src]!")) + grabbed_mob.apply_effect(5, WEAKEN) + grabbed_mob.apply_damage(20) health -= 50 - M.attack_log += text("\[[time_stamp()]\] was slammed against [src] by [key_name(user)]") - user.attack_log += text("\[[time_stamp()]\] slammed [key_name(M)] against [src]") - msg_admin_attack("[key_name(user)] slammed [key_name(M)] against [src] at [get_area_name(M)]", M.loc.x, M.loc.y, M.loc.z) + grabbed_mob.attack_log += text("\[[time_stamp()]\] was slammed against [src] by [key_name(user)]") + user.attack_log += text("\[[time_stamp()]\] slammed [key_name(grabbed_mob)] against [src]") + msg_admin_attack("[key_name(user)] slammed [key_name(grabbed_mob)] against [src] at [get_area_name(grabbed_mob)]", grabbed_mob.loc.x, grabbed_mob.loc.y, grabbed_mob.loc.z) - healthcheck(1, 1, M) //The person thrown into the window literally shattered it + healthcheck(1, 1, grabbed_mob) //The person thrown into the window literally shattered it return - if(W.flags_item & NOBLUDGEON) return + if(W.flags_item & NOBLUDGEON) + return if(HAS_TRAIT(W, TRAIT_TOOL_WIRECUTTERS)) user.visible_message(SPAN_NOTICE("[user] starts cutting through [src] with [W]."), @@ -188,7 +192,7 @@ /obj/structure/fence/proc/cut_grille() health = 0 - cut = 1 + cut = TRUE density = FALSE update_icon() //Make it appear cut through! @@ -215,8 +219,9 @@ /obj/structure/fence/proc/update_nearby_icons() update_icon() for(var/direction in GLOB.cardinals) - for(var/obj/structure/fence/W in get_step(src, direction)) - W.update_icon() + for(var/obj/structure/fence/fence in get_step(src, direction)) + if(fence.forms_junctions) + fence.update_icon() //merges adjacent full-tile windows into one (blatant ripoff from game/smoothwall.dm) /obj/structure/fence/update_icon() @@ -224,10 +229,13 @@ //this way it will only update full-tile ones //This spawn is here so windows get properly updated when one gets deleted. spawn(2) - if(!src) return - for(var/obj/structure/fence/W in orange(src, 1)) - if(abs(x - W.x) - abs(y - W.y)) //Doesn't count grilles, placed diagonally to src - junction |= get_dir(src, W) + if(!src) + return + for(var/obj/structure/fence/fence in orange(src, 1)) + if(!fence.forms_junctions) + continue + if(abs(x - fence.x) - abs(y - fence.y)) //Doesn't count grilles, placed diagonally to src + junction |= get_dir(src, fence) if(cut) icon_state = "broken[basestate][junction]" else @@ -238,3 +246,75 @@ health -= floor(exposed_volume / 100) healthcheck(0) //Don't make hit sounds, it's dumb with fire/heat ..() + +GLOBAL_LIST_INIT(all_electric_fences, list()) + +// Hybrisa Electric Fence +/obj/structure/fence/electrified + name = "electrified grille" + desc = "A dark reinforced mesh grille with warning stripes, equipped with Tesla-like coils to regulate high voltage current. It is highly electrified and dangerous when powered." + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "highvoltagegrille_off" + basestate = "highvoltagegrille" + throwpass = TRUE + unacidable = TRUE + forms_junctions = FALSE + var/electrified = FALSE + var/obj/structure/machinery/colony_floodlight_switch/electrified_fence_switch/breaker_switch = null + +/obj/structure/fence/electrified/hitby(atom/movable/AM) + visible_message(SPAN_DANGER("[src] was hit by [AM].")) + var/tforce = 0 + if(ismob(AM)) + if(electrified && !cut) + electrocute_mob(AM, get_area(breaker_switch), src, 0.75) + else + tforce = 40 + else if(isobj(AM)) + var/obj/item/zapped_item = AM + tforce = zapped_item.throwforce + health = max(0, health - tforce) + healthcheck() + +/obj/structure/fence/electrified/update_nearby_icons() + return + +/obj/structure/fence/electrified/update_icon() + if(cut) + icon_state = "[basestate]_broken" + else + if(electrified) + icon_state = "[basestate]" + else + icon_state = "[basestate]_off" + +/obj/structure/fence/electrified/proc/toggle_power() + electrified = !electrified + update_icon() + +/obj/structure/fence/electrified/Initialize() + . = ..() + GLOB.all_electric_fences += src + +/obj/structure/fence/electrified/Destroy() + GLOB.all_electric_fences -= src + return ..() + +/obj/structure/fence/electrified/attackby(obj/item/W, mob/user) + if(electrified && !cut) + electrocute_mob(user, get_area(breaker_switch), src, 0.75) + return ..() + +/obj/structure/fence/electrified/ex_act(severity) + health -= severity/2 + healthcheck(make_hit_sound = FALSE, create_debris = TRUE) + +/obj/structure/fence/dark + name = "fence" + desc = "A large metal mesh strewn between two poles. Intended as a cheap way to separate areas, while allowing one to see through it." + icon = 'icons/obj/structures/props/dark_fence.dmi' + +/obj/structure/fence/dark/warning + name = "fence" + desc = "A large metal mesh strewn between two poles. Intended as a cheap way to separate areas, while allowing one to see through it." + icon = 'icons/obj/structures/props/electric_fence.dmi' diff --git a/code/game/objects/structures/hybrisa_props.dm b/code/game/objects/structures/hybrisa_props.dm new file mode 100644 index 000000000000..2b57c0e3ecf3 --- /dev/null +++ b/code/game/objects/structures/hybrisa_props.dm @@ -0,0 +1,2723 @@ +// Hybrisa props + + + +/obj/structure/prop/hybrisa + icon = 'icons/obj/structures/props/hybrisa_vehicles/small_truck_red.dmi' + icon_state = "pimp" + +// Vehicles + +/obj/structure/prop/hybrisa/vehicles + icon = 'icons/obj/structures/props/hybrisa_vehicles/meridian_red.dmi' + icon_state = "meridian_red" + health = 3000 + var/damage_state = 0 + var/brute_multiplier = 1 + +/obj/structure/prop/hybrisa/vehicles/attack_alien(mob/living/carbon/xenomorph/user) + user.animation_attack_on(src) + take_damage( rand(user.melee_damage_lower, user.melee_damage_upper) * brute_multiplier) + playsound(src, 'sound/effects/metalscrape.ogg', 20, 1) + if(health <= 0) + user.visible_message(SPAN_DANGER("[user] slices [src] apart!"), \ + SPAN_DANGER("We slice [src] apart!"), null, 5, CHAT_TYPE_XENO_COMBAT) + else + user.visible_message(SPAN_DANGER("[user] [user.slashes_verb] [src]!"), \ + SPAN_DANGER("We [user.slash_verb] [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT) + update_icon() + return XENO_ATTACK_ACTION + +/obj/structure/prop/hybrisa/vehicles/update_icon() + switch(health) + if(2500 to 3000) + icon_state = initial(icon_state) + return + if(2000 to 2500) + damage_state = 1 + if(1500 to 2000) + damage_state = 2 + if(1000 to 1500) + damage_state = 3 + if(500 to 1000) + damage_state = 4 + if(0 to 500) + damage_state = 5 + icon_state = "[initial(icon_state)]_damage_[damage_state]" + +/obj/structure/prop/hybrisa/vehicles/get_examine_text(mob/user) + . = ..() + switch(health) + if(2500 to 3000) + . += SPAN_WARNING("It looks to be in good condition.") + if(2000 to 2500) + . += SPAN_WARNING("It looks slightly damaged.") + if(1500 to 2000) + . += SPAN_WARNING("It looks moderately damaged.") + if(1000 to 1500) + . += SPAN_DANGER("It looks heavily damaged.") + if(500 to 1000) + . += SPAN_DANGER("It looks very heavily damaged.") + if(0 to 500) + . += SPAN_DANGER("It looks like it's about break down into scrap.") + +/obj/structure/prop/hybrisa/vehicles/proc/explode(dam, mob/M) + visible_message(SPAN_DANGER("[src] blows apart!"), max_distance = 1) + playsound(loc, 'sound/effects/car_crush.ogg', 20) + var/turf/Tsec = get_turf(src) + new /obj/item/stack/rods(Tsec) + new /obj/item/stack/rods(Tsec) + new /obj/item/stack/sheet/metal(Tsec) + new /obj/item/stack/sheet/metal(Tsec) + new /obj/item/stack/cable_coil/cut(Tsec) + + new /obj/effect/spawner/gibspawner/robot(Tsec) + new /obj/effect/decal/cleanable/blood/oil(src.loc) + + deconstruct(FALSE) +/obj/structure/prop/hybrisa/vehicles/proc/take_damage(dam, mob/M) + if(health) //Prevents unbreakable objects from being destroyed + health -= dam + if(health <= 0) + explode() + else + update_icon() + +/obj/structure/prop/hybrisa/vehicles/bullet_act(obj/projectile/P) + if(P.ammo.damage) + take_damage(P.ammo.damage) + playsound(src, 'sound/effects/metalping.ogg', 35, 1) + update_icon() + +// Armored Truck - Damage States +/obj/structure/prop/hybrisa/vehicles/Armored_Truck + name = "heavy-loader truck" + desc = "It's locked and seems to be broken down, forget driving this." + icon = 'icons/obj/structures/props/hybrisa_vehicles/armored_truck_wy_black.dmi' + icon_state = "armored_truck_wy_black" + bound_height = 64 + bound_width = 96 + density = TRUE + layer = ABOVE_MOB_LAYER + +/obj/structure/prop/hybrisa/vehicles/Armored_Truck/Blue + icon = 'icons/obj/structures/props/hybrisa_vehicles/armored_truck_blue.dmi' + icon_state = "armored_truck_blue" + +/obj/structure/prop/hybrisa/vehicles/Armored_Truck/Teal + icon = 'icons/obj/structures/props/hybrisa_vehicles/armored_truck_teal.dmi' + icon_state = "armored_truck_teal" + +/obj/structure/prop/hybrisa/vehicles/Armored_Truck/White + icon = 'icons/obj/structures/props/hybrisa_vehicles/armored_truck_white.dmi' + icon_state = "armored_truck_white" + +/obj/structure/prop/hybrisa/vehicles/Armored_Truck/WY_Black + name = "Weyland-Yutani security truck" + icon = 'icons/obj/structures/props/hybrisa_vehicles/armored_truck_wy_black.dmi' + icon_state = "armored_truck_wy_black" + +/obj/structure/prop/hybrisa/vehicles/Armored_Truck/WY_White + name = "Weyland-Yutani security truck" + icon = 'icons/obj/structures/props/hybrisa_vehicles/armored_truck_wy_white.dmi' + icon_state = "armored_truck_wy_white" + +// Ambulance - Damage States +/obj/structure/prop/hybrisa/vehicles/Ambulance + name = "ambulance" + desc = "It's locked and seems to be broken down, forget driving this." + icon = 'icons/obj/structures/props/hybrisa_vehicles/ambulance.dmi' + icon_state = "ambulance" + bound_height = 64 + bound_width = 96 + density = TRUE + layer = ABOVE_MOB_LAYER + +// Long Hauler Truck - Damage States +/obj/structure/prop/hybrisa/vehicles/Long_Truck + name = "long-hauler truck" + desc = "It's locked and seems to be broken down, forget driving this." + icon = 'icons/obj/structures/props/hybrisa_vehicles/long_truck_wy_blue.dmi' + icon_state = "longtruck_wy_blue" + bound_height = 64 + bound_width = 128 + density = TRUE + +/obj/structure/prop/hybrisa/vehicles/Long_Truck/Blue + icon = 'icons/obj/structures/props/hybrisa_vehicles/long_truck_blue.dmi' + icon_state = "longtruck_blue" + +/obj/structure/prop/hybrisa/vehicles/Long_Truck/Red + icon = 'icons/obj/structures/props/hybrisa_vehicles/long_truck_red.dmi' + icon_state = "longtruck_red" + +/obj/structure/prop/hybrisa/vehicles/Long_Truck/Brown + icon = 'icons/obj/structures/props/hybrisa_vehicles/long_truck_brown.dmi' + icon_state = "longtruck_brown" + +/obj/structure/prop/hybrisa/vehicles/Long_Truck/Kelland_Mining + icon = 'icons/obj/structures/props/hybrisa_vehicles/long_truck_kelland.dmi' + icon_state = "longtruck_kelland" + +/obj/structure/prop/hybrisa/vehicles/Long_Truck/Donk + icon = 'icons/obj/structures/props/hybrisa_vehicles/long_truck_donk.dmi' + icon_state = "longtruck_donk" + +/obj/structure/prop/hybrisa/vehicles/Long_Truck/WY_Blue + icon = 'icons/obj/structures/props/hybrisa_vehicles/long_truck_wy_blue.dmi' + icon_state = "longtruck_wy_blue" + +/obj/structure/prop/hybrisa/vehicles/Long_Truck/WY_Black + icon = 'icons/obj/structures/props/hybrisa_vehicles/long_truck_wy_black.dmi' + icon_state = "longtruck_wy_black" + +// Small Truck - Damage States +/obj/structure/prop/hybrisa/vehicles/Small_Truck + name = "small truck" + desc = "It's locked and seems to be broken down, forget driving this." + icon = 'icons/obj/structures/props/hybrisa_vehicles/small_truck_turquoise_cargo.dmi' + icon_state = "small_truck_turquoise_cargo" + bound_height = 32 + bound_width = 64 + density = TRUE + layer = ABOVE_MOB_LAYER + +/obj/structure/prop/hybrisa/vehicles/Small_Truck/Turquoise_Cargo + icon = 'icons/obj/structures/props/hybrisa_vehicles/small_truck_turquoise_cargo.dmi' + icon_state = "small_truck_turquoise_cargo" + +/obj/structure/prop/hybrisa/vehicles/Small_Truck/White + icon = 'icons/obj/structures/props/hybrisa_vehicles/small_truck_white.dmi' + icon_state = "small_truck_white" + +/obj/structure/prop/hybrisa/vehicles/Small_Truck/White_Cargo + icon = 'icons/obj/structures/props/hybrisa_vehicles/small_truck_white_cargo.dmi' + icon_state = "small_truck_white_cargo" + +/obj/structure/prop/hybrisa/vehicles/Small_Truck/Mining + icon = 'icons/obj/structures/props/hybrisa_vehicles/small_truck_mining.dmi' + icon_state = "small_truck_mining" + +/obj/structure/prop/hybrisa/vehicles/Small_Truck/Blue + icon = 'icons/obj/structures/props/hybrisa_vehicles/small_truck_blue.dmi' + icon_state = "small_truck_blue" + +/obj/structure/prop/hybrisa/vehicles/Small_Truck/Red + icon = 'icons/obj/structures/props/hybrisa_vehicles/small_truck_red.dmi' + icon_state = "small_truck_red" + +/obj/structure/prop/hybrisa/vehicles/Small_Truck/Brown + icon = 'icons/obj/structures/props/hybrisa_vehicles/small_truck_brown.dmi' + icon_state = "small_truck_brown" + +/obj/structure/prop/hybrisa/vehicles/Small_Truck/Green + icon = 'icons/obj/structures/props/hybrisa_vehicles/small_truck_green.dmi' + icon_state = "small_truck_green" + +/obj/structure/prop/hybrisa/vehicles/Small_Truck/Garbage + icon = 'icons/obj/structures/props/hybrisa_vehicles/small_truck_garbage.dmi' + icon_state = "small_truck_garbage" + +/obj/structure/prop/hybrisa/vehicles/Small_Truck/Brown_Cargo + icon = 'icons/obj/structures/props/hybrisa_vehicles/small_truck_brown_cargo.dmi' + icon_state = "small_truck_brown_cargo" + +/obj/structure/prop/hybrisa/vehicles/Small_Truck/Blue_Cargo + icon = 'icons/obj/structures/props/hybrisa_vehicles/small_truck_blue_cargo.dmi' + icon_state = "small_truck_blue_cargo" + +/obj/structure/prop/hybrisa/vehicles/Small_Truck/Medical_Cargo + icon = 'icons/obj/structures/props/hybrisa_vehicles/small_truck_medical.dmi' + icon_state = "small_truck_medical" + +/obj/structure/prop/hybrisa/vehicles/Small_Truck/Brown_Cargo_Barrels + icon = 'icons/obj/structures/props/hybrisa_vehicles/small_truck_brown_cargobarrels.dmi' + icon_state = "small_truck_brown_cargobarrels" + +// Box Vans - Damage States +/obj/structure/prop/hybrisa/vehicles/Box_Vans + name = "box van" + desc = "It's locked and seems to be broken down, forget driving this." + icon = 'icons/obj/structures/props/hybrisa_vehicles/box_van_hyperdyne.dmi' + icon_state = "box_van_hyperdyne" + bound_height = 32 + bound_width = 64 + density = TRUE + layer = ABOVE_MOB_LAYER + +/obj/structure/prop/hybrisa/vehicles/Box_Vans/Hyperdyne + icon = 'icons/obj/structures/props/hybrisa_vehicles/box_van_hyperdyne.dmi' + icon_state = "box_van_hyperdyne" + +/obj/structure/prop/hybrisa/vehicles/Box_Vans/White + icon = 'icons/obj/structures/props/hybrisa_vehicles/box_van_white.dmi' + icon_state = "box_van_white" + +/obj/structure/prop/hybrisa/vehicles/Box_Vans/Blue_Grey + icon = 'icons/obj/structures/props/hybrisa_vehicles/box_van_bluegrey.dmi' + icon_state = "box_van_bluegrey" + +/obj/structure/prop/hybrisa/vehicles/Box_Vans/Kelland_Mining + icon = 'icons/obj/structures/props/hybrisa_vehicles/box_van_kellandmining.dmi' + icon_state = "box_van_kellandmining" + +/obj/structure/prop/hybrisa/vehicles/Box_Vans/Maintenance_Blue + icon = 'icons/obj/structures/props/hybrisa_vehicles/box_van_maintenanceblue.dmi' + icon_state = "box_van_maintenanceblue" + +/obj/structure/prop/hybrisa/vehicles/Box_Vans/Pizza + icon = 'icons/obj/structures/props/hybrisa_vehicles/box_van_pizza.dmi' + icon_state = "box_van_pizza" + +// Meridian Cars - Damage States +/obj/structure/prop/hybrisa/vehicles/Meridian + name = "Mono-Spectra" + desc = "The 'Mono-Spectra', a mass-produced civilian vehicle for the colonial markets, in and outside of the United Americas. Produced by 'Meridian' a car marque and associated operating division of the Weyland-Yutani Corporation." + icon = 'icons/obj/structures/props/hybrisa_vehicles/meridian_red.dmi' + icon_state = "meridian_red" + bound_height = 32 + bound_width = 64 + density = TRUE + layer = ABOVE_MOB_LAYER + projectile_coverage = PROJECTILE_COVERAGE_LOW + throwpass = TRUE + +/obj/structure/prop/hybrisa/vehicles/Meridian/Red + icon = 'icons/obj/structures/props/hybrisa_vehicles/meridian_red.dmi' + icon_state = "meridian_red" + +/obj/structure/prop/hybrisa/vehicles/Meridian/Black + icon = 'icons/obj/structures/props/hybrisa_vehicles/meridian_black.dmi' + icon_state = "meridian_black" + +/obj/structure/prop/hybrisa/vehicles/Meridian/Blue + icon = 'icons/obj/structures/props/hybrisa_vehicles/meridian_blue.dmi' + icon_state = "meridian_blue" + +/obj/structure/prop/hybrisa/vehicles/Meridian/Brown + icon = 'icons/obj/structures/props/hybrisa_vehicles/meridian_brown.dmi' + icon_state = "meridian_brown" + +/obj/structure/prop/hybrisa/vehicles/Meridian/Cop + icon = 'icons/obj/structures/props/hybrisa_vehicles/meridian_cop.dmi' + icon_state = "meridian_cop" + +/obj/structure/prop/hybrisa/vehicles/Meridian/Desat_Blue + icon = 'icons/obj/structures/props/hybrisa_vehicles/meridian_desatblue.dmi' + icon_state = "meridian_desatblue" + +/obj/structure/prop/hybrisa/vehicles/Meridian/Green + icon = 'icons/obj/structures/props/hybrisa_vehicles/meridian_green.dmi' + icon_state = "meridian_green" + +/obj/structure/prop/hybrisa/vehicles/Meridian/Light_Blue + icon = 'icons/obj/structures/props/hybrisa_vehicles/meridian_lightblue.dmi' + icon_state = "meridian_lightblue" + +/obj/structure/prop/hybrisa/vehicles/Meridian/Pink + icon = 'icons/obj/structures/props/hybrisa_vehicles/meridian_pink.dmi' + icon_state = "meridian_pink" + +/obj/structure/prop/hybrisa/vehicles/Meridian/Purple + icon = 'icons/obj/structures/props/hybrisa_vehicles/meridian_purple.dmi' + icon_state = "meridian_purple" + +/obj/structure/prop/hybrisa/vehicles/Meridian/Turquoise + icon = 'icons/obj/structures/props/hybrisa_vehicles/meridian_turquoise.dmi' + icon_state = "meridian_turquoise" + +/obj/structure/prop/hybrisa/vehicles/Meridian/Orange + icon = 'icons/obj/structures/props/hybrisa_vehicles/meridian_orange.dmi' + icon_state = "meridian_orange" + +/obj/structure/prop/hybrisa/vehicles/Meridian/WeylandYutani + icon = 'icons/obj/structures/props/hybrisa_vehicles/meridian_wy.dmi' + icon_state = "meridian_wy" + +/obj/structure/prop/hybrisa/vehicles/Meridian/Taxi + icon = 'icons/obj/structures/props/hybrisa_vehicles/meridian_taxi.dmi' + icon_state = "meridian_taxi" + +/obj/structure/prop/hybrisa/vehicles/Meridian/Shell + desc = "A Mono-Spectra chassis in the early stages of assembly." + icon = 'icons/obj/structures/props/hybrisa_vehicles/meridian_shell.dmi' + icon_state = "meridian_shell" + +// Colony Crawlers - Damage States +/obj/structure/prop/hybrisa/vehicles/Colony_Crawlers + name = "colony crawler" + desc = "It's locked and seems to be broken down, forget driving this." + icon = 'icons/obj/structures/props/hybrisa_vehicles/crawler_wy_1.dmi' + icon_state = "crawler_wy_1" + bound_height = 32 + bound_width = 64 + density = TRUE + layer = ABOVE_MOB_LAYER + +/obj/structure/prop/hybrisa/vehicles/Colony_Crawlers/Science_1 + desc = "It is a tread bound crawler used in harsh conditions. This one is designed for personnel transportation. Supplied by Orbital Blue International; 'Your friends, in the Aerospace business.' A subsidiary of Weyland Yutani." + icon = 'icons/obj/structures/props/hybrisa_vehicles/crawler_wy_1.dmi' + icon_state = "crawler_wy_1" + +/obj/structure/prop/hybrisa/vehicles/Colony_Crawlers/Science_2 + desc = "It is a tread bound crawler used in harsh conditions. This one is designed for personnel transportation. Supplied by Orbital Blue International; 'Your friends, in the Aerospace business.' A subsidiary of Weyland Yutani." + icon = 'icons/obj/structures/props/hybrisa_vehicles/crawler_wy_2.dmi' + icon_state = "crawler_wy_2" + +/obj/structure/prop/hybrisa/vehicles/Colony_Crawlers/Crawler_Cargo + icon = 'icons/obj/structures/props/hybrisa_vehicles/crawler_bed.dmi' + icon_state = "crawler_bed" + +// Mining Crawlers + +/obj/structure/prop/hybrisa/vehicles/Mining_Crawlers + name = "mining crawler" + desc = "It is a tread bound crawler used in harsh conditions. Supplied by The Kelland Mining Company; A subsidiary of Weyland Yutani." + icon = 'icons/obj/structures/props/hybrisa_vehicles/mining_crawler.dmi' + icon_state = "mining_crawler_1" + bound_height = 32 + bound_width = 64 + density = TRUE + layer = ABOVE_MOB_LAYER + +/obj/structure/prop/hybrisa/vehicles/Mining_Crawlers/Fuel + icon = 'icons/obj/structures/props/hybrisa_vehicles/mining_crawler_fuel.dmi' + icon_state = "mining_crawler_fuel" + +// Car Pileup + +/obj/structure/prop/hybrisa/vehicles/car_pileup + name = "burned out vehicle pileup" + desc = "Burned-out vehicles block your path, their charred frames and shattered glass hinting at recent chaos. The acrid smell of smoke lingers." + icon = 'icons/obj/structures/props/hybrisa_vehicles/car_pileup.dmi' + icon_state = "car_pileup" + bound_height = 96 + bound_width = 128 + unslashable = TRUE + unacidable = TRUE + density = TRUE + layer = 5 + +// Cave props + +/obj/structure/prop/hybrisa/boulders + icon = 'icons/obj/structures/props/boulder_largedark.dmi' + icon_state = "boulder_largedark1" + +/obj/structure/prop/hybrisa/boulders/large_boulderdark + name = "boulder" + desc = "A large rock. It's not cooking anything." + icon = 'icons/obj/structures/props/boulder_largedark.dmi' + icon_state = "boulder_largedark1" + density = TRUE + bound_height = 64 + bound_width = 64 + unslashable = TRUE + unacidable = TRUE +/obj/structure/prop/hybrisa/boulders/large_boulderdark/boulder_dark1 + icon_state = "boulder_largedark1" + +/obj/structure/prop/hybrisa/boulders/large_boulderdark/boulder_dark2 + icon_state = "boulder_largedark2" + +/obj/structure/prop/hybrisa/boulders/large_boulderdark/boulder_dark3 + icon_state = "boulder_largedark3" + +/obj/structure/prop/hybrisa/boulders/wide_boulderdark + name = "boulder" + desc = "A large rock. It's not cooking anything." + icon = 'icons/obj/structures/props/boulder_widedark.dmi' + icon_state = "boulderwidedark" + density = TRUE + bound_height = 32 + bound_width = 64 + unslashable = TRUE + unacidable = TRUE +/obj/structure/prop/hybrisa/boulders/wide_boulderdark/wide_boulder1 + icon_state = "boulderwidedark" + +/obj/structure/prop/hybrisa/boulders/wide_boulderdark/wide_boulder2 + icon_state = "boulderwidedark2" + +/obj/structure/prop/hybrisa/boulders/smallboulderdark + name = "boulder" + icon_state = "bouldersmalldark1" + desc = "A large rock. It's not cooking anything." + icon = 'icons/obj/structures/props/boulder_small.dmi' + unslashable = TRUE + unacidable = TRUE + density = TRUE + +/obj/structure/prop/hybrisa/boulders/smallboulderdark/boulder_dark1 + icon_state = "bouldersmalldark1" + +/obj/structure/prop/hybrisa/boulders/smallboulderdark/boulder_dark2 + icon_state = "bouldersmalldark2" + +/obj/structure/prop/hybrisa/boulders/smallboulderdark/boulder_dark3 + icon_state = "bouldersmalldark3" + + +/obj/structure/prop/hybrisa/cavedecor + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + name = "stalagmite" + icon_state = "stalagmite" + desc = "A cave stalagmite." + layer = TURF_LAYER + plane = FLOOR_PLANE + +/obj/structure/prop/hybrisa/cavedecor/stalagmite0 + icon_state = "stalagmite" + +/obj/structure/prop/hybrisa/cavedecor/stalagmite1 + icon_state = "stalagmite1" + +/obj/structure/prop/hybrisa/cavedecor/stalagmite2 + icon_state = "stalagmite2" + +/obj/structure/prop/hybrisa/cavedecor/stalagmite3 + icon_state = "stalagmite3" + +/obj/structure/prop/hybrisa/cavedecor/stalagmite4 + icon_state = "stalagmite4" + +/obj/structure/prop/hybrisa/cavedecor/stalagmite5 + icon_state = "stalagmite5" + +// Supermart + +/obj/structure/prop/hybrisa/supermart + name = "long rack" + icon_state = "longrack1" + desc = "A long shelf filled with various foodstuffs" + icon = 'icons/obj/structures/props/supermart.dmi' + density = TRUE + projectile_coverage = 20 + throwpass = TRUE + health = 200 + +/obj/structure/prop/hybrisa/supermart/bullet_act(obj/projectile/P) + health -= P.damage + ..() + healthcheck() + return TRUE + +/obj/structure/prop/hybrisa/supermart/proc/explode() + visible_message(SPAN_DANGER("[src] breaks apart!"), max_distance = 1) + deconstruct(FALSE) + +/obj/structure/prop/hybrisa/supermart/proc/healthcheck() + if(health <= 0) + explode() + +/obj/structure/prop/hybrisa/supermart/ex_act(severity) + switch(severity) + if(EXPLOSION_THRESHOLD_LOW to EXPLOSION_THRESHOLD_MEDIUM) + if(prob(50)) + deconstruct(FALSE) + if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) + deconstruct(FALSE) + +/obj/structure/prop/hybrisa/supermart/attack_alien(mob/living/carbon/xenomorph/current_xenomorph) + if(unslashable) + return XENO_NO_DELAY_ACTION + current_xenomorph.animation_attack_on(src) + playsound(src, 'sound/effects/metalhit.ogg', 25, 1) + current_xenomorph.visible_message(SPAN_DANGER("[current_xenomorph] slashes at [src]!"), + SPAN_DANGER("You slash at [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT) + update_health(rand(current_xenomorph.melee_damage_lower, current_xenomorph.melee_damage_upper)) + return XENO_ATTACK_ACTION + +/obj/structure/prop/hybrisa/supermart/rack/longrackempty + name = "shelf" + desc = "A long empty shelf." + icon_state = "longrackempty" + +/obj/structure/prop/hybrisa/supermart/rack/longrack1 + name = "shelf" + desc = "A long shelf filled with various foodstuffs" + icon_state = "longrack1" + +/obj/structure/prop/hybrisa/supermart/rack/longrack2 + name = "shelf" + desc = "A long shelf filled with various foodstuffs" + icon_state = "longrack2" + +/obj/structure/prop/hybrisa/supermart/rack/longrack3 + name = "shelf" + desc = "A long shelf filled with various foodstuffs" + icon_state = "longrack3" + +/obj/structure/prop/hybrisa/supermart/rack/longrack4 + name = "shelf" + desc = "A long shelf filled with various foodstuffs" + icon_state = "longrack4" + +/obj/structure/prop/hybrisa/supermart/rack/longrack5 + name = "shelf" + desc = "A long shelf filled with various foodstuffs" + icon_state = "longrack5" + +/obj/structure/prop/hybrisa/supermart/rack/longrack6 + name = "shelf" + desc = "A long shelf filled with various foodstuffs" + icon_state = "longrack6" + +/obj/structure/prop/hybrisa/supermart/rack/longrack7 + name = "shelf" + desc = "A long shelf filled with various foodstuffs" + icon_state = "longrack7" + +/obj/structure/prop/hybrisa/supermart/supermartbelt + name = "conveyor belt" + desc = "A conveyor belt." + icon_state = "checkoutbelt" + +/obj/structure/prop/hybrisa/supermart/freezer + name = "commercial freezer" + desc = "A commercial grade freezer." + icon_state = "freezerupper" + density = TRUE + +/obj/structure/prop/hybrisa/supermart/freezer/supermartfreezer1 + icon_state = "freezerupper" + +/obj/structure/prop/hybrisa/supermart/freezer/supermartfreezer2 + icon_state = "freezerlower" + +/obj/structure/prop/hybrisa/supermart/freezer/supermartfreezer3 + icon_state = "freezermid" + +/obj/structure/prop/hybrisa/supermart/freezer/supermartfreezer4 + icon_state = "freezerupper1" + +/obj/structure/prop/hybrisa/supermart/freezer/supermartfreezer5 + icon_state = "freezerlower1" + +/obj/structure/prop/hybrisa/supermart/freezer/supermartfreezer6 + icon_state = "freezermid1" + +/obj/structure/prop/hybrisa/supermart/supermartfruitbasketempty + name = "basket" + desc = "A basket." + icon_state = "supermarketbasketempty" + +/obj/structure/prop/hybrisa/supermart/supermartfruitbasketoranges + name = "basket" + desc = "A basket full of oranges." + icon_state = "supermarketbasket1" + +/obj/structure/prop/hybrisa/supermart/supermartfruitbasketpears + name = "basket" + desc = "A basket full of pears." + icon_state = "supermarketbasket2" + +/obj/structure/prop/hybrisa/supermart/supermartfruitbasketcarrots + name = "basket" + desc = "A basket full of carrots." + icon_state = "supermarketbasket3" + +/obj/structure/prop/hybrisa/supermart/supermartfruitbasketmelons + name = "basket" + desc = "A basket full of melons." + icon_state = "supermarketbasket4" + +/obj/structure/prop/hybrisa/supermart/supermartfruitbasketapples + name = "basket" + desc = "A basket full of apples." + icon_state = "supermarketbasket5" + +/obj/structure/prop/hybrisa/supermart/souto_man_prop + name = "Souto Man mannequin" + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + desc = "A mannequin of the famous 'Souto-Man', Party like it's 1999!" + icon_state = "souto_man_prop" + density = TRUE + +/obj/structure/prop/hybrisa/supermart/souto_rack + name = "Souto cans rack" + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + desc = "A rack filled with Souto cans of various flavors." + icon_state = "souto_rack" + density = TRUE + +/obj/structure/prop/hybrisa/supermart/souto_can_stack + name = "stacked souto cans" + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + desc = "A large stack of 'Souto-Classic' cans." + icon_state = "souto_can_stack" + density = TRUE + +// Furniture +/obj/structure/prop/hybrisa/furniture + icon = 'icons/obj/structures/props/hybrisatables.dmi' + icon_state = "blackmetaltable" + health = 200 + projectile_coverage = 20 + throwpass = TRUE + +/obj/structure/prop/hybrisa/furniture/tables + icon = 'icons/obj/structures/props/hybrisatables.dmi' + icon_state = "table_pool" + health = 200 + +/obj/structure/prop/hybrisa/furniture/tables/bullet_act(obj/projectile/P) + health -= P.damage + ..() + healthcheck() + return TRUE + +/obj/structure/prop/hybrisa/furniture/tables/proc/explode() + visible_message(SPAN_DANGER("[src] breaks apart!"), max_distance = 1) + deconstruct(FALSE) + +/obj/structure/prop/hybrisa/furniture/tables/proc/healthcheck() + if(health <= 0) + explode() + +/obj/structure/prop/hybrisa/furniture/tables/ex_act(severity) + switch(severity) + if(EXPLOSION_THRESHOLD_LOW to EXPLOSION_THRESHOLD_MEDIUM) + if(prob(50)) + deconstruct(FALSE) + if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) + deconstruct(FALSE) + +/obj/structure/prop/hybrisa/furniture/tables/attack_alien(mob/living/carbon/xenomorph/current_xenomorph) + if(unslashable) + return XENO_NO_DELAY_ACTION + current_xenomorph.animation_attack_on(src) + playsound(src, 'sound/effects/metalhit.ogg', 25, 1) + current_xenomorph.visible_message(SPAN_DANGER("[current_xenomorph] slashes at [src]!"), + SPAN_DANGER("You slash at [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT) + update_health(rand(current_xenomorph.melee_damage_lower, current_xenomorph.melee_damage_upper)) + return XENO_ATTACK_ACTION + +/obj/structure/prop/hybrisa/furniture/tables/tableblack + name = "large metal table" + desc = "A large black metal table, looks very expensive." + icon_state = "blackmetaltable" + density = TRUE + climbable = TRUE + breakable = TRUE + bound_height = 32 + bound_width = 64 + debris = list(/obj/item/stack/sheet/metal) + +/obj/structure/prop/hybrisa/furniture/tables/tableblack/blacktablecomputer + icon = 'icons/obj/structures/props/hybrisatables.dmi' + icon_state = "blackmetaltable_computer" + +/obj/structure/prop/hybrisa/furniture/tables/tablewood + name = "large wood table" + desc = "A large wooden table, looks very expensive." + icon_state = "brownlargetable" + density = TRUE + climbable = TRUE + breakable = TRUE + bound_height = 32 + bound_width = 64 + debris = list(/obj/item/stack/sheet/wood) + +/obj/structure/prop/hybrisa/furniture/tables/tablewood/woodtablecomputer + icon = 'icons/obj/structures/props/hybrisatables.dmi' + icon_state = "brownlargetable_computer" + +/obj/structure/prop/hybrisa/furniture/tables/tablepool + name = "pool table" + desc = "A large table used for Pool." + icon = 'icons/obj/structures/props/hybrisatables.dmi' + icon_state = "table_pool" + density = TRUE + bound_height = 32 + bound_width = 64 + climbable = TRUE + breakable = TRUE + debris = list(/obj/item/stack/sheet/wood) + +/obj/structure/prop/hybrisa/furniture/tables/tablegambling + name = "gambling table" + desc = "A large table used for gambling." + icon = 'icons/obj/structures/props/hybrisatables.dmi' + icon_state = "table_cards" + density = TRUE + bound_height = 32 + bound_width = 64 + climbable = TRUE + breakable = TRUE + debris = list(/obj/item/stack/sheet/wood) + +// Chairs + +/obj/structure/bed/chair/comfy/hybrisa + name = "expensive chair" + desc = "A expensive looking chair" + +/obj/structure/bed/chair/comfy/hybrisa/black + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "comfychair_hybrisablack" + +/obj/structure/bed/chair/comfy/hybrisa/red + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "comfychair_hybrisared" + +/obj/structure/bed/chair/comfy/hybrisa/blue + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "comfychair_hybrisablue" + +/obj/structure/bed/chair/comfy/hybrisa/brown + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "comfychair_hybrisabrown" + +// Beds + +/obj/structure/bed/hybrisa/dingy + name = "dingy bed" + desc = "An old mattress seated on a rectangular metallic frame. This is used to support a lying person in a comfortable manner, notably for regular sleep. Ancient technology, but still useful." + icon_state = "bed_dingy" + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + +/obj/structure/bed/hybrisa + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "hybrisa" + buckling_y = 8 + +/obj/structure/bed/hybrisa/prisonbed + name = "bunk bed" + desc = "A sorry looking bunk-bed." + icon_state = "prisonbed" + +/obj/structure/bed/hybrisa/bunkbed1 + name = "bunk bed" + desc = "A comfy looking bunk-bed." + icon_state = "zbunkbed" + +/obj/structure/bed/hybrisa/bunkbed2 + name = "bunk bed" + desc = "A comfy looking bunk-bed." + icon_state = "zbunkbed2" + +/obj/structure/bed/hybrisa/bunkbed3 + name = "bunk bed" + desc = "A comfy looking bunk-bed." + icon_state = "zbunkbed3" + +/obj/structure/bed/hybrisa/bunkbed4 + name = "bunk bed" + desc = "A comfy looking bunk-bed." + icon_state = "zbunkbed4" + +// Cabinet + +/obj/structure/closet/cabinet/hybrisa/metal + name = "metal cabinet" + desc = "A large metal cabinet, looks sturdy." + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "cabinet_metal_closed" + icon_closed = "cabinet_metal_closed" + icon_opened = "cabinet_metal_open" + +/obj/structure/closet/cabinet/hybrisa/metal/alt + name = "metal cabinet" + desc = "A large metal cabinet, looks sturdy." + icon_state = "cabinet_metal_alt_closed" + icon_closed = "cabinet_metal_alt_closed" + icon_opened = "cabinet_metal_alt_open" + +// Xenobiology + +/obj/structure/prop/hybrisa/xenobiology + icon = 'icons/obj/structures/props/hybrisaxenocryogenics.dmi' + icon_state = "xenocellemptyon" + layer = ABOVE_MOB_LAYER + +/obj/structure/prop/hybrisa/xenobiology/small/empty + name = "specimen containment cell" + desc = "It's empty." + icon_state = "xenocellemptyon" + density = TRUE + +/obj/structure/prop/hybrisa/xenobiology/small/offempty + name = "specimen containment cell" + desc = "It's turned off and empty." + icon_state = "xenocellemptyoff" + density = TRUE + +/obj/structure/prop/hybrisa/xenobiology/small/larva + name = "specimen containment cell" + desc = "There is something worm-like inside..." + icon_state = "xenocelllarva" + density = TRUE + +/obj/structure/prop/hybrisa/xenobiology/small/egg + name = "specimen containment cell" + desc = "There is, what looks like some sort of egg inside..." + icon_state = "xenocellegg" + density = TRUE + +/obj/structure/prop/hybrisa/xenobiology/small/hugger + name = "specimen containment cell" + desc = "There's something spider-like inside..." + icon_state = "xenocellhugger" + density = TRUE + +/obj/structure/prop/hybrisa/xenobiology/small/cracked1 + name = "specimen containment cell" + desc = "Looks like something broke it...from the inside." + icon_state = "xenocellcrackedempty" + density = TRUE + +/obj/structure/prop/hybrisa/xenobiology/small/cracked2 + name = "specimen containment cell" + desc = "Looks like something broke it...from the inside." + icon_state = "xenocellcrackedempty2" + density = TRUE + +/obj/structure/prop/hybrisa/xenobiology/small/crackedegg + name = "specimen containment cell" + desc = "Looks like something broke it, there's a giant empty egg inside." + icon_state = "xenocellcrackedegg" + density = TRUE + +/obj/structure/prop/hybrisa/xenobiology/giant_cryo + icon = 'icons/obj/structures/props/xeno_cyro_giant.dmi' + name = "colossal specimen containment cell" + desc = "A colossal cryogenic tube with yellow-tinted glass towers before you, housing a hulking, monstrous entity. Is it alive, or in a deep slumber? Cold mist swirls around the base as a low hum fills the air." + icon_state = "giant_xeno_cryo" + bound_height = 128 + bound_width = 64 + unslashable = TRUE + unacidable = TRUE + explo_proof = TRUE + density = FALSE + layer = ABOVE_XENO_LAYER + +/obj/structure/prop/hybrisa/xenobiology/misc + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + name = "strange egg" + desc = "A strange ancient looking egg, it seems to be inert." + icon_state = "inertegg" + unslashable = TRUE + explo_proof = TRUE + layer = TURF_LAYER + +// Engineer + +/obj/structure/prop/hybrisa/engineer + icon = 'icons/obj/structures/props/engineerJockey.dmi' + icon_state = "spacejockey" + +/obj/structure/prop/hybrisa/engineer/spacejockey + name = "giant pilot" + desc = "A colossal enigma looms before you—a titan of alien origin, frozen in time and death. Its massive form appears fossilized, hinting at eons spent entombed within the bowels of the derelict alien vessel. The creature seems fused with the grandeur of its chair, as if emerging from the very essence of the ship itself. Bones, twisted and contorted, protrude outward in a macabre display, as if violently expelled from within by some unimaginable force. It's a harrowing encounter with an enigmatic being from a bygone era—a silent witness to mysteries that may never be unraveled." + icon = 'icons/obj/structures/props/engineerJockey.dmi' + icon_state = "spacejockey" + unslashable = TRUE + unacidable = TRUE + explo_proof = TRUE + layer = ABOVE_MOB_LAYER + +/obj/structure/prop/hybrisa/engineer/giantpod/broken + name = "giant hypersleep chamber" + desc = "Before you lies a behemoth of what looks like a 'hypersleep chamber', dwarfing everything around it. Within, a fossilized alien presence lies dormant. The chamber itself bears the scars of a violent past, with holes melted in its outer shell, as if something within had erupted outwards with some unknown force. The desiccated remains of the occupant are twisted and contorted, suggesting a violent demise that occurred long ago." + icon = 'icons/obj/structures/props/engineerPod.dmi' + icon_state = "pod_broken" + bound_height = 96 + density = TRUE + +/obj/structure/prop/hybrisa/engineer/giantpod + name = "colossal hypersleep chamber" + desc = "Before you stands an imposing structure, what looks like a colossal 'hypersleep chamber' of alien design, unlike anything you've ever encountered. Its intricate patterns and unfamiliar symbols hint at technologies far beyond human comprehension. Yet, despite its grandeur, the chamber is empty, devoid of any sign of life." + icon = 'icons/obj/structures/props/engineerPod.dmi' + icon_state = "pod" + bound_height = 96 + bound_width = 64 + unslashable = TRUE + unacidable = TRUE + density = TRUE + layer = ABOVE_MOB_LAYER + health = 12000 + +/obj/structure/prop/hybrisa/engineer/giantpod/bullet_act(obj/projectile/P) + health -= P.damage + playsound(src, 'sound/effects/metalping.ogg', 35, 1) + ..() + healthcheck() + return TRUE + +/obj/structure/prop/hybrisa/engineer/giantpod/proc/explode() + visible_message(SPAN_DANGER("[src] crumbles!"), max_distance = 1) + playsound(loc, 'sound/effects/burrowoff.ogg', 25) + + deconstruct(FALSE) + +/obj/structure/prop/hybrisa/engineer/giantpod/proc/healthcheck() + if(health <= 0) + explode() + +/obj/structure/prop/hybrisa/engineer/giantpod/ex_act(severity) + switch(severity) + if(EXPLOSION_THRESHOLD_LOW to EXPLOSION_THRESHOLD_MEDIUM) + if(prob(50)) + deconstruct(FALSE) + if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) + deconstruct(FALSE) + +/obj/structure/prop/hybrisa/engineer/giantpod/attack_alien(mob/living/carbon/xenomorph/current_xenomorph) + if(unslashable) + return XENO_NO_DELAY_ACTION + current_xenomorph.animation_attack_on(src) + playsound(src, 'sound/effects/metal_close.ogg', 25, 1) + current_xenomorph.visible_message(SPAN_DANGER("[current_xenomorph] slashes at [src]!"), + SPAN_DANGER("You slash at [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT) + update_health(rand(current_xenomorph.melee_damage_lower, current_xenomorph.melee_damage_upper)) + return XENO_ATTACK_ACTION + +/obj/structure/prop/hybrisa/engineer/giantconsole + name = "colossal alien console" + desc = "Before you looms a towering alien console, its design defying all familiarity and logic. It's a marvel of unknown technology, adorned with intricate patterns and pulsating lights that dance with otherworldly energy. What purpose does this enigmatic device serve? The answer eludes you..." + icon = 'icons/obj/structures/props/64x64_hybrisarandomprops.dmi' + icon_state = "engineerconsole" + bound_height = 32 + bound_width = 32 + unslashable = TRUE + unacidable = TRUE + explo_proof = TRUE + density = TRUE + +/obj/structure/prop/hybrisa/engineer/engineerpillar + icon = 'icons/obj/structures/props/hybrisaengineerpillarangled.dmi' + icon_state = "engineerpillar_SW1fade" + bound_height = 64 + bound_width = 128 + unslashable = TRUE + unacidable = TRUE + explo_proof = TRUE + layer = ABOVE_MOB_LAYER + +/obj/structure/prop/hybrisa/engineer/engineerpillar/northwesttop + name = "strange pillar" + icon_state = "engineerpillar_NW1" + +/obj/structure/prop/hybrisa/engineer/engineerpillar/northwestbottom + name = "strange pillar" + icon_state = "engineerpillar_NW2" + +/obj/structure/prop/hybrisa/engineer/engineerpillar/southwesttop + name = "strange pillar" + icon_state = "engineerpillar_SW1" + +/obj/structure/prop/hybrisa/engineer/engineerpillar/southwestbottom + name = "strange pillar" + icon_state = "engineerpillar_SW2" + +/obj/structure/prop/hybrisa/engineer/engineerpillar/smallsouthwest1 + name = "strange pillar" + icon_state = "engineerpillar_SW1fade" + +/obj/structure/prop/hybrisa/engineer/engineerpillar/smallsouthwest2 + name = "strange pillar" + icon_state = "engineerpillar_SW2fade" + +/obj/structure/blackgoocontainer + name = "strange container" + icon_state = "blackgoocontainer1" + desc = "A strange alien container. It exudes an aura of otherworldly mystery, its sleek surface bearing no hint of its previous contents. It appears to be completely empty." + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + density = TRUE + anchored = TRUE + unslashable = FALSE + health = 100 + projectile_coverage = 20 + throwpass = TRUE + +/obj/structure/blackgoocontainer/initialize_pass_flags(datum/pass_flags_container/PF) + ..() + if (PF) + PF.flags_can_pass_all = PASS_HIGH_OVER_ONLY + +/obj/structure/blackgoocontainer/bullet_act(obj/projectile/P) + health -= P.damage + playsound(src, 'sound/effects/thud.ogg', 35, 1) + ..() + healthcheck() + return TRUE + +/obj/structure/blackgoocontainer/proc/explode() + visible_message(SPAN_DANGER("[src] crumbles!"), max_distance = 1) + playsound(loc, 'sound/effects/burrowoff.ogg', 25) + + deconstruct(FALSE) + +/obj/structure/blackgoocontainer/proc/healthcheck() + if(health <= 0) + explode() + +/obj/structure/blackgoocontainer/ex_act(severity) + switch(severity) + if(EXPLOSION_THRESHOLD_LOW to EXPLOSION_THRESHOLD_MEDIUM) + if(prob(50)) + deconstruct(FALSE) + if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) + deconstruct(FALSE) + +/obj/structure/blackgoocontainer/attack_alien(mob/living/carbon/xenomorph/current_xenomorph) + if(unslashable) + return XENO_NO_DELAY_ACTION + current_xenomorph.animation_attack_on(src) + playsound(src, 'sound/effects/metal_close.ogg', 25, 1) + current_xenomorph.visible_message(SPAN_DANGER("[current_xenomorph] slashes at [src]!"), + SPAN_DANGER("You slash at [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT) + update_health(rand(current_xenomorph.melee_damage_lower, current_xenomorph.melee_damage_upper)) + return XENO_ATTACK_ACTION + +/obj/item/hybrisa/engineer_helmet + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + name = "strange alien helmet" + desc = "The alien helmet takes on a bizarre form reminiscent of an elongated elephant's trunk, adorned with insectoid-like eyes that peer out from its weathered surface. Its purpose and origins shrouded in mystery. As you behold this strange relic, you can't help but ponder the beings who once wore such unconventional headgear and the ancient secrets it may hold..." + icon_state = "alien_helmet" + force = 15 + throwforce = 12 + w_class = SIZE_MEDIUM + +// Airport + +/obj/structure/prop/hybrisa/airport + name = "nose cone" + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "dropshipfrontwhite1" + unslashable = TRUE + unacidable = TRUE + +/obj/structure/prop/hybrisa/airport/dropshipnosecone + name = "nose cone" + icon_state = "dropshipfrontwhite1" + explo_proof = TRUE + layer = ABOVE_MOB_LAYER + density = TRUE + +/obj/structure/prop/hybrisa/airport/dropshipwingleft + name = "wing" + icon_state = "dropshipwingtop1" + explo_proof = TRUE + layer = ABOVE_MOB_LAYER + +/obj/structure/prop/hybrisa/airport/dropshipwingright + name = "wing" + icon_state = "dropshipwingtop2" + explo_proof = TRUE + layer = ABOVE_MOB_LAYER + +/obj/structure/prop/hybrisa/airport/dropshipvent1left + name = "vent" + icon_state = "dropshipvent1" + explo_proof = TRUE + layer = ABOVE_MOB_LAYER + +/obj/structure/prop/hybrisa/airport/dropshipvent2right + name = "vent" + icon_state = "dropshipvent2" + explo_proof = TRUE + layer = ABOVE_MOB_LAYER + +/obj/structure/prop/hybrisa/airport/dropshipventleft + name = "vent" + icon_state = "dropshipvent3" + explo_proof = TRUE + layer = ABOVE_MOB_LAYER + +/obj/structure/prop/hybrisa/airport/dropshipventright + name = "vent" + icon_state = "dropshipvent4" + explo_proof = TRUE + layer = ABOVE_MOB_LAYER + +// Dropship damage + +/obj/structure/prop/hybrisa/airport/dropshipenginedamage + name = "dropship damage" + desc = "the engine appears to have severe damage." + icon = 'icons/obj/structures/props/64x96-hybrisarandomprops.dmi' + icon_state = "dropship_engine_damage" + bound_height = 64 + bound_width = 96 + unslashable = TRUE + unacidable = TRUE + explo_proof = TRUE + gender = PLURAL + +/obj/structure/prop/hybrisa/airport/dropshipenginedamagenofire + name = "dropship damage" + desc = "the engine appears to have severe damage." + icon = 'icons/obj/structures/props/64x96-hybrisarandomprops.dmi' + icon_state = "dropship_engine_damage_nofire" + bound_height = 64 + bound_width = 96 + unslashable = TRUE + unacidable = TRUE + explo_proof = TRUE + gender = PLURAL + +/obj/structure/prop/hybrisa/airport/refuelinghose + name = "refueling hose" + desc = "A long refueling hose that connects to various types of dropships." + icon = 'icons/obj/structures/props/64x96-hybrisarandomprops.dmi' + icon_state = "fuelline1" + bound_height = 64 + bound_width = 96 + unslashable = TRUE + unacidable = TRUE + +/obj/structure/prop/hybrisa/airport/refuelinghose2 + name = "refueling hose" + desc = "A long refueling hose that connects to various types of dropships." + icon = 'icons/obj/structures/props/64x96-hybrisarandomprops.dmi' + icon_state = "fuelline2" + bound_height = 64 + bound_width = 96 + unslashable = TRUE + unacidable = TRUE + +// Pilot body + +/obj/structure/prop/hybrisa/airport/deadpilot1 + name = "decapitated Weyland-Yutani Pilot" + desc = "What remains of a Weyland-Yutani Pilot. Their entire head is missing. Where'd it roll off to?..." + icon = 'icons/obj/structures/props/64x96-hybrisarandomprops.dmi' + icon_state = "pilotbody_decap1" + bound_height = 64 + bound_width = 96 + unslashable = TRUE + unacidable = TRUE + +/obj/structure/prop/hybrisa/airport/deadpilot2 + name = "decapitated Weyland-Yutani Pilot" + desc = "What remains of a Weyland-Yutani Pilot. Their entire head is missing. Where'd it roll off to?..." + icon = 'icons/obj/structures/props/64x96-hybrisarandomprops.dmi' + icon_state = "pilotbody_decap2" + bound_height = 64 + bound_width = 96 + unslashable = TRUE + unacidable = TRUE + +// Misc + +/obj/structure/prop/hybrisa/misc + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "roadbarrier" + +// Floor props + +/obj/structure/prop/hybrisa/misc/floorprops + icon_state = "solidgrate1" + layer = HATCH_LAYER + +/obj/structure/prop/hybrisa/misc/floorprops/grate + name = "solid metal grate" + desc = "A metal grate." + icon_state = "solidgrate1" + +/obj/structure/prop/hybrisa/misc/floorprops/grate2 + name = "solid metal grate" + desc = "A metal grate." + icon_state = "solidgrate5" + +/obj/structure/prop/hybrisa/misc/floorprops/grate3 + name = "solid metal grate" + desc = "A metal grate." + icon_state = "zhalfgrate1" + +/obj/structure/prop/hybrisa/misc/floorprops/floorglass + name = "reinforced glass floor" + desc = "A heavily reinforced glass floor panel, this looks almost indestructible." + icon_state = "solidgrate2" + unslashable = TRUE + unacidable = TRUE + explo_proof = TRUE + +/obj/structure/prop/hybrisa/misc/floorprops/floorglass2 + name = "reinforced glass floor" + desc = "A heavily reinforced glass floor panel, this looks almost indestructible." + icon_state = "solidgrate3" + unslashable = TRUE + unacidable = TRUE + explo_proof = TRUE + layer = ABOVE_TURF_LAYER + +/obj/structure/prop/hybrisa/misc/floorprops/floorglass3 + name = "reinforced glass floor" + desc = "A heavily reinforced glass floor panel, this looks almost indestructible." + icon_state = "solidgrate4" + unslashable = TRUE + unacidable = TRUE + explo_proof = TRUE + +// Graffiti + +/obj/structure/prop/hybrisa/misc/graffiti + name = "graffiti" + icon = 'icons/obj/structures/props/64x96-hybrisarandomprops.dmi' + icon_state = "zgraffiti4" + bound_height = 64 + bound_width = 96 + unslashable = TRUE + unacidable = TRUE + breakable = TRUE + gender = PLURAL + +/obj/structure/prop/hybrisa/misc/graffiti/graffiti1 + icon_state = "zgraffiti1" + +/obj/structure/prop/hybrisa/misc/graffiti/graffiti2 + icon_state = "zgraffiti2" + +/obj/structure/prop/hybrisa/misc/graffiti/graffiti3 + icon_state = "zgraffiti3" + +/obj/structure/prop/hybrisa/misc/graffiti/graffiti4 + icon_state = "zgraffiti4" + +/obj/structure/prop/hybrisa/misc/graffiti/graffiti5 + icon_state = "zgraffiti5" + +/obj/structure/prop/hybrisa/misc/graffiti/graffiti6 + icon_state = "zgraffiti6" + +/obj/structure/prop/hybrisa/misc/graffiti/graffiti7 + icon_state = "zgraffiti7" + +// Wall Blood + +/obj/structure/prop/hybrisa/misc/blood + name = "blood" + icon = 'icons/obj/structures/props/64x96-hybrisarandomprops.dmi' + icon_state = "wallblood_floorblood" + unslashable = TRUE + unacidable = TRUE + breakable = TRUE + gender = PLURAL + +/obj/structure/prop/hybrisa/misc/blood/blood1 + icon_state = "wallblood_floorblood" + +/obj/structure/prop/hybrisa/misc/blood/blood2 + icon_state = "wall_blood_1" + +/obj/structure/prop/hybrisa/misc/blood/blood3 + icon_state = "wall_blood_2" + +// Fire + +/obj/structure/prop/hybrisa/misc/fire + name = "fire" + icon = 'icons/obj/structures/props/64x96-hybrisarandomprops.dmi' + icon_state = "zfire_smoke" + layer = ABOVE_MOB_LAYER + light_on = TRUE + light_power = 2 + light_range = 3 + +/obj/structure/prop/hybrisa/misc/fire/fire1 + icon_state = "zfire_smoke" + +/obj/structure/prop/hybrisa/misc/fire/fire2 + icon_state = "zfire_smoke2" + +/obj/structure/prop/hybrisa/misc/fire/firebarrel + name = "barrel" + icon = 'icons/obj/structures/props/64x64_hybrisarandomprops.dmi' + icon_state = "zbarrelfireon" + bound_height = 32 + bound_width = 32 + density = TRUE + +/obj/structure/prop/hybrisa/misc/firebarreloff + name = "barrel" + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "zfirebarreloff" + bound_height = 32 + bound_width = 32 + density = TRUE + +// Misc + +/obj/structure/prop/hybrisa/misc/picture + name = "framed picture" + desc = "A golden framed picture of an ominous skeletal figure ordorned in golden garb, fancy for a pile of bones..." + icon_state = "pictureframe" + +/obj/structure/prop/hybrisa/misc/commandosuitemptyprop + name = "Weyland-Yutani 'Ape-Suit' showcase" + desc = "A display model of the Weyland-Yutani 'Apesuit', shame it's only a model..." + icon_state = "dogcatchersuitempty1" + +/obj/structure/prop/hybrisa/misc/cabinet + name = "cabinet" + desc = "a small cabinet with drawers." + icon_state = "sidecabinet" + projectile_coverage = 20 + throwpass = TRUE + +/obj/structure/prop/hybrisa/misc/elevator_door + name = "broken elevator door" + desc = "completely broken, the elevator is not going to work." + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "elevator_left" + opacity = FALSE + unslashable = TRUE + unacidable = TRUE + explo_proof = TRUE + +/obj/structure/prop/hybrisa/misc/elevator_door/right + icon_state = "elevator_right" + +/obj/structure/prop/hybrisa/misc/trash + name = "trash bin" + desc = "A Weyland-Yutani trash bin used for disposing your unwanted items, or you can just throw your shit on the ground like every other asshole." + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "trashblue" + health = 150 + density = TRUE + projectile_coverage = 20 + throwpass = TRUE + +/obj/structure/prop/hybrisa/misc/trash/bullet_act(obj/projectile/P) + health -= P.damage + playsound(src, 'sound/effects/metalping.ogg', 35, 1) + ..() + healthcheck() + return TRUE + +/obj/structure/prop/hybrisa/misc/trash/proc/explode() + visible_message(SPAN_DANGER("[src] breaks apart!"), max_distance = 1) + deconstruct(FALSE) + +/obj/structure/prop/hybrisa/misc/trash/proc/healthcheck() + if(health <= 0) + explode() + +/obj/structure/prop/hybrisa/misc/trash/ex_act(severity) + switch(severity) + if(EXPLOSION_THRESHOLD_LOW to EXPLOSION_THRESHOLD_MEDIUM) + if(prob(50)) + deconstruct(FALSE) + if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) + deconstruct(FALSE) + +/obj/structure/prop/hybrisa/misc/trash/attack_alien(mob/living/carbon/xenomorph/current_xenomorph) + if(unslashable) + return XENO_NO_DELAY_ACTION + current_xenomorph.animation_attack_on(src) + playsound(src, 'sound/effects/metalhit.ogg', 25, 1) + current_xenomorph.visible_message(SPAN_DANGER("[current_xenomorph] slashes at [src]!"), + SPAN_DANGER("You slash at [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT) + update_health(rand(current_xenomorph.melee_damage_lower, current_xenomorph.melee_damage_upper)) + return XENO_ATTACK_ACTION + +/obj/structure/prop/hybrisa/misc/trash/green + icon_state = "trashgreen" + +/obj/structure/prop/hybrisa/misc/trash/blue + icon_state = "trashblue" + +/obj/structure/prop/hybrisa/misc/redmeter + name = "meter" + icon_state = "redmeter" + +/obj/item/hybrisa/misc/trash_bag_full_prop + name = "full trash bag" + desc = "It's the heavy-duty black polymer kind. It's full of old trash, you don't want to touch it." + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + icon_state = "ztrashbag" + force = 15 + throwforce = 3 + w_class = SIZE_MEDIUM + +/obj/structure/prop/hybrisa/misc/slotmachine + name = "slot machine" + desc = "A slot machine." + icon = 'icons/obj/structures/props/64x64_hybrisarandomprops.dmi' + icon_state = "slotmachine" + bound_width = 32 + bound_height = 32 + anchored = TRUE + density = TRUE + layer = WINDOW_LAYER + health = 450 + +/obj/structure/prop/hybrisa/misc/slotmachine/broken + name = "slot machine" + desc = "A broken slot machine." + icon = 'icons/obj/structures/props/64x64_hybrisarandomprops.dmi' + icon_state = "slotmachine_broken" + bound_width = 32 + bound_height = 32 + anchored = TRUE + density = TRUE + layer = WINDOW_LAYER + +/obj/structure/prop/hybrisa/misc/slotmachine/bullet_act(obj/projectile/P) + health -= P.damage + playsound(src, 'sound/effects/metalping.ogg', 35, 1) + ..() + healthcheck() + return TRUE + +/obj/structure/prop/hybrisa/misc/slotmachine/proc/explode() + visible_message(SPAN_DANGER("[src] breaks apart!"), max_distance = 1) + deconstruct(FALSE) + +/obj/structure/prop/hybrisa/misc/slotmachine/proc/healthcheck() + if(health <= 0) + explode() + +/obj/structure/prop/hybrisa/misc/slotmachine/ex_act(severity) + switch(severity) + if(EXPLOSION_THRESHOLD_LOW to EXPLOSION_THRESHOLD_MEDIUM) + if(prob(50)) + deconstruct(FALSE) + if(EXPLOSION_THRESHOLD_MEDIUM to INFINITY) + deconstruct(FALSE) + +/obj/structure/prop/hybrisa/misc/slotmachine/attack_alien(mob/living/carbon/xenomorph/current_xenomorph) + if(unslashable) + return XENO_NO_DELAY_ACTION + current_xenomorph.animation_attack_on(src) + playsound(src, 'sound/effects/metalhit.ogg', 25, 1) + current_xenomorph.visible_message(SPAN_DANGER("[current_xenomorph] slashes at [src]!"), + SPAN_DANGER("You slash at [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT) + update_health(rand(current_xenomorph.melee_damage_lower, current_xenomorph.melee_damage_upper)) + return XENO_ATTACK_ACTION + +/obj/structure/machinery/hybrisa/coffee_machine + icon = 'icons/obj/structures/props/hybrisarandomprops.dmi' + name = "coffee machine" + desc = "A coffee machine." + wrenchable = TRUE + icon_state = "coffee" + var/vends = "coffee" + var/base_state = "coffee" + var/fiting_cups = list(/obj/item/reagent_container/food/drinks/coffee,/obj/item/reagent_container/food/drinks/coffeecup) + var/making_time = 10 SECONDS + var/obj/item/reagent_container/food/drinks/cup = null + +/obj/structure/machinery/hybrisa/coffee_machine/attackby(obj/item/reagent_container/attacking_object, mob/user) + if(cup) + to_chat(user, SPAN_WARNING("There is already cup there.")) + return + if(!is_type_in_list(attacking_object,fiting_cups )) + to_chat(user, SPAN_WARNING("\The [attacking_object] does not quite fit in.")) + return + else + playsound(src, "sound/machines/coffee1.ogg", 40, TRUE) + cup = attacking_object + user.drop_inv_item_to_loc(attacking_object, src) + update_icon() + addtimer(CALLBACK(src, PROC_REF(vend_coffee), user), making_time) + +/obj/structure/machinery/hybrisa/coffee_machine/proc/vend_coffee(mob/user) + var/datum/reagents/current_reagent = cup.reagents + var/space = current_reagent.maximum_volume - current_reagent.total_volume + if(space