diff --git a/code/__DEFINES/xeno_ai.dm b/code/__DEFINES/xeno_ai.dm
index d1f0b647cd..847f649fd5 100644
--- a/code/__DEFINES/xeno_ai.dm
+++ b/code/__DEFINES/xeno_ai.dm
@@ -23,8 +23,10 @@ PROBABILITY CALCULATIONS ARE HERE
#define XENO_SLASH 80
-#define RETREAT_AT_PLASMA_LEVEL 0.2
-#define RETREAT_AT_HEALTH_LEVEL 0.4
+#define XENO_DOOR_BUILDING_CHANCE 25
+
+#define PLASMA_RETREAT_PERCENTAGE 10
+#define HEALTH_RETREAT_PERCENTAGE 20
#define LURKING_IGNORE_SHOT_CHANCE 75
diff --git a/code/datums/components/xeno/ai_behavior_overrides/build_override_behavior.dm b/code/datums/components/xeno/ai_behavior_overrides/build_override_behavior.dm
new file mode 100644
index 0000000000..5430c3cd03
--- /dev/null
+++ b/code/datums/components/xeno/ai_behavior_overrides/build_override_behavior.dm
@@ -0,0 +1,104 @@
+
+/datum/component/ai_behavior_override/build
+ behavior_icon_state = "priority_move_order"
+
+ max_assigned = 1
+
+/datum/component/ai_behavior_override/build/Initialize(...)
+ . = ..()
+
+ if(istype(parent, /mob))
+ return COMPONENT_INCOMPATIBLE
+
+ var/turf/open/location = get_turf(parent)
+ if(location.is_weedable() != FULLY_WEEDABLE)
+ return COMPONENT_INCOMPATIBLE
+
+/datum/component/ai_behavior_override/build/Destroy(force, silent, ...)
+ var/turf/parent_turf = get_turf(parent)
+ if(QDELETED(parent) && parent_turf != parent)
+ parent_turf.AddComponent(/datum/component/ai_behavior_override/build)
+
+ return ..()
+
+/datum/component/ai_behavior_override/build/check_behavior_validity(mob/living/carbon/xenomorph/checked_xeno, distance)
+ . = ..()
+ if(!.)
+ return
+
+ var/turf/open/location = get_turf(parent)
+ if(!istype(location))
+ qdel(src)
+ return FALSE
+
+ if(locate(/obj/structure/mineral_door/resin) in location)
+ qdel(src)
+ return FALSE
+
+ if(distance > 10)
+ return FALSE
+
+ if(checked_xeno.current_target)
+ return FALSE
+
+ if(!locate(/datum/action/xeno_action/activable/secrete_resin) in checked_xeno.actions)
+ return FALSE
+
+ if(checked_xeno.get_plasma_percentage() < PLASMA_RETREAT_PERCENTAGE)
+ var/turf/xeno_loc = get_turf(checked_xeno)
+ if(xeno_loc.weeds && !checked_xeno.resting)
+ currently_assigned -= checked_xeno
+ checked_xeno.lay_down()
+
+ return FALSE
+
+ return TRUE
+
+/datum/component/ai_behavior_override/build/process_override_behavior(mob/living/carbon/xenomorph/processing_xeno, delta_time)
+ . = ..()
+ if(!.)
+ return
+
+ processing_xeno.resting = FALSE
+
+ var/turf/xeno_loc = get_turf(processing_xeno)
+ if(xeno_loc.density)
+ return FALSE // We shouldn't stand in a wall, let's act default
+
+ var/turf/parent_turf = get_turf(parent)
+
+ var/is_diagonal = (get_dir(processing_xeno, parent_turf) in diagonals)
+ if(is_diagonal || get_dist(processing_xeno, parent) > 1)
+ return processing_xeno.move_to_next_turf(parent_turf)
+
+ for(var/obj/structure/blocker in parent_turf.contents)
+ if(!blocker.unslashable && blocker.density || istype(blocker, /obj/structure/bed))
+ INVOKE_ASYNC(processing_xeno, TYPE_PROC_REF(/mob, do_click), blocker, "", list())
+ return TRUE
+
+ if(!parent_turf.weeds)
+ var/datum/action/xeno_action/onclick/plant_weeds/weeds_action = locate() in processing_xeno.actions
+ INVOKE_ASYNC(weeds_action, TYPE_PROC_REF(/datum/action/xeno_action/onclick/plant_weeds, use_ability_wrapper))
+ return TRUE
+
+ var/list/resin_types = processing_xeno.resin_build_order
+ processing_xeno.selected_resin = locate(/datum/resin_construction/resin_turf/wall) in resin_types
+
+ var/wall_nearby
+ var/blocked_turfs = 0
+ for(var/turf/blocked_turf in orange(1, parent_turf) - parent_turf.AdjacentTurfs())
+ if(get_dir(blocked_turf, parent_turf) in diagonals)
+ continue
+
+ if(blocked_turf.density)
+ wall_nearby = TRUE
+
+ blocked_turfs++
+
+ if(blocked_turfs)
+ if(prob(XENO_DOOR_BUILDING_CHANCE) || (wall_nearby && blocked_turfs == 2))
+ processing_xeno.selected_resin = locate(/datum/resin_construction/resin_obj/door) in resin_types
+
+ var/datum/action/xeno_action/activable/secrete_resin/build_action = locate() in processing_xeno.actions
+ INVOKE_ASYNC(build_action, TYPE_PROC_REF(/datum/action/xeno_action/activable/secrete_resin, use_ability_wrapper), parent_turf)
+ return TRUE
diff --git a/code/datums/skills/uscm.dm b/code/datums/skills/uscm.dm
index d3f4823286..871278ff23 100644
--- a/code/datums/skills/uscm.dm
+++ b/code/datums/skills/uscm.dm
@@ -75,6 +75,7 @@ United States Colonial Marines
SKILL_ENDURANCE = SKILL_ENDURANCE_TRAINED,
SKILL_JTAC = SKILL_JTAC_TRAINED,
SKILL_INTEL = SKILL_INTEL_TRAINED,
+ SKILL_PILOT = SKILL_PILOT_EXPERT,
)
/datum/skills/intel
@@ -290,6 +291,7 @@ COMMAND STAFF
SKILL_JTAC = SKILL_JTAC_EXPERT,
SKILL_INTEL = SKILL_INTEL_TRAINED,
SKILL_SURGERY = SKILL_SURGERY_NOVICE,
+ SKILL_PILOT = SKILL_PILOT_EXPERT,
)
/datum/skills/SEA
diff --git a/code/datums/vehicles.dm b/code/datums/vehicles.dm
index 36ac96938c..ac71cc1fc7 100644
--- a/code/datums/vehicles.dm
+++ b/code/datums/vehicles.dm
@@ -26,6 +26,10 @@
name = "APC - No FPW"
interior_id = "apc_no_fpw"
+/datum/map_template/interior/apc_movie
+ name = "Movie APC"
+ interior_id = "apc_movie"
+
/datum/map_template/interior/fancy_locker
name = "Fancy Locker"
interior_id = "fancylocker"
diff --git a/code/game/area/golden_arrow.dm b/code/game/area/golden_arrow.dm
index 11656d7da4..7c35640d06 100644
--- a/code/game/area/golden_arrow.dm
+++ b/code/game/area/golden_arrow.dm
@@ -65,3 +65,7 @@
/area/golden_arrow/synthcloset
name = "\improper Synthetic Storage Closet"
icon_state = "livingspace"
+
+/area/golden_arrow/firingrange
+ name = "\improper Firing Range"
+ icon_state = "firingrange"
diff --git a/code/game/machinery/vending/vendor_types/crew/synthetic.dm b/code/game/machinery/vending/vendor_types/crew/synthetic.dm
index c912ae8ce3..cec5627a63 100644
--- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm
+++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm
@@ -121,6 +121,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list(
list("M3A1 Pattern Synthetic Utility Vest (UA Jungle)", 0, /obj/item/clothing/suit/storage/marine/light/synvest/jungle, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
list("M3A1 Pattern Synthetic Utility Vest (UA Snow)", 0, /obj/item/clothing/suit/storage/marine/light/synvest/snow, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
list("M3A1 Pattern Synthetic Utility Vest (UA Desert)", 0, /obj/item/clothing/suit/storage/marine/light/synvest/desert, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("M3-VL Pattern Ballistics Vest", 0, /obj/item/clothing/suit/storage/marine/light/vest, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
list("GLOVES (CHOOSE 1)", 0, null, null, null),
list("Insulated Gloves", 0, /obj/item/clothing/gloves/yellow, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_RECOMMENDED),
diff --git a/code/game/objects/effects/spawners/prop_gun_spawner.dm b/code/game/objects/effects/spawners/prop_gun_spawner.dm
index 5e620994e7..bdfb083ffe 100644
--- a/code/game/objects/effects/spawners/prop_gun_spawner.dm
+++ b/code/game/objects/effects/spawners/prop_gun_spawner.dm
@@ -90,3 +90,8 @@
prop_gun_type = /obj/item/weapon/gun/rifle/m41aMK1
custom_gun_name = "\improper Broken M41A pulse rifle"
custom_gun_desc = "An older design of the Pulse Rifle commonly used by Colonial Marines. This one has seen better days. The trigger is missing, the barrel is bent, and it no longer appropriately feeds magazines."
+
+/obj/effect/spawner/prop_gun/anti_tank
+ prop_gun_type = /obj/item/weapon/gun/launcher/rocket/anti_tank
+ custom_gun_name = "\improper Spent M83A2 SADAR"
+ custom_gun_desc = "A spent M83A2 tube. It's been kept as a trophy after a lucky tank kill nearly a thousand meters out. Someone has engraved a single tally-mark on the side to begin recording a kill-count."
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 114964464a..3f9dc09ae6 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -524,6 +524,27 @@
qdel(signal)
..()
+/obj/effect/landmark/rappel
+ name = "Rappel Point"
+ var/datum/cas_signal/signal
+ invisibility_value = SEE_INVISIBLE_OBSERVER
+ icon_state = "o_green"
+
+/obj/effect/landmark/rappel/New()
+ . = ..()
+ signal = new(src)
+ signal.target_id = ++cas_tracking_id_increment
+ name = "Rappel Point #[signal.target_id]"
+ signal.name = name
+ cas_groups[FACTION_MARINE].add_signal(signal)
+
+/obj/effect/landmark/rappel/Destroy()
+ if(signal)
+ cas_groups[FACTION_MARINE].remove_signal(signal)
+ QDEL_NULL(signal)
+ return ..()
+
+
/// Signal flares deployed by a flare gun
/obj/item/device/flashlight/flare/signal/gun
activate_message = FALSE
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 3f4e721d59..3a752b43f6 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -330,6 +330,7 @@ var/list/roundstart_mod_verbs = list(
add_verb(src, /client/proc/toggle_join_xeno)
add_verb(src, /client/proc/game_master_rename_platoon)
add_verb(src, /client/proc/toggle_vehicle_blockers)
+ add_verb(src, /client/proc/toggle_rappel_menu)
if(CLIENT_HAS_RIGHTS(src, R_SERVER))
add_verb(src, admin_verbs_server)
if(CLIENT_HAS_RIGHTS(src, R_DEBUG))
@@ -363,6 +364,7 @@ var/list/roundstart_mod_verbs = list(
/client/proc/toggle_join_xeno,
/client/proc/game_master_rename_platoon,
/client/proc/toggle_vehicle_blockers,
+ /client/proc/toggle_rappel_menu,
admin_verbs_admin,
admin_verbs_ban,
admin_verbs_minor_event,
diff --git a/code/modules/admin/game_master/extra_buttons/rappel_menu.dm b/code/modules/admin/game_master/extra_buttons/rappel_menu.dm
new file mode 100644
index 0000000000..f35cbae24e
--- /dev/null
+++ b/code/modules/admin/game_master/extra_buttons/rappel_menu.dm
@@ -0,0 +1,108 @@
+GLOBAL_LIST_EMPTY(game_master_rappels)
+GLOBAL_DATUM_INIT(rappel_panel, /datum/rappel_menu, new)
+#define RAPPEL_CLICK_INTERCEPT_ACTION "rappel_click_intercept_action"
+
+/client/proc/toggle_rappel_menu()
+ set name = "Rappel Menu"
+ set category = "Game Master.Extras"
+ if(!check_rights(R_ADMIN))
+ return
+
+ GLOB.rappel_panel.tgui_interact(mob)
+
+/datum/rappel_menu
+ var/rappel_click_intercept = FALSE
+
+/datum/rappel_menu/ui_data(mob/user)
+ . = ..()
+
+ var/list/data = list()
+
+ data["game_master_rappels"] = length(GLOB.game_master_rappels) ? GLOB.game_master_rappels : ""
+ data["rappel_click_intercept"] = rappel_click_intercept
+ return data
+
+/datum/rappel_menu/proc/InterceptClickOn(mob/user, params, atom/object)
+ var/list/modifiers = params2list(params)
+ if(rappel_click_intercept)
+ var/turf/object_turf = get_turf(object)
+ if(LAZYACCESS(modifiers, MIDDLE_CLICK))
+ for(var/obj/effect/landmark/rappel/R in object_turf)
+ GLOB.game_master_rappels -= R
+ QDEL_NULL(R)
+ return TRUE
+
+ var/obj/effect/landmark/rappel/rappel = new(object_turf)
+ var/rappel_ref = REF(rappel)
+ GLOB.game_master_rappels += list(list(
+ "rappel" = rappel,
+ "rappel_name" = rappel.name,
+ "rappel_ref" = rappel_ref,
+ ))
+ return TRUE
+
+/datum/rappel_menu/tgui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "GameMasterRappelMenu", "Rappel Menu")
+ ui.open()
+ user.client?.click_intercept = src
+/datum/rappel_menu/ui_status(mob/user, datum/ui_state/state)
+ return UI_INTERACTIVE
+
+
+/datum/rappel_menu/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ . = ..()
+
+ switch(action)
+ if("remove_rappel")
+ if(!params["val"])
+ return
+
+ var/list/rappel = params["val"]
+
+ var/atom/rappel_atom = locate(rappel["rappel_ref"])
+
+ if(!rappel_atom)
+ return TRUE
+
+ if(tgui_alert(ui.user, "Do you want to remove [rappel_atom] ?", "Confirmation", list("Yes", "No")) != "Yes")
+ return TRUE
+
+ remove_rappel(rappel_atom)
+
+ if("jump_to_rappel")
+ if(!params["val"])
+ return
+
+ var/list/rappel = params["val"]
+
+ var/atom/rappel_atom = locate(rappel["rappel_ref"])
+
+ var/turf/rappel_turf = get_turf(rappel_atom)
+
+ if(!rappel_turf)
+ return TRUE
+
+ var/client/jumping_client = ui.user.client
+ jumping_client.jump_to_turf(rappel_turf)
+ return TRUE
+
+ if("toggle_click_rappel")
+ rappel_click_intercept = !rappel_click_intercept
+ return
+
+/datum/rappel_menu/ui_close(mob/user)
+ var/client/user_client = user.client
+ if(user_client?.click_intercept == src)
+ user_client.click_intercept = null
+
+ rappel_click_intercept = FALSE
+
+/datum/rappel_menu/proc/remove_rappel(obj/removing_datum)
+ SIGNAL_HANDLER
+
+ for(var/list/cycled_rappel in GLOB.game_master_rappels)
+ if(cycled_rappel["rappel"] == removing_datum)
+ GLOB.game_master_rappels.Remove(list(cycled_rappel))
+ QDEL_NULL(removing_datum)
diff --git a/code/modules/admin/game_master/game_master.dm b/code/modules/admin/game_master/game_master.dm
index 5d450037db..29de8161da 100644
--- a/code/modules/admin/game_master/game_master.dm
+++ b/code/modules/admin/game_master/game_master.dm
@@ -35,8 +35,8 @@ GLOBAL_VAR_INIT(radio_communication_clarity, 100)
// Behavior stuff
#define DEFAULT_BEHAVIOR_STRING "Attack"
-#define SELECTABLE_XENO_BEHAVIORS list("Attack", "Capture", "Hive")
-#define SELECTABLE_XENO_BEHAVIORS_ASSOC list("Attack" = /datum/component/ai_behavior_override/attack, "Capture" = /datum/component/ai_behavior_override/capture, "Hive" = /datum/component/ai_behavior_override/hive)
+#define SELECTABLE_XENO_BEHAVIORS list("Attack", "Capture", "Hive", "Build")
+#define SELECTABLE_XENO_BEHAVIORS_ASSOC list("Attack" = /datum/component/ai_behavior_override/attack, "Capture" = /datum/component/ai_behavior_override/capture, "Hive" = /datum/component/ai_behavior_override/hive, "Build" = /datum/component/ai_behavior_override/build)
// Objective stuff
#define OBJECTIVE_NUMBER_OPTIONS list("zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine")
diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm
index 9ac7950b72..70efeb9f39 100644
--- a/code/modules/gear_presets/synths.dm
+++ b/code/modules/gear_presets/synths.dm
@@ -30,7 +30,7 @@
if(iscolonysynthetic(new_human) && !isworkingjoe(new_human))
new_human.set_skills(/datum/skills/colonial_synthetic)
- new_human.allow_gun_usage = FALSE
+ new_human.allow_gun_usage = TRUE
//*****************************************************************************************************/
diff --git a/code/modules/mob/living/carbon/human/species/synthetic.dm b/code/modules/mob/living/carbon/human/species/synthetic.dm
index 38b7e93526..d521ed2a63 100644
--- a/code/modules/mob/living/carbon/human/species/synthetic.dm
+++ b/code/modules/mob/living/carbon/human/species/synthetic.dm
@@ -13,10 +13,7 @@
bloodsplatter_type = /obj/effect/temp_visual/dir_setting/bloodsplatter/synthsplatter
- total_health = 150 //more health than regular humans
-
- brute_mod = 0.5
- burn_mod = 0.9 //a small bit of resistance
+ total_health = 100 //same health as regular humans
cold_level_1 = -1
cold_level_2 = -1
@@ -40,7 +37,7 @@
knock_down_reduction = 5
stun_reduction = 5
- acid_blood_dodge_chance = 25
+ acid_blood_dodge_chance = 50
inherent_verbs = list(
/mob/living/carbon/human/synthetic/proc/toggle_HUD,
@@ -76,20 +73,15 @@
name = SYNTH_COLONY
name_plural = "Colonial Synthetics"
uses_ethnicity = TRUE
+ brute_mod = 0.8
burn_mod = 0.8
mob_inherent_traits = list(TRAIT_SUPER_STRONG)
pain_type = /datum/pain/synthetic/colonial
rarity_value = 1.5
- slowdown = 0.2
- total_health = 200 //But more durable
default_lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
- knock_down_reduction = 3.5
- stun_reduction = 3.5
-
-
/datum/species/synthetic/colonial/colonial_gen_two
name = SYNTH_COLONY_GEN_TWO
uses_ethnicity = FALSE //2nd gen uses generic human look
@@ -111,8 +103,8 @@
uses_ethnicity = FALSE
mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_INTENT_EYES)
- burn_mod = 0.6 //made for combat
- total_health = 250 //made for combat
+ brute_mod = 0.5
+ burn_mod = 0.5 //made for combat
hair_color = "#000000"
icobase = 'icons/mob/humans/species/r_synthetic.dmi'
diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm
index fa1b2ac4a1..a1b6f96ab6 100644
--- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm
+++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm
@@ -302,10 +302,10 @@
apply_effect(3, WEAKEN)
throwing = FALSE
return
- if(iscolonysynthetic(H) && prob(60))
+ if(issynth(H) && prob(80))
visible_message(SPAN_DANGER("[H] withstands being pounced and slams down [src]!"),
SPAN_XENODANGER("[H] throws you down after withstanding the pounce!"), null, 5)
- apply_effect(1.5, WEAKEN)
+ apply_effect(3.5, WEAKEN)
throwing = FALSE
return
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 e9413bc4a4..eeeb5b9ba8 100644
--- a/code/modules/mob/living/carbon/xenomorph/ai/movement/lurking.dm
+++ b/code/modules/mob/living/carbon/xenomorph/ai/movement/lurking.dm
@@ -67,8 +67,13 @@
continue
var/blocked = FALSE
- for(var/atom/potential_blocker as anything in potential_home)
- if(potential_blocker != idle_xeno && (potential_blocker.can_block_movement || potential_blocker.density))
+ for(var/obj/structure/potential_blocker in potential_home)
+ if(potential_blocker.unslashable && potential_blocker.can_block_movement && potential_blocker.density)
+ blocked = TRUE
+ break
+
+ for(var/mob/potential_blocker in potential_home)
+ if(potential_blocker != idle_xeno && potential_blocker.can_block_movement && potential_blocker.density)
blocked = TRUE
break
@@ -76,7 +81,24 @@
continue
var/preferred = FALSE
+ for(var/obj/structure/structure in potential_home)
+ if(structure.unslashable && structure.can_block_movement && structure.density)
+ continue
+
+ if(structure.invisibility == 101)
+ continue
+
+ preferred = TRUE
+ break
+
for(var/turf/closed/touching_turf in orange(1, potential_home))
+ if(get_dir(potential_home, touching_turf) in diagonals)
+ continue
+
+ preferred = TRUE
+ break
+
+ for(var/obj/item/stack/sheet/sheet in potential_home)
preferred = TRUE
break
@@ -194,12 +216,14 @@
#undef LURKER_BAITS_BEFORE_AMBUSH
/datum/xeno_ai_movement/linger/lurking/proc/interact_random(mob/living/carbon/xenomorph/X)
- for(var/obj/potential_interaction in orange(1, X))
- if(istype(potential_interaction, /obj/structure/window_frame))
+ for(var/atom/potential_interaction in orange(1, X))
+ if(istype(potential_interaction, /obj/structure/shuttle))
+ continue
+ if(istype(potential_interaction, /turf/closed/shuttle))
continue
- if(istype(potential_interaction, /obj/structure/pipes))
+ if(istype(potential_interaction, /obj/effect))
continue
- if(istype(potential_interaction, /obj/structure/sign))
+ if(istype(potential_interaction, /turf/open))
continue
if(!potential_interaction.xeno_ai_act(X))
continue
diff --git a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm
index b5a8cfff51..497ebe734e 100644
--- a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm
+++ b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm
@@ -520,6 +520,10 @@
. = XENO_NO_DELAY_ACTION
+ if(M.action_busy)
+ to_chat(M, SPAN_WARNING("You are already doing something!"))
+ return
+
if(M.claw_type >= CLAW_TYPE_SHARP)
M.animation_attack_on(src)
playsound(src, 'sound/effects/metalhit.ogg', 25, 1)
@@ -900,6 +904,7 @@
M.visible_message(SPAN_DANGER("[M] smashes \the [src] open!"), \
SPAN_DANGER("You smash \the [src] open!"), null, 5, CHAT_TYPE_XENO_COMBAT)
else
+ take_damage(M.melee_damage_upper)
M.visible_message(SPAN_DANGER("[M] smashes [src]!"), \
SPAN_DANGER("You smash [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT)
return XENO_ATTACK_ACTION
@@ -933,6 +938,7 @@
M.visible_message(SPAN_DANGER("[M] smashes [src] beyond recognition!"), \
SPAN_DANGER("You enter a frenzy and smash [src] apart!"), null, 5, CHAT_TYPE_XENO_COMBAT)
malfunction()
+ tip_over()
else
M.visible_message(SPAN_DANGER("[M] [M.slashes_verb] [src]!"), \
SPAN_DANGER("You [M.slash_verb] [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT)
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm b/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm
index 8915cebbe6..d18b5eb671 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm
@@ -59,6 +59,7 @@
icon_xeno = 'icons/mob/xenos/lurker.dmi'
icon_xenonid = 'icons/mob/xenonids/lurker.dmi'
+ forced_retarget_time = (2 SECONDS)
var/pull_direction
/mob/living/carbon/xenomorph/lurker/launch_towards(datum/launch_metadata/LM)
diff --git a/code/modules/mob/living/carbon/xenomorph/resin_constructions.dm b/code/modules/mob/living/carbon/xenomorph/resin_constructions.dm
index 3bfb4e3554..bad467288e 100644
--- a/code/modules/mob/living/carbon/xenomorph/resin_constructions.dm
+++ b/code/modules/mob/living/carbon/xenomorph/resin_constructions.dm
@@ -20,11 +20,6 @@ GLOBAL_VAR_INIT(resin_lz_allowed, FALSE)
var/can_build_on_doors = TRUE // if it can be built on a tile with an open door or not
/datum/resin_construction/proc/can_build_here(turf/T, mob/living/carbon/xenomorph/X)
- var/mob/living/carbon/xenomorph/blocker = locate() in T
- if(blocker && blocker != X && blocker.stat != DEAD)
- to_chat(X, SPAN_WARNING("Can't do that with [blocker] in the way!"))
- return FALSE
-
if(!istype(T) || T.is_weedable() < FULLY_WEEDABLE)
to_chat(X, SPAN_WARNING("You can't do that here."))
return FALSE
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 9f4ce3df0e..217f61d56f 100644
--- a/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm
+++ b/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm
@@ -30,13 +30,19 @@ At bare minimum, make sure the relevant checks from parent types gets copied in
return OBJECT_PENALTY
/obj/structure/xeno_ai_act(mob/living/carbon/xenomorph/X)
- if(unslashable)
+ if(unslashable || indestructible || (climbable && islurker(X)))
if(!X.action_busy)
do_climb(X)
return
return ..()
+/obj/structure/machinery/xeno_ai_act(mob/living/carbon/xenomorph/X)
+ if(stat & TIPPED_OVER)
+ return
+
+ return ..()
+
// MINERAL DOOR
/obj/structure/mineral_door/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target)
return DOOR_PENALTY
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index a234c5962f..ecda0787c5 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -66,15 +66,6 @@
var/mob/victim = grabbed_thing
- var/max_grab_size = user.mob_size
- /// Amazing what you can do with a bit of dexterity.
- if(HAS_TRAIT(user, TRAIT_DEXTROUS))
- max_grab_size++
- /// Strong mobs can lift above their own weight.
- if(HAS_TRAIT(user, TRAIT_SUPER_STRONG))//NB; this will mean Yautja can bodily lift MOB_SIZE_XENO(3) and Synths can lift MOB_SIZE_XENO_SMALL(2)
- max_grab_size++
- if(victim.mob_size > max_grab_size || !(victim.status_flags & CANPUSH))
- return //can't tighten your grip on mobs bigger than you and mobs you can't push.
last_upgrade = world.time
switch(user.grab_level)
diff --git a/code/modules/vehicles/apc/apc_movie.dm b/code/modules/vehicles/apc/apc_movie.dm
new file mode 100644
index 0000000000..aef7ad45b2
--- /dev/null
+++ b/code/modules/vehicles/apc/apc_movie.dm
@@ -0,0 +1,168 @@
+
+/obj/vehicle/multitile/apc/movie
+ name = "M577A3 Armored Personnel Carrier"
+ desc = "An M577A3 Armored Personnel Carrier complete with a tactical operations center. Entrance on the right."
+
+ icon = 'icons/obj/vehicles/movieapc.dmi'
+ icon_state = "apc_base_movie"
+ pixel_x = -64
+ pixel_y = -64
+
+ bound_width = 96
+ bound_height = 96
+
+ interior_map = /datum/map_template/interior/apc_movie
+
+
+ passengers_slots = 20
+
+ entrances = list(
+ "right rear" = list(-2, 1),
+ "right front" = list(-2, 0)
+ )
+
+ seats = list(
+ VEHICLE_DRIVER = null,
+ VEHICLE_GUNNER = null,
+ )
+
+ active_hp = list(
+ VEHICLE_DRIVER = null,
+ VEHICLE_GUNNER = null,
+ )
+
+/obj/vehicle/multitile/apc/movie/add_seated_verbs(mob/living/M, seat)
+ if(!M.client)
+ return
+ add_verb(M.client, list(
+ /obj/vehicle/multitile/proc/get_status_info,
+ /obj/vehicle/multitile/proc/open_controls_guide,
+ /obj/vehicle/multitile/proc/name_vehicle,
+ ))
+ if(seat == VEHICLE_DRIVER)
+ add_verb(M.client, list(
+ /obj/vehicle/multitile/proc/toggle_door_lock,
+ /obj/vehicle/multitile/proc/switch_hardpoint,
+ /obj/vehicle/multitile/proc/cycle_hardpoint,
+ /obj/vehicle/multitile/proc/toggle_shift_click,
+ /obj/vehicle/multitile/proc/activate_horn,
+ ))
+ else if(seat == VEHICLE_GUNNER)
+ add_verb(M.client, list(
+ /obj/vehicle/multitile/proc/switch_hardpoint,
+ /obj/vehicle/multitile/proc/cycle_hardpoint,
+ /obj/vehicle/multitile/proc/toggle_shift_click,
+ ))
+
+/obj/vehicle/multitile/apc/movie/remove_seated_verbs(mob/living/M, seat)
+ if(!M.client)
+ return
+ remove_verb(M.client, list(
+ /obj/vehicle/multitile/proc/get_status_info,
+ /obj/vehicle/multitile/proc/open_controls_guide,
+ /obj/vehicle/multitile/proc/name_vehicle,
+ ))
+ SStgui.close_user_uis(M, src)
+ if(seat == VEHICLE_DRIVER)
+ remove_verb(M.client, list(
+ /obj/vehicle/multitile/proc/toggle_door_lock,
+ /obj/vehicle/multitile/proc/switch_hardpoint,
+ /obj/vehicle/multitile/proc/cycle_hardpoint,
+ /obj/vehicle/multitile/proc/toggle_shift_click,
+ /obj/vehicle/multitile/proc/activate_horn,
+ ))
+ else if(seat == VEHICLE_GUNNER)
+ remove_verb(M.client, list(
+ /obj/vehicle/multitile/proc/switch_hardpoint,
+ /obj/vehicle/multitile/proc/cycle_hardpoint,
+ /obj/vehicle/multitile/proc/toggle_shift_click,
+ ))
+
+/obj/vehicle/multitile/apc/movie/initialize_cameras(change_tag = FALSE)
+ if(!camera)
+ camera = new /obj/structure/machinery/camera/vehicle(src)
+ if(change_tag)
+ camera.c_tag = "#[rand(1,100)] M577A3 \"[nickname]\" APC"
+ if(camera_int)
+ camera_int.c_tag = camera.c_tag + " interior"
+ else
+ camera.c_tag = "#[rand(1,100)] M577A3 APC"
+ if(camera_int)
+ camera_int.c_tag = camera.c_tag + " interior"
+
+/obj/vehicle/multitile/apc/movie/set_muzzle_offsets(obj/item/hardpoint/HP)
+ //sets muzzle flash offsets for APC weapons as appropriate for the movie APC
+ switch(HP.slot)
+ if(HDPT_PRIMARY) //dualcannon
+ HP.muzzle_flash_pos = list(
+ "1" = list(8, -20),
+ "2" = list(25, 31),
+ "4" = list(-7, 27),
+ "8" = list(37, 9)
+ )
+ if(HDPT_SECONDARY) //frontalcannon
+ HP.muzzle_flash_pos = list(
+ "1" = list(34, 70),
+ "2" = list(-1, -70),
+ "4" = list(88, -7),
+ "8" = list(-56, 12)
+ )
+ if(HDPT_SUPPORT) //flare
+ HP.muzzle_flash_pos = list(
+ "1" = list(22, -20),
+ "2" = list(11, 32),
+ "4" = list(-5, 10),
+ "8" = list(37, 24)
+ )
+ return ..()
+
+/*
+** PRESETS SPAWNERS
+*/
+/obj/effect/vehicle_spawner/apc_movie
+ name = "Movie APC Spawner"
+ icon = 'icons/obj/vehicles/movieapc.dmi'
+ icon_state = "apc_base_movie"
+ pixel_x = -64
+ pixel_y = -64
+
+/obj/effect/vehicle_spawner/apc_movie/Initialize()
+ . = ..()
+ spawn_vehicle()
+ qdel(src)
+
+//PRESET: no hardpoints
+/obj/effect/vehicle_spawner/apc_movie/spawn_vehicle()
+ var/obj/vehicle/multitile/apc/movie/APC = new (loc)
+
+ load_misc(APC)
+ load_hardpoints(APC)
+ handle_direction(APC)
+ APC.update_icon()
+
+//PRESET: only wheels installed
+/obj/effect/vehicle_spawner/apc_movie/plain/load_hardpoints(obj/vehicle/multitile/apc/movie/V)
+ V.add_hardpoint(new /obj/item/hardpoint/locomotion/apc_wheels)
+
+//PRESET: default hardpoints, destroyed
+/obj/effect/vehicle_spawner/apc_movie/decrepit/spawn_vehicle()
+ var/obj/vehicle/multitile/apc/movie/APC = new (loc)
+
+ load_misc(APC)
+ load_hardpoints(APC)
+ handle_direction(APC)
+ load_damage(APC)
+ APC.update_icon()
+
+/obj/effect/vehicle_spawner/apc_movie/decrepit/load_hardpoints(obj/vehicle/multitile/apc/movie/V)
+ V.add_hardpoint(new /obj/item/hardpoint/primary/dualcannon)
+ V.add_hardpoint(new /obj/item/hardpoint/secondary/frontalcannon)
+ V.add_hardpoint(new /obj/item/hardpoint/support/flare_launcher)
+ V.add_hardpoint(new /obj/item/hardpoint/locomotion/apc_wheels)
+
+//PRESET: default hardpoints
+/obj/effect/vehicle_spawner/apc_movie/fixed/load_hardpoints(obj/vehicle/multitile/apc/movie/V)
+ V.add_hardpoint(new /obj/item/hardpoint/primary/dualcannon)
+ V.add_hardpoint(new /obj/item/hardpoint/secondary/frontalcannon)
+ V.add_hardpoint(new /obj/item/hardpoint/support/flare_launcher)
+ V.add_hardpoint(new /obj/item/hardpoint/locomotion/apc_wheels)
diff --git a/code/modules/vehicles/interior/areas.dm b/code/modules/vehicles/interior/areas.dm
index 605b32079f..f18c4d03c8 100644
--- a/code/modules/vehicles/interior/areas.dm
+++ b/code/modules/vehicles/interior/areas.dm
@@ -24,6 +24,10 @@
name = "\improper CMD APC interior"
icon_state = "apc_cmd"
+/area/vehicle/apc/movie
+ name = "\improper M557A3 APC interior"
+ icon_state = "apc_movie"
+
/area/vehicle/van
name = "van interior"
icon_state = "van"
diff --git a/code/modules/vehicles/multitile/multitile_hardpoints.dm b/code/modules/vehicles/multitile/multitile_hardpoints.dm
index 2c5a343b80..b8edba78da 100644
--- a/code/modules/vehicles/multitile/multitile_hardpoints.dm
+++ b/code/modules/vehicles/multitile/multitile_hardpoints.dm
@@ -201,6 +201,7 @@
//ALWAYS CALL THIS WHEN ATTACHING HARDPOINTS
/obj/vehicle/multitile/proc/add_hardpoint(obj/item/hardpoint/HP, mob/user)
HP.owner = src
+ set_muzzle_offsets(HP)
HP.forceMove(src)
hardpoints += HP
@@ -209,6 +210,9 @@
update_icon()
+/obj/vehicle/multitile/proc/set_muzzle_offsets(obj/item/hardpoint/HP)
+ return
+
//General proc for taking off hardpoints
//ALWAYS CALL THIS WHEN REMOVING HARDPOINTS
/obj/vehicle/multitile/proc/remove_hardpoint(obj/item/hardpoint/old, mob/user)
diff --git a/colonialmarines.dme b/colonialmarines.dme
index 9a91390f91..3f71204835 100644
--- a/colonialmarines.dme
+++ b/colonialmarines.dme
@@ -401,6 +401,7 @@
#include "code\datums\components\xeno\shield_slash.dm"
#include "code\datums\components\xeno\ai_behavior_overrides\attack_override_behavior.dm"
#include "code\datums\components\xeno\ai_behavior_overrides\base_override_behavior.dm"
+#include "code\datums\components\xeno\ai_behavior_overrides\build_override_behavior.dm"
#include "code\datums\components\xeno\ai_behavior_overrides\capture_override_behavior.dm"
#include "code\datums\components\xeno\ai_behavior_overrides\hive_override_behavior.dm"
#include "code\datums\construction\construction_template.dm"
@@ -1382,6 +1383,7 @@
#include "code\modules\admin\ToRban.dm"
#include "code\modules\admin\game_master\game_master.dm"
#include "code\modules\admin\game_master\game_master_submenu.dm"
+#include "code\modules\admin\game_master\extra_buttons\rappel_menu.dm"
#include "code\modules\admin\game_master\extra_buttons\rename_platoon.dm"
#include "code\modules\admin\game_master\extra_buttons\toggle_join_xeno.dm"
#include "code\modules\admin\game_master\extra_buttons\toggle_vehicle_blockers.dm"
@@ -2383,6 +2385,7 @@
#include "code\modules\vehicles\apc\apc.dm"
#include "code\modules\vehicles\apc\apc_command.dm"
#include "code\modules\vehicles\apc\apc_medical.dm"
+#include "code\modules\vehicles\apc\apc_movie.dm"
#include "code\modules\vehicles\apc\interior.dm"
#include "code\modules\vehicles\hardpoints\hardpoint.dm"
#include "code\modules\vehicles\hardpoints\armor\armor.dm"
diff --git a/icons/mob/xenos/crusher.dmi b/icons/mob/xenos/crusher.dmi
index 014246dbee..f6a30f5901 100644
Binary files a/icons/mob/xenos/crusher.dmi and b/icons/mob/xenos/crusher.dmi differ
diff --git a/icons/mob/xenos/drone.dmi b/icons/mob/xenos/drone.dmi
index 937ddaa7b9..28016677bd 100644
Binary files a/icons/mob/xenos/drone.dmi and b/icons/mob/xenos/drone.dmi differ
diff --git a/icons/mob/xenos/lurker.dmi b/icons/mob/xenos/lurker.dmi
index a44b68ccf4..aef231c699 100644
Binary files a/icons/mob/xenos/lurker.dmi and b/icons/mob/xenos/lurker.dmi differ
diff --git a/icons/mob/xenos/runner.dmi b/icons/mob/xenos/runner.dmi
index 487aabae7b..7a87f9cf3e 100644
Binary files a/icons/mob/xenos/runner.dmi and b/icons/mob/xenos/runner.dmi differ
diff --git a/icons/mob/xenos/wounds.dmi b/icons/mob/xenos/wounds.dmi
index bf7d573b73..65c5a84fbe 100644
Binary files a/icons/mob/xenos/wounds.dmi and b/icons/mob/xenos/wounds.dmi differ
diff --git a/icons/obj/vehicles/interiors/apc.dmi b/icons/obj/vehicles/interiors/apc.dmi
index 5855af1dc0..e12c5f68ab 100644
Binary files a/icons/obj/vehicles/interiors/apc.dmi and b/icons/obj/vehicles/interiors/apc.dmi differ
diff --git a/icons/obj/vehicles/movieapc.dmi b/icons/obj/vehicles/movieapc.dmi
new file mode 100644
index 0000000000..8c5faee611
Binary files /dev/null and b/icons/obj/vehicles/movieapc.dmi differ
diff --git a/icons/turf/areas_interiors.dmi b/icons/turf/areas_interiors.dmi
index 4da1109803..40e6e906ce 100644
Binary files a/icons/turf/areas_interiors.dmi and b/icons/turf/areas_interiors.dmi differ
diff --git a/maps/interiors/apc_movie.dmm b/maps/interiors/apc_movie.dmm
new file mode 100644
index 0000000000..d32b9f49ec
--- /dev/null
+++ b/maps/interiors/apc_movie.dmm
@@ -0,0 +1,536 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "rear_6"
+ },
+/turf/open/void/vehicle,
+/area/space)
+"b" = (
+/obj/structure/machinery/computer/shuttle/dropship/flight/remote_control{
+ name = "Alamo Remote Control Console";
+ shuttleId = "dropship_alamo";
+ pixel_x = 7;
+ pixel_y = 11
+ },
+/obj/structure/bed/chair/vehicle{
+ dir = 1;
+ pixel_x = -16;
+ layer = 3.21
+ },
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_1_4"
+ },
+/area/vehicle/apc/movie)
+"c" = (
+/obj/structure/machinery/computer/overwatch/almayer{
+ layer = 3.2;
+ pixel_x = 16;
+ pixel_y = 23
+ },
+/obj/structure/machinery/prop/almayer/CICmap{
+ icon_state = "security_cam";
+ layer = 2.97;
+ name = "Tactical Map Display";
+ pixel_x = -7;
+ pixel_y = 11;
+ density = 0
+ },
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_1_3"
+ },
+/area/vehicle/apc/movie)
+"d" = (
+/obj/structure/bed/chair/vehicle{
+ dir = 1;
+ pixel_x = -8
+ },
+/obj/structure/bed/chair/vehicle{
+ dir = 1;
+ pixel_x = 8
+ },
+/obj/effect/landmark/interior/spawn/interior_viewport{
+ dir = 1;
+ pixel_x = 2;
+ pixel_y = -13
+ },
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_2"
+ },
+/area/vehicle/apc/movie)
+"e" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "wheel_front_top_2";
+ pixel_x = 4;
+ pixel_y = -4
+ },
+/turf/open/void/vehicle,
+/area/space)
+"f" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "wheel_front_top_1";
+ pixel_x = 1;
+ pixel_y = -4
+ },
+/turf/open/void/vehicle,
+/area/space)
+"g" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "front_1"
+ },
+/turf/open/void/vehicle,
+/area/space)
+"h" = (
+/obj/effect/landmark/interior/spawn/weapons_loader,
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_2"
+ },
+/area/vehicle/apc/movie)
+"i" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "corner_inverse_R";
+ opacity = 0
+ },
+/turf/open/space/basic,
+/area/space)
+"j" = (
+/obj/structure/bed/chair/vehicle{
+ dir = 1;
+ pixel_x = 8
+ },
+/obj/structure/bed/chair/vehicle{
+ dir = 1;
+ pixel_x = -8
+ },
+/obj/effect/landmark/interior/spawn/interior_viewport{
+ dir = 1;
+ pixel_x = 8;
+ pixel_y = -11
+ },
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_2"
+ },
+/area/vehicle/apc/movie)
+"l" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "wall";
+ opacity = 0
+ },
+/turf/open/space/basic,
+/area/space)
+"m" = (
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_1_5"
+ },
+/area/vehicle/apc/movie)
+"n" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "intersection_2";
+ opacity = 0
+ },
+/obj/structure/interior_wall/apc{
+ icon_state = "wheel_front_top_2";
+ pixel_x = 2;
+ pixel_y = 8;
+ layer = 2
+ },
+/turf/open/shuttle/vehicle,
+/area/space)
+"o" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "rear_1"
+ },
+/turf/open/void/vehicle,
+/area/space)
+"p" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "front_4"
+ },
+/turf/open/void/vehicle,
+/area/space)
+"q" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "front_wheel_L_1"
+ },
+/turf/open/space/basic,
+/area/space)
+"r" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "rear_wheel_R";
+ layer = 5.2
+ },
+/turf/open/space/basic,
+/area/space)
+"s" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "wall_2";
+ opacity = 0
+ },
+/turf/open/space/basic,
+/area/space)
+"t" = (
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_0_10"
+ },
+/area/vehicle/apc/movie)
+"u" = (
+/obj/effect/landmark/interior/spawn/interior_camera{
+ dir = 10;
+ pixel_x = -14;
+ pixel_y = 38
+ },
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_1_3"
+ },
+/area/vehicle/apc/movie)
+"v" = (
+/obj/structure/bed/chair/vehicle{
+ pixel_x = 8
+ },
+/obj/structure/bed/chair/vehicle{
+ pixel_x = -8
+ },
+/obj/effect/landmark/interior/spawn/interior_viewport{
+ pixel_x = -7;
+ pixel_y = 23
+ },
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_2"
+ },
+/area/vehicle/apc/movie)
+"w" = (
+/obj/structure/machinery/cm_vending/sorted/medical/wall_med/vehicle{
+ pixel_x = 6;
+ pixel_y = 28
+ },
+/obj/structure/extinguisher_cabinet/lifeboat{
+ icon = 'icons/obj/vehicles/interiors/general.dmi';
+ pixel_x = -8;
+ pixel_y = 28
+ },
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_1_5"
+ },
+/area/vehicle/apc/movie)
+"y" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "front_5"
+ },
+/turf/open/void/vehicle,
+/area/space)
+"z" = (
+/obj/effect/landmark/interior/spawn/entrance{
+ alpha = 50;
+ exit_type = /obj/structure/interior_exit/vehicle/apc;
+ name = "Right APC door";
+ tag = "right rear"
+ },
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_1_3"
+ },
+/area/vehicle/apc/movie)
+"A" = (
+/obj/structure/bed/chair/vehicle{
+ dir = 1;
+ pixel_x = 8
+ },
+/obj/structure/bed/chair/vehicle{
+ dir = 1;
+ pixel_x = -8
+ },
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_2"
+ },
+/area/vehicle/apc/movie)
+"B" = (
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_1_3"
+ },
+/area/vehicle/apc/movie)
+"C" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "door_big_right";
+ layer = 5.2;
+ pixel_y = 32;
+ alpha = 100
+ },
+/turf/open/void/vehicle,
+/area/space)
+"D" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "rear_5"
+ },
+/turf/open/void/vehicle,
+/area/space)
+"E" = (
+/turf/open/void/vehicle,
+/area/space)
+"F" = (
+/obj/structure/bed/chair/vehicle{
+ pixel_x = 8
+ },
+/obj/structure/bed/chair/vehicle{
+ pixel_x = -8
+ },
+/obj/structure/vehicle_locker{
+ pixel_y = 28
+ },
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_2"
+ },
+/area/vehicle/apc/movie)
+"G" = (
+/obj/structure/machinery/cm_vending/sorted/vehicle_supply{
+ pixel_y = 16
+ },
+/obj/effect/landmark/interior/spawn/interior_viewport{
+ dir = 8;
+ pixel_x = 5;
+ pixel_y = 8
+ },
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_2"
+ },
+/area/vehicle/apc/movie)
+"H" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "corner_inverse_L";
+ opacity = 0
+ },
+/turf/open/space/basic,
+/area/space)
+"I" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "front_3"
+ },
+/obj/structure/interior_wall/apc{
+ icon_state = "front_4"
+ },
+/turf/open/void/vehicle,
+/area/space)
+"J" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "intersection_1";
+ opacity = 0
+ },
+/obj/structure/interior_wall/apc{
+ icon_state = "wheel_front_top_2";
+ pixel_x = 4;
+ pixel_y = 1;
+ layer = 2.01
+ },
+/turf/open/shuttle/vehicle,
+/area/space)
+"K" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "corner_small_L";
+ opacity = 0
+ },
+/obj/structure/interior_wall/apc{
+ icon_state = "wheel_back_top_2";
+ pixel_x = -4;
+ pixel_y = -4
+ },
+/turf/open/void/vehicle,
+/area/space)
+"L" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "rear_wheel_L"
+ },
+/turf/open/space/basic,
+/area/space)
+"M" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "rear_3"
+ },
+/turf/open/void/vehicle,
+/area/space)
+"N" = (
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_1_4"
+ },
+/area/vehicle/apc/movie)
+"O" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "front_2"
+ },
+/turf/open/void/vehicle,
+/area/space)
+"P" = (
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_0_9"
+ },
+/area/vehicle/apc/movie)
+"Q" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "door_big_left";
+ pixel_y = 32;
+ layer = 5.2;
+ alpha = 100
+ },
+/turf/open/void/vehicle,
+/area/space)
+"R" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "wall_wheelside"
+ },
+/turf/open/space/basic,
+/area/space)
+"S" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "front_6"
+ },
+/turf/open/void/vehicle,
+/area/space)
+"T" = (
+/obj/effect/landmark/interior/spawn/entrance{
+ alpha = 50;
+ exit_type = /obj/structure/interior_exit/vehicle/apc;
+ name = "Right APC door";
+ tag = "right front"
+ },
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_1_4"
+ },
+/area/vehicle/apc/movie)
+"U" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "front_wheel_R"
+ },
+/turf/open/space/basic,
+/area/space)
+"V" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "wheel_back_top_1";
+ pixel_x = -4;
+ pixel_y = -4
+ },
+/turf/open/void/vehicle,
+/area/space)
+"W" = (
+/obj/effect/landmark/interior/spawn/vehicle_driver_seat/armor{
+ dir = 4
+ },
+/obj/effect/landmark/interior/spawn/interior_viewport{
+ dir = 8;
+ pixel_x = 5
+ },
+/turf/open/shuttle/vehicle{
+ icon_state = "floor_2"
+ },
+/area/vehicle/apc/movie)
+"X" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "wall";
+ opacity = 0
+ },
+/obj/structure/surface/table/reinforced/almayer_B{
+ pixel_y = -18
+ },
+/turf/open/space/basic,
+/area/space)
+"Y" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "rear_2"
+ },
+/turf/open/void/vehicle,
+/area/space)
+"Z" = (
+/obj/structure/interior_wall/apc{
+ icon_state = "corner_small_R";
+ opacity = 0
+ },
+/obj/structure/interior_wall/apc{
+ icon_state = "wheel_front_top_2";
+ pixel_x = 4;
+ pixel_y = -4
+ },
+/obj/structure/interior_wall/apc{
+ icon_state = "wheel_front_top_2";
+ pixel_x = 8;
+ pixel_y = -4;
+ layer = 2.03
+ },
+/turf/open/void/vehicle,
+/area/space)
+
+(1,1,1) = {"
+a
+D
+M
+M
+Y
+o
+E
+"}
+(2,1,1) = {"
+V
+s
+v
+m
+A
+L
+E
+"}
+(3,1,1) = {"
+K
+H
+F
+m
+j
+r
+E
+"}
+(4,1,1) = {"
+X
+c
+u
+P
+B
+z
+Q
+"}
+(5,1,1) = {"
+X
+b
+N
+t
+N
+T
+C
+"}
+(6,1,1) = {"
+Z
+i
+G
+m
+d
+R
+E
+"}
+(7,1,1) = {"
+e
+J
+n
+w
+A
+q
+E
+"}
+(8,1,1) = {"
+f
+l
+W
+m
+h
+U
+E
+"}
+(9,1,1) = {"
+S
+I
+O
+p
+y
+g
+E
+"}
diff --git a/maps/map_files/golden_arrow/golden_arrow.dmm b/maps/map_files/golden_arrow/golden_arrow.dmm
index 3558338e21..c00c87e116 100644
--- a/maps/map_files/golden_arrow/golden_arrow.dmm
+++ b/maps/map_files/golden_arrow/golden_arrow.dmm
@@ -173,17 +173,17 @@
"aT" = (
/obj/structure/machinery/computer/cameras/almayer/vehicle{
dir = 4;
- pixel_x = -17;
- network = list("Golden Arrow","Vehicle","Midway")
+ network = list("Golden Arrow","Vehicle","Midway");
+ pixel_x = -17
},
/obj/structure/machinery/prop/almayer/CICmap{
+ density = 0;
dir = 4;
icon_state = "shuttle";
layer = 2.97;
name = "Tactical Map Display";
pixel_x = -17;
- pixel_y = 14;
- density = 0
+ pixel_y = 14
},
/turf/open/floor/almayer,
/area/golden_arrow/platoon_commander_rooms)
@@ -237,6 +237,9 @@
/obj/effect/landmark/late_join/alpha,
/turf/open/floor/plating/plating_catwalk,
/area/golden_arrow/cryo_cells)
+"bl" = (
+/turf/closed/wall/almayer/outer,
+/area/golden_arrow/firingrange)
"bo" = (
/obj/structure/window/framed/almayer,
/turf/open/floor/almayer{
@@ -354,6 +357,19 @@
"ca" = (
/turf/closed/wall/almayer/outer,
/area/golden_arrow/hangar)
+"ce" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "E";
+ pixel_x = 1
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "S"
+ },
+/turf/open/floor/almayer{
+ dir = 5;
+ icon_state = "plating"
+ },
+/area/golden_arrow/firingrange)
"cj" = (
/obj/effect/decal/warning_stripes{
icon_state = "S"
@@ -466,11 +482,13 @@
/area/golden_arrow/hangar)
"cD" = (
/obj/structure/surface/table/almayer,
-/obj/item/reagent_container/food/drinks/coffeecup/wy{
- desc = "A matte gray coffee mug bearing the Weyland-Yutani logo on its front. Looks like someone spat in it.";
- name = "dip cup";
- pixel_x = -4;
- pixel_y = 8
+/obj/item/spacecash/c10{
+ pixel_x = 5;
+ pixel_y = 7
+ },
+/obj/item/storage/box/co2_knife{
+ pixel_x = 3;
+ pixel_y = 13
},
/turf/open/floor/almayer,
/area/golden_arrow/squad_one)
@@ -511,6 +529,13 @@
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 4
},
+/obj/structure/surface/table/almayer,
+/obj/item/reagent_container/food/drinks/coffeecup/wy{
+ desc = "A matte gray coffee mug bearing the Weyland-Yutani logo on its front. Looks like someone spat in it.";
+ name = "dip cup";
+ pixel_x = -4;
+ pixel_y = 8
+ },
/turf/open/floor/plating/plating_catwalk,
/area/golden_arrow/squad_one)
"cS" = (
@@ -722,6 +747,29 @@
icon_state = "sterile_green"
},
/area/golden_arrow/medical)
+"eh" = (
+/obj/structure/surface/rack,
+/obj/item/ammo_magazine/rifle/m41aMK1{
+ current_rounds = 0;
+ pixel_x = -5
+ },
+/obj/item/ammo_magazine/rifle/m41aMK1{
+ current_rounds = 0
+ },
+/obj/item/ammo_magazine/rifle/m41aMK1{
+ current_rounds = 0;
+ pixel_x = 5
+ },
+/turf/open/floor/almayer{
+ icon_state = "plate"
+ },
+/area/golden_arrow/firingrange)
+"ek" = (
+/obj/structure/machinery/light,
+/turf/open/floor/almayer{
+ icon_state = "redfull"
+ },
+/area/golden_arrow/firingrange)
"eo" = (
/turf/open/floor/almayer{
icon_state = "cargo_arrow"
@@ -744,8 +792,8 @@
/obj/structure/machinery/door/airlock/almayer/maint/reinforced{
access_modified = 1;
dir = 8;
- req_one_access = list(36);
- name = "\improper Synthetic Preperations"
+ name = "\improper Synthetic Preperations";
+ req_one_access = list(36)
},
/obj/structure/machinery/door/poddoor/almayer/closed{
dir = 4;
@@ -1261,6 +1309,16 @@
},
/turf/open/floor/plating/plating_catwalk,
/area/golden_arrow/squad_two)
+"hD" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "S"
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/almayer{
+ dir = 5;
+ icon_state = "plating"
+ },
+/area/golden_arrow/firingrange)
"hF" = (
/obj/effect/decal/cleanable/blood/oil,
/turf/open/floor/almayer,
@@ -1293,6 +1351,9 @@
icon_state = "plate"
},
/area/golden_arrow/engineering)
+"hM" = (
+/turf/open/floor/plating/plating_catwalk,
+/area/golden_arrow/firingrange)
"hN" = (
/obj/structure/surface/table/almayer,
/obj/structure/machinery/computer/secure_data{
@@ -1302,6 +1363,17 @@
icon_state = "plate"
},
/area/golden_arrow/platoon_sergeant)
+"hQ" = (
+/obj/structure/machinery/power/apc/almayer{
+ dir = 1
+ },
+/obj/structure/pipes/standard/manifold/hidden/supply{
+ dir = 1
+ },
+/turf/open/floor/almayer{
+ icon_state = "plate"
+ },
+/area/golden_arrow/firingrange)
"hR" = (
/obj/structure/machinery/firealarm{
pixel_y = 28
@@ -1438,16 +1510,7 @@
},
/area/golden_arrow/prep_hallway)
"iE" = (
-/obj/structure/surface/table/almayer,
/obj/structure/pipes/standard/simple/hidden/supply,
-/obj/item/spacecash/c10{
- pixel_x = 5;
- pixel_y = 7
- },
-/obj/item/storage/box/co2_knife{
- pixel_x = 3;
- pixel_y = 13
- },
/turf/open/floor/plating/plating_catwalk,
/area/golden_arrow/squad_one)
"iF" = (
@@ -1477,9 +1540,7 @@
dir = 4
},
/obj/structure/pipes/vents/scrubber,
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
+/turf/open/floor/almayer,
/area/golden_arrow/prep_hallway)
"iN" = (
/turf/open/floor/almayer{
@@ -1597,6 +1658,16 @@
icon_state = "plate"
},
/area/golden_arrow/squad_two)
+"jt" = (
+/obj/structure/target,
+/obj/structure/machinery/light{
+ dir = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/almayer{
+ icon_state = "redfull"
+ },
+/area/golden_arrow/firingrange)
"jy" = (
/obj/effect/decal/cleanable/blood/oil,
/obj/structure/machinery/computer/station_alert{
@@ -2237,6 +2308,15 @@
/obj/structure/pipes/standard/simple/hidden/supply,
/turf/open/floor/almayer,
/area/golden_arrow/squad_one)
+"nH" = (
+/obj/structure/pipes/standard/simple/hidden/supply{
+ dir = 4
+ },
+/turf/open/floor/almayer{
+ dir = 4;
+ icon_state = "cargo_arrow"
+ },
+/area/golden_arrow/prep_hallway)
"nK" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/machinery/power/apc/almayer{
@@ -2246,6 +2326,12 @@
icon_state = "plate"
},
/area/golden_arrow/canteen)
+"nL" = (
+/obj/structure/surface/table/almayer,
+/turf/open/floor/almayer{
+ icon_state = "plate"
+ },
+/area/golden_arrow/firingrange)
"nM" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/surface/table/reinforced/almayer_B,
@@ -2702,6 +2788,16 @@
icon_state = "plate"
},
/area/golden_arrow/squad_two)
+"qE" = (
+/obj/structure/barricade/metal{
+ dir = 8
+ },
+/obj/structure/machinery/light,
+/obj/structure/sign/safety/two{
+ pixel_y = -22
+ },
+/turf/open/floor/almayer,
+/area/golden_arrow/firingrange)
"qI" = (
/obj/structure/machinery/landinglight/ds1/delayone{
dir = 8
@@ -2950,11 +3046,12 @@
},
/area/golden_arrow/briefing)
"so" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/pipes/standard/simple/hidden/supply{
- dir = 5
+/obj/structure/pipes/standard/manifold/hidden/supply{
+ dir = 8
+ },
+/turf/open/floor/almayer{
+ icon_state = "cargo_arrow"
},
-/turf/open/floor/almayer,
/area/golden_arrow/prep_hallway)
"sv" = (
/obj/effect/decal/warning_stripes{
@@ -3066,6 +3163,25 @@
icon_state = "plate"
},
/area/golden_arrow/platoon_commander_rooms)
+"tb" = (
+/obj/structure/sign/safety/firingrange{
+ pixel_x = -24;
+ pixel_y = 7
+ },
+/obj/structure/sign/safety/hazard{
+ pixel_y = -7;
+ pixel_x = -24
+ },
+/turf/open/floor/almayer{
+ icon_state = "plate"
+ },
+/area/golden_arrow/prep_hallway)
+"tf" = (
+/obj/structure/pipes/vents/pump{
+ dir = 4
+ },
+/turf/open/floor/plating/plating_catwalk,
+/area/golden_arrow/firingrange)
"ti" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/warning_stripes{
@@ -3239,6 +3355,18 @@
icon_state = "plate"
},
/area/golden_arrow/briefing)
+"uE" = (
+/obj/structure/machinery/firealarm{
+ pixel_y = 28
+ },
+/obj/structure/pipes/standard/simple/hidden/supply{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/almayer{
+ icon_state = "plate"
+ },
+/area/golden_arrow/firingrange)
"uF" = (
/obj/structure/surface/table/reinforced/prison,
/obj/structure/machinery/computer/crew/alt,
@@ -3575,8 +3703,8 @@
dir = 8
},
/obj/item/device/walkman{
- pixel_y = -6;
- pixel_x = 4
+ pixel_x = 4;
+ pixel_y = -6
},
/turf/open/floor/almayer{
dir = 5;
@@ -3647,6 +3775,12 @@
icon_state = "test_floor4"
},
/area/golden_arrow/platoon_sergeant)
+"wX" = (
+/obj/structure/pipes/standard/simple/hidden/supply,
+/turf/open/floor/almayer{
+ icon_state = "plate"
+ },
+/area/golden_arrow/firingrange)
"xf" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/almayer,
@@ -3664,6 +3798,15 @@
icon_state = "plate"
},
/area/golden_arrow/prep_hallway)
+"xo" = (
+/obj/structure/pipes/standard/simple/hidden/supply{
+ dir = 8
+ },
+/turf/open/floor/almayer{
+ dir = 8;
+ icon_state = "cargo_arrow"
+ },
+/area/golden_arrow/prep_hallway)
"xx" = (
/obj/structure/machinery/light,
/obj/structure/pipes/vents/scrubber,
@@ -3979,6 +4122,11 @@
icon_state = "dark_sterile"
},
/area/golden_arrow/cryo_cells)
+"zv" = (
+/turf/open/floor/almayer{
+ icon_state = "plate"
+ },
+/area/golden_arrow/firingrange)
"zy" = (
/obj/structure/pipes/standard/simple/hidden/supply,
/turf/open/floor/almayer,
@@ -4057,6 +4205,16 @@
icon_state = "cargo_arrow"
},
/area/golden_arrow/prep_hallway)
+"zP" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = 1
+ },
+/turf/open/floor/almayer{
+ dir = 5;
+ icon_state = "plating"
+ },
+/area/golden_arrow/firingrange)
"zV" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/machinery/disposal,
@@ -4079,12 +4237,7 @@
},
/area/golden_arrow/squad_one)
"Ad" = (
-/obj/structure/machinery/door/poddoor/almayer/locked{
- name = "\improper Hangar Lockdown Blast Door"
- },
-/turf/open/floor/almayer{
- icon_state = "test_floor4"
- },
+/turf/open/floor/almayer,
/area/golden_arrow/prep_hallway)
"Ap" = (
/obj/structure/surface/table/almayer,
@@ -4118,6 +4271,15 @@
},
/turf/open/floor/plating/plating_catwalk,
/area/golden_arrow/cryo_cells)
+"Ay" = (
+/obj/structure/machinery/door/poddoor/almayer/locked{
+ dir = 2;
+ name = "\improper Hangar Lockdown Blast Door"
+ },
+/turf/open/floor/almayer{
+ icon_state = "test_floor4"
+ },
+/area/golden_arrow/prep_hallway)
"AA" = (
/obj/structure/machinery/cm_vending/sorted/medical/wall_med{
pixel_y = 25
@@ -4323,6 +4485,19 @@
icon_state = "plate"
},
/area/golden_arrow/squad_two)
+"BC" = (
+/obj/structure/target,
+/obj/structure/machinery/light,
+/turf/open/floor/almayer{
+ icon_state = "redfull"
+ },
+/area/golden_arrow/firingrange)
+"BD" = (
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/almayer{
+ icon_state = "plate"
+ },
+/area/golden_arrow/firingrange)
"BM" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/machinery/light{
@@ -4448,6 +4623,15 @@
},
/turf/open/floor/almayer,
/area/golden_arrow/supply)
+"Co" = (
+/obj/structure/barricade/plasteel{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/almayer{
+ icon_state = "plate"
+ },
+/area/golden_arrow/firingrange)
"Cr" = (
/turf/open/space/basic,
/area/space)
@@ -4502,6 +4686,10 @@
icon_state = "plate"
},
/area/golden_arrow/supply)
+"CA" = (
+/obj/structure/largecrate/random/barrel/green,
+/turf/open/floor/plating/plating_catwalk,
+/area/golden_arrow/prep_hallway)
"CC" = (
/obj/structure/surface/rack,
/obj/item/ammo_magazine/flamer_tank,
@@ -4590,7 +4778,7 @@
/area/golden_arrow/platoon_commander_rooms)
"Db" = (
/obj/effect/decal/cleanable/dirt,
-/turf/closed/wall/almayer/outer,
+/turf/closed/wall/almayer,
/area/golden_arrow/squad_two)
"Dc" = (
/obj/structure/pipes/standard/simple/hidden/supply{
@@ -4851,6 +5039,13 @@
icon_state = "cargo_arrow"
},
/area/golden_arrow/cryo_cells)
+"EN" = (
+/obj/structure/barricade/metal{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/almayer,
+/area/golden_arrow/firingrange)
"EO" = (
/obj/structure/machinery/disposal{
density = 0;
@@ -5014,6 +5209,20 @@
},
/turf/open/floor/almayer,
/area/golden_arrow/dorms)
+"FK" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "E";
+ pixel_x = 1
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = 1
+ },
+/turf/open/floor/almayer{
+ dir = 5;
+ icon_state = "plating"
+ },
+/area/golden_arrow/firingrange)
"FN" = (
/obj/structure/machinery/medical_pod/sleeper{
dir = 8;
@@ -5151,6 +5360,9 @@
icon_state = "dark_sterile"
},
/area/golden_arrow/canteen)
+"Gl" = (
+/turf/closed/wall/almayer/outer,
+/area/golden_arrow/prep_hallway)
"Gq" = (
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 5
@@ -5347,6 +5559,16 @@
},
/turf/open/floor/almayer,
/area/golden_arrow/platoon_sergeant)
+"Hu" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = 1
+ },
+/obj/structure/target,
+/turf/open/floor/almayer{
+ icon_state = "redfull"
+ },
+/area/golden_arrow/firingrange)
"Hv" = (
/obj/item/frame/camera{
desc = "The Staff Officer insisted he needed to monitor everyone at all times.";
@@ -5465,17 +5687,38 @@
icon_state = "dark_sterile"
},
/area/golden_arrow/cryo_cells)
+"Ib" = (
+/obj/structure/barricade/metal{
+ dir = 8
+ },
+/obj/structure/machinery/light{
+ dir = 1
+ },
+/obj/structure/sign/safety/one{
+ pixel_y = 22
+ },
+/turf/open/floor/almayer,
+/area/golden_arrow/firingrange)
"Ii" = (
/obj/structure/machinery/cryopod,
/turf/open/floor/almayer{
icon_state = "cargo"
},
/area/golden_arrow/cryo_cells)
+"Is" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = 1
+ },
+/turf/open/floor/almayer{
+ icon_state = "redfull"
+ },
+/area/golden_arrow/firingrange)
"It" = (
/obj/structure/machinery/door/airlock/multi_tile/almayer/engidoor/autoname{
+ autoname = 0;
dir = 1;
- req_one_access = list();
- autoname = 0
+ req_one_access = list()
},
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 8
@@ -5521,6 +5764,12 @@
},
/turf/open/floor/plating/plating_catwalk,
/area/golden_arrow/squad_two)
+"IH" = (
+/obj/structure/barricade/metal{
+ dir = 8
+ },
+/turf/open/floor/almayer,
+/area/golden_arrow/firingrange)
"IP" = (
/turf/open/floor/plating/plating_catwalk,
/area/golden_arrow/engineering)
@@ -5613,6 +5862,14 @@
icon_state = "plate"
},
/area/golden_arrow/platoon_commander_rooms)
+"Jj" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "S"
+ },
+/turf/open/floor/almayer{
+ icon_state = "redfull"
+ },
+/area/golden_arrow/firingrange)
"Jk" = (
/obj/effect/decal/warning_stripes{
icon_state = "N";
@@ -5720,6 +5977,14 @@
icon_state = "plate"
},
/area/golden_arrow/hangar)
+"Kb" = (
+/obj/structure/surface/rack,
+/obj/item/tool/screwdriver,
+/obj/item/prop/helmetgarb/gunoil,
+/turf/open/floor/almayer{
+ icon_state = "plate"
+ },
+/area/golden_arrow/firingrange)
"Kd" = (
/obj/structure/surface/table/almayer,
/obj/effect/decal/cleanable/dirt,
@@ -5821,6 +6086,15 @@
icon_state = "plate"
},
/area/golden_arrow/dorms)
+"KL" = (
+/obj/structure/pipes/standard/simple/hidden/supply{
+ dir = 9
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/almayer{
+ icon_state = "plate"
+ },
+/area/golden_arrow/firingrange)
"KM" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/machinery/light,
@@ -6157,13 +6431,22 @@
/area/golden_arrow/cryo_cells)
"Mu" = (
/obj/structure/machinery/door/airlock/almayer/engineering/reinforced{
- req_one_access = list();
- name = "\improper Engineering Airlock"
+ name = "\improper Engineering Airlock";
+ req_one_access = list()
},
/turf/open/floor/almayer{
icon_state = "test_floor4"
},
/area/golden_arrow/engineering)
+"Mz" = (
+/obj/structure/machinery/light{
+ dir = 4
+ },
+/obj/structure/surface/table/almayer,
+/turf/open/floor/almayer{
+ icon_state = "plate"
+ },
+/area/golden_arrow/firingrange)
"MB" = (
/obj/effect/decal/warning_stripes{
icon_state = "SE-out"
@@ -6284,6 +6567,7 @@
/area/golden_arrow/briefing)
"Nr" = (
/obj/structure/surface/table/almayer,
+/obj/effect/spawner/prop_gun/anti_tank,
/turf/open/floor/almayer,
/area/golden_arrow/squad_two)
"Nx" = (
@@ -6360,8 +6644,8 @@
/area/golden_arrow/platoon_commander_rooms)
"NI" = (
/obj/structure/machinery/cm_vending/clothing/synth/snowflake{
- pixel_x = -30;
- density = 0
+ density = 0;
+ pixel_x = -30
},
/turf/open/floor/almayer{
icon_state = "test_floor5"
@@ -6387,9 +6671,9 @@
/area/golden_arrow/canteen)
"NU" = (
/obj/structure/machinery/door/airlock/multi_tile/almayer/engidoor/autoname{
+ autoname = 0;
dir = 1;
- req_one_access = list();
- autoname = 0
+ req_one_access = list()
},
/turf/open/floor/almayer{
icon_state = "test_floor4"
@@ -6439,6 +6723,9 @@
icon_state = "cargo_arrow"
},
/area/golden_arrow/briefing)
+"Of" = (
+/turf/closed/wall/almayer,
+/area/golden_arrow/firingrange)
"Oj" = (
/obj/structure/machinery/camera/autoname/golden_arrow,
/turf/open/floor/almayer{
@@ -6453,12 +6740,23 @@
/obj/structure/janitorialcart,
/turf/open/floor/plating/plating_catwalk,
/area/golden_arrow/engineering)
+"Op" = (
+/turf/open/floor/plating/plating_catwalk,
+/area/golden_arrow/prep_hallway)
"Os" = (
/obj/structure/bed/chair/comfy,
/turf/open/floor/almayer{
icon_state = "dark_sterile"
},
/area/golden_arrow/canteen)
+"Oy" = (
+/obj/structure/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/almayer{
+ icon_state = "redfull"
+ },
+/area/golden_arrow/firingrange)
"Oz" = (
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 5
@@ -6720,6 +7018,14 @@
icon_state = "plate"
},
/area/golden_arrow/squad_two)
+"PI" = (
+/obj/structure/pipes/standard/simple/hidden/supply{
+ dir = 8
+ },
+/turf/open/floor/almayer{
+ icon_state = "test_floor4"
+ },
+/area/golden_arrow/firingrange)
"PL" = (
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 10
@@ -6736,6 +7042,16 @@
icon_state = "cargo_arrow"
},
/area/golden_arrow/platoon_sergeant)
+"PS" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "E";
+ pixel_x = 1
+ },
+/turf/open/floor/almayer{
+ dir = 5;
+ icon_state = "plating"
+ },
+/area/golden_arrow/firingrange)
"PW" = (
/obj/structure/machinery/door/airlock/almayer/command/reinforced{
name = "\improper Private Briefing Room";
@@ -6767,6 +7083,12 @@
/obj/structure/pipes/standard/manifold/hidden/supply{
dir = 8
},
+/obj/structure/surface/table/almayer,
+/obj/item/device/cassette_tape/nam{
+ layer = 2.9;
+ pixel_x = -6;
+ pixel_y = 7
+ },
/turf/open/floor/plating/plating_catwalk,
/area/golden_arrow/squad_one)
"Qc" = (
@@ -6829,8 +7151,8 @@
/area/golden_arrow/prep_hallway)
"Qq" = (
/obj/structure/machinery/door/airlock/almayer/engineering/reinforced{
- req_one_access = list();
- name = "\improper Engineering Airlock"
+ name = "\improper Engineering Airlock";
+ req_one_access = list()
},
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 8
@@ -7060,7 +7382,16 @@
/turf/open/floor/almayer{
icon_state = "plate"
},
-/area/golden_arrow/platoon_sergeant)
+/area/golden_arrow/platoon_sergeant)
+"Ri" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "S"
+ },
+/turf/open/floor/almayer{
+ dir = 5;
+ icon_state = "plating"
+ },
+/area/golden_arrow/firingrange)
"Rl" = (
/obj/structure/surface/table/almayer,
/obj/item/tool/kitchen/tray{
@@ -7206,6 +7537,12 @@
},
/turf/open/floor/almayer,
/area/golden_arrow/supply)
+"RY" = (
+/turf/open/floor/almayer{
+ dir = 8;
+ icon_state = "cargo_arrow"
+ },
+/area/golden_arrow/prep_hallway)
"Sc" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/almayer{
@@ -7363,6 +7700,16 @@
"SC" = (
/turf/closed/wall/almayer/outer,
/area/space)
+"SE" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "S"
+ },
+/obj/structure/target,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/almayer{
+ icon_state = "redfull"
+ },
+/area/golden_arrow/firingrange)
"SL" = (
/obj/structure/machinery/light{
dir = 8
@@ -7706,8 +8053,8 @@
"Um" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/machinery/cm_vending/clothing/synth{
- pixel_x = -30;
- density = 0
+ density = 0;
+ pixel_x = -30
},
/turf/open/floor/almayer{
icon_state = "test_floor5"
@@ -7721,12 +8068,6 @@
},
/area/golden_arrow/canteen)
"UI" = (
-/obj/structure/surface/table/almayer,
-/obj/item/device/cassette_tape/nam{
- layer = 2.9;
- pixel_x = -6;
- pixel_y = 7
- },
/turf/open/floor/plating/plating_catwalk,
/area/golden_arrow/squad_one)
"UK" = (
@@ -7858,6 +8199,12 @@
icon_state = "plate"
},
/area/golden_arrow/hangar)
+"VG" = (
+/turf/open/floor/almayer{
+ dir = 5;
+ icon_state = "plating"
+ },
+/area/golden_arrow/firingrange)
"VJ" = (
/obj/structure/ladder{
height = 1;
@@ -8036,6 +8383,12 @@
icon_state = "plate"
},
/area/golden_arrow/hangar)
+"Wy" = (
+/obj/structure/pipes/standard/simple/hidden/supply{
+ dir = 9
+ },
+/turf/open/floor/almayer,
+/area/golden_arrow/prep_hallway)
"WA" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/machinery/power/apc/almayer{
@@ -8084,16 +8437,13 @@
pixel_x = -1;
pixel_y = 1
},
-/obj/effect/decal/cleanable/dirt,
/obj/structure/machinery/light{
dir = 8
},
/obj/structure/sign/safety/bulkhead_door{
pixel_x = -19
},
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
+/turf/open/floor/almayer,
/area/golden_arrow/prep_hallway)
"Xa" = (
/obj/effect/decal/warning_stripes{
@@ -8147,6 +8497,16 @@
},
/turf/open/floor/plating/plating_catwalk,
/area/golden_arrow/hangar)
+"Xu" = (
+/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{
+ name = "\improper Firing Range";
+ req_one_access_txt = "8;12;40";
+ dir = 2
+ },
+/turf/open/floor/almayer{
+ icon_state = "test_floor4"
+ },
+/area/golden_arrow/firingrange)
"Xv" = (
/obj/structure/sign/safety/rewire{
pixel_x = 14;
@@ -8265,6 +8625,11 @@
icon_state = "plate"
},
/area/golden_arrow/canteen)
+"XV" = (
+/obj/structure/pipes/standard/simple/hidden/supply,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/almayer,
+/area/golden_arrow/prep_hallway)
"Ya" = (
/obj/structure/pipes/standard/simple/hidden/supply,
/turf/open/floor/almayer{
@@ -8315,10 +8680,21 @@
"Yj" = (
/turf/closed/wall/almayer,
/area/golden_arrow/hangar)
+"Yk" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = 1
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/almayer{
+ dir = 5;
+ icon_state = "plating"
+ },
+/area/golden_arrow/firingrange)
"Yl" = (
/obj/structure/machinery/cm_vending/gear/synth{
- pixel_x = -30;
- density = 0
+ density = 0;
+ pixel_x = -30
},
/turf/open/floor/almayer{
icon_state = "test_floor5"
@@ -8545,6 +8921,11 @@
icon_state = "test_floor4"
},
/area/golden_arrow/canteen)
+"ZQ" = (
+/obj/structure/pipes/standard/simple/hidden/supply,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating/plating_catwalk,
+/area/golden_arrow/firingrange)
"ZR" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/machinery/chem_master,
@@ -15369,13 +15750,13 @@ ot
Qw
Cr
Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
+bl
+bl
+bl
+bl
+bl
+bl
+bl
Cr
Cr
Cr
@@ -15521,13 +15902,13 @@ gd
Qw
Cr
Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
+bl
+Oy
+SE
+zv
+Hu
+ek
+bl
Cr
Cr
Cr
@@ -15673,13 +16054,13 @@ gd
Qw
Cr
Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
+bl
+VG
+hD
+zv
+zP
+VG
+bl
Cr
Cr
Cr
@@ -15825,13 +16206,13 @@ Me
Qw
Qw
Qw
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
+bl
+VG
+Ri
+zv
+Yk
+VG
+bl
Cr
Cr
Cr
@@ -15976,14 +16357,14 @@ Yp
gd
ST
Df
-Qw
-Qw
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
+Me
+Me
+jt
+Jj
+BD
+Is
+BC
+bl
Cr
Cr
Cr
@@ -16129,13 +16510,13 @@ Fg
Fg
gd
tS
-Qw
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
+Me
+VG
+hD
+zv
+zP
+VG
+bl
Cr
Cr
Cr
@@ -16281,13 +16662,13 @@ ty
Fg
Fg
Ku
-Qw
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
+Me
+PS
+ce
+zv
+FK
+PS
+bl
Cr
Cr
Cr
@@ -16433,13 +16814,13 @@ mf
Fy
DR
tS
-Qw
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
+Me
+Ib
+EN
+Co
+IH
+qE
+bl
Cr
Cr
Cr
@@ -16585,14 +16966,14 @@ pf
sV
Yp
Db
-Qw
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
+Me
+tf
+hM
+zv
+hM
+tf
+bl
+bl
Cr
Cr
Cr
@@ -16736,15 +17117,15 @@ dX
pB
Fg
TT
-Qw
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
+Me
+Of
+hQ
+wX
+ZQ
+wX
+KL
+Kb
+bl
Cr
Cr
Cr
@@ -16888,15 +17269,15 @@ Qw
qD
cA
RO
-Qw
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
+Me
+Of
+uE
+BD
+Mz
+nL
+BD
+eh
+bl
Cr
Cr
Cr
@@ -17031,24 +17412,24 @@ qA
qA
jc
Jc
-XQ
+nH
GG
Zk
Me
-Qw
-Qw
-Qw
-Qw
-Qw
-Qw
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
+Me
+Me
+Me
+Me
+Me
+Me
+Of
+PI
+Xu
+Of
+Of
+bl
+bl
+bl
Cr
Cr
Cr
@@ -17187,18 +17568,18 @@ XI
Wl
uu
WY
-Ad
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
+iN
+wp
+iN
+wp
+iN
+wp
+tb
+xo
+RY
+iN
+oh
+Ay
Cr
Cr
Cr
@@ -17339,18 +17720,18 @@ wn
iK
SO
so
+SO
+iK
+iK
+XV
+XV
+iK
+iK
+Wy
Ad
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
+Op
+CA
+Ay
Cr
Cr
Cr
@@ -17491,18 +17872,18 @@ XI
gq
Va
iL
-Ad
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
+iN
+wp
+iN
+iN
+iN
+wp
+wp
+pZ
+ms
+wp
+iN
+Ay
Cr
Cr
Cr
@@ -17643,18 +18024,18 @@ TC
GG
jc
ZC
+ZC
+ZC
+ZC
+ZC
+ZC
Ty
-Ty
-Ty
-Ty
-Ty
-Ty
-Cr
-Cr
-Cr
-Cr
-Cr
-Cr
+Gl
+pt
+pt
+Gl
+Gl
+Gl
Cr
Cr
Cr
@@ -18100,7 +18481,7 @@ wp
ZC
Fe
cT
-cT
+cD
aJ
iE
xx
@@ -18406,7 +18787,7 @@ qa
cT
cR
Uk
-cD
+cT
cT
zk
Ty
diff --git a/tgui/packages/tgui/interfaces/GameMasterRappelMenu.js b/tgui/packages/tgui/interfaces/GameMasterRappelMenu.js
new file mode 100644
index 0000000000..f1e3286db4
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/GameMasterRappelMenu.js
@@ -0,0 +1,75 @@
+import { useBackend } from '../backend';
+import { Button, Section, Collapsible, Stack, Divider } from '../components';
+import { Window } from '../layouts';
+
+export const GameMasterRappelMenu = (props, context) => {
+ const { data, act } = useBackend(context);
+
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+export const GameMasterRappelPanel = (props, context) => {
+ const { data, act } = useBackend(context);
+
+ return (
+
+
+
+
+ {data.game_master_rappels && (
+
+
+
+ {data.game_master_rappels.map((val) => {
+ if (val) {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+ }
+ })}
+
+
+
+
+ )}
+
+
+ );
+};