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