diff --git a/code/__DEFINES/camera.dm b/code/__DEFINES/camera.dm index 9d797b964d..a95112341a 100644 --- a/code/__DEFINES/camera.dm +++ b/code/__DEFINES/camera.dm @@ -1,10 +1,12 @@ // Networks #define CAMERA_NET_ALMAYER "Almayer" +#define CAMERA_NET_GOLDEN_ARROW "Golden Arrow" #define CAMERA_NET_CONTAINMENT "Containment" #define CAMERA_NET_CONTAINMENT_HIDDEN "Containment Hidden" #define CAMERA_NET_RESEARCH "Research" #define CAMERA_NET_ALAMO "Alamo" #define CAMERA_NET_NORMANDY "Normandy" +#define CAMERA_NET_MIDWAY "Midway" #define CAMERA_NET_COLONY "Colony" #define CAMERA_NET_ARES "ARES" diff --git a/code/__DEFINES/job.dm b/code/__DEFINES/job.dm index 31812445c3..949f9385e8 100644 --- a/code/__DEFINES/job.dm +++ b/code/__DEFINES/job.dm @@ -358,12 +358,11 @@ var/global/list/job_command_roles = JOB_COMMAND_ROLES_LIST #define JOB_PLAYTIME_TIER_4 (175 HOURS) #define XENO_NO_AGE -1 -#define XENO_YOUNG 0 -#define XENO_NORMAL 1 -#define XENO_MATURE 2 -#define XENO_ELDER 3 -#define XENO_ANCIENT 4 -#define XENO_PRIME 5 +#define XENO_NORMAL 0 +#define XENO_MATURE 1 +#define XENO_ELDER 2 +#define XENO_ANCIENT 3 +#define XENO_PRIME 4 /// For monthly time tracking #define JOB_OBSERVER "Observer" diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index a3299184e4..a6e1e168c2 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -111,12 +111,15 @@ #define MOBILE_SHUTTLE_LIFEBOAT_STARBOARD "lifeboat-starboard" #define MOBILE_SHUTTLE_VEHICLE_ELEVATOR "vehicle_elevator" +#define DROPSHIP_MIDWAY "dropship_midway" #define DROPSHIP_ALAMO "dropship_alamo" #define DROPSHIP_NORMANDY "dropship_normandy" #define ALMAYER_DROPSHIP_LZ1 "almayer-hangar-lz1" #define ALMAYER_DROPSHIP_LZ2 "almayer-hangar-lz2" +#define GOLDEN_ARROW_LZ "golden arrow lz" + #define DROPSHIP_FLYBY_ID "special_flight" #define DROPSHIP_LZ1 "dropship-lz1" #define DROPSHIP_LZ2 "dropship-lz2" diff --git a/code/__DEFINES/skills.dm b/code/__DEFINES/skills.dm index a57bc91a2b..57c19d02f8 100644 --- a/code/__DEFINES/skills.dm +++ b/code/__DEFINES/skills.dm @@ -192,8 +192,8 @@ #define SKILL_DOMESTIC_MAX 2 //multitile vehicle skills -//Can't drive -#define SKILL_VEHICLE_DEFAULT 0 + +#define SKILL_VEHICLE_DEFAULT 2 //Can drive small vehicles (truck) #define SKILL_VEHICLE_SMALL 1 //Can drive large vehicles (apc, tank) diff --git a/code/__DEFINES/xeno.dm b/code/__DEFINES/xeno.dm index a0a4c927d3..935f58f69c 100644 --- a/code/__DEFINES/xeno.dm +++ b/code/__DEFINES/xeno.dm @@ -36,6 +36,7 @@ #define XENO_HITS_TO_DESTROY_WINDOW_FRAME 3 #define XENO_HITS_TO_DESTROY_R_WINDOW_FRAME 5 #define XENO_HITS_TO_DESTROY_BOLTED_DOOR 10 +#define XENO_HITS_TO_DESTROY_DOOR 10 #define XENO_HITS_TO_DESTROY_WELDED_DOOR 15 #define XENO_HITS_TO_EXPOSE_WIRES_MIN 3 #define XENO_HITS_TO_EXPOSE_WIRES_MAX 4 diff --git a/code/__DEFINES/xeno_ai.dm b/code/__DEFINES/xeno_ai.dm index 9bea986461..dc4be8dbcc 100644 --- a/code/__DEFINES/xeno_ai.dm +++ b/code/__DEFINES/xeno_ai.dm @@ -5,6 +5,7 @@ #define DISTANCE_PENALTY 1 #define ASTAR_COST_FUNCTION(n) (abs(n.x - target.x)+abs(n.y - target.y)) +#define OPEN_TURF_PENALTY 1 #define DOOR_PENALTY 3 #define OBJECT_PENALTY 20 #define HUMAN_PENALTY 4 diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 640eb12ea9..4e0fb9422c 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -144,21 +144,6 @@ Administrative related. /datum/config_entry/string/ooc_color_normal config_entry_value = "#1c52f5" -/datum/config_entry/string/ooc_color_other - config_entry_value = "#2e78d9" - -/datum/config_entry/string/ooc_color_mods - config_entry_value = "#ffbf00" - -/datum/config_entry/string/ooc_color_debug - config_entry_value = "#6bd1b4" - -/datum/config_entry/string/ooc_color_admin - config_entry_value = "#ff8000" - -/datum/config_entry/string/ooc_color_default - config_entry_value = "#b82e00" - /datum/config_entry/flag/usewhitelist /datum/config_entry/flag/usealienwhitelist diff --git a/code/controllers/subsystem/minimap.dm b/code/controllers/subsystem/minimap.dm index 93bfd32468..83bb088bc9 100644 --- a/code/controllers/subsystem/minimap.dm +++ b/code/controllers/subsystem/minimap.dm @@ -247,12 +247,19 @@ SUBSYSTEM_DEF(minimaps) blip.overlays += overlay images_by_source[target] = blip + for(var/flag in bitfield2list(hud_flags)) minimaps_by_z["[zlevel]"].images_assoc["[flag]"][target] = blip minimaps_by_z["[zlevel]"].images_raw["[flag]"] += blip + if(ismovableatom(target)) RegisterSignal(target, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_z_change)) blip.RegisterSignal(target, COMSIG_MOVABLE_MOVED, TYPE_PROC_REF(/image, minimap_on_move)) + + if(isitem(target)) + blip.RegisterSignal(target, COMSIG_ITEM_PICKUP, TYPE_PROC_REF(/image, minimap_on_pickup)) + blip.RegisterSignal(target, COMSIG_ITEM_DROPPED, TYPE_PROC_REF(/image, minimap_on_drop)) + removal_cbs[target] = CALLBACK(src, PROC_REF(removeimage), blip, target) RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(remove_marker)) @@ -299,6 +306,19 @@ SUBSYSTEM_DEF(minimaps) pixel_x = MINIMAP_PIXEL_FROM_WORLD(source.x) + SSminimaps.minimaps_by_z["[source_z]"].x_offset pixel_y = MINIMAP_PIXEL_FROM_WORLD(source.y) + SSminimaps.minimaps_by_z["[source_z]"].y_offset +/image/proc/minimap_on_pickup(obj/item/source, mob/user) + SIGNAL_HANDLER + + RegisterSignal(user, COMSIG_MOVABLE_MOVED, TYPE_PROC_REF(/image, minimap_on_move), override = TRUE) + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + +/image/proc/minimap_on_drop(obj/item/source, mob/user) + SIGNAL_HANDLER + + if(recursive_holder_check(source, recursion_limit = 5) != user) + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) + RegisterSignal(source, COMSIG_MOVABLE_MOVED, TYPE_PROC_REF(/image, minimap_on_move)) + /** * Removes an atom and it's blip from the subsystem. * Force has no effect on this proc, but is here because we are a COMSIG_PARENT_QDELETING handler. diff --git a/code/datums/components/xeno/ai_behavior_overrides/attack_override_behavior.dm b/code/datums/components/xeno/ai_behavior_overrides/attack_override_behavior.dm index 30ec893db3..2b2290586e 100644 --- a/code/datums/components/xeno/ai_behavior_overrides/attack_override_behavior.dm +++ b/code/datums/components/xeno/ai_behavior_overrides/attack_override_behavior.dm @@ -2,6 +2,12 @@ /datum/component/ai_behavior_override/attack behavior_icon_state = "attack_order" +/datum/component/ai_behavior_override/attack/Destroy(force, silent, ...) + for(var/mob/living/carbon/xenomorph/assigned_xeno in currently_assigned) + assigned_xeno.current_target = null + + . = ..() + /datum/component/ai_behavior_override/attack/check_behavior_validity(mob/living/carbon/xenomorph/checked_xeno, distance) . = ..() if(!.) diff --git a/code/datums/skills/uscm.dm b/code/datums/skills/uscm.dm index 73ce4ef972..6c6b4b4e7b 100644 --- a/code/datums/skills/uscm.dm +++ b/code/datums/skills/uscm.dm @@ -72,7 +72,6 @@ United States Colonial Marines SKILL_LEADERSHIP = SKILL_LEAD_EXPERT, SKILL_MEDICAL = SKILL_MEDICAL_TRAINED, SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED, - SKILL_VEHICLE = SKILL_VEHICLE_SMALL, SKILL_JTAC = SKILL_JTAC_TRAINED, SKILL_INTEL = SKILL_INTEL_TRAINED, ) diff --git a/code/datums/supply_packs/black_market.dm b/code/datums/supply_packs/black_market.dm index 1b8464820b..a48cdf62a8 100644 --- a/code/datums/supply_packs/black_market.dm +++ b/code/datums/supply_packs/black_market.dm @@ -28,6 +28,7 @@ black market prices are NOT based on real or in-universe costs. they are based o crate_heat = 5 /obj/structure/largecrate/black_market + fill_from_loc = FALSE /// Wipes points from objects inside to avoid infinite farming. var/points_wipe = TRUE //no special name so it can be hidden diff --git a/code/game/area/Sulaco.dm b/code/game/area/Sulaco.dm index ae19753714..e2461ed30a 100644 --- a/code/game/area/Sulaco.dm +++ b/code/game/area/Sulaco.dm @@ -110,8 +110,18 @@ name = "\improper Normandy Landing Zone" icon_state = "away2" +/area/shuttle/midway + name = "\improper Dropship Midway" + icon_state = "shuttlered" + base_muffle = MUFFLE_HIGH + soundscape_interval = 30 + is_landing_zone = TRUE + ceiling = CEILING_REINFORCED_METAL - +/area/shuttle/midway/Enter(atom/movable/O, atom/oldloc) + if(istype(O, /obj/structure/barricade)) + return FALSE + return TRUE //DISTRESS SHUTTLES diff --git a/code/game/jobs/role_authority.dm b/code/game/jobs/role_authority.dm index c147807f00..efb5e2ae8d 100644 --- a/code/game/jobs/role_authority.dm +++ b/code/game/jobs/role_authority.dm @@ -234,55 +234,16 @@ I hope it's easier to tell what the heck this proc is even doing, unlike previou if(length(overwritten_roles_for_mode)) temp_roles_for_mode = overwritten_roles_for_mode - // Get balancing weight for the readied players. - // Squad marine roles have a weight of 1, and shipside roles have a lower weight of SHIPSIDE_ROLE_WEIGHT. - players_preassigned = assign_roles(temp_roles_for_mode.Copy(), unassigned_players.Copy(), TRUE) - - // Even though we pass a copy of temp_roles_for_mode, job counters still change, so we reset them here. - for(var/title in temp_roles_for_mode) - var/datum/job/J = temp_roles_for_mode[title] - J.current_positions = 0 - - // Set up limits for other roles based on our balancing weight number. - // Set the xeno starting amount based on marines assigned - var/datum/job/antag/xenos/XJ = temp_roles_for_mode[JOB_XENOMORPH] - if(istype(XJ)) - XJ.set_spawn_positions(players_preassigned) - - // Limit the number of SQUAD MARINE roles players can roll initially - var/datum/job/SMJ = GET_MAPPED_ROLE(JOB_SQUAD_MARINE) - if(istype(SMJ)) - SMJ.set_spawn_positions(players_preassigned) - - // Set survivor starting amount based on marines assigned - var/datum/job/SJ = temp_roles_for_mode[JOB_SURVIVOR] - if(istype(SJ)) - SJ.set_spawn_positions(players_preassigned) - - var/datum/job/CO_surv_job = temp_roles_for_mode[JOB_CO_SURVIVOR] - if(istype(CO_surv_job)) - CO_surv_job.set_spawn_positions(players_preassigned) - - if(SSnightmare.get_scenario_value("predator_round")) - SSticker.mode.flags_round_type |= MODE_PREDATOR - // Set predators starting amount based on marines assigned - var/datum/job/PJ = temp_roles_for_mode[JOB_PREDATOR] - if(istype(PJ)) - PJ.set_spawn_positions(players_preassigned) - // Assign the roles, this time for real, respecting limits we have established. var/list/roles_left = assign_roles(temp_roles_for_mode, unassigned_players) - var/alternate_option_assigned = 0; for(var/mob/new_player/M in unassigned_players) switch(M.client.prefs.alternate_option) if(GET_RANDOM_JOB) roles_left = assign_random_role(M, roles_left) //We want to keep the list between assignments. - alternate_option_assigned++ if(BE_MARINE) var/datum/job/marine_job = GET_MAPPED_ROLE(JOB_SQUAD_MARINE) assign_role(M, marine_job) //Should always be available, in all game modes, as a candidate. Even if it may not be a marine. - alternate_option_assigned++ if(BE_XENOMORPH) assign_role(M, temp_roles_for_mode[JOB_XENOMORPH]) if(RETURN_TO_LOBBY) @@ -295,70 +256,54 @@ I hope it's easier to tell what the heck this proc is even doing, unlike previou unassigned_players = null - // Now we take spare unfilled xeno slots and make them larva NEW - var/datum/hive_status/hive = GLOB.hive_datum[XENO_HIVE_NORMAL] - if(istype(hive) && istype(XJ)) - hive.stored_larva += max(0, (XJ.total_positions - XJ.current_positions) \ - + (XJ.calculate_extra_spawn_positions(alternate_option_assigned))) - /*===============================================================*/ -/** -* Assign roles to the players. Return roles that are still avialable. -* If count is true, return role balancing weight instead. -*/ -/datum/authority/branch/role/proc/assign_roles(list/roles_for_mode, list/unassigned_players, count = FALSE) - var/list/roles_left = list() - var/assigned = 0 - for(var/priority in HIGH_PRIORITY to LOW_PRIORITY) - // Assigning xenos first. - assigned += assign_initial_roles(priority, roles_for_mode & ROLES_XENO, unassigned_players) - // Assigning special roles second. (survivor, predator) - assigned += assign_initial_roles(priority, roles_for_mode & (ROLES_WHITELISTED|ROLES_SPECIAL), unassigned_players) - // Assigning command third. - assigned += assign_initial_roles(priority, roles_for_mode & ROLES_COMMAND, unassigned_players) - // Assigning the rest - var/rest_roles_for_mode = roles_for_mode - (roles_for_mode & ROLES_XENO) - (roles_for_mode & ROLES_COMMAND) - (roles_for_mode & (ROLES_WHITELISTED|ROLES_SPECIAL)) - if(count) - assigned += assign_initial_roles(priority, rest_roles_for_mode, unassigned_players) - else - roles_left= assign_initial_roles(priority, rest_roles_for_mode, unassigned_players, FALSE) - if(count) - return assigned - return roles_left - -/datum/authority/branch/role/proc/assign_initial_roles(priority, list/roles_to_iterate, list/unassigned_players, count = TRUE) - var/assigned = 0 - if(!length(roles_to_iterate) || !length(unassigned_players)) +/// Assign roles to the players. Return roles that are still available. +/datum/authority/branch/role/proc/assign_roles(list/roles_to_assign, list/unassigned_players) + if(!length(roles_to_assign) || !length(unassigned_players)) return - for(var/job in roles_to_iterate) - var/datum/job/J = roles_to_iterate[job] - if(!istype(J)) //Shouldn't happen, but who knows. - to_world(SPAN_DEBUG("Error setting up jobs, no job datum set for: [job].")) - log_debug("Error setting up jobs, no job datum set for: [job].") - continue + for(var/mob/new_player/cycled_unassigned in shuffle(unassigned_players)) + var/player_assigned_job = FALSE + log_debug("We have started assigning for [cycled_unassigned]") + + for(var/priority in HIGH_PRIORITY to LOW_PRIORITY) + var/wanted_jobs_by_name = shuffle(cycled_unassigned.client?.prefs?.get_jobs_by_priority(priority)) + log_debug("We have started cycled through priority [priority] for [cycled_unassigned]") + + for(var/job_name in wanted_jobs_by_name) + log_debug("We are cycling through wanted jobs and are at [job_name] for [cycled_unassigned]") + if(job_name in roles_to_assign) + log_debug("We have found [job_name] in roles to assign for [cycled_unassigned]") + var/datum/job/actual_job = roles_to_assign[job_name] + + if(assign_role(cycled_unassigned, actual_job)) + log_debug("We have assigned [job_name] to [cycled_unassigned]") + unassigned_players -= cycled_unassigned + + if(actual_job.spawn_positions != -1 && actual_job.current_positions >= actual_job.spawn_positions) + roles_to_assign -= job_name + log_debug("We have ran out of slots for [job_name] and it has been removed from roles to assign") + + player_assigned_job = TRUE + break + + if(player_assigned_job) + log_debug("[cycled_unassigned] has been assigned a job and we are breaking") + break + + log_debug("[cycled_unassigned] did not get a job at priority [priority], moving to next priority level") + + if(!length(roles_to_assign)) + log_debug("No more roles to assign, breaking") + break + + if(!player_assigned_job) + log_debug("[cycled_unassigned] was unable to be assigned a job based on preferences and roles to assign. We still have roles to assign, continuing to next player") + + log_debug("Assigning complete. Players unassigned: [length(unassigned_players)] Jobs unassigned: [length(roles_to_assign)]") - var/role_weight = calculate_role_weight(J) - for(var/M in unassigned_players) - var/mob/new_player/NP = M - if(!(NP.client.prefs.get_job_priority(J.title) == priority)) - continue //If they don't want the job. //TODO Change the name of the prefs proc? - - if(assign_role(NP, J)) - assigned += role_weight - unassigned_players -= NP - // -1 check is not strictly needed here, since standard marines are - // supposed to have an actual spawn_positions number at this point - if(J.spawn_positions != -1 && J.current_positions >= J.spawn_positions) - roles_to_iterate -= job //Remove the position, since we no longer need it. - break //Maximum position is reached? - - if(!length(unassigned_players)) - break //No players left to assign? Break. - if(count) - return assigned - return roles_to_iterate + return roles_to_assign /** * Calculate role balance weight for one person joining as that role. This weight is used diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index a8735cbc06..b075808652 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -114,6 +114,13 @@ name = "ares core camera" network = list(CAMERA_NET_ALMAYER, CAMERA_NET_ARES) +/obj/structure/machinery/camera/autoname/golden_arrow + name = "military-grade camera" + network = list(CAMERA_NET_GOLDEN_ARROW) + +/obj/structure/machinery/camera/autoname/golden_arrow/midway + network = list(CAMERA_NET_GOLDEN_ARROW, CAMERA_NET_MIDWAY) + //used by the landing camera dropship equipment. Do not place them right under where the dropship lands. //Should place them near each corner of your LZs. /obj/structure/machinery/camera/autoname/lz_camera diff --git a/code/game/machinery/computer/camera_console.dm b/code/game/machinery/computer/camera_console.dm index 281c548227..b5cfc856b0 100644 --- a/code/game/machinery/computer/camera_console.dm +++ b/code/game/machinery/computer/camera_console.dm @@ -377,4 +377,8 @@ name = "\improper 'Normandy' camera controls" network = list(CAMERA_NET_NORMANDY, CAMERA_NET_LASER_TARGETS) +/obj/structure/machinery/computer/cameras/dropship/midway + name = "\improper 'Midway' camera controls" + network = list(CAMERA_NET_MIDWAY, CAMERA_NET_LASER_TARGETS) + #undef DEFAULT_MAP_SIZE diff --git a/code/game/machinery/computer/dropship_weapons.dm b/code/game/machinery/computer/dropship_weapons.dm index 6218bf0cde..370461cff7 100644 --- a/code/game/machinery/computer/dropship_weapons.dm +++ b/code/game/machinery/computer/dropship_weapons.dm @@ -9,6 +9,7 @@ unslashable = TRUE unacidable = TRUE exproof = TRUE + var/shuttle_tag // Used to know which shuttle we're linked to. var/obj/structure/dropship_equipment/selected_equipment //the currently selected equipment installed on the shuttle this console controls. var/list/shuttle_equipments = list() //list of the equipments on the shuttle this console controls @@ -28,6 +29,8 @@ /obj/structure/machinery/computer/dropship_weapons/Initialize() . = ..() simulation = new() + firemission_envelope = new /datum/cas_fire_envelope/uscm_dropship() + req_one_access = list(ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP, ACCESS_WY_FLIGHT) /obj/structure/machinery/computer/dropship_weapons/New() ..() @@ -717,29 +720,23 @@ else firemission_envelope.change_current_loc(shootloc) +/obj/structure/machinery/computer/dropship_weapons/Destroy() + . = ..() + + QDEL_NULL(firemission_envelope) + +/obj/structure/machinery/computer/dropship_weapons/midway + name = "\improper 'Midway' weapons controls" + shuttle_tag = DROPSHIP_MIDWAY + /obj/structure/machinery/computer/dropship_weapons/dropship1 name = "\improper 'Alamo' weapons controls" - req_one_access = list(ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP, ACCESS_WY_FLIGHT) - firemission_envelope = new /datum/cas_fire_envelope/uscm_dropship() - -/obj/structure/machinery/computer/dropship_weapons/dropship1/New() - ..() shuttle_tag = DROPSHIP_ALAMO /obj/structure/machinery/computer/dropship_weapons/dropship2 name = "\improper 'Normandy' weapons controls" - req_one_access = list(ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP, ACCESS_WY_FLIGHT) - firemission_envelope = new /datum/cas_fire_envelope/uscm_dropship() - -/obj/structure/machinery/computer/dropship_weapons/dropship2/New() - ..() shuttle_tag = DROPSHIP_NORMANDY -/obj/structure/machinery/computer/dropship_weapons/Destroy() - . = ..() - - QDEL_NULL(firemission_envelope) - // CAS TGUI SHIT \\ /obj/structure/machinery/computer/dropship_weapons/tgui_interact(mob/user, datum/tgui/ui) diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 255a655ca5..dabca58935 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -135,6 +135,9 @@ if(R.receive_range(display_freq, level) > -1 && OBJECTS_CAN_REACH(loc, radio_loc)) radios += R + if(GLOB.radio_communication_clarity < 100) + message = stars(message, GLOB.radio_communication_clarity) + // Get a list of mobs who can hear from the radios we collected. var/list/receive = get_mobs_in_radio_ranges(radios) diff --git a/code/game/objects/items/fulton.dm b/code/game/objects/items/fulton.dm index afaaaa6d20..7770428298 100644 --- a/code/game/objects/items/fulton.dm +++ b/code/game/objects/items/fulton.dm @@ -119,7 +119,7 @@ var/global/list/deployed_fultons = list() return for(var/obj/item/stack/fulton/F in get_turf(target_atom)) return - var/obj/item/stack/fulton/F = new /obj/item/stack/fulton(get_turf(target_atom), 1, target_atom) + var/obj/item/stack/fulton/F = new type(get_turf(target_atom), 1, target_atom) transfer_fingerprints_to(F) src.add_fingerprint(user) F.add_fingerprint(user) @@ -172,3 +172,12 @@ var/global/list/deployed_fultons = list() qdel(reservation) qdel(src) return + +/obj/item/stack/fulton/destroy_on_use + +/obj/item/stack/fulton/destroy_on_use/deploy_fulton() + . = ..() + + qdel(attached_atom) + qdel(reservation) + qdel(src) diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 2f2877ba75..6ff298dc9b 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -7,6 +7,13 @@ anchored = FALSE var/parts_type = /obj/item/stack/sheet/wood var/unpacking_sound = 'sound/effects/woodhit.ogg' + var/fill_from_loc = TRUE + +/obj/structure/largecrate/Initialize(mapload, ...) + . = ..() + + if(fill_from_loc) + store_items() /obj/structure/largecrate/initialize_pass_flags(datum/pass_flags_container/PF) ..() @@ -17,6 +24,17 @@ to_chat(user, SPAN_NOTICE("You need a crowbar to pry this open!")) return +/obj/structure/largecrate/proc/store_items() + for(var/obj/item/location_item in loc) + if(istype(location_item, /obj/item/explosive/plastic)) + var/obj/item/explosive/plastic/plastic_explosive = location_item + if(plastic_explosive.active) + continue + if(location_item.w_class > SIZE_HUGE) + continue + if(!location_item.anchored) + location_item.forceMove(src) + /obj/structure/largecrate/proc/unpack() var/turf/current_turf = get_turf(src) // Get the turf the crate is on @@ -82,9 +100,11 @@ /obj/structure/largecrate/mule icon_state = "mulecrate" + fill_from_loc = FALSE /obj/structure/largecrate/lisa icon_state = "lisacrate" + fill_from_loc = FALSE /obj/structure/largecrate/lisa/attackby(obj/item/W as obj, mob/user as mob) //ugly but oh well if(HAS_TRAIT(W, TRAIT_TOOL_CROWBAR)) @@ -94,6 +114,7 @@ /obj/structure/largecrate/cow name = "cow crate" icon_state = "lisacrate" + fill_from_loc = FALSE /obj/structure/largecrate/cow/attackby(obj/item/W as obj, mob/user as mob) if(HAS_TRAIT(W, TRAIT_TOOL_CROWBAR)) @@ -103,6 +124,7 @@ /obj/structure/largecrate/goat name = "goat crate" icon_state = "lisacrate" + fill_from_loc = FALSE /obj/structure/largecrate/goat/attackby(obj/item/W as obj, mob/user as mob) if(HAS_TRAIT(W, TRAIT_TOOL_CROWBAR)) @@ -112,6 +134,7 @@ /obj/structure/largecrate/chick name = "chicken crate" icon_state = "lisacrate" + fill_from_loc = FALSE /obj/structure/largecrate/chick/attackby(obj/item/W as obj, mob/user as mob) if(HAS_TRAIT(W, TRAIT_TOOL_CROWBAR)) @@ -124,6 +147,7 @@ // CM largecrates /obj/structure/largecrate/random name = "supply crate" + fill_from_loc = FALSE var/num_things = 0 var/list/stuff = list(/obj/item/cell/high, /obj/item/storage/belt/utility/full, @@ -306,6 +330,7 @@ /obj/structure/largecrate/guns name = "\improper USCM firearms crate (x3)" + fill_from_loc = FALSE var/num_guns = 3 var/num_mags = 3 var/list/stuff = list( @@ -373,6 +398,7 @@ /obj/structure/largecrate/hunter_games_construction name = "construction crate" + fill_from_loc = FALSE /obj/structure/largecrate/hunter_games_construction/Initialize() . = ..() diff --git a/code/game/objects/structures/crates_lockers/largecrate_supplies.dm b/code/game/objects/structures/crates_lockers/largecrate_supplies.dm index ec62d27198..ff35e97d12 100644 --- a/code/game/objects/structures/crates_lockers/largecrate_supplies.dm +++ b/code/game/objects/structures/crates_lockers/largecrate_supplies.dm @@ -88,6 +88,7 @@ /obj/structure/largecrate/supply name = "supply crate" + fill_from_loc = FALSE var/list/supplies = list() /obj/structure/largecrate/supply/Initialize() @@ -334,6 +335,7 @@ name = "machine crate" desc = "A crate containing a pre-assembled machine." icon_state = "secure_crate_strapped" + fill_from_loc = FALSE var/dir_needed = EAST //If set to anything but 0, will check that space before spawning in. var/unmovable = 1 //If set to 1, then on examine, the user will see a warning that states the contents cannot be moved after opened. diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index bf84bc04bf..312c351f47 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -259,6 +259,14 @@ /turf/closed/shuttle/dropship2/transparent opacity = FALSE +/turf/closed/shuttle/midway + name = "\improper Midway" + icon = 'icons/turf/dropship.dmi' + icon_state = "1" + +/turf/closed/shuttle/midway/transparent + opacity = FALSE + /turf/closed/shuttle/twe_dropship name = "\improper UD4-UK" icon = 'icons/turf/twedropship.dmi' diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 3c964cf401..1d5ad124b8 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -41,20 +41,12 @@ var/display_colour = GLOB.ooc_color_override if(!display_colour) display_colour = CONFIG_GET(string/ooc_color_normal) - if(admin_holder && !admin_holder.fakekey) - display_colour = CONFIG_GET(string/ooc_color_other) - if(admin_holder.rights & R_DEBUG) - display_colour = CONFIG_GET(string/ooc_color_debug) - if(admin_holder.rights & R_MOD) - display_colour = CONFIG_GET(string/ooc_color_mods) - if(admin_holder.rights & R_ADMIN) - display_colour = CONFIG_GET(string/ooc_color_admin) - if(admin_holder.rights & R_COLOR) - display_colour = prefs.ooccolor + if(admin_holder && !admin_holder.fakekey && admin_holder.rights & R_COLOR) + display_colour = prefs.ooccolor else if(donator) display_colour = prefs.ooccolor if(!display_colour) // if invalid R_COLOR choice - display_colour = CONFIG_GET(string/ooc_color_default) + display_colour = CONFIG_GET(string/ooc_color_normal) msg = process_chat_markup(msg, list("*")) var/ooc_prefix = handle_ooc_prefix() diff --git a/code/modules/admin/game_master/game_master.dm b/code/modules/admin/game_master/game_master.dm index d3bc3b0fbc..d8a9b1c32e 100644 --- a/code/modules/admin/game_master/game_master.dm +++ b/code/modules/admin/game_master/game_master.dm @@ -55,8 +55,7 @@ GLOBAL_VAR_INIT(radio_communication_clarity, 100) /// Associated list of game master submenus organized by object_type = game_master_submenu var/list/submenu_types = list( - /obj/structure/pipes/vents/scrubber = /datum/game_master_submenu/vents, - /obj/structure/pipes/vents/pump = /datum/game_master_submenu/vents, + /obj/structure/pipes/vents = /datum/game_master_submenu/vents, ) /// List of current submenus diff --git a/code/modules/admin/player_panel/actions/physical.dm b/code/modules/admin/player_panel/actions/physical.dm index a48f39e81a..2728cbfc5d 100644 --- a/code/modules/admin/player_panel/actions/physical.dm +++ b/code/modules/admin/player_panel/actions/physical.dm @@ -98,7 +98,7 @@ SSticker.mode.latejoin_tally-- //Cryoing someone out removes someone from the Marines, blocking further larva spawns until accounted for //Handle job slot/tater cleanup. - RoleAuthority.free_role(RoleAuthority.roles_for_mode[target.job], TRUE) + RoleAuthority.free_role(GET_MAPPED_ROLE(target.job), TRUE) //Delete them from datacore. var/target_ref = WEAKREF(target) diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index d1e7f83dac..4879db24aa 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -206,10 +206,10 @@ /datum/asset/spritesheet/playtime_rank/register() var/icon_file = 'icons/mob/hud/hud.dmi' - var/tier1_state = "hudxenoupgrade2" - var/tier2_state = "hudxenoupgrade3" - var/tier3_state = "hudxenoupgrade4" - var/tier4_state = "hudxenoupgrade5" + var/tier1_state = "hudxenoupgrade1" + var/tier2_state = "hudxenoupgrade2" + var/tier3_state = "hudxenoupgrade3" + var/tier4_state = "hudxenoupgrade4" var/icon/tier1_icon = icon(icon_file, tier1_state, SOUTH) var/icon/tier2_icon = icon(icon_file, tier2_state, SOUTH) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 2e1f8f33f2..fd11ed2931 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -254,7 +254,7 @@ var/const/MAX_SAVE_SLOTS = 10 if(load_character()) return if(!ooccolor) - ooccolor = CONFIG_GET(string/ooc_color_default) + ooccolor = CONFIG_GET(string/ooc_color_normal) gender = pick(MALE, FEMALE) real_name = random_name(gender) gear = list() @@ -908,6 +908,20 @@ var/const/MAX_SAVE_SLOTS = 10 return job_preference_list[J] +/// Returns a list of all the proference's jobs set to the priority argument +/datum/preferences/proc/get_jobs_by_priority(priority) + var/list/jobs_to_return = list() + + if(!length(job_preference_list)) + ResetJobs() + return jobs_to_return + + for(var/job in job_preference_list) + if(job_preference_list[job] == priority) + jobs_to_return += job + + return jobs_to_return + /datum/preferences/proc/SetJobDepartment(datum/job/J, priority) if(!J || priority < 0 || priority > 4) return FALSE @@ -1394,15 +1408,11 @@ var/const/MAX_SAVE_SLOTS = 10 var/prefix_length = length(new_xeno_prefix) - if(prefix_length>3) + if(prefix_length > 3) to_chat(user, SPAN_WARNING(FONT_SIZE_BIG("Invalid Xeno Prefix. Your Prefix can only be up to 3 letters long."))) return - if(prefix_length==3) - var/playtime = user.client.get_total_xeno_playtime() - if(playtime < 124 HOURS) - to_chat(user, SPAN_WARNING(FONT_SIZE_BIG("You need to play [time_left_until(124 HOURS, playtime, 1 HOURS)] more hours to unlock xeno three letter prefix."))) - return + if(prefix_length == 3) if(xeno_postfix) to_chat(user, SPAN_WARNING(FONT_SIZE_BIG("You can't use three letter prefix with any postfix."))) return @@ -1427,12 +1437,8 @@ var/const/MAX_SAVE_SLOTS = 10 to_chat(user, SPAN_WARNING(FONT_SIZE_BIG("You are banned from xeno name picking."))) xeno_postfix = "" return - var/playtime = user.client.get_total_xeno_playtime() - if(playtime < 24 HOURS) - to_chat(user, SPAN_WARNING(FONT_SIZE_BIG("You need to play [time_left_until(24 HOURS, playtime, 1 HOURS)] more hours to unlock xeno postfix."))) - return - if(length(xeno_prefix)==3) + if(length(xeno_prefix) == 3) to_chat(user, SPAN_WARNING(FONT_SIZE_BIG("You can't use three letter prefix with any postfix."))) return @@ -1449,23 +1455,22 @@ var/const/MAX_SAVE_SLOTS = 10 var/first_char = TRUE for(var/i=1, i<=length(new_xeno_postfix), i++) var/ascii_char = text2ascii(new_xeno_postfix,i) + switch(ascii_char) // A .. Z if(65 to 90) //Uppercase Letters will work on first char - if(length(xeno_prefix)!=2) to_chat(user, SPAN_WARNING(FONT_SIZE_BIG("You can't use three letter prefix with any postfix."))) return - if(!first_char && playtime < 300 HOURS) - to_chat(user, SPAN_WARNING(FONT_SIZE_BIG("You need to play [time_left_until(300 HOURS, playtime, 1 HOURS)] more hours to unlock double letter xeno postfix."))) - all_ok = FALSE // 0 .. 9 if(48 to 57) //Numbers will work if not the first char if(first_char) all_ok = FALSE + else all_ok = FALSE //everything else - won't + first_char = FALSE if(all_ok) xeno_postfix = new_xeno_postfix diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index c885e9b73a..aa02e580b5 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -208,7 +208,7 @@ S["tooltips"] >> tooltips //Sanitize - ooccolor = sanitize_hexcolor(ooccolor, CONFIG_GET(string/ooc_color_default)) + ooccolor = sanitize_hexcolor(ooccolor, CONFIG_GET(string/ooc_color_normal)) lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) UI_style = sanitize_inlist(UI_style, list("white", "dark", "midnight", "orange", "old"), initial(UI_style)) tgui_say = sanitize_integer(tgui_say, FALSE, TRUE, TRUE) diff --git a/code/modules/cm_marines/dropship_equipment.dm b/code/modules/cm_marines/dropship_equipment.dm index f12966b471..8503dc5981 100644 --- a/code/modules/cm_marines/dropship_equipment.dm +++ b/code/modules/cm_marines/dropship_equipment.dm @@ -261,7 +261,8 @@ deployed_turret.linked_cam.network = list(CAMERA_NET_ALAMO) else if (linked_shuttle.id == DROPSHIP_NORMANDY) deployed_turret.linked_cam.network = list(CAMERA_NET_NORMANDY) - + else if(linked_shuttle.id == DROPSHIP_MIDWAY) + deployed_turret.linked_cam.network = list(CAMERA_NET_MIDWAY) /obj/structure/dropship_equipment/sentry_holder/proc/undeploy_sentry() if(!deployed_turret) diff --git a/code/modules/dropships/attach_points/templates.dm b/code/modules/dropships/attach_points/templates.dm index 51c870f04b..1d0fc53d8a 100644 --- a/code/modules/dropships/attach_points/templates.dm +++ b/code/modules/dropships/attach_points/templates.dm @@ -80,6 +80,47 @@ transverse = 3 long = 0 +/obj/effect/attach_point/weapon/midway + ship_tag = DROPSHIP_MIDWAY + +/obj/effect/attach_point/weapon/midway/left_wing + name = "port wing weapon attach point" + icon_state = "equip_base_l_wing" + attach_id = 1 + dir = WEST + firing_arc_min = -3 + firing_arc_max = 3 + transverse = -3 + long = 0 + +/obj/effect/attach_point/weapon/midway/left_fore + name = "port fore weapon attach point" + attach_id = 2 + dir = NORTH + firing_arc_min = -6 + firing_arc_max = 0 + transverse = 0 + long = 0 + +/obj/effect/attach_point/weapon/midway/right_fore + name = "starboard fore weapon attach point" + attach_id = 3 + dir = NORTH + firing_arc_min = 0 + firing_arc_max = 6 + transverse = 0 + long = 0 + +/obj/effect/attach_point/weapon/midway/right_wing + name = "starboard wing weapon attach point" + icon_state = "equip_base_r_wing"; + attach_id = 4 + dir = EAST + firing_arc_min = -3 + firing_arc_max = 3 + transverse = 3 + long = 0 + /obj/effect/attach_point/crew_weapon name = "crew compartment attach point" base_category = DROPSHIP_CREW_WEAPON @@ -90,6 +131,9 @@ /obj/effect/attach_point/crew_weapon/dropship2 ship_tag = DROPSHIP_NORMANDY +/obj/effect/attach_point/crew_weapon/midway + ship_tag = DROPSHIP_MIDWAY + /obj/effect/attach_point/electronics name = "electronic system attach point" base_category = DROPSHIP_ELECTRONICS @@ -102,6 +146,9 @@ /obj/effect/attach_point/electronics/dropship2 ship_tag = DROPSHIP_NORMANDY +/obj/effect/attach_point/electronics/midway + ship_tag = DROPSHIP_MIDWAY + /obj/effect/attach_point/fuel name = "engine system attach point" icon = 'icons/obj/structures/props/almayer_props64.dmi' @@ -114,6 +161,9 @@ /obj/effect/attach_point/fuel/dropship2 ship_tag = DROPSHIP_NORMANDY +/obj/effect/attach_point/fuel/midway + ship_tag = DROPSHIP_MIDWAY + /obj/effect/attach_point/computer base_category = DROPSHIP_COMPUTER @@ -122,3 +172,6 @@ /obj/effect/attach_point/computer/dropship2 ship_tag = DROPSHIP_NORMANDY + +/obj/effect/attach_point/computer/midway + ship_tag = DROPSHIP_MIDWAY diff --git a/code/modules/maptext_alerts/text_blurbs.dm b/code/modules/maptext_alerts/text_blurbs.dm index c942543f88..d34a4ef19a 100644 --- a/code/modules/maptext_alerts/text_blurbs.dm +++ b/code/modules/maptext_alerts/text_blurbs.dm @@ -14,7 +14,7 @@ exempt_ztraits = trait or list of traits of zlevels where any marines don't see shouldn't see the ship marines' drop message. Ex. ZTRAIT_GROUND by default. unit = the unit the marines are from. FF, Dust Raiders etc. Military crew see this. base = the base the marines are staging from. The ship, Whiskey Outpost etc. Noncombat crew see this.**/ -/proc/show_blurb_uscm(list/exempt_ztraits = ZTRAIT_GROUND, unit = "2nd Bat. 'Falling Falcons'", base = station_name) +/proc/show_blurb_uscm(list/exempt_ztraits = ZTRAIT_GROUND, unit = "3rd Bat. 'Solar Devils'", base = station_name) if(!islist(exempt_ztraits)) exempt_ztraits = list(exempt_ztraits) var/list/exempt_zlevels = SSmapping.levels_by_any_trait(exempt_ztraits) diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 8a13617fa7..19f461be75 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -90,9 +90,6 @@ else message = stars(message) - if(GLOB.radio_communication_clarity < 100) - message = stars(message, GLOB.radio_communication_clarity) - if(language) style = language.color diff --git a/code/modules/mob/living/carbon/xenomorph/XenoUpgrade.dm b/code/modules/mob/living/carbon/xenomorph/XenoUpgrade.dm index ae03d06466..a89a3ad32e 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoUpgrade.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoUpgrade.dm @@ -3,7 +3,6 @@ return age = XENO_NORMAL - var/hours_as_xeno = client.get_total_xeno_playtime() var/hours_as_caste = get_job_playtime(client, caste.caste_type) switch(hours_as_caste) @@ -16,16 +15,11 @@ if(JOB_PLAYTIME_TIER_4 to INFINITY) age = XENO_PRIME - if(hours_as_xeno < JOB_PLAYTIME_TIER_1) - age = XENO_YOUNG - // For people who wish to remain anonymous if(!client.prefs.playtime_perks) age = XENO_NORMAL switch(age) - if(XENO_YOUNG) - age_prefix = "Young " if(XENO_NORMAL) age_prefix = "" if(XENO_MATURE) diff --git a/code/modules/mob/living/carbon/xenomorph/ai/movement/lurking.dm b/code/modules/mob/living/carbon/xenomorph/ai/movement/lurking.dm index 15c4fb257b..e9413bc4a4 100644 --- a/code/modules/mob/living/carbon/xenomorph/ai/movement/lurking.dm +++ b/code/modules/mob/living/carbon/xenomorph/ai/movement/lurking.dm @@ -247,7 +247,7 @@ registered_turfs += cycled_open_turf var/mob/living/carbon/human/possible_target = locate() in cycled_open_turf - if(possible_target && (!parent.current_target || get_dist(parent, possible_target) < get_dist(parent, parent.current_target))) + if(possible_target && (!parent.current_target || get_dist(parent, possible_target) < get_dist(parent, parent.current_target)) && parent.check_mob_target(possible_target)) parent.current_target = possible_target /datum/xeno_ai_movement/linger/lurking/proc/unregister_turf_signals() @@ -261,8 +261,9 @@ if(!istype(entering_atom, /mob/living/carbon/human)) return - if(!parent.current_target || get_dist(parent, entering_atom) < get_dist(parent, parent.current_target)) - parent.current_target = entering_atom + var/mob/living/carbon/human/possible_target = entering_atom + if(!parent.current_target || get_dist(parent, possible_target) < get_dist(parent, parent.current_target) && parent.check_mob_target(possible_target)) + parent.current_target = possible_target /datum/xeno_ai_movement/linger/lurking/proc/lurking_parent_moved(atom/movable/moving_atom, atom/oldloc, direction, Forced) SIGNAL_HANDLER diff --git a/code/modules/mob/living/carbon/xenomorph/ai/xeno_ai.dm b/code/modules/mob/living/carbon/xenomorph/ai/xeno_ai.dm index 4389833604..0e29a8e353 100644 --- a/code/modules/mob/living/carbon/xenomorph/ai/xeno_ai.dm +++ b/code/modules/mob/living/carbon/xenomorph/ai/xeno_ai.dm @@ -23,15 +23,6 @@ QDEL_NULL(ai_movement_handler) return ..() -GLOBAL_LIST_INIT(ai_target_limbs, list( - "head", - "chest", - "l_leg", - "r_leg", - "l_arm", - "r_arm" -)) - /mob/living/carbon/xenomorph/proc/init_movement_handler() return new /datum/xeno_ai_movement(src) @@ -143,7 +134,8 @@ GLOBAL_LIST_INIT(ai_target_limbs, list( // Called whenever an obstacle is encountered but xeno_ai_obstacle returned something else than infinite // and now it is considered a valid path. /atom/proc/xeno_ai_act(mob/living/carbon/xenomorph/X) - return + X.do_click(src, "", list()) + return TRUE /mob/living/carbon/xenomorph/proc/can_move_and_apply_move_delay() // Unable to move, try next time. diff --git a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm index e3dfccbf88..c331324770 100644 --- a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm +++ b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm @@ -92,7 +92,7 @@ M.flick_attack_overlay(src, "slash") var/obj/limb/affecting - affecting = get_limb(rand_zone(M.zone_selected, 70)) + affecting = get_limb(M.mob_flags & AI_CONTROLLED ? rand_zone() : rand_zone(M.zone_selected, 70)) if(!affecting) //No organ, just get a random one affecting = get_limb(rand_zone(null, 0)) if(!affecting) //Still nothing?? @@ -517,46 +517,42 @@ //Prying open doors /obj/structure/machinery/door/airlock/attack_alien(mob/living/carbon/xenomorph/M) var/turf/cur_loc = M.loc - if(isElectrified()) - if(shock(M, 100)) - return XENO_NO_DELAY_ACTION + + . = XENO_NO_DELAY_ACTION + + if(M.claw_type >= CLAW_TYPE_SHARP) + M.animation_attack_on(src) + playsound(src, 'sound/effects/metalhit.ogg', 25, 1) + take_damage(damage_cap / XENO_HITS_TO_DESTROY_DOOR) + . = XENO_ATTACK_ACTION + + if(isElectrified() && shock(M, 100)) + return if(!density) to_chat(M, SPAN_WARNING("[src] is already open!")) - return XENO_NO_DELAY_ACTION + return if(heavy) to_chat(M, SPAN_WARNING("[src] is too heavy to open.")) - return XENO_NO_DELAY_ACTION + return if(welded) - if(M.claw_type >= CLAW_TYPE_SHARP) - M.animation_attack_on(src) - playsound(src, 'sound/effects/metalhit.ogg', 25, 1) - take_damage(damage_cap / XENO_HITS_TO_DESTROY_WELDED_DOOR) - return XENO_ATTACK_ACTION - else - to_chat(M, SPAN_WARNING("[src] is welded shut.")) - return XENO_NO_DELAY_ACTION + to_chat(M, SPAN_WARNING("[src] is welded shut.")) + return if(locked) - if(M.claw_type >= CLAW_TYPE_SHARP) - M.animation_attack_on(src) - playsound(src, 'sound/effects/metalhit.ogg', 25, 1) - take_damage(HEALTH_DOOR / XENO_HITS_TO_DESTROY_BOLTED_DOOR) - return XENO_ATTACK_ACTION - else - to_chat(M, SPAN_WARNING("[src] is bolted down tight.")) - return XENO_NO_DELAY_ACTION + to_chat(M, SPAN_WARNING("[src] is bolted down tight.")) + return if(!istype(cur_loc)) - return XENO_NO_DELAY_ACTION //Some basic logic here + return //Some basic logic here if(M.action_busy) - return XENO_NO_DELAY_ACTION + return if(M.lying) - return XENO_NO_DELAY_ACTION + return var/delay diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm b/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm index 7cb060c1c5..cf1f0f20ce 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm @@ -116,7 +116,6 @@ /mob/living/carbon/xenomorph/lurker/process_ai(delta_time) if(get_active_hand()) swap_hand() - zone_selected = pick(GLOB.ai_target_limbs) return ..() /datum/behavior_delegate/lurker_base diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm index b83b33e2ee..c4eba46c64 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm @@ -414,8 +414,6 @@ if(queen_aged) age_xeno() switch(age) - if(XENO_YOUNG) - name = "[name_prefix]Young Queen" //Young if(XENO_NORMAL) name = "[name_prefix]Queen" //Regular if(XENO_MATURE) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Runner.dm b/code/modules/mob/living/carbon/xenomorph/castes/Runner.dm index d95989693d..02699fb389 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Runner.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Runner.dm @@ -134,7 +134,6 @@ /mob/living/carbon/xenomorph/runner/process_ai(delta_time) if(get_active_hand()) swap_hand() - zone_selected = pick(GLOB.ai_target_limbs) return ..() /datum/behavior_delegate/runner_base diff --git a/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm b/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm index 9d0eb37c1b..ddadee2b5b 100644 --- a/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm +++ b/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm @@ -15,24 +15,50 @@ At bare minimum, make sure the relevant checks from parent types gets copied in */// - Morrow +// OBJECTS +/obj/structure/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) + . = ..() + if(!.) + return + + if(!density) + return 0 + + if(unslashable && !climbable) + return + + return OBJECT_PENALTY + +/obj/structure/xeno_ai_act(mob/living/carbon/xenomorph/X) + if(unslashable) + if(!X.action_busy) + do_climb(X) + return + + return ..() // MINERAL DOOR /obj/structure/mineral_door/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) return DOOR_PENALTY -/obj/structure/mineral_door/xeno_ai_act(mob/living/carbon/xenomorph/X) - X.do_click(src, "", list()) - return TRUE - /obj/structure/mineral_door/resin/xeno_ai_obstacle(mob/living/carbon/xenomorph/xeno, direction, turf/target) if(xeno.hivenumber != hivenumber) return ..() return 0 /obj/structure/mineral_door/resin/xeno_ai_act(mob/living/carbon/xenomorph/acting_xeno) - acting_xeno.a_intent = INTENT_HELP + if(acting_xeno.hivenumber == hivenumber) + acting_xeno.a_intent = INTENT_HELP . = ..() +/// Platforms +/obj/structure/platform/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) + . = ..() + if(!.) + return + + return DOOR_PENALTY + // Poddoors/shutters /obj/structure/machinery/door/poddoor/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) . = ..() @@ -61,60 +87,34 @@ At bare minimum, make sure the relevant checks from parent types gets copied in return DOOR_PENALTY -/obj/structure/machinery/door/xeno_ai_act(mob/living/carbon/xenomorph/X) - X.do_click(src, "", list()) - return TRUE - -// OBJECTS -/obj/structure/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) - . = ..() - if(!.) - return - - if(!density) - return 0 - - if(unslashable && !climbable) - return - - return OBJECT_PENALTY - -/obj/structure/xeno_ai_act(mob/living/carbon/xenomorph/X) - if(unslashable) - if(!X.action_busy) - do_climb(X) - return - X.do_click(src, "", list()) - return TRUE - - // HUMANS /mob/living/carbon/human/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) if(status_flags & GODMODE) return ..() + return HUMAN_PENALTY /mob/living/carbon/human/xeno_ai_act(mob/living/carbon/xenomorph/X) if(status_flags & GODMODE) - return ..() - X.do_click(src, "", list()) - return TRUE + return + + . = ..() // VEHICLES /obj/vehicle/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) - return VEHICLE_PENALTY + . = ..() + if(!.) + return -/obj/vehicle/xeno_ai_act(mob/living/carbon/xenomorph/X) - X.do_click(src, "", list()) - return TRUE + return VEHICLE_PENALTY // SENTRY /obj/structure/machinery/defenses/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) - return VEHICLE_PENALTY + . = ..() + if(!.) + return -/obj/structure/machinery/defenses/xeno_ai_act(mob/living/carbon/xenomorph/X) - X.do_click(src, "", list()) - return TRUE + return VEHICLE_PENALTY // WINDOW FRAME /obj/structure/window_frame/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) @@ -127,8 +127,19 @@ At bare minimum, make sure the relevant checks from parent types gets copied in if(!X.action_busy) do_climb(X) +/obj/structure/barricade/handrail/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) + . = ..() + if(!.) + return + + return DOOR_PENALTY + // Avoid barricades if possible. /obj/structure/barricade/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) + . = ..() + if(!.) + return + return BARRICADE_PENALTY // FIRE @@ -138,7 +149,18 @@ At bare minimum, make sure the relevant checks from parent types gets copied in return FIRE_PENALTY -// HOLES -/obj/effect/acid_hole/xeno_ai_act(mob/living/carbon/xenomorph/X) - X.do_click(src, "", list()) - return TRUE +/// Open turfs, sometimes open turfs are passed back as obstacles due to platforms and such, generally it's fast so very slight penalty mainly for handling subtypes properly +/turf/open/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) + . = ..() + if(!.) + return + + return OPEN_TURF_PENALTY + +/// Space, do NOT path into space. +/turf/open/space/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) + . = ..() + if(!.) + return + + return INFINITY diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 56951097a1..4e83a0a839 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -48,7 +48,7 @@ var/list/global/base_miss_chance = list( //Used to weight organs when an organ is hit randomly (i.e. not a directed, aimed attack). //Also used to weight the protection value that armor provides for covering that body part when calculating protection from full-body effects. var/list/global/organ_rel_size = list( - "head" = 15, + "head" = 20, "chest" = 70, "groin" = 30, "l_leg" = 25, @@ -60,7 +60,7 @@ var/list/global/organ_rel_size = list( "l_foot" = 10, "r_foot" = 10, "eyes" = 5, - "mouth" = 15, + "mouth" = 5, ) // This is much faster than a string comparison diff --git a/code/modules/shuttle/shuttles/dropship.dm b/code/modules/shuttle/shuttles/dropship.dm index 9d910882d1..0a69439011 100644 --- a/code/modules/shuttle/shuttles/dropship.dm +++ b/code/modules/shuttle/shuttles/dropship.dm @@ -104,6 +104,15 @@ set_security_level(SEC_LEVEL_RED) return +/obj/docking_port/mobile/marine_dropship/midway + name = "Midway" + id = DROPSHIP_MIDWAY + width = 9 + height = 18 + + dwidth = 4 + dheight = 8 + /obj/docking_port/mobile/marine_dropship/alamo name = "Alamo" id = DROPSHIP_ALAMO @@ -260,6 +269,12 @@ auto_open = TRUE roundstart_template = /datum/map_template/shuttle/normandy +/obj/docking_port/stationary/marine_dropship/golden_arrow_hangar + name = "Hangar Bay" + id = GOLDEN_ARROW_LZ + auto_open = TRUE + roundstart_template = /datum/map_template/shuttle/midway + /obj/docking_port/stationary/marine_dropship/crash_site auto_open = TRUE @@ -285,6 +300,10 @@ SEND_GLOBAL_SIGNAL(COMSIG_GLOB_GROUNDSIDE_FORSAKEN_HANDLING) +/datum/map_template/shuttle/midway + name = "Midway" + shuttle_id = DROPSHIP_MIDWAY + /datum/map_template/shuttle/alamo name = "Alamo" shuttle_id = DROPSHIP_ALAMO diff --git a/icons/mob/hud/hud.dmi b/icons/mob/hud/hud.dmi index c9e4c0c6c2..9189b5eff7 100644 Binary files a/icons/mob/hud/hud.dmi and b/icons/mob/hud/hud.dmi differ diff --git a/icons/turf/dropship.dmi b/icons/turf/dropship.dmi index b3cf56eb45..88a220eb6f 100644 Binary files a/icons/turf/dropship.dmi and b/icons/turf/dropship.dmi differ diff --git a/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm b/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm index 66c65da735..9cc753e4bd 100644 --- a/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm +++ b/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm @@ -26654,11 +26654,6 @@ icon_state = "floor2" }, /area/strata/ag/interior/outpost/engi/drome) -"chz" = ( -/obj/structure/flora/bush/ausbushes/ppflowers, -/obj/structure/bed/medevac_stretcher, -/turf/open/auto_turf/strata_grass/layer1, -/area/strata/ug/exterior/jungle/deep/carplake_center) "chB" = ( /turf/open/floor/interior/plastic, /area/strata/ag/interior/outpost/canteen) @@ -26669,12 +26664,6 @@ icon_state = "white_cyan2" }, /area/strata/ag/interior/outpost/canteen) -"chJ" = ( -/mob/living/simple_animal/hostile/carp{ - desc = "You think this might be Glubs's son." - }, -/turf/open/gm/dirt, -/area/strata/ug/exterior/jungle/deep/carplake_center) "chN" = ( /turf/open/auto_turf/strata_grass/layer1, /area/strata/ug/interior/jungle/deep/south_res) @@ -79028,7 +79017,7 @@ bDH cwD cuM cuM -chz +caw cuM cuM cwD @@ -80003,7 +79992,7 @@ cwD cwD cwD mmF -chJ +cwD cwD cwD cuM diff --git a/maps/map_files/golden_arrow/golden_arrow.dmm b/maps/map_files/golden_arrow/golden_arrow.dmm index fbc55b0e38..bbcbe52131 100644 --- a/maps/map_files/golden_arrow/golden_arrow.dmm +++ b/maps/map_files/golden_arrow/golden_arrow.dmm @@ -173,7 +173,8 @@ "aT" = ( /obj/structure/machinery/computer/cameras/almayer/vehicle{ dir = 4; - pixel_x = -17 + pixel_x = -17; + network = list("Golden Arrow","Vehicle","Midway") }, /obj/structure/machinery/prop/almayer/CICmap{ dir = 4; @@ -250,7 +251,7 @@ /obj/effect/decal/warning_stripes{ icon_state = "S" }, -/obj/structure/machinery/camera/autoname/almayer{ +/obj/structure/machinery/camera/autoname/golden_arrow{ dir = 8; name = "ship-grade camera" }, @@ -260,7 +261,7 @@ }, /area/golden_arrow/hangar) "bu" = ( -/obj/structure/machinery/camera/autoname/almayer, +/obj/structure/machinery/camera/autoname/golden_arrow, /obj/effect/decal/warning_stripes{ icon_state = "N"; pixel_y = 1 @@ -504,7 +505,7 @@ }, /area/golden_arrow/squad_two) "cB" = ( -/obj/structure/machinery/camera/autoname/almayer, +/obj/structure/machinery/camera/autoname/golden_arrow, /turf/open/floor/almayer, /area/golden_arrow/hangar) "cD" = ( @@ -1243,7 +1244,7 @@ /turf/open/floor/plating/plating_catwalk, /area/golden_arrow/hangar) "hk" = ( -/obj/structure/machinery/camera/autoname/almayer{ +/obj/structure/machinery/camera/autoname/golden_arrow{ dir = 4; name = "ship-grade camera" }, @@ -1583,7 +1584,7 @@ icon_state = "E"; pixel_x = 1 }, -/obj/structure/machinery/camera/autoname/almayer{ +/obj/structure/machinery/camera/autoname/golden_arrow{ dir = 8; name = "ship-grade camera" }, @@ -1832,7 +1833,7 @@ icon_state = "SE-out"; pixel_x = 1 }, -/obj/structure/machinery/camera/autoname/almayer{ +/obj/structure/machinery/camera/autoname/golden_arrow{ dir = 8; name = "ship-grade camera" }, @@ -3225,7 +3226,7 @@ }, /area/golden_arrow/canteen) "ug" = ( -/obj/structure/machinery/camera/autoname/almayer{ +/obj/structure/machinery/camera/autoname/golden_arrow{ dir = 4; name = "ship-grade camera" }, @@ -3747,7 +3748,7 @@ /obj/structure/machinery/recharger{ pixel_y = 6 }, -/obj/structure/machinery/camera/autoname/almayer{ +/obj/structure/machinery/camera/autoname/golden_arrow{ dir = 4; name = "ship-grade camera" }, @@ -3833,7 +3834,7 @@ }, /area/golden_arrow/supply) "yj" = ( -/obj/structure/machinery/camera/autoname/almayer{ +/obj/structure/machinery/camera/autoname/golden_arrow{ dir = 1; name = "ship-grade camera" }, @@ -3985,7 +3986,7 @@ }, /area/golden_arrow/hangar) "za" = ( -/obj/structure/machinery/camera/autoname/almayer, +/obj/structure/machinery/camera/autoname/golden_arrow, /obj/effect/decal/warning_stripes{ icon_state = "N"; pixel_y = 2 @@ -4005,7 +4006,7 @@ /area/golden_arrow/squad_one) "zl" = ( /obj/structure/machinery/power/smes/buildable, -/obj/structure/machinery/camera/autoname/almayer{ +/obj/structure/machinery/camera/autoname/golden_arrow{ dir = 8; name = "ship-grade camera" }, @@ -4053,7 +4054,7 @@ }, /area/golden_arrow/hangar) "zG" = ( -/obj/structure/machinery/camera/autoname/almayer{ +/obj/structure/machinery/camera/autoname/golden_arrow{ dir = 8; name = "ship-grade camera" }, @@ -4251,7 +4252,7 @@ /turf/open/floor/almayer, /area/golden_arrow/hangar) "AY" = ( -/obj/structure/machinery/camera/autoname/almayer{ +/obj/structure/machinery/camera/autoname/golden_arrow{ dir = 4; name = "ship-grade camera" }, @@ -4629,8 +4630,8 @@ "CZ" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/structure/machinery/computer/shuttle/dropship/flight/remote_control{ - name = "Alamo Remote Control Console"; - shuttleId = "dropship_alamo" + name = "Midway Remote Control Console"; + shuttleId = "dropship_midway" }, /turf/open/floor/almayer, /area/golden_arrow/platoon_commander_rooms) @@ -4888,7 +4889,7 @@ /area/golden_arrow/engineering) "EK" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/machinery/camera/autoname/almayer{ +/obj/structure/machinery/camera/autoname/golden_arrow{ dir = 8; name = "ship-grade camera" }, @@ -5580,7 +5581,7 @@ /area/golden_arrow/engineering) "IS" = ( /obj/structure/reagent_dispensers/fueltank, -/obj/structure/machinery/camera/autoname/almayer{ +/obj/structure/machinery/camera/autoname/golden_arrow{ dir = 4; name = "ship-grade camera" }, @@ -5949,7 +5950,7 @@ /turf/open/floor/plating/plating_catwalk, /area/golden_arrow/cryo_cells) "Lg" = ( -/obj/docking_port/stationary/marine_dropship/almayer_hangar_1, +/obj/docking_port/stationary/marine_dropship/golden_arrow_hangar, /turf/open/floor/plating, /area/golden_arrow/hangar) "Ll" = ( @@ -5998,7 +5999,7 @@ }, /area/golden_arrow/supply) "LE" = ( -/obj/structure/machinery/camera/autoname/almayer{ +/obj/structure/machinery/camera/autoname/golden_arrow{ dir = 8; name = "ship-grade camera" }, @@ -6434,7 +6435,7 @@ }, /area/golden_arrow/briefing) "Oj" = ( -/obj/structure/machinery/camera/autoname/almayer, +/obj/structure/machinery/camera/autoname/golden_arrow, /turf/open/floor/almayer{ icon_state = "plate" }, @@ -7109,7 +7110,7 @@ /obj/item/tool/wrench{ pixel_y = 7 }, -/obj/structure/machinery/camera/autoname/almayer{ +/obj/structure/machinery/camera/autoname/golden_arrow{ dir = 8; name = "ship-grade camera" }, @@ -7342,7 +7343,7 @@ /area/golden_arrow/cryo_cells) "Sy" = ( /obj/structure/machinery/disposal, -/obj/structure/machinery/camera/autoname/almayer{ +/obj/structure/machinery/camera/autoname/golden_arrow{ dir = 4; name = "ship-grade camera" }, @@ -7656,7 +7657,7 @@ "Ub" = ( /obj/structure/surface/table/almayer, /obj/effect/decal/cleanable/dirt, -/obj/structure/machinery/camera/autoname/almayer{ +/obj/structure/machinery/camera/autoname/golden_arrow{ dir = 8; name = "ship-grade camera" }, diff --git a/maps/shuttles/dropship_midway.dmm b/maps/shuttles/dropship_midway.dmm new file mode 100644 index 0000000000..4c41724f40 --- /dev/null +++ b/maps/shuttles/dropship_midway.dmm @@ -0,0 +1,814 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"af" = ( +/turf/closed/shuttle/midway/transparent{ + icon_state = "34" + }, +/area/shuttle/midway) +"bm" = ( +/obj/structure/shuttle/part/dropship1/transparent/engine_right_exhaust, +/turf/template_noop, +/area/shuttle/midway) +"bs" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin6" + }, +/area/shuttle/midway) +"dr" = ( +/obj/structure/machinery/door_control{ + id = "dropship_midway"; + name = "Dropship Lockdown"; + normaldoorcontrol = 3; + pixel_y = -19; + req_one_access_txt = "3;22" + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"dB" = ( +/obj/structure/shuttle/part/dropship1/left_inner_wing_connector, +/turf/open/space/basic, +/area/shuttle/midway) +"dD" = ( +/turf/closed/shuttle/midway/transparent{ + icon_state = "22" + }, +/area/shuttle/midway) +"dE" = ( +/turf/closed/shuttle/midway{ + icon_state = "42" + }, +/area/shuttle/midway) +"eu" = ( +/obj/structure/shuttle/part/dropship1/transparent/left_outer_bottom_wing, +/turf/template_noop, +/area/shuttle/midway) +"go" = ( +/obj/structure/phone_base/rotary{ + name = "Midway Telephone"; + phone_category = "Dropship"; + phone_id = "Midway"; + pixel_x = 11; + pixel_y = 16 + }, +/obj/structure/blocker/invisible_wall, +/obj/structure/machinery/computer/dropship_weapons/midway, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"gw" = ( +/obj/structure/shuttle/part/dropship2/transparent/engine_right_cap, +/turf/template_noop, +/area/shuttle/midway) +"hl" = ( +/turf/closed/shuttle/midway{ + icon_state = "24" + }, +/area/shuttle/midway) +"hL" = ( +/obj/structure/machinery/light{ + dir = 8; + pixel_x = -14 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin2" + }, +/area/shuttle/midway) +"hO" = ( +/turf/closed/shuttle/midway/transparent{ + icon_state = "86" + }, +/area/shuttle/midway) +"if" = ( +/turf/closed/shuttle/midway/transparent{ + icon_state = "27" + }, +/area/shuttle/midway) +"im" = ( +/obj/structure/shuttle/part/dropship1/transparent/nose_top_left, +/obj/structure/shuttle/part/dropship1/transparent/nose_top_left, +/turf/template_noop, +/area/shuttle/midway) +"iv" = ( +/obj/structure/machinery/cm_vending/sorted/medical/wall_med{ + pixel_x = -30 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"je" = ( +/obj/structure/machinery/camera/autoname/golden_arrow/midway{ + dir = 4; + pixel_x = -23 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/shuttle/midway) +"jy" = ( +/obj/effect/attach_point/crew_weapon/midway, +/obj/structure/machinery/light{ + dir = 8; + pixel_x = -14 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"jW" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/shuttle/midway) +"kC" = ( +/obj/structure/platform{ + dir = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/turf/open/shuttle/dropship{ + icon_state = "floor8" + }, +/area/shuttle/midway) +"ls" = ( +/turf/closed/shuttle/midway/transparent{ + icon_state = "35" + }, +/area/shuttle/midway) +"lC" = ( +/turf/closed/shuttle/midway{ + icon_state = "104" + }, +/area/shuttle/midway) +"mh" = ( +/obj/structure/shuttle/part/dropship1/right_inner_wing_connector, +/turf/open/space/basic, +/area/shuttle/midway) +"mE" = ( +/obj/structure/shuttle/part/dropship1/transparent/left_inner_bottom_wing, +/turf/template_noop, +/area/shuttle/midway) +"mG" = ( +/obj/structure/shuttle/part/dropship1/transparent/upper_left_wing, +/turf/template_noop, +/area/shuttle/midway) +"mL" = ( +/obj/structure/platform_decoration{ + dir = 4 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin7" + }, +/area/shuttle/midway) +"mR" = ( +/obj/structure/shuttle/part/dropship1/nose_front_left, +/turf/template_noop, +/area/shuttle/midway) +"nH" = ( +/obj/structure/shuttle/part/dropship1/transparent/nose_center, +/turf/template_noop, +/area/shuttle/midway) +"od" = ( +/obj/structure/shuttle/part/dropship1/transparent/middle_left_wing, +/turf/template_noop, +/area/shuttle/midway) +"ro" = ( +/turf/closed/shuttle/midway/transparent{ + icon_state = "80" + }, +/area/shuttle/midway) +"rq" = ( +/turf/closed/shuttle/midway{ + icon_state = "77" + }, +/area/shuttle/midway) +"rr" = ( +/turf/closed/shuttle/midway{ + icon_state = "103" + }, +/area/shuttle/midway) +"rF" = ( +/obj/structure/shuttle/part/dropship1/lower_right_wall, +/turf/template_noop, +/area/shuttle/midway) +"rR" = ( +/turf/closed/shuttle/midway/transparent{ + icon_state = "32" + }, +/area/shuttle/midway) +"sl" = ( +/turf/closed/shuttle/midway{ + icon_state = "31" + }, +/area/shuttle/midway) +"tf" = ( +/obj/structure/bed/chair/dropship/pilot{ + dir = 1 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"ti" = ( +/obj/structure/extinguisher_cabinet/lifeboat{ + pixel_x = 12 + }, +/turf/closed/shuttle/midway/transparent{ + icon_state = "78" + }, +/area/shuttle/midway) +"tG" = ( +/obj/structure/machinery/cm_vending/sorted/medical/wall_med{ + pixel_x = 30 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/shuttle/midway) +"tP" = ( +/obj/structure/shuttle/part/dropship1/transparent/right_outer_bottom_wing, +/turf/template_noop, +/area/shuttle/midway) +"ul" = ( +/obj/structure/shuttle/part/dropship2/transparent/engine_left_cap, +/turf/template_noop, +/area/shuttle/midway) +"ux" = ( +/obj/structure/bed/chair/vehicle{ + pixel_x = -8 + }, +/obj/structure/bed/chair/vehicle{ + pixel_x = 8 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin14" + }, +/area/shuttle/midway) +"vJ" = ( +/turf/closed/shuttle/midway{ + icon_state = "92" + }, +/area/shuttle/midway) +"vN" = ( +/obj/structure/shuttle/part/dropship1/transparent/middle_right_wing, +/turf/template_noop, +/area/shuttle/midway) +"wB" = ( +/turf/closed/shuttle/midway{ + icon_state = "83" + }, +/area/shuttle/midway) +"xp" = ( +/turf/closed/shuttle/midway{ + icon_state = "62" + }, +/area/shuttle/midway) +"xy" = ( +/obj/effect/attach_point/crew_weapon/midway, +/obj/structure/machinery/light{ + dir = 4; + pixel_x = 14 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"ym" = ( +/turf/closed/shuttle/midway{ + icon_state = "69" + }, +/area/shuttle/midway) +"yB" = ( +/turf/closed/shuttle/midway{ + icon_state = "54" + }, +/area/shuttle/midway) +"yN" = ( +/obj/structure/shuttle/part/dropship1/right_outer_wing_connector, +/turf/open/space/basic, +/area/shuttle/midway) +"yO" = ( +/turf/closed/shuttle/midway{ + icon_state = "94" + }, +/area/shuttle/midway) +"zm" = ( +/turf/closed/shuttle/midway/transparent{ + icon_state = "23" + }, +/area/shuttle/midway) +"Aw" = ( +/turf/closed/shuttle/midway/transparent{ + icon_state = "97" + }, +/area/shuttle/midway) +"Bn" = ( +/turf/closed/shuttle/midway{ + icon_state = "30" + }, +/area/shuttle/midway) +"BI" = ( +/turf/closed/shuttle/midway{ + icon_state = "47" + }, +/area/shuttle/midway) +"BS" = ( +/turf/closed/shuttle/midway/transparent{ + icon_state = "38" + }, +/area/shuttle/midway) +"BU" = ( +/obj/structure/shuttle/part/dropship1/transparent/engine_left_exhaust, +/turf/template_noop, +/area/shuttle/midway) +"Cc" = ( +/obj/structure/machinery/camera/autoname/golden_arrow/midway{ + dir = 8; + pixel_x = 23 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"Cm" = ( +/obj/effect/attach_point/fuel/midway, +/turf/closed/shuttle/midway/transparent{ + icon_state = "28" + }, +/area/shuttle/midway) +"Cr" = ( +/obj/structure/prop/ice_colony/hula_girl{ + pixel_x = -10; + pixel_y = 16 + }, +/obj/structure/blocker/invisible_wall, +/obj/structure/machinery/computer/cameras/dropship/midway, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"Db" = ( +/turf/closed/shuttle/midway/transparent{ + icon_state = "26" + }, +/area/shuttle/midway) +"Dg" = ( +/turf/open/shuttle/dropship, +/area/shuttle/midway) +"Ds" = ( +/obj/structure/stairs/perspective, +/obj/structure/platform{ + dir = 4; + layer = 2.7 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/shuttle/midway) +"DH" = ( +/turf/closed/shuttle/midway/transparent{ + icon_state = "89" + }, +/area/shuttle/midway) +"Ed" = ( +/turf/closed/shuttle/midway{ + icon_state = "25" + }, +/area/shuttle/midway) +"EN" = ( +/obj/structure/shuttle/part/dropship1/nose_front_right, +/turf/template_noop, +/area/shuttle/midway) +"Fu" = ( +/obj/structure/shuttle/part/dropship1/transparent/lower_right_wing, +/obj/effect/attach_point/weapon/midway/right_wing, +/turf/template_noop, +/area/shuttle/midway) +"Gf" = ( +/obj/structure/machinery/camera/autoname/golden_arrow/midway{ + pixel_x = -6; + pixel_y = -16 + }, +/obj/structure/machinery/light{ + dir = 4; + pixel_x = 14 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin2" + }, +/area/shuttle/midway) +"Gh" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin7" + }, +/area/shuttle/midway) +"Go" = ( +/obj/structure/shuttle/part/dropship1/transparent/outer_left_weapons, +/obj/effect/attach_point/weapon/midway/left_fore, +/turf/template_noop, +/area/shuttle/midway) +"Hj" = ( +/turf/closed/shuttle/midway{ + icon_state = "75" + }, +/area/shuttle/midway) +"Hz" = ( +/obj/structure/shuttle/part/dropship1/left_outer_wing_connector, +/turf/open/space/basic, +/area/shuttle/midway) +"HY" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ds1{ + id = "aft_door" + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"Id" = ( +/obj/effect/attach_point/crew_weapon/midway, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"Ji" = ( +/turf/closed/shuttle/midway{ + icon_state = "64" + }, +/area/shuttle/midway) +"Jq" = ( +/turf/closed/shuttle/midway{ + icon_state = "72" + }, +/area/shuttle/midway) +"Ks" = ( +/obj/structure/shuttle/part/dropship1/transparent/lower_left_wing, +/obj/effect/attach_point/weapon/midway/left_wing, +/turf/template_noop, +/area/shuttle/midway) +"Kv" = ( +/obj/structure/machinery/light{ + dir = 4; + pixel_x = 14 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/shuttle/midway) +"Kw" = ( +/turf/template_noop, +/area/space) +"Lr" = ( +/turf/closed/shuttle/midway{ + icon_state = "48" + }, +/area/shuttle/midway) +"LY" = ( +/obj/structure/blocker/invisible_wall, +/obj/structure/machinery/computer/shuttle/dropship/flight, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"LZ" = ( +/obj/structure/shuttle/part/dropship1/transparent/upper_right_wing, +/turf/template_noop, +/area/shuttle/midway) +"Mf" = ( +/obj/structure/machinery/door/airlock/dropship_hatch{ + id = "port_door" + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"Mz" = ( +/obj/structure/stairs/perspective, +/obj/structure/platform{ + dir = 8; + layer = 2.7 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/shuttle/midway) +"ME" = ( +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"OB" = ( +/turf/closed/shuttle/midway/transparent{ + icon_state = "96" + }, +/area/shuttle/midway) +"Pc" = ( +/turf/closed/shuttle/midway/transparent{ + icon_state = "98" + }, +/area/shuttle/midway) +"PP" = ( +/obj/structure/machinery/door/airlock/hatch/cockpit, +/obj/structure/blocker/forcefield/multitile_vehicles, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"Qk" = ( +/obj/docking_port/mobile/marine_dropship/midway, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"QI" = ( +/obj/structure/shuttle/part/dropship1/lower_left_wall, +/turf/template_noop, +/area/shuttle/midway) +"QK" = ( +/obj/structure/machinery/light{ + dir = 8; + pixel_x = -14 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/shuttle/midway) +"Rm" = ( +/obj/structure/platform_decoration{ + dir = 8 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin6" + }, +/area/shuttle/midway) +"SS" = ( +/obj/structure/machinery/door/airlock/dropship_hatch{ + dir = 8; + id = "starboard_door" + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"SZ" = ( +/obj/structure/shuttle/part/dropship1/transparent/right_inner_bottom_wing, +/turf/template_noop, +/area/shuttle/midway) +"Tl" = ( +/obj/structure/shuttle/part/dropship1/transparent/nose_top_right, +/turf/template_noop, +/area/shuttle/midway) +"UI" = ( +/obj/structure/bed/chair/vehicle{ + pixel_x = -8 + }, +/obj/structure/bed/chair/vehicle{ + pixel_x = 8 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"Vu" = ( +/turf/closed/shuttle/midway{ + icon_state = "67" + }, +/area/shuttle/midway) +"VU" = ( +/turf/closed/shuttle/midway{ + icon_state = "73" + }, +/area/shuttle/midway) +"WN" = ( +/obj/structure/bed/chair/vehicle{ + dir = 1; + pixel_x = -8 + }, +/obj/structure/bed/chair/vehicle{ + dir = 1; + pixel_x = 8 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/midway) +"XH" = ( +/obj/effect/attach_point/fuel/midway{ + pixel_x = -32 + }, +/turf/closed/shuttle/midway/transparent{ + icon_state = "33" + }, +/area/shuttle/midway) +"Yr" = ( +/turf/closed/shuttle/midway{ + icon_state = "81" + }, +/area/shuttle/midway) +"Zr" = ( +/obj/structure/shuttle/part/dropship1/transparent/outer_right_weapons, +/obj/effect/attach_point/weapon/midway/right_fore, +/turf/template_noop, +/area/shuttle/midway) +"Zu" = ( +/turf/closed/shuttle/midway/transparent{ + icon_state = "29" + }, +/area/shuttle/midway) +"ZZ" = ( +/turf/closed/shuttle/midway/transparent{ + icon_state = "39" + }, +/area/shuttle/midway) + +(1,1,1) = {" +Kw +Kw +Kw +Kw +Kw +mG +od +Ks +Kw +Kw +Kw +ul +af +Cm +dD +BU +Kw +mE +"} +(2,1,1) = {" +Kw +Kw +Kw +Go +Hj +Jq +Vu +xp +Mf +Mf +QI +gw +ls +Zu +zm +bm +Kw +eu +"} +(3,1,1) = {" +im +mR +vJ +hO +Yr +UI +iv +jy +ME +dr +BI +dE +dE +Bn +hl +rr +dB +Hz +"} +(4,1,1) = {" +nH +OB +Cr +hL +ti +ux +bs +jW +jW +jW +Ds +Rm +jW +je +QK +HY +Kw +Kw +"} +(5,1,1) = {" +nH +Aw +LY +tf +PP +jW +Dg +WN +ME +Qk +Id +kC +ME +ME +ME +ME +Kw +Kw +"} +(6,1,1) = {" +nH +Pc +go +Gf +ro +ux +Gh +jW +jW +jW +Mz +mL +tG +jW +Kv +ME +Kw +Kw +"} +(7,1,1) = {" +Tl +EN +yO +DH +rq +UI +Cc +xy +ME +dr +Lr +yB +yB +sl +Ed +lC +mh +yN +"} +(8,1,1) = {" +Kw +Kw +Kw +Zr +wB +VU +ym +Ji +SS +SS +rF +ul +BS +rR +Db +BU +Kw +SZ +"} +(9,1,1) = {" +Kw +Kw +Kw +Kw +Kw +LZ +vN +Fu +Kw +Kw +Kw +gw +ZZ +XH +if +bm +Kw +tP +"}