diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm
index a40675e0560e..36251634d50f 100644
--- a/code/__DEFINES/access.dm
+++ b/code/__DEFINES/access.dm
@@ -71,3 +71,7 @@ most of them are tied into map-placed objects. This should be reworked in the fu
#define ACCESS_WY_CORPORATE_DS 202
#define ACCESS_PRESS 203
//=================================================
+
+#define ACCESS_YAUTJA_SECURE 250
+#define ACCESS_YAUTJA_ELDER 251
+#define ACCESS_YAUTJA_ANCIENT 252
diff --git a/code/__DEFINES/clans.dm b/code/__DEFINES/clans.dm
index 54c9d11616e5..1b95d11c030c 100644
--- a/code/__DEFINES/clans.dm
+++ b/code/__DEFINES/clans.dm
@@ -49,14 +49,14 @@
/// Scales with clan size
#define CLAN_LIMIT_SIZE 2
-var/global/list/datum/rank/clan_ranks = list(
- CLAN_RANK_UNBLOODED = new /datum/rank/unblooded(),
- CLAN_RANK_YOUNG = new /datum/rank/young(),
- CLAN_RANK_BLOODED = new /datum/rank/blooded(),
- CLAN_RANK_ELITE = new /datum/rank/elite(),
- CLAN_RANK_ELDER = new /datum/rank/elder(),
- CLAN_RANK_LEADER = new /datum/rank/leader(),
- CLAN_RANK_ADMIN = new /datum/rank/ancient()
+var/global/list/datum/yautja_rank/clan_ranks = list(
+ CLAN_RANK_UNBLOODED = new /datum/yautja_rank/unblooded(),
+ CLAN_RANK_YOUNG = new /datum/yautja_rank/young(),
+ CLAN_RANK_BLOODED = new /datum/yautja_rank/blooded(),
+ CLAN_RANK_ELITE = new /datum/yautja_rank/elite(),
+ CLAN_RANK_ELDER = new /datum/yautja_rank/elder(),
+ CLAN_RANK_LEADER = new /datum/yautja_rank/leader(),
+ CLAN_RANK_ADMIN = new /datum/yautja_rank/ancient()
)
var/global/list/clan_ranks_ordered = list(
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 71c659054952..7dc5a3652dc5 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -18,3 +18,18 @@
//the define for visible message range in combat
#define COMBAT_MESSAGE_RANGE 3
#define DEFAULT_MESSAGE_RANGE 7
+
+//Predator decloak multpliers based on the standard.
+#define DECLOAK_STANDARD 10 SECONDS
+/// Forced for any unspecified reason.
+#define DECLOAK_FORCED 1
+/// Caused by being worn by non humans.
+#define DECLOAK_SPECIES 0.75
+/// Caused by fire extinguisher.
+#define DECLOAK_EXTINGUISHER 1.5
+/// Caused by predalien screech.
+#define DECLOAK_PREDALIEN 2
+/// Caused by being in a body of water.
+#define DECLOAK_SUBMERGED 2
+/// Caused by an EMP.
+#define DECLOAK_EMP 3
diff --git a/code/__DEFINES/equipment.dm b/code/__DEFINES/equipment.dm
index 4212f6a52301..ea73ac38bcc7 100644
--- a/code/__DEFINES/equipment.dm
+++ b/code/__DEFINES/equipment.dm
@@ -82,6 +82,8 @@
#define NOTABLEMERGE (1<<13)
/// Has heat source but isn't 'on fire' and thus can be stored
#define IGNITING_ITEM (1<<14)
+/// Is in the process of falling apart.
+#define ITEM_DISSOLVING (1<<15)
//==========================================================================================
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index 899f9f5a0e1c..93a17c2445f3 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -267,6 +267,35 @@
/obj/structure/machinery/door/airlock/strata/mining/autoname
autoname = TRUE
+//YAUTJA SHIP - CURRENTLY USES STRATA DOORS
+/obj/structure/machinery/door/airlock/yautja
+ name = "\improper Airlock"
+ icon = 'icons/obj/structures/doors/strata/strata_doors.dmi'
+ openspeed = 5
+ req_access = null
+ req_one_access = null
+ tiles_with = list(
+ /obj/structure/window/framed/strata,
+ /obj/structure/machinery/door/airlock,
+ )
+ heavy = TRUE
+ masterkey_resist = TRUE
+ no_panel = TRUE
+ not_weldable = TRUE
+ unacidable = TRUE
+
+/obj/structure/machinery/door/airlock/yautja/autoname
+ autoname = TRUE
+
+/obj/structure/machinery/door/airlock/yautja/secure
+ req_one_access = list(ACCESS_YAUTJA_SECURE, ACCESS_YAUTJA_ELDER, ACCESS_YAUTJA_ANCIENT)
+
+/obj/structure/machinery/door/airlock/yautja/elder
+ req_one_access = list(ACCESS_YAUTJA_ELDER, ACCESS_YAUTJA_ANCIENT)
+
+/obj/structure/machinery/door/airlock/yautja/ancient
+ req_one_access = list(ACCESS_YAUTJA_ANCIENT)
+ unslashable = TRUE
//FIORINA PENITENTIARY (PRISON_FOP) MAINTENANCE HATCHES
/obj/structure/machinery/door/airlock/prison_hatch
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 2edfc3d6ea2b..5b7e875af8b9 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -272,6 +272,8 @@ cases. Override_icon_state should be a list.*/
. += desc
if(desc_lore)
. += SPAN_NOTICE("This has an extended lore description.")
+ if(flags_item & ITEM_DISSOLVING)
+ . += SPAN_WARNING("It is currently dissolving into bits!")
/obj/item/attack_hand(mob/user)
if (!user)
@@ -310,6 +312,10 @@ cases. Override_icon_state should be a list.*/
if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACKED, W, user) & COMPONENT_CANCEL_ITEM_ATTACK)
return
+ if((flags_item & ITEM_PREDATOR) && (istype(W, /obj/item/tool/yautja_cleaner)))
+ if(handle_dissolve())
+ return
+
if(istype(W,/obj/item/storage))
var/obj/item/storage/S = W
if(S.storage_flags & STORAGE_CLICK_GATHER && isturf(loc))
@@ -1064,3 +1070,45 @@ cases. Override_icon_state should be a list.*/
animate(attack_image, alpha = 175, transform = copy_transform.Scale(0.75), pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3)
animate(time = 1)
animate(alpha = 0, time = 3, easing = CIRCULAR_EASING|EASE_OUT)
+
+/obj/item/proc/handle_dissolve()
+ if(!(flags_item & ITEM_PREDATOR))
+ return FALSE
+ if(!HAS_TRAIT(usr, TRAIT_YAUTJA_TECH))
+ to_chat(usr, SPAN_WARNING("You have no idea what this even does..."))
+ return FALSE
+ if(istype(src, /obj/item/tool/yautja_cleaner))
+ to_chat(usr, SPAN_WARNING("You cannot dissolve more dissolving fluid..."))
+ return FALSE
+ if(usr.alpha < 255)
+ to_chat(usr, SPAN_BOLDWARNING("It would not be safe to attempt this while cloaked!"))
+ return FALSE
+ if(anchored)
+ to_chat(usr, SPAN_WARNING("\The [src] cannot be moved by any means, why dissolve it?"))
+ return FALSE
+
+ var/mob/living/location = loc
+ var/mob/living/loc_loc = loc.loc
+ if(istype(location) || istype(loc_loc))
+ to_chat(usr, SPAN_WARNING("You cannot dissolve this while it is being held!"))
+ return FALSE
+
+ dissolve()
+ return TRUE
+
+/obj/item/proc/dissolve()
+ usr.visible_message(SPAN_DANGER("[usr] uncaps a vial and begins to pour out a vibrant blue liquid over \the [src]!"), \
+ SPAN_NOTICE("You begin to spread dissolving gel onto \the [src]!"))
+ if(do_after(usr, 5 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE))
+ usr.visible_message(SPAN_DANGER("[usr] pours blue liquid all over \the [src]!"), \
+ SPAN_NOTICE("You cover \the [src] with dissolving gel!"))
+ add_filter("dissolve_gel", 1, list("type" = "outline", "color" = "#3333FFff", "size" = 1))
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), 15 SECONDS)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, visible_message), SPAN_WARNING("[src] crumbles into pieces!")), 15 SECONDS)
+ flags_item |= ITEM_DISSOLVING
+ log_attack("[key_name(usr)] dissolved [src] with Yautja Cleaner!")
+ return TRUE
+ else
+ usr.visible_message(SPAN_WARNING("[usr] stops pouring liquid on to \the [src]!"), \
+ SPAN_WARNING("You decide not to cover \the [src] with dissolving gel."))
+ return FALSE
diff --git a/code/game/objects/items/explosives/plastic.dm b/code/game/objects/items/explosives/plastic.dm
index 4c2a1774d4db..cd1b863181a9 100644
--- a/code/game/objects/items/explosives/plastic.dm
+++ b/code/game/objects/items/explosives/plastic.dm
@@ -213,23 +213,6 @@
return TRUE
-/obj/item/explosive/plastic/breaching_charge/can_place(mob/user, atom/target)
- if(!is_type_in_list(target, breachable))//only items on the list are allowed
- to_chat(user, SPAN_WARNING("You cannot plant \the [name] on \the [target]!"))
- return FALSE
-
- if(SSinterior.in_interior(target))// vehicle checks again JUST IN CASE
- to_chat(user, SPAN_WARNING("It's too cramped in here to deploy \the [src]."))
- return FALSE
-
- if(istype(target, /obj/structure/window))//no breaching charges on the briefing windows / brig / CIC e.e
- var/obj/structure/window/W = target
- if(W.not_damageable)
- to_chat(user, SPAN_WARNING("[W] is much too tough for you to do anything to it with [src].")) //On purpose to mimic wall message
- return FALSE
-
- return TRUE
-
/obj/item/explosive/plastic/proc/calculate_pixel_offset(mob/user, atom/target)
switch(get_dir(user, target))
if(NORTH)
@@ -312,13 +295,6 @@
cell_explosion(target_turf, 120, 30, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, cause_data)
qdel(src)
-/obj/item/explosive/plastic/breaching_charge/handle_explosion(turf/target_turf, dir, cause_data)
- var/explosion_target = get_step(target_turf, dir)
- create_shrapnel(explosion_target, 40, dir, angle,/datum/ammo/bullet/shrapnel/metal, cause_data)
- sleep(1)// prevents explosion from eating shrapnel
- cell_explosion(target_turf, 60, 60, EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL, dir, cause_data)
- qdel(src)
-
/obj/item/explosive/plastic/proc/delayed_prime(turf/target_turf)
prime(TRUE)
@@ -342,3 +318,70 @@
min_timer = 3
penetration = 0.60
deploying_time = 10
+ var/shrapnel_volume = 40
+
+/obj/item/explosive/plastic/breaching_charge/can_place(mob/user, atom/target)
+ if(!is_type_in_list(target, breachable))//only items on the list are allowed
+ to_chat(user, SPAN_WARNING("You cannot plant \the [name] on \the [target]!"))
+ return FALSE
+
+ if(SSinterior.in_interior(target))// vehicle checks again JUST IN CASE
+ to_chat(user, SPAN_WARNING("It's too cramped in here to deploy \the [src]."))
+ return FALSE
+
+ if(istype(target, /obj/structure/window))//no breaching charges on the briefing windows / brig / CIC e.e
+ var/obj/structure/window/W = target
+ if(W.not_damageable)
+ to_chat(user, SPAN_WARNING("[W] is much too tough for you to do anything to it with [src].")) //On purpose to mimic wall message
+ return FALSE
+
+ return TRUE
+
+/obj/item/explosive/plastic/breaching_charge/handle_explosion(turf/target_turf, dir, cause_data)
+ var/explosion_target = get_step(target_turf, dir)
+ create_shrapnel(explosion_target, shrapnel_volume, dir, angle,/datum/ammo/bullet/shrapnel/metal, cause_data)
+ sleep(1)// prevents explosion from eating shrapnel
+ cell_explosion(target_turf, 60, 60, EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL, dir, cause_data)
+ qdel(src)
+
+/obj/item/explosive/plastic/breaching_charge/plasma
+ name = "plasma charge"
+ desc = "An alien explosive device. Who knows what it might do."
+ icon_state = "plasma-charge"
+ overlay_image = "plasma-active"
+ w_class = SIZE_SMALL
+ angle = 55
+ timer = 5
+ min_timer = 5
+ penetration = 0.60
+ deploying_time = 10
+ flags_item = NOBLUDGEON|ITEM_PREDATOR
+ shrapnel_volume = 10
+
+/obj/item/explosive/plastic/breaching_charge/plasma/can_place(mob/user, atom/target)
+ if(!HAS_TRAIT(user, TRAIT_YAUTJA_TECH))
+ to_chat(user, SPAN_WARNING("You don't quite understand how the device works..."))
+ return FALSE
+
+ if(!is_type_in_list(target, breachable))//only items on the list are allowed
+ to_chat(user, SPAN_WARNING("You cannot plant \the [name] on \the [target]!"))
+ return FALSE
+
+ if(SSinterior.in_interior(target))// vehicle checks again JUST IN CASE
+ to_chat(user, SPAN_WARNING("It's too cramped in here to deploy \the [src]."))
+ return FALSE
+
+ if(istype(target, /obj/structure/window))//no breaching charges on the briefing windows / brig / CIC e.e
+ var/obj/structure/window/W = target
+ if(W.not_damageable)
+ to_chat(user, SPAN_WARNING("[W] is much too tough for you to do anything to it with [src].")) //On purpose to mimic wall message
+ return FALSE
+
+ return TRUE
+
+/obj/item/explosive/plastic/breaching_charge/plasma/handle_explosion(turf/target_turf, dir, cause_data)
+ var/explosion_target = get_step(target_turf, dir)
+ create_shrapnel(explosion_target, shrapnel_volume, dir, angle,/datum/ammo/bullet/shrapnel/plasma, cause_data)
+ sleep(1)// prevents explosion from eating shrapnel
+ cell_explosion(target_turf, 90, 90, EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL, dir, cause_data)
+ qdel(src)
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index 3f7192b0090b..41ac80bfdc58 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -517,7 +517,7 @@
var/obj/item/clothing/gloves/yautja/hunter/Y = H.gloves
if(Y && istype(Y) && Y.cloaked)
to_chat(H, SPAN_WARNING(" Your bracers hiss and spark as they short out!"))
- Y.decloak(H, TRUE)
+ Y.decloak(H, TRUE, DECLOAK_SUBMERGED)
else if(isxeno(C))
river_slowdown -= 0.7
diff --git a/code/modules/clans/client.dm b/code/modules/clans/client.dm
index 2d06725736ce..d1f403c08300 100644
--- a/code/modules/clans/client.dm
+++ b/code/modules/clans/client.dm
@@ -405,10 +405,10 @@
to_chat(src, SPAN_WARNING("This player doesn't belong to a clan!"))
return
- var/list/datum/rank/ranks = clan_ranks.Copy()
+ var/list/datum/yautja_rank/ranks = clan_ranks.Copy()
ranks -= CLAN_RANK_ADMIN // Admin rank should not and cannot be obtained from here
- var/datum/rank/chosen_rank
+ var/datum/yautja_rank/chosen_rank
if(has_clan_permission(CLAN_PERMISSION_ADMIN_MODIFY, warn = FALSE))
var/input = tgui_input_list(src, "Select the rank to change this user to.", "Select Rank", ranks)
diff --git a/code/modules/clans/rank.dm b/code/modules/clans/rank.dm
index b0748ce60662..a6b78a0d95e9 100644
--- a/code/modules/clans/rank.dm
+++ b/code/modules/clans/rank.dm
@@ -1,4 +1,4 @@
-/datum/rank
+/datum/yautja_rank
var/name
var/limit_type
@@ -7,29 +7,29 @@
var/permissions = CLAN_PERMISSION_USER_VIEW
var/permission_required = CLAN_PERMISSION_USER_MODIFY
-/datum/rank/unblooded
+/datum/yautja_rank/unblooded
name = CLAN_RANK_UNBLOODED
permission_required = CLAN_PERMISSION_ADMIN_MODIFY
-/datum/rank/young
+/datum/yautja_rank/young
name = CLAN_RANK_YOUNG
-/datum/rank/blooded
+/datum/yautja_rank/blooded
name = CLAN_RANK_BLOODED
-/datum/rank/elite
+/datum/yautja_rank/elite
name = CLAN_RANK_ELITE
limit_type = CLAN_LIMIT_SIZE
limit = 5
-/datum/rank/elder
+/datum/yautja_rank/elder
name = CLAN_RANK_ELDER
limit_type = CLAN_LIMIT_SIZE
limit = 12
-/datum/rank/leader
+/datum/yautja_rank/leader
name = CLAN_RANK_LEADER
permissions = CLAN_PERMISSION_USER_ALL
@@ -37,7 +37,7 @@
limit_type = CLAN_LIMIT_NUMBER
limit = 1
-/datum/rank/ancient
+/datum/yautja_rank/ancient
name = CLAN_RANK_ADMIN
permission_required = CLAN_PERMISSION_ADMIN_MANAGER
diff --git a/code/modules/cm_preds/smartdisc.dm b/code/modules/cm_preds/smartdisc.dm
index 068ff3550024..319e19fdb421 100644
--- a/code/modules/cm_preds/smartdisc.dm
+++ b/code/modules/cm_preds/smartdisc.dm
@@ -59,6 +59,12 @@
var/list/L = hearers(src, dist)
return L
+/obj/item/explosive/grenade/spawnergrenade/smartdisc/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/tool/yautja_cleaner))
+ if(handle_dissolve())
+ return
+ ..()
+
/obj/item/explosive/grenade/spawnergrenade/smartdisc/attack_self(mob/user)
..()
diff --git a/code/modules/cm_preds/yaut_bracers.dm b/code/modules/cm_preds/yaut_bracers.dm
index 1b98ef402b90..b9083dd54be7 100644
--- a/code/modules/cm_preds/yaut_bracers.dm
+++ b/code/modules/cm_preds/yaut_bracers.dm
@@ -31,6 +31,9 @@
var/notification_sound = TRUE // Whether the bracer pings when a message comes or not
var/charge = 1500
var/charge_max = 1500
+ var/charge_rate = 30
+ var/charge_cooldown = 3 MINUTES
+ var/last_charge
var/cloaked = 0
var/cloak_timer = 0
var/cloak_malfunction = 0
@@ -45,14 +48,10 @@
/obj/item/clothing/gloves/yautja/equipped(mob/user, slot)
. = ..()
if(slot == WEAR_HANDS)
- flags_item |= NODROP
START_PROCESSING(SSobj, src)
- if(isyautja(user))
- to_chat(user, SPAN_WARNING("The bracer clamps securely around your forearm and beeps in a comfortable, familiar way."))
- else
- to_chat(user, SPAN_WARNING("The bracer clamps painfully around your forearm and beeps angrily. It won't come off!"))
if(!owner)
owner = user
+ toggle_lock_internal(user, TRUE)
/obj/item/clothing/gloves/yautja/Destroy()
STOP_PROCESSING(SSobj, src)
@@ -75,11 +74,27 @@
if(!ishuman(loc))
STOP_PROCESSING(SSobj, src)
return
- var/mob/living/carbon/human/H = loc
+ var/mob/living/carbon/human/hooman = loc
- charge = min(charge + 30, charge_max)
- var/perc_charge = (charge / charge_max * 100)
- H.update_power_display(perc_charge)
+ if(charge < charge_max)
+ var/charge_increase = charge_rate
+ if(is_ground_level(hooman.z))
+ charge_increase = charge_rate / 6
+ else if(is_mainship_level(hooman.z))
+ charge_increase = charge_rate / 3
+
+ charge = min(charge + charge_increase, charge_max)
+ var/perc_charge = (charge / charge_max * 100)
+ hooman.update_power_display(perc_charge)
+
+ //Non-Yautja have a chance to get stunned with each power drain
+ if(cloaked)
+ if(!HAS_TRAIT(hooman, TRAIT_YAUTJA_TECH) && !hooman.hunter_data.thralled)
+ if(prob(15))
+ decloak(hooman)
+ shock_user(hooman)
+ if(hooman.stat == DEAD)
+ decloak(hooman, TRUE)
/// handles decloaking only on HUNTER gloves
/obj/item/clothing/gloves/yautja/proc/decloak()
@@ -100,16 +115,6 @@
charge -= amount
var/perc = (charge / charge_max * 100)
human.update_power_display(perc)
-
- //Non-Yautja have a chance to get stunned with each power drain
- if(!HAS_TRAIT(human, TRAIT_YAUTJA_TECH) && !human.hunter_data.thralled)
- if(prob(15))
- if(cloaked)
- decloak(human)
- cloak_timer = world.time + 5 SECONDS
- shock_user(human)
- return FALSE
-
return TRUE
/obj/item/clothing/gloves/yautja/proc/shock_user(mob/living/carbon/human/M)
@@ -215,7 +220,7 @@
var/caster_material = "ebony"
var/obj/item/card/id/bracer_chip/embedded_id
-
+ var/owner_rank = CLAN_RANK_UNBLOODED_INT
var/caster_deployed = FALSE
var/obj/item/weapon/gun/energy/yautja/plasma_caster/caster
@@ -224,8 +229,10 @@
var/obj/item/weapon/wristblades/left_wristblades
var/obj/item/weapon/wristblades/right_wristblades
-/obj/item/clothing/gloves/yautja/hunter/Initialize(mapload, new_translator_type, new_caster_material)
+/obj/item/clothing/gloves/yautja/hunter/Initialize(mapload, new_translator_type, new_caster_material, new_owner_rank)
. = ..()
+ if(new_owner_rank)
+ owner_rank = new_owner_rank
embedded_id = new(src)
if(new_translator_type)
translator_type = new_translator_type
@@ -242,7 +249,7 @@
if(wearer.gloves == src)
wearer.visible_message(SPAN_DANGER("You hear a hiss and crackle!"), SPAN_DANGER("Your bracers hiss and spark!"), SPAN_DANGER("You hear a hiss and crackle!"))
if(cloaked)
- decloak(wearer)
+ decloak(wearer, TRUE, DECLOAK_EMP)
else
var/turf/our_turf = get_turf(src)
our_turf.visible_message(SPAN_DANGER("You hear a hiss and crackle!"), SPAN_DANGER("You hear a hiss and crackle!"))
@@ -266,10 +273,6 @@
decloak(H)
return COMPONENT_CANCEL_BULLET_ACT //Absorb one free bullet.
-/obj/item/clothing/gloves/yautja/hunter/toggle_notification_sound()
- set category = "Yautja.Misc"
- ..()
-
/obj/item/clothing/gloves/yautja/hunter/Destroy()
QDEL_NULL(caster)
QDEL_NULL(embedded_id)
@@ -282,29 +285,26 @@
var/mob/living/carbon/human/human = loc
- if(cloaked)
- charge = max(charge - 10, 0)
- if(charge <= 0)
- decloak(loc)
- //Non-Yautja have a chance to get stunned with each power drain
- if(!isyautja(human))
- if(prob(15))
- decloak(human)
- shock_user(human)
- return
+ //Non-Yautja have a chance to get stunned with each power drain
+ if(cloaked && !isyautja(human))
+ if(prob(15))
+ decloak(human, TRUE, DECLOAK_SPECIES)
+ shock_user(human)
return ..()
/obj/item/clothing/gloves/yautja/hunter/dropped(mob/user)
move_chip_to_bracer()
+ if(wristblades_deployed)
+ wristblades_internal(user, TRUE)
if(cloaked)
- decloak(user)
+ decloak(user, TRUE)
..()
/obj/item/clothing/gloves/yautja/hunter/on_enter_storage(obj/item/storage/S)
if(ishuman(loc))
var/mob/living/carbon/human/human = loc
if(cloaked)
- decloak(human)
+ decloak(human, TRUE)
. = ..()
//We use this to activate random verbs for non-Yautja
@@ -350,6 +350,7 @@
// Toggle the notification sound
/obj/item/clothing/gloves/yautja/hunter/toggle_notification_sound()
set category = "Yautja.Misc"
+ ..()
//Should put a cool menu here, like ninjas.
/obj/item/clothing/gloves/yautja/hunter/verb/wristblades()
@@ -361,11 +362,11 @@
/obj/item/clothing/gloves/yautja/hunter/proc/wristblades_internal(mob/living/carbon/human/caller, forced = FALSE)
if(!caller.loc || !caller.canmove || caller.stat || !ishuman(caller))
- return
+ return FALSE
. = check_random_function(caller, forced)
if(.)
- return
+ return FALSE
if(wristblades_deployed)
if(left_wristblades.loc == caller)
@@ -377,15 +378,15 @@
playsound(caller, 'sound/weapons/wristblades_off.ogg', 15, TRUE)
else
if(!drain_power(caller, 50))
- return
+ return FALSE
var/deploying_into_left_hand = caller.hand ? TRUE : FALSE
if(caller.get_active_hand())
to_chat(caller, SPAN_WARNING("Your hand must be free to activate your wristblade!"))
- return
+ return FALSE
var/obj/limb/hand = caller.get_limb(deploying_into_left_hand ? "l_hand" : "r_hand")
if(!istype(hand) || !hand.is_usable())
to_chat(caller, SPAN_WARNING("You can't hold that!"))
- return
+ return FALSE
var/is_offhand_full = FALSE
var/obj/limb/off_hand = caller.get_limb(deploying_into_left_hand ? "r_hand" : "l_hand")
if(caller.get_inactive_hand() || (!istype(off_hand) || !off_hand.is_usable()))
@@ -425,15 +426,16 @@
var/gear_on_almayer = 0
var/gear_low_orbit = 0
var/closest = 10000
+ var/obj/closest_item //The item itself, to be referenced so Yautja know what to look for.
var/direction = -1
var/atom/areaLoc = null
- for(var/obj/item/I as anything in GLOB.loose_yautja_gear)
- var/atom/loc = get_true_location(I)
- if(I.anchored)
+ for(var/obj/item/tracked_item as anything in GLOB.loose_yautja_gear)
+ var/atom/loc = get_true_location(tracked_item)
+ if(tracked_item.anchored)
continue
- if(is_honorable_carrier(recursive_holder_check(I)))
+ if(is_honorable_carrier(recursive_holder_check(tracked_item)))
continue
- if(istype(get_area(I), /area/yautja))
+ if(istype(get_area(tracked_item), /area/yautja))
continue
if(is_reserved_level(loc.z))
gear_low_orbit++
@@ -445,6 +447,7 @@
var/dist = get_dist(M,loc)
if(dist < closest)
closest = dist
+ closest_item = tracked_item
direction = get_dir(M,loc)
areaLoc = loc
for(var/mob/living/carbon/human/Y as anything in GLOB.yautja_mob_list)
@@ -476,9 +479,9 @@
output = TRUE
var/areaName = get_area_name(areaLoc)
if(closest == 0)
- to_chat(M, SPAN_NOTICE("You are directly on top of the closest signature."))
+ to_chat(M, SPAN_NOTICE("You are directly on top of the[closest_item ? " [closest_item.name]'s" : ""] signature."))
else
- to_chat(M, SPAN_NOTICE("The closest signature is [closest > 10 ? "approximately [round(closest, 10)]" : "[closest]"] paces [dir2text(direction)] in [areaName]."))
+ to_chat(M, SPAN_NOTICE("The closest signature[closest_item ? ", a [closest_item.name]" : ""], is [closest > 10 ? "approximately [round(closest, 10)]" : "[closest]"] paces [dir2text(direction)] in [areaName]."))
if(!output)
to_chat(M, SPAN_NOTICE("There are no signatures that require your attention."))
return TRUE
@@ -520,9 +523,6 @@
to_chat(M, SPAN_WARNING("Your cloaking device is still recharging! Time left: [max(round((cloak_timer - world.time) / 10), 1)] seconds."))
return FALSE
- if(!drain_power(M, 50))
- return FALSE
-
cloaked = TRUE
RegisterSignal(M, COMSIG_HUMAN_EXTINGUISH, PROC_REF(wrapper_fizzle_camouflage))
@@ -557,17 +557,18 @@
sparks.set_up(5, 4, src)
sparks.start()
- decloak(wearer, TRUE)
+ decloak(wearer, TRUE, DECLOAK_EXTINGUISHER)
-/obj/item/clothing/gloves/yautja/hunter/decloak(mob/user, forced)
+/obj/item/clothing/gloves/yautja/hunter/decloak(mob/user, forced, force_multipler = DECLOAK_FORCED)
if(!user)
return
UnregisterSignal(user, COMSIG_HUMAN_EXTINGUISH)
UnregisterSignal(user, COMSIG_HUMAN_PRE_BULLET_ACT)
+ var/decloak_timer = (DECLOAK_STANDARD * force_multipler)
if(forced)
- cloak_malfunction = world.time + 10 SECONDS
+ cloak_malfunction = world.time + decloak_timer
cloaked = FALSE
log_game("[key_name_admin(usr)] has disabled their cloaking device.")
@@ -577,7 +578,7 @@
if(true_cloak)
user.invisibility = initial(user.invisibility)
user.see_invisible = initial(user.see_invisible)
- cloak_timer = world.time + 5 SECONDS
+ cloak_timer = world.time + (DECLOAK_STANDARD / 2)
var/datum/mob_hud/security/advanced/SA = huds[MOB_HUD_SECURITY_ADVANCED]
SA.add_to_hud(user)
@@ -710,7 +711,7 @@
var/area/A = get_area(M)
var/turf/T = get_turf(M)
if(A)
- message_admins(FONT_SIZE_HUGE("ALERT: [M] ([M.key]) triggered the predator self-destruct sequence of [victim] ([victim.key]) in [A.name] [ADMIN_JMP(T)]"))
+ message_admins(FONT_SIZE_HUGE("ALERT: [key_name(M)] triggered the predator self-destruct sequence of [victim.real_name] ([victim.key]) in [A.name] [ADMIN_JMP(T)]"))
log_attack("[key_name(M)] triggered the predator self-destruct sequence of [victim] ([victim.key]) in [A.name]")
if (!bracer.exploding)
bracer.explode(victim)
@@ -735,12 +736,13 @@
return
exploding = FALSE
to_chat(M, SPAN_NOTICE("Your bracers stop beeping."))
- message_admins("[M] ([M.key]) has deactivated their Self-Destruct.")
+ message_all_yautja("[M.real_name] has cancelled their bracer's self-destruction sequence.")
+ message_admins("[key_name(M)] has deactivated their Self-Destruct.")
return
if(istype(M.wear_mask,/obj/item/clothing/mask/facehugger) || (M.status_flags & XENO_HOST))
to_chat(M, SPAN_WARNING("Strange...something seems to be interfering with your bracer functions..."))
return
- if(forced || alert("Detonate the bracers? Are you sure?","Explosive Bracers", "Yes", "No") == "Yes")
+ if(forced || alert("Detonate the bracers? Are you sure?\n\nNote: If you activate SD for any non-accidental reason during or after a fight, you commit to the SD. By initially activating the SD, you have accepted your impending death to preserve any lost honor.","Explosive Bracers", "Yes", "No") == "Yes")
if(M.gloves != src)
return
if(M.stat == DEAD)
@@ -1070,3 +1072,63 @@
M.u_equip(embedded_id, src, FALSE, TRUE)
else
embedded_id.forceMove(src)
+
+/// Handles all the locking and unlocking of bracers.
+/obj/item/clothing/gloves/yautja/hunter/verb/toggle_lock()
+ set name = "Toggle Bracer Lock"
+ set desc = "Toggle the lock on your bracers, allowing them to be removed."
+ set category = "Yautja.Misc"
+ set src in usr
+
+ if(usr.stat)
+ to_chat(usr, SPAN_WARNING("You can't do that right now..."))
+ return
+ if(!HAS_TRAIT(usr, TRAIT_YAUTJA_TECH))
+ to_chat(usr, SPAN_WARNING("You have no idea how to use this..."))
+ return FALSE
+
+ attempt_toggle_lock(usr, FALSE)
+
+/obj/item/clothing/gloves/yautja/proc/attempt_toggle_lock(mob/user, force_lock)
+ if(!user)
+ return FALSE
+
+ var/obj/item/grab/G = user.get_active_hand()
+ if(istype(G))
+ var/mob/living/carbon/human/victim = G.grabbed_thing
+ var/obj/item/clothing/gloves/yautja/hunter/bracer = victim.gloves
+ if(isspeciesyautja(victim) && !(victim.stat == DEAD))
+ to_chat(user, SPAN_WARNING("You cannot unlock the bracer of a living hunter!"))
+ return FALSE
+
+ if(istype(bracer))
+ if(alert("Are you sure you want to unlock this [victim.species]'s bracer?", "Unlock Bracers", "Yes", "No") == "Yes")
+ if(user.get_active_hand() == G && victim && victim.gloves == bracer)
+ log_interact(user, victim, "[key_name(user)] unlocked the [bracer.name] of [key_name(victim)].")
+ user.visible_message(SPAN_WARNING("[user] presses a few buttons on [victim]'s wrist bracer."),SPAN_DANGER("You unlock the bracer."))
+ bracer.toggle_lock_internal(victim)
+ return TRUE
+ else
+ to_chat(user, SPAN_WARNING("This [victim.species] does not have a bracer attached."))
+ return FALSE
+ else
+ log_attack("[key_name_admin(usr)] has unlocked their own bracer.")
+ toggle_lock_internal(user)
+ return TRUE
+
+/obj/item/clothing/gloves/yautja/proc/toggle_lock_internal(mob/user, force_lock)
+ if(((flags_item & NODROP) || (flags_inventory & CANTSTRIP)) && !force_lock)
+ flags_item &= ~NODROP
+ flags_inventory &= ~CANTSTRIP
+ if(isyautja(user))
+ to_chat(user, SPAN_WARNING("The bracer beeps pleasantly, releasing it's grip on your forearm."))
+ else
+ to_chat(user, SPAN_WARNING("With an angry blare the bracer releases your forearm."))
+ else
+ flags_item |= NODROP
+ flags_inventory |= CANTSTRIP
+ if(isyautja(user))
+ to_chat(user, SPAN_WARNING("The bracer clamps securely around your forearm and beeps in a comfortable, familiar way."))
+ else
+ to_chat(user, SPAN_WARNING("The bracer clamps painfully around your forearm and beeps angrily. It won't come off!"))
+ return TRUE
diff --git a/code/modules/cm_preds/yaut_items.dm b/code/modules/cm_preds/yaut_items.dm
index e9b7c36b5df6..0b33afbc4553 100644
--- a/code/modules/cm_preds/yaut_items.dm
+++ b/code/modules/cm_preds/yaut_items.dm
@@ -248,6 +248,12 @@
flags_cold_protection = flags_armor_protection
flags_heat_protection = flags_armor_protection
+/obj/item/clothing/shoes/yautja/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/tool/yautja_cleaner))
+ if(handle_dissolve())
+ return
+ ..()
+
/obj/item/clothing/shoes/yautja/hunter
name = "clan greaves"
desc = "A pair of armored, perfectly balanced boots. Perfect for running through the jungle."
@@ -327,6 +333,7 @@
unacidable = TRUE
ignore_z = TRUE
black_market_value = 100
+ flags_item = ITEM_PREDATOR
/obj/item/device/radio/headset/yautja/talk_into(mob/living/M as mob, message, channel, verb = "commands", datum/language/speaking)
if(!isyautja(M)) //Nope.
@@ -338,8 +345,11 @@
to_chat(hellhound, "\[Radio\]: [M.real_name] [verb], '[message]'.")
..()
-/obj/item/device/radio/headset/yautja/attackby()
- return
+/obj/item/device/radio/headset/yautja/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/tool/yautja_cleaner))
+ if(handle_dissolve())
+ return
+ ..()
/obj/item/device/radio/headset/yautja/elder //primarily for use in another MR
name = "\improper Elder Communicator"
@@ -697,6 +707,7 @@
var/tether_range = 5
var/mob/trapped_mob
layer = LOWER_ITEM_LAYER
+ flags_item = ITEM_PREDATOR
/obj/item/hunting_trap/Destroy()
cleanup_tether()
@@ -889,11 +900,43 @@
desc = "A complex cypher chip embedded within a set of clan bracers."
icon = 'icons/obj/items/radio.dmi'
icon_state = "upp_key"
+ access = list(ACCESS_YAUTJA_SECURE)
w_class = SIZE_TINY
flags_equip_slot = SLOT_ID
flags_item = ITEM_PREDATOR|DELONDROP|NODROP
paygrade = null
+/obj/item/card/id/bracer_chip/set_user_data(mob/living/carbon/human/H)
+ if(!istype(H))
+ return
+
+ registered_name = H.real_name
+ registered_ref = WEAKREF(H)
+ registered_gid = H.gid
+ blood_type = H.blood_type
+
+ var/list/new_access = list(ACCESS_YAUTJA_SECURE)
+ var/obj/item/clothing/gloves/yautja/hunter/bracer = loc
+ if(istype(bracer) && bracer.owner_rank)
+ switch(bracer.owner_rank)
+ if(CLAN_RANK_ELDER_INT, CLAN_RANK_LEADER_INT)
+ new_access = list(ACCESS_YAUTJA_SECURE, ACCESS_YAUTJA_ELDER)
+ if(CLAN_RANK_ADMIN_INT)
+ new_access = list(ACCESS_YAUTJA_SECURE, ACCESS_YAUTJA_ELDER, ACCESS_YAUTJA_ANCIENT)
+ access = new_access
+
+/obj/item/tool/yautja_cleaner
+ name = "cleanser gel vial"
+ desc = "Used for dissolving the gear of the fallen whilst in the field."
+ icon = 'icons/obj/items/hunter/pred_gear.dmi'
+ icon_state = "blue_gel"
+ force = 0
+ throwforce = 1
+ w_class = SIZE_SMALL
+ flags_item = ITEM_PREDATOR
+ black_market_value = 150
+
+// ---- Medicomp ---- //
/obj/item/storage/medicomp
name = "medicomp"
desc = "A complex kit of alien tools and medicines."
diff --git a/code/modules/cm_preds/yaut_procs.dm b/code/modules/cm_preds/yaut_procs.dm
index 445dfb40bf9f..a42f8a887196 100644
--- a/code/modules/cm_preds/yaut_procs.dm
+++ b/code/modules/cm_preds/yaut_procs.dm
@@ -3,7 +3,7 @@
for(var/mob/living/carbon/human/Y in GLOB.yautja_mob_list)
// Send message to the bracer; appear multiple times if we have more bracers
for(var/obj/item/clothing/gloves/yautja/hunter/G in Y.contents)
- to_chat(Y, SPAN_YAUTJABOLD("[icon2html(G)] \The [G] beeps: [msg]"))
+ to_chat(Y, SPAN_YAUTJABOLD("[icon2html(G)] \The [G] beep: [msg]"))
if(G.notification_sound)
playsound(Y.loc, 'sound/items/pred_bracer.ogg', 75, 1)
@@ -14,7 +14,7 @@
var/mob/living/carbon/T = hunter_data.thrall
for(var/obj/item/clothing/gloves/yautja/hunter/G in T.contents)
- to_chat(T, SPAN_YAUTJABOLD("[icon2html(G)] \The [G] beeps: [msg]"))
+ to_chat(T, SPAN_YAUTJABOLD("[icon2html(G)] \The [G] beep: [msg]"))
if(G.notification_sound)
playsound(T.loc, 'sound/items/pred_bracer.ogg', 75, 1)
diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm
index 40006dafe60b..04796a0919ad 100644
--- a/code/modules/cm_preds/yaut_weapons.dm
+++ b/code/modules/cm_preds/yaut_weapons.dm
@@ -37,6 +37,7 @@
edge = 1
hitsound = 'sound/weapons/bladeslice.ogg'
sharp = IS_SHARP_ITEM_BIG
+ flags_item = ITEM_PREDATOR
/obj/item/weapon/harpoon/yautja/New()
. = ..()
@@ -140,6 +141,7 @@
WEAR_R_HAND = 'icons/mob/humans/onmob/hunter/items_righthand.dmi'
)
var/human_adapted = FALSE
+ flags_item = ITEM_PREDATOR
/obj/item/weapon/yautja/chain
name = "chainwhip"
@@ -147,7 +149,6 @@
icon_state = "whip"
item_state = "whip"
flags_atom = FPRINT|CONDUCT
- flags_item = ITEM_PREDATOR
flags_equip_slot = SLOT_WAIST
embeddable = FALSE
w_class = SIZE_MEDIUM
@@ -172,7 +173,6 @@
desc = "An expertly crafted Yautja blade carried by hunters who wish to fight up close. Razor sharp and capable of cutting flesh into ribbons. Commonly carried by aggressive and lethal hunters."
icon_state = "clansword"
flags_atom = FPRINT|CONDUCT
- flags_item = ITEM_PREDATOR
flags_equip_slot = SLOT_BACK
force = MELEE_FORCE_TIER_7
throwforce = MELEE_FORCE_TIER_5
@@ -197,7 +197,6 @@
icon_state = "predscythe"
item_state = "scythe_dual"
flags_atom = FPRINT|CONDUCT
- flags_item = ITEM_PREDATOR
flags_equip_slot = SLOT_WAIST
force = MELEE_FORCE_TIER_6
throwforce = MELEE_FORCE_TIER_5
@@ -620,7 +619,7 @@
desc = "A spear of exquisite design, used by an ancient civilisation."
icon_state = "spearhunter"
item_state = "spearhunter"
- flags_item = NOSHIELD|TWOHANDED
+ flags_item = NOSHIELD|TWOHANDED|ITEM_PREDATOR
force = MELEE_FORCE_TIER_3
force_wielded = MELEE_FORCE_TIER_7
sharp = IS_SHARP_ITEM_SIMPLE
@@ -778,6 +777,12 @@
. = list()
. += SPAN_NOTICE("Looks like some kind of...mechanical donut.")
+/obj/item/weapon/gun/launcher/spike/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/tool/yautja_cleaner))
+ if(handle_dissolve())
+ return
+ ..()
+
/obj/item/weapon/gun/launcher/spike/update_icon()
..()
var/new_icon_state = spikes <=1 ? null : icon_state + "[round(spikes/4, 1)]"
@@ -821,6 +826,12 @@
WEAR_R_HAND = 'icons/mob/humans/onmob/hunter/items_righthand.dmi'
)
+/obj/item/weapon/gun/energy/yautja/attackby(obj/item/I, mob/user)
+ if(istype(I, /obj/item/tool/yautja_cleaner))
+ if(handle_dissolve())
+ return
+ ..()
+
/obj/item/weapon/gun/energy/yautja/plasmarifle
name = "plasma rifle"
desc = "A long-barreled heavy plasma weapon capable of taking down large game. It has a mounted scope for distant shots and an integrated battery."
@@ -925,6 +936,8 @@
muzzle_flash = null // TO DO, add a decent one.
w_class = SIZE_MEDIUM
var/charge_time = 40
+ var/shot_cost = 1
+ var/mode = "standard"
flags_gun_features = GUN_UNUSUAL_DESIGN
flags_item = ITEM_PREDATOR|IGNITING_ITEM|TWOHANDED
@@ -937,21 +950,16 @@
verbs -= /obj/item/weapon/gun/verb/use_toggle_burst
verbs -= /obj/item/weapon/gun/verb/empty_mag
-
-
/obj/item/weapon/gun/energy/yautja/plasmapistol/Destroy()
. = ..()
STOP_PROCESSING(SSobj, src)
-
/obj/item/weapon/gun/energy/yautja/plasmapistol/process()
if(charge_time < 40)
charge_time++
if(charge_time == 39)
if(ismob(loc)) to_chat(loc, SPAN_NOTICE("[src] hums as it achieves maximum charge."))
-
-
/obj/item/weapon/gun/energy/yautja/plasmapistol/set_gun_config_values()
..()
fire_delay = FIRE_DELAY_TIER_7
@@ -965,11 +973,17 @@
if(isyautja(user))
. = ..()
. += SPAN_NOTICE("It currently has [charge_time]/40 charge.")
+
+ if(mode == "incendiary")
+ . += SPAN_RED("It is set to fire incendiary plasma bolts.")
+ else
+ . += SPAN_ORANGE("It is set to fire plasma bolts.")
else
. = list()
. += SPAN_NOTICE("This thing looks like an alien rifle of some kind. Strange.")
+
/obj/item/weapon/gun/energy/yautja/plasmapistol/able_to_fire(mob/user)
if(!HAS_TRAIT(user, TRAIT_YAUTJA_TECH))
to_chat(user, SPAN_WARNING("You have no idea how this thing works!"))
@@ -978,16 +992,16 @@
return ..()
/obj/item/weapon/gun/energy/yautja/plasmapistol/load_into_chamber()
- if(charge_time < 1)
- return
+ if(charge_time < shot_cost)
+ return FALSE
var/obj/item/projectile/projectile = create_bullet(ammo, initial(name))
projectile.SetLuminosity(1)
in_chamber = projectile
- charge_time--
+ charge_time = (charge_time - shot_cost)
return in_chamber
/obj/item/weapon/gun/energy/yautja/plasmapistol/has_ammunition()
- if(charge_time >= 1)
+ if(charge_time >= shot_cost)
return TRUE //Enough charge for a shot.
/obj/item/weapon/gun/energy/yautja/plasmapistol/reload_into_chamber()
@@ -995,9 +1009,27 @@
/obj/item/weapon/gun/energy/yautja/plasmapistol/delete_bullet(obj/item/projectile/projectile_to_fire, refund = 0)
qdel(projectile_to_fire)
- if(refund) charge_time *= 2
+ if(refund)
+ charge_time *= 2
+ log_debug("Plasma Pistol refunded shot.")
return TRUE
+/obj/item/weapon/gun/energy/yautja/plasmapistol/use_unique_action()
+ switch(mode)
+ if("standard")
+ mode = "incendiary"
+ shot_cost = 5
+ fire_delay = FIRE_DELAY_TIER_5
+ to_chat(usr, SPAN_NOTICE("[src] will now fire incendiary plasma bolts."))
+ ammo = GLOB.ammo_list[/datum/ammo/energy/yautja/pistol/incendiary]
+
+ if("incendiary")
+ mode = "standard"
+ shot_cost = 1
+ fire_delay = FIRE_DELAY_TIER_7
+ to_chat(usr, SPAN_NOTICE("[src] will now fire plasma bolts."))
+ ammo = GLOB.ammo_list[/datum/ammo/energy/yautja/pistol]
+
/obj/item/weapon/gun/energy/yautja/plasma_caster
name = "plasma caster"
desc = "A powerful, shoulder-mounted energy weapon."
diff --git a/code/modules/gear_presets/yautja.dm b/code/modules/gear_presets/yautja.dm
index 51d2178bd905..49065b00844c 100644
--- a/code/modules/gear_presets/yautja.dm
+++ b/code/modules/gear_presets/yautja.dm
@@ -8,6 +8,7 @@
skills = /datum/skills/yautja/warrior
var/default_cape_type = "None"
+ var/clan_rank
/datum/equipment_preset/yautja/load_race(mob/living/carbon/human/new_human, client/mob_client)
new_human.set_species(SPECIES_YAUTJA)
@@ -53,13 +54,12 @@
cape_color = mob_client.prefs.predator_cape_color
new_human.equip_to_slot_or_del(new /obj/item/clothing/under/chainshirt/hunter(new_human), WEAR_BODY)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/yautja/hunter(new_human, translator_type, caster_material), WEAR_HANDS)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/yautja/hunter(new_human, translator_type, caster_material, clan_rank), WEAR_HANDS)
new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/yautja(new_human), WEAR_L_EAR)
new_human.equip_to_slot_or_del(new /obj/item/device/flashlight/lantern(new_human), WEAR_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/device/yautja_teleporter(new_human), WEAR_L_STORE)
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/yautja(new_human), WEAR_WAIST)
new_human.equip_to_slot_or_del(new /obj/item/storage/medicomp/full(new_human), WEAR_IN_BELT)
-
new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/yautja/hunter/knife(new_human, boot_number, greave_material), WEAR_FEET)
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/yautja/hunter(new_human, armor_number, armor_material), WEAR_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/yautja/hunter(new_human, mask_number, mask_material), WEAR_FACE)
@@ -89,6 +89,7 @@
/datum/equipment_preset/yautja/youngblood
name = "Yautja Young"
flags = EQUIPMENT_PRESET_START_OF_ROUND
+ clan_rank = CLAN_RANK_UNBLOODED_INT
/datum/equipment_preset/yautja/youngblood/load_name(mob/living/carbon/human/new_human, randomise)
. = ..()
@@ -100,12 +101,14 @@
name = "Yautja Blooded"
flags = EQUIPMENT_PRESET_START_OF_ROUND
default_cape_type = PRED_YAUTJA_QUARTER_CAPE
+ clan_rank = CLAN_RANK_BLOODED_INT
// ELITE
/datum/equipment_preset/yautja/elite
name = "Yautja Elite"
flags = EQUIPMENT_PRESET_START_OF_ROUND
default_cape_type = PRED_YAUTJA_HALF_CAPE
+ clan_rank = CLAN_RANK_ELITE_INT
/datum/equipment_preset/yautja/elite/load_name(mob/living/carbon/human/new_human, randomise)
. = ..()
@@ -117,6 +120,7 @@
name = "Yautja Elder"
flags = EQUIPMENT_PRESET_START_OF_ROUND
default_cape_type = PRED_YAUTJA_THIRD_CAPE
+ clan_rank = CLAN_RANK_ELDER_INT
/datum/equipment_preset/yautja/elder/load_name(mob/living/carbon/human/new_human, randomise)
. = ..()
@@ -132,6 +136,7 @@
name = "Yautja Leader"
flags = EQUIPMENT_PRESET_START_OF_ROUND
default_cape_type = PRED_YAUTJA_CAPE
+ clan_rank = CLAN_RANK_LEADER_INT
/datum/equipment_preset/yautja/leader/load_name(mob/living/carbon/human/new_human, randomise)
. = ..()
@@ -147,6 +152,7 @@
name = "Yautja Ancient"
flags = EQUIPMENT_PRESET_START_OF_ROUND
default_cape_type = PRED_YAUTJA_PONCHO
+ clan_rank = CLAN_RANK_ADMIN_INT
/datum/equipment_preset/yautja/ancient/load_name(mob/living/carbon/human/new_human, randomise)
. = ..()
diff --git a/code/modules/mob/living/carbon/xenomorph/Embryo.dm b/code/modules/mob/living/carbon/xenomorph/Embryo.dm
index 8b890de8a727..9fc402ef5ccc 100644
--- a/code/modules/mob/living/carbon/xenomorph/Embryo.dm
+++ b/code/modules/mob/living/carbon/xenomorph/Embryo.dm
@@ -181,7 +181,10 @@
if(isyautja(affected_mob) || (flags_embryo & FLAG_EMBRYO_PREDATOR))
new_xeno = new /mob/living/carbon/xenomorph/larva/predalien(affected_mob)
- yautja_announcement(SPAN_YAUTJABOLDBIG("WARNING!\n\nAn abomination has been detected at [get_area_name(new_xeno)]. It is a stain upon our purity and is unfit for life. Exterminate it immediately"))
+ yautja_announcement(SPAN_YAUTJABOLDBIG("WARNING!\n\nAn abomination has been detected at [get_area_name(new_xeno)]. It is a stain upon our purity and is unfit for life. Exterminate it immediately.\n\nHeavy Armory unlocked."))
+ for(var/obj/structure/machinery/door/poddoor/shutters/almayer/D in machines)
+ if(D.id == "Yautja Armory")
+ D.open()
else
new_xeno = new(affected_mob)
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm
index 058e643f5c64..5c1584c565c6 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/predalien/predalien_powers.dm
@@ -25,7 +25,7 @@
var/obj/item/clothing/gloves/yautja/hunter/YG = locate(/obj/item/clothing/gloves/yautja/hunter) in human
if(isyautja(human) && YG)
if(YG.cloaked)
- YG.decloak(human)
+ YG.decloak(human, TRUE, DECLOAK_PREDALIEN)
YG.cloak_timer = xeno_cooldown * 0.1
else if(isxeno(carbon) && xeno.can_not_harm(carbon))
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 7247e9b87b16..8eed51f138db 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -798,41 +798,87 @@ GLOBAL_LIST_INIT(apc_wire_descriptions, list(
//Human mob special interaction goes here.
if(ishuman(user))
- var/mob/living/carbon/human/H = user
+ var/mob/living/carbon/human/hooman = user
- if(H.species.flags & IS_SYNTHETIC && H.a_intent == INTENT_GRAB)
- if(H.action_busy)
- return
-
- if(!do_after(H, 20, INTERRUPT_ALL, BUSY_ICON_GENERIC))
- return
+ if(hooman.a_intent == INTENT_GRAB)
- playsound(src.loc, 'sound/effects/sparks2.ogg', 25, 1)
+ //Synthpack recharge
+ if((hooman.species.flags & IS_SYNTHETIC) && istype(hooman.back, /obj/item/storage/backpack/marine/smartpack))
+ var/obj/item/storage/backpack/marine/smartpack/s_pack = hooman.back
+ if(hooman.action_busy)
+ return
- if(stat & BROKEN)
- var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- to_chat(H, SPAN_DANGER("The APC's power currents surge eratically, damaging your chassis!"))
- H.apply_damage(10,0, BURN)
- else if(cell && cell.charge > 0)
- if(!istype(H.back, /obj/item/storage/backpack/marine/smartpack))
+ if(!do_after(hooman, 20, INTERRUPT_ALL, BUSY_ICON_GENERIC))
return
- var/obj/item/storage/backpack/marine/smartpack/S = H.back
- if(S.battery_charge < SMARTPACK_MAX_POWER_STORED)
- var/charge_to_use = min(cell.charge, SMARTPACK_MAX_POWER_STORED - S.battery_charge)
- if(!(cell.use(charge_to_use)))
+ playsound(src.loc, 'sound/effects/sparks2.ogg', 25, 1)
+
+ if(stat & BROKEN)
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+ to_chat(hooman, SPAN_DANGER("The APC's power currents surge eratically, damaging your chassis!"))
+ hooman.apply_damage(10,0, BURN)
+ else if(cell && cell.charge > 0)
+ if(!istype(s_pack))
return
- S.battery_charge += charge_to_use
- to_chat(user, SPAN_NOTICE("You slot your fingers into the APC interface and siphon off some of the stored charge. [S.name] now has [S.battery_charge]/[SMARTPACK_MAX_POWER_STORED]"))
- charging = APC_CHARGING
+
+ if(s_pack.battery_charge < SMARTPACK_MAX_POWER_STORED)
+ var/charge_to_use = min(cell.charge, SMARTPACK_MAX_POWER_STORED - s_pack.battery_charge)
+ if(!(cell.use(charge_to_use)))
+ return
+ s_pack.battery_charge += charge_to_use
+ to_chat(user, SPAN_NOTICE("You slot your fingers into the APC interface and siphon off some of the stored charge. [s_pack.name] now has [s_pack.battery_charge]/[SMARTPACK_MAX_POWER_STORED]"))
+ charging = APC_CHARGING
+ else
+ to_chat(user, SPAN_WARNING("[s_pack.name] is already fully charged."))
else
- to_chat(user, SPAN_WARNING("[S.name] is already fully charged."))
- else
- to_chat(user, SPAN_WARNING("There is no charge to draw from that APC."))
- return
- else if(H.species.can_shred(H))
+ to_chat(user, SPAN_WARNING("There is no charge to draw from that APC."))
+ return
+
+ // Yautja Bracer Recharge
+ var/obj/item/clothing/gloves/yautja/bracer = hooman.gloves
+ if(istype(bracer))
+ if(hooman.action_busy)
+ return FALSE
+ if(bracer.last_charge > world.time)
+ to_chat(user, SPAN_WARNING("It is too soon for [bracer.name] to siphon power again."))
+ return FALSE
+ to_chat(user, SPAN_NOTICE("You rest your bracer against the APC interface and begin to siphon off some of the stored energy."))
+ if(!do_after(hooman, 20, INTERRUPT_ALL, BUSY_ICON_HOSTILE))
+ return FALSE
+
+ if(stat & BROKEN)
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+ to_chat(hooman, SPAN_DANGER("The APC's power currents surge eratically, super-heating your bracer!"))
+ playsound(src.loc, 'sound/effects/sparks2.ogg', 25, 1)
+ hooman.apply_damage(10,0, BURN)
+ return FALSE
+ else if(cell && cell.charge > 0)
+ if(bracer.charge < bracer.charge_max)
+ var/charge_to_use = min(cell.charge, bracer.charge_max - bracer.charge)
+ if(!(cell.use(charge_to_use)))
+ return FALSE
+ playsound(src.loc, 'sound/effects/sparks2.ogg', 25, 1)
+ bracer.charge += charge_to_use
+ bracer.last_charge = (world.time + bracer.charge_cooldown)
+ to_chat(hooman, SPAN_YAUTJABOLD("[icon2html(bracer)] \The [bracer] beep: Power siphon complete. Charge at [bracer.charge]/[bracer.charge_max]."))
+ if(bracer.notification_sound)
+ playsound(bracer.loc, 'sound/items/pred_bracer.ogg', 75, 1)
+ charging = APC_CHARGING
+ set_broken() // Breaks the APC
+
+ return TRUE
+ else
+ to_chat(user, SPAN_WARNING("[bracer.name] is already fully charged."))
+ return FALSE
+ else
+ to_chat(user, SPAN_WARNING("There is no charge to draw from that APC."))
+ return FALSE
+
+ else if(hooman.species.can_shred(hooman))
var/allcut = TRUE
for(var/wire = 1; wire < length(get_wire_descriptions()); wire++)
if(!isWireCut(wire))
diff --git a/code/modules/projectiles/ammo_datums.dm b/code/modules/projectiles/ammo_datums.dm
index 14eb6a120886..ede7ddeb8e84 100644
--- a/code/modules/projectiles/ammo_datums.dm
+++ b/code/modules/projectiles/ammo_datums.dm
@@ -2211,7 +2211,9 @@
damage = 40
shell_speed = AMMO_SPEED_TIER_2
-/datum/ammo/energy/yautja/pistol/set_bullet_traits()
+/datum/ammo/energy/yautja/pistol/incendiary
+ damage = 10
+/datum/ammo/energy/yautja/pistol/incendiary/set_bullet_traits()
. = ..()
LAZYADD(traits_to_give, list(
BULLET_TRAIT_ENTRY(/datum/element/bullet_trait_incendiary)
@@ -3023,6 +3025,18 @@
if(isxeno(M))
M.apply_effect(0.4, SLOW)
+/datum/ammo/bullet/shrapnel/plasma
+ name = "plasma wave"
+ shrapnel_chance = 0
+ penetration = ARMOR_PENETRATION_TIER_10
+ accuracy = HIT_ACCURACY_TIER_MAX
+ damage = 15
+ icon_state = "shrapnel_plasma"
+ damage_type = BURN
+
+/datum/ammo/bullet/shrapnel/plasma/on_hit_mob(mob/M, obj/item/projectile/P)
+ M.apply_effect(2, WEAKEN)
+
/*
//========
CAS 30mm impacters
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 12f1976e186e..d5e337e392cb 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -102,7 +102,10 @@
/obj/item/weapon/gun/energy/get_examine_text(mob/user)
. = ..()
- if(has_charge_meter && cell)
+ if((flags_item & ITEM_PREDATOR))//Should stop all the pred weapons that have independant charge methods showing up with cells.
+ if(!HAS_TRAIT(user, TRAIT_YAUTJA_TECH))
+ . += SPAN_NOTICE("You have no idea how this is powered.")
+ else if(has_charge_meter && cell)
. += SPAN_NOTICE("It has [round((cell.charge / charge_cost), 1)] / [max_shots] shots left.")
else if(cell)
. += SPAN_NOTICE("It has [cell.percent()]% charge left.")
diff --git a/code/modules/reagents/chemistry_reagents/medical.dm b/code/modules/reagents/chemistry_reagents/medical.dm
index f69d1b952c43..5a9999330387 100644
--- a/code/modules/reagents/chemistry_reagents/medical.dm
+++ b/code/modules/reagents/chemistry_reagents/medical.dm
@@ -175,7 +175,9 @@
PROPERTY_FOCUSING = 6,
PROPERTY_CURING = 4,
)
- flags = REAGENT_TYPE_MEDICAL
+ flags = REAGENT_TYPE_MEDICAL|REAGENT_SCANNABLE
+ overdose = HIGH_REAGENTS_OVERDOSE
+ overdose_critical = HIGH_REAGENTS_OVERDOSE
/datum/reagent/medical/neuraline //injected by neurostimulator implant
name = "Neuraline"
diff --git a/icons/obj/items/assemblies.dmi b/icons/obj/items/assemblies.dmi
index 668d62d23d4e..522e0fb5e55d 100644
Binary files a/icons/obj/items/assemblies.dmi and b/icons/obj/items/assemblies.dmi differ
diff --git a/icons/obj/items/hunter/pred_gear.dmi b/icons/obj/items/hunter/pred_gear.dmi
index 5587cc685bec..3d8752c35d0c 100644
Binary files a/icons/obj/items/hunter/pred_gear.dmi and b/icons/obj/items/hunter/pred_gear.dmi differ
diff --git a/icons/obj/items/weapons/projectiles.dmi b/icons/obj/items/weapons/projectiles.dmi
index 720ea1e61f2d..e11acba003f6 100644
Binary files a/icons/obj/items/weapons/projectiles.dmi and b/icons/obj/items/weapons/projectiles.dmi differ
diff --git a/maps/predship/huntership.dmm b/maps/predship/huntership.dmm
index 467df24a94f4..e125f568170a 100644
--- a/maps/predship/huntership.dmm
+++ b/maps/predship/huntership.dmm
@@ -195,7 +195,7 @@
},
/area/yautja)
"ar" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja/secure{
dir = 1;
name = "\improper Wargear Storage"
},
@@ -407,7 +407,7 @@
},
/area/yautja)
"aP" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja{
dir = 1;
name = "\improper Trophy Room"
},
@@ -427,7 +427,7 @@
},
/area/yautja)
"aT" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja{
name = "\improper Operation Room"
},
/turf/open/shuttle/predship,
@@ -486,6 +486,10 @@
/obj/structure/pipes/standard/simple/hidden{
dir = 4
},
+/obj/structure/machinery/computer/crew/alt{
+ faction = "Yautja";
+ pixel_y = 24
+ },
/turf/open/floor/corsat{
dir = 1;
icon_state = "squareswood"
@@ -505,7 +509,7 @@
/turf/open/floor/light,
/area/yautja)
"be" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja{
name = "\improper Blooded Teleporter"
},
/turf/open/floor/strata{
@@ -531,13 +535,13 @@
/turf/closed/wall/huntership,
/area/yautja)
"bl" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja{
name = "\improper Starboard Wing"
},
/turf/open/shuttle/predship,
/area/yautja)
"bm" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja{
name = "\improper Port Wing"
},
/turf/open/shuttle/predship,
@@ -566,7 +570,7 @@
},
/area/yautja)
"bp" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja/secure{
dir = 1;
name = "\improper Research Chamber"
},
@@ -600,7 +604,7 @@
},
/area/yautja)
"bu" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja/secure{
dir = 1;
name = "\improper Burial Room"
},
@@ -618,7 +622,7 @@
/turf/open/shuttle/predship,
/area/yautja)
"bx" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja{
dir = 1;
name = "\improper Storage Chamber"
},
@@ -680,9 +684,16 @@
},
/area/yautja)
"bD" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja/secure{
dir = 1;
- name = "\improper Unworthy Prey"
+ name = "\improper Heavy Armory"
+ },
+/obj/structure/machinery/door/poddoor/shutters/almayer{
+ id = "Yautja Armory";
+ name = "\improper Armory Shutter";
+ needs_power = 0;
+ unacidable = 1;
+ indestructible = 1
},
/turf/open/shuttle/predship,
/area/yautja)
@@ -697,7 +708,7 @@
},
/area/yautja)
"bG" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja{
name = "\improper Cooler Room"
},
/turf/open/shuttle/predship,
@@ -749,13 +760,9 @@
/turf/open/shuttle/predship,
/area/yautja)
"bN" = (
-/obj/structure/kitchenspike{
- icon_state = "spikebloodygreen"
- },
-/obj/effect/decal/cleanable/blood/gibs/xeno/body,
-/turf/open/floor/strata{
- color = "#5e5d5d";
- icon_state = "multi_tiles"
+/turf/closed/wall/cult{
+ hull = 1;
+ name = "runed hull"
},
/area/yautja)
"bO" = (
@@ -782,10 +789,37 @@
},
/area/yautja)
"bR" = (
-/obj/structure/kitchenspike{
- icon_state = "spikebloody"
+/obj/structure/surface/rack{
+ color = "#6b675e";
+ layer = 2.79;
+ pixel_x = -8
+ },
+/obj/item/weapon/gun/energy/yautja/plasmapistol{
+ pixel_y = -8;
+ pixel_x = -8
+ },
+/obj/item/weapon/gun/energy/yautja/plasmapistol{
+ pixel_x = -8
+ },
+/obj/item/weapon/gun/energy/yautja/plasmapistol{
+ pixel_y = 8;
+ pixel_x = -8
+ },
+/obj/item/stack/medical/advanced/bruise_pack/predator{
+ pixel_x = 13
+ },
+/obj/item/stack/medical/advanced/bruise_pack/predator{
+ pixel_x = 13
+ },
+/obj/item/stack/medical/advanced/bruise_pack/predator{
+ pixel_x = 13
+ },
+/obj/item/stack/medical/advanced/bruise_pack/predator{
+ pixel_x = 13
+ },
+/obj/item/stack/medical/advanced/bruise_pack/predator{
+ pixel_x = 13
},
-/obj/effect/decal/cleanable/blood/gibs,
/turf/open/floor/strata{
color = "#5e5d5d";
icon_state = "multi_tiles"
@@ -802,7 +836,8 @@
id = "Cell Lockdown 1";
name = "Cell Lockdown 1";
pixel_x = -25;
- pixel_y = 9
+ pixel_y = 9;
+ req_one_access_txt = "250;251;252"
},
/turf/open/shuttle/predship,
/area/yautja)
@@ -811,12 +846,13 @@
id = "Cell Lockdown 4";
name = "Cell Lockdown 4";
pixel_x = -7;
- pixel_y = 9
+ pixel_y = 9;
+ req_one_access_txt = "250;251;252"
},
/turf/closed/wall/huntership,
/area/yautja)
"bW" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja/secure{
name = "\improper Prisoner Cell 1";
opacity = 0
},
@@ -828,7 +864,7 @@
/turf/open/shuttle/predship,
/area/yautja)
"bX" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja/secure{
name = "\improper Prisoner Cell 4";
opacity = 0
},
@@ -865,7 +901,8 @@
id = "Cell Lockdown 2";
name = "Cell Lockdown 2";
pixel_x = -25;
- pixel_y = 9
+ pixel_y = 9;
+ req_one_access_txt = "250;251;252"
},
/turf/open/shuttle/predship,
/area/yautja)
@@ -889,7 +926,7 @@
},
/area/yautja)
"ce" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja/secure{
name = "\improper Prisoner Cell 2";
opacity = 0
},
@@ -901,7 +938,7 @@
/turf/open/shuttle/predship,
/area/yautja)
"cf" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja/secure{
name = "\improper Prisoner Cell 5";
opacity = 0
},
@@ -917,7 +954,8 @@
id = "Cell Lockdown 3";
name = "Cell Lockdown 3";
pixel_x = -25;
- pixel_y = 9
+ pixel_y = 9;
+ req_one_access_txt = "250;251;252"
},
/turf/open/shuttle/predship,
/area/yautja)
@@ -926,7 +964,8 @@
id = "Cell Lockdown 6";
name = "Cell Lockdown 6";
pixel_x = -7;
- pixel_y = 9
+ pixel_y = 9;
+ req_one_access_txt = "250;251;252"
},
/turf/closed/wall/huntership,
/area/yautja)
@@ -948,7 +987,7 @@
},
/area/yautja)
"cm" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja/secure{
name = "\improper Prisoner Cell 3";
opacity = 0
},
@@ -960,7 +999,7 @@
/turf/open/shuttle/predship,
/area/yautja)
"cn" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja/secure{
name = "\improper Prisoner Cell 6";
opacity = 0
},
@@ -1002,7 +1041,7 @@
/turf/open/shuttle/predship,
/area/yautja)
"ct" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja{
dir = 1;
name = "\improper Fore Rooms"
},
@@ -1106,7 +1145,7 @@
},
/area/yautja)
"cA" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja{
name = "\improper Elder Teleporter"
},
/turf/open/floor/corsat{
@@ -1115,9 +1154,9 @@
},
/area/yautja)
"cB" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja/secure{
dir = 1;
- name = "\improper Navigation Chamber"
+ name = "\improper Control Center"
},
/turf/open/shuttle/predship,
/area/yautja)
@@ -1136,7 +1175,7 @@
},
/area/yautja)
"cF" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja{
dir = 1;
name = "\improper Engine Room"
},
@@ -1499,7 +1538,7 @@
},
/area/yautja)
"dc" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja/secure{
dir = 1;
name = "\improper Research Containment"
},
@@ -1591,7 +1630,8 @@
id = "Cell Lockdown 5";
name = "Cell Lockdown 5";
pixel_x = -7;
- pixel_y = 9
+ pixel_y = 9;
+ req_one_access_txt = "250;251;252"
},
/turf/closed/wall/huntership,
/area/yautja)
@@ -1669,6 +1709,32 @@
/obj/structure/machinery/cryopod,
/turf/open/shuttle/predship,
/area/yautja)
+"fo" = (
+/obj/structure/surface/table/reinforced/prison{
+ color = "#6b675e"
+ },
+/obj/structure/window/reinforced{
+ dir = 4;
+ health = 80
+ },
+/obj/structure/window/reinforced{
+ dir = 8;
+ health = 80
+ },
+/obj/item/tool/yautja_cleaner{
+ pixel_y = -8;
+ pixel_x = 6
+ },
+/obj/item/tool/yautja_cleaner,
+/obj/item/tool/yautja_cleaner{
+ pixel_y = 8;
+ pixel_x = -6
+ },
+/turf/open/floor/corsat{
+ dir = 1;
+ icon_state = "squareswood"
+ },
+/area/yautja)
"fq" = (
/obj/structure/window/framed/colony/reinforced/hull{
color = "#aba9a9"
@@ -1727,19 +1793,15 @@
},
/area/yautja)
"gb" = (
-/obj/item/reagent_container/blood/OMinus,
-/obj/item/reagent_container/blood/OMinus,
-/obj/item/reagent_container/blood/OMinus,
-/obj/item/reagent_container/blood/OMinus,
-/obj/item/reagent_container/blood/OMinus,
-/obj/item/reagent_container/blood/OMinus,
-/obj/item/reagent_container/blood/OMinus,
-/obj/item/reagent_container/blood/OMinus,
-/obj/item/reagent_container/blood/OMinus,
-/obj/item/reagent_container/blood/OMinus,
/obj/structure/closet/crate{
color = "#6b675e"
},
+/obj/item/explosive/plastic/breaching_charge/plasma,
+/obj/item/explosive/plastic/breaching_charge/plasma,
+/obj/item/explosive/plastic/breaching_charge/plasma,
+/obj/item/explosive/plastic/breaching_charge/plasma,
+/obj/item/explosive/plastic/breaching_charge/plasma,
+/obj/item/explosive/plastic/breaching_charge/plasma,
/turf/open/floor/strata{
color = "#5e5d5d";
icon_state = "multi_tiles"
@@ -1753,30 +1815,30 @@
},
/area/yautja)
"gr" = (
-/obj/structure/surface/table/reinforced/prison{
- color = "#6b675e"
- },
-/obj/item/weapon/unathiknife,
-/obj/item/weapon/unathiknife{
- attack_speed = 12;
- force = 25
+/obj/structure/closet/crate/secure{
+ req_one_access_txt = "252";
+ color = "#6b675e";
+ name = "Secure Yautja crate"
},
+/obj/item/explosive/grenade/spawnergrenade/hellhound,
+/obj/item/explosive/grenade/spawnergrenade/hellhound,
+/obj/item/explosive/grenade/spawnergrenade/hellhound,
+/obj/item/explosive/grenade/spawnergrenade/hellhound,
/turf/open/floor/strata{
color = "#5e5d5d";
icon_state = "multi_tiles"
},
/area/yautja)
"gG" = (
-/obj/structure/surface/table/reinforced/prison{
- color = "#6b675e"
+/obj/structure/machinery/door_control{
+ id = "Yautja Armory";
+ name = "Armory Shutters";
+ pixel_x = 24;
+ req_one_access_txt = "252"
},
-/obj/item/tool/surgery/FixOVein/predatorFixOVein,
-/obj/item/tool/surgery/bonegel/predatorbonegel,
-/obj/item/tool/surgery/bonesetter/predatorbonesetter,
-/obj/item/tool/surgery/surgicaldrill/predatorsurgicaldrill,
-/turf/open/floor/strata{
- color = "#5e5d5d";
- icon_state = "multi_tiles"
+/turf/open/floor/corsat{
+ dir = 1;
+ icon_state = "squareswood"
},
/area/yautja)
"ha" = (
@@ -2143,7 +2205,7 @@
},
/area/yautja)
"sV" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja{
dir = 1;
name = "\improper Feed Hall"
},
@@ -2200,6 +2262,34 @@
icon_state = "squareswood"
},
/area/yautja)
+"tR" = (
+/obj/structure/surface/table/reinforced/prison{
+ color = "#6b675e"
+ },
+/obj/structure/window/reinforced{
+ dir = 4;
+ health = 80
+ },
+/obj/structure/window/reinforced{
+ dir = 8;
+ health = 80
+ },
+/obj/item/explosive/plastic/breaching_charge/plasma{
+ pixel_x = 6;
+ pixel_y = 4
+ },
+/obj/item/explosive/plastic/breaching_charge/plasma{
+ pixel_y = 4
+ },
+/obj/item/explosive/plastic/breaching_charge/plasma{
+ pixel_y = 4;
+ pixel_x = -6
+ },
+/turf/open/floor/corsat{
+ dir = 1;
+ icon_state = "squareswood"
+ },
+/area/yautja)
"uf" = (
/obj/structure/barricade/handrail/strata{
dir = 8
@@ -2395,27 +2485,36 @@
/obj/structure/machinery/cryopod/right,
/turf/open/shuttle/predship,
/area/yautja)
-"Br" = (
-/turf/open/gm/dirtgrassborder{
- icon_state = "desert2"
+"Bg" = (
+/obj/structure/closet/crate/secure{
+ req_one_access_txt = "252";
+ color = "#6b675e";
+ name = "Secure Yautja crate"
},
-/area/yautja)
-"BB" = (
-/obj/structure/machinery/iv_drip,
+/obj/item/weapon/yautja/combistick,
+/obj/item/weapon/yautja/combistick{
+ pixel_x = -4;
+ pixel_y = 4
+ },
+/obj/item/weapon/twohanded/yautja/glaive/alt,
+/obj/item/weapon/yautja/chain,
+/obj/item/weapon/yautja/sword,
+/obj/item/weapon/yautja/scythe,
/turf/open/floor/strata{
color = "#5e5d5d";
icon_state = "multi_tiles"
},
/area/yautja)
+"Br" = (
+/turf/open/gm/dirtgrassborder{
+ icon_state = "desert2"
+ },
+/area/yautja)
"BK" = (
/obj/structure/surface/table/reinforced/prison{
color = "#6b675e"
},
-/obj/item/tool/surgery/cautery/predatorcautery,
-/obj/item/tool/surgery/circular_saw/predatorbonesaw,
-/obj/item/tool/surgery/hemostat/predatorhemostat,
-/obj/item/tool/surgery/retractor/predatorretractor,
-/obj/item/tool/surgery/scalpel/predatorscalpel,
+/obj/item/storage/medicomp/full,
/turf/open/floor/strata{
color = "#5e5d5d";
icon_state = "multi_tiles"
@@ -2480,7 +2579,7 @@
},
/area/yautja)
"Dr" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja/secure{
indestructible = 1;
locked = 1;
name = "\improper External Airlock"
@@ -2508,7 +2607,13 @@
},
/area/yautja)
"DJ" = (
-/obj/structure/machinery/computer/crew,
+/obj/structure/machinery/computer/crew/alt{
+ dir = 1;
+ name = "human monitoring computer"
+ },
+/obj/structure/surface/table/reinforced/prison{
+ color = "#6b675e"
+ },
/turf/open/floor/strata{
color = "#5e5d5d";
icon_state = "multi_tiles"
@@ -2548,13 +2653,12 @@
/obj/structure/surface/table/reinforced/prison{
color = "#6b675e"
},
-/obj/item/bedsheet{
- anchored = 1;
+/obj/structure/showcase{
desc = "A console used by the Hunters for navigation purposes.";
dir = 8;
icon = 'icons/obj/structures/machinery/computer.dmi';
icon_state = "security_cam";
- name = "Hunter Nav Console"
+ name = "Radar Console"
},
/turf/open/floor/strata{
color = "#5e5d5d";
@@ -2575,7 +2679,7 @@
/turf/open/shuttle/predship,
/area/yautja)
"Gd" = (
-/obj/structure/machinery/door/airlock/strata/autoname,
+/obj/structure/machinery/door/airlock/yautja/secure,
/turf/open/shuttle/predship,
/area/yautja)
"Gk" = (
@@ -2644,18 +2748,16 @@
color = "#6b675e";
layer = 2.79
},
-/obj/item/stack/medical/advanced/ointment/predator,
-/obj/item/stack/medical/advanced/ointment/predator,
-/obj/item/stack/medical/advanced/ointment/predator,
-/obj/item/stack/medical/advanced/ointment/predator,
-/obj/item/stack/medical/advanced/ointment/predator,
-/obj/item/stack/medical/advanced/ointment/predator,
-/obj/item/stack/medical/advanced/bruise_pack/predator,
-/obj/item/stack/medical/advanced/bruise_pack/predator,
-/obj/item/stack/medical/advanced/bruise_pack/predator,
-/obj/item/stack/medical/advanced/bruise_pack/predator,
-/obj/item/stack/medical/advanced/bruise_pack/predator,
-/obj/item/stack/medical/advanced/bruise_pack/predator,
+/obj/item/stack/medical/advanced/ointment/predator{
+ pixel_x = 6;
+ desc = "A poultice made of cold, blue petals that is rubbed on burns. Not to be removed from the ship.";
+ name = "arena soothing herbs"
+ },
+/obj/item/stack/medical/advanced/bruise_pack/predator{
+ pixel_x = -6;
+ desc = "A poultice made of soft leaves that is rubbed on bruises. Not to be removed from the ship.";
+ name = "arena mending herbs"
+ },
/turf/open/shuttle/predship,
/area/yautja)
"Hp" = (
@@ -2679,6 +2781,25 @@
icon_state = "squareswood"
},
/area/yautja)
+"HD" = (
+/obj/structure/surface/rack{
+ color = "#6b675e";
+ layer = 2.79;
+ pixel_y = 24;
+ density = 0
+ },
+/obj/item/weapon/gun/energy/yautja/plasmarifle{
+ pixel_y = -8
+ },
+/obj/item/weapon/gun/energy/yautja/plasmarifle,
+/obj/item/weapon/gun/energy/yautja/plasmarifle{
+ pixel_y = 8
+ },
+/turf/open/floor/strata{
+ color = "#5e5d5d";
+ icon_state = "multi_tiles"
+ },
+/area/yautja)
"HN" = (
/obj/structure/surface/table/reinforced/prison{
color = "#6b675e"
@@ -2694,8 +2815,42 @@
},
/area/yautja)
"If" = (
-/obj/structure/machinery/optable,
-/obj/effect/decal/cleanable/blood,
+/obj/structure/surface/rack{
+ color = "#6b675e";
+ layer = 2.79;
+ pixel_x = -16
+ },
+/obj/structure/surface/rack{
+ color = "#6b675e";
+ layer = 2.79;
+ pixel_x = 8
+ },
+/obj/item/weapon/gun/energy/yautja/plasmapistol{
+ pixel_y = -8;
+ pixel_x = 8
+ },
+/obj/item/weapon/gun/energy/yautja/plasmapistol{
+ pixel_x = 8
+ },
+/obj/item/weapon/gun/energy/yautja/plasmapistol{
+ pixel_y = 8;
+ pixel_x = 8
+ },
+/obj/item/stack/medical/advanced/ointment/predator{
+ pixel_x = -13
+ },
+/obj/item/stack/medical/advanced/ointment/predator{
+ pixel_x = -13
+ },
+/obj/item/stack/medical/advanced/ointment/predator{
+ pixel_x = -13
+ },
+/obj/item/stack/medical/advanced/ointment/predator{
+ pixel_x = -13
+ },
+/obj/item/stack/medical/advanced/ointment/predator{
+ pixel_x = -13
+ },
/turf/open/floor/strata{
color = "#5e5d5d";
icon_state = "multi_tiles"
@@ -2741,7 +2896,7 @@
},
/area/yautja)
"Iw" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja/secure{
name = "\improper Hellhound Quarters"
},
/turf/open/floor/corsat{
@@ -2750,7 +2905,7 @@
},
/area/yautja)
"IC" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja/elder{
name = "\improper Elder Quarters"
},
/turf/open/shuttle/predship,
@@ -2896,7 +3051,7 @@
},
/area/yautja)
"MI" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja{
name = "\improper Blooded Teleporter"
},
/turf/open/floor/strata{
@@ -2950,7 +3105,7 @@
},
/area/yautja)
"Pr" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja/secure{
name = "\improper Research Containment"
},
/turf/open/floor/strata{
@@ -3094,13 +3249,12 @@
/obj/structure/surface/table/reinforced/prison{
color = "#6b675e"
},
-/obj/item/bedsheet{
- anchored = 1;
+/obj/structure/showcase{
desc = "A console used by the Hunters for navigation purposes.";
dir = 4;
icon = 'icons/obj/structures/machinery/computer.dmi';
icon_state = "security_cam";
- name = "Hunter Nav Console"
+ name = "Radar Console"
},
/turf/open/floor/strata{
color = "#5e5d5d";
@@ -3130,7 +3284,7 @@
/turf/open/shuttle/predship,
/area/yautja)
"Wg" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja{
dir = 1;
name = "\improper Gladiator Hall"
},
@@ -3218,7 +3372,7 @@
},
/area/yautja)
"YL" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
+/obj/structure/machinery/door/airlock/yautja{
dir = 1;
name = "\improper Cryo Room"
},
@@ -3234,8 +3388,16 @@
/turf/open/shuttle/predship,
/area/yautja)
"Zs" = (
-/obj/structure/machinery/door/airlock/strata/autoname{
- name = "\improper Containment"
+/obj/structure/machinery/door/airlock/yautja/secure{
+ name = "\improper Heavy Armory"
+ },
+/obj/structure/machinery/door/poddoor/shutters/almayer{
+ dir = 4;
+ id = "Yautja Armory";
+ name = "\improper Armory Shutter";
+ needs_power = 0;
+ unacidable = 1;
+ indestructible = 1
},
/turf/open/floor/strata{
color = "#5e5d5d";
@@ -4836,7 +4998,7 @@ bj
aa
aa
aa
-aa
+dI
aa
bj
bj
@@ -5169,7 +5331,7 @@ aa
aa
ac
bj
-af
+bN
ZR
aV
bn
@@ -5182,7 +5344,7 @@ av
ZM
bO
bj
-wQ
+tR
cP
cP
wQ
@@ -5241,7 +5403,7 @@ aa
aa
ae
bj
-af
+bN
aC
cP
bL
@@ -5254,7 +5416,7 @@ bL
SB
bL
bj
-wQ
+fo
cP
bL
wQ
@@ -5330,9 +5492,9 @@ KD
bL
JH
JH
-af
+bN
be
-af
+bN
JH
JH
JH
@@ -6338,9 +6500,9 @@ bL
bL
JH
JH
-af
+bN
MI
-af
+bN
JH
JH
JH
@@ -6393,7 +6555,7 @@ aa
aa
ae
bj
-af
+bN
aC
cP
bL
@@ -6465,7 +6627,7 @@ aa
aa
ad
bj
-af
+bN
ZR
aV
bn
@@ -6785,9 +6947,9 @@ aa
aa
bj
bj
+HD
+JH
bR
-If
-bN
bj
bj
bj
@@ -6857,9 +7019,9 @@ aa
bj
bj
bj
-BB
-JH
+HD
JH
+If
bj
bj
bj
@@ -7003,7 +7165,7 @@ gb
JH
JH
JH
-JH
+Bg
bj
bj
bj
@@ -7146,7 +7308,7 @@ bD
df
JH
BK
-gG
+BK
bj
bj
bj
@@ -7212,7 +7374,7 @@ bj
bL
bL
bL
-bL
+gG
bL
Fy
dl