diff --git a/code/__DEFINES/equipment.dm b/code/__DEFINES/equipment.dm
index 4212f6a52301..461eae27a2a3 100644
--- a/code/__DEFINES/equipment.dm
+++ b/code/__DEFINES/equipment.dm
@@ -82,7 +82,6 @@
#define NOTABLEMERGE (1<<13)
/// Has heat source but isn't 'on fire' and thus can be stored
#define IGNITING_ITEM (1<<14)
-
//==========================================================================================
diff --git a/code/game/objects/items/explosives/plastic.dm b/code/game/objects/items/explosives/plastic.dm
index 4c2a1774d4db..830df9659070 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,65 @@
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 [name] on [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 [src]."))
+ return FALSE
+
+ if(istype(target, /obj/structure/window))//no breaching charges on the briefing windows / brig / CIC e.e
+ var/obj/structure/window/window = target
+ if(window.not_damageable)
+ to_chat(user, SPAN_WARNING("[window] is much too tough for you to do anything to it with [src].")) //On purpose to mimic wall message
+ return FALSE
+
+ if(istype(target, /turf/closed/wall))
+ var/turf/closed/wall/targeted_wall = target
+ if(targeted_wall.hull)
+ to_chat(user, SPAN_WARNING("You are unable to stick [src] to [targeted_wall]!"))
+ 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)
+ addtimer(CALLBACK(src, PROC_REF(trigger_explosion), target_turf, dir, cause_data), 1)
+
+/obj/item/explosive/plastic/breaching_charge/proc/trigger_explosion(turf/target_turf, dir, cause_data)
+ 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
+ . = ..()
+
+/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)
+ addtimer(CALLBACK(src, PROC_REF(trigger_explosion), target_turf, dir, cause_data), 1)
+
+/obj/item/explosive/plastic/breaching_charge/plasma/trigger_explosion(turf/target_turf, dir, cause_data)
+ cell_explosion(target_turf, 90, 90, EXPLOSION_FALLOFF_SHAPE_EXPONENTIAL, dir, cause_data)
+ qdel(src)
diff --git a/code/modules/cm_preds/yaut_bracers.dm b/code/modules/cm_preds/yaut_bracers.dm
index 05e4a8205c94..b526e11d99bb 100644
--- a/code/modules/cm_preds/yaut_bracers.dm
+++ b/code/modules/cm_preds/yaut_bracers.dm
@@ -408,15 +408,17 @@
var/gear_on_almayer = 0
var/gear_low_orbit = 0
var/closest = 10000
+ /// The item itself, to be referenced so Yautja know what to look for.
+ var/obj/closest_item
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++
@@ -428,6 +430,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)
@@ -459,9 +462,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
diff --git a/code/modules/cm_preds/yaut_items.dm b/code/modules/cm_preds/yaut_items.dm
index 8a3306817078..47b2408c4f37 100644
--- a/code/modules/cm_preds/yaut_items.dm
+++ b/code/modules/cm_preds/yaut_items.dm
@@ -327,6 +327,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,9 +339,6 @@
to_chat(hellhound, "\[Radio\]: [M.real_name] [verb], '[message]'.")
..()
-/obj/item/device/radio/headset/yautja/attackby()
- return
-
/obj/item/device/radio/headset/yautja/elder //primarily for use in another MR
name = "\improper Elder Communicator"
volume_settings = list(RADIO_VOLUME_QUIET_STR, RADIO_VOLUME_RAISED_STR, RADIO_VOLUME_IMPORTANT_STR, RADIO_VOLUME_CRITICAL_STR)
@@ -697,6 +695,7 @@
var/tether_range = 5
var/mob/trapped_mob
layer = LOWER_ITEM_LAYER
+ flags_item = ITEM_PREDATOR
/obj/item/hunting_trap/Destroy()
cleanup_tether()
diff --git a/code/modules/cm_preds/yaut_machines.dm b/code/modules/cm_preds/yaut_machines.dm
index adba69043dcc..a1782ca22b85 100644
--- a/code/modules/cm_preds/yaut_machines.dm
+++ b/code/modules/cm_preds/yaut_machines.dm
@@ -5,7 +5,7 @@
icon_state = "globe"
breakable = FALSE
- minimap_type = MINIMAP_FLAG_XENO|MINIMAP_FLAG_USCM
+ minimap_type = MINIMAP_FLAG_ALL
/obj/structure/machinery/autolathe/yautja
name = "yautja autolathe"
diff --git a/code/modules/cm_preds/yaut_shield.dm b/code/modules/cm_preds/yaut_shield.dm
index 2e036b4a5357..7b84f935f4c5 100644
--- a/code/modules/cm_preds/yaut_shield.dm
+++ b/code/modules/cm_preds/yaut_shield.dm
@@ -45,10 +45,10 @@
M.apply_effect(3, DAZE)
M.apply_effect(5, SLOW)
-/obj/item/weapon/shield/riot/yautja/attackby(obj/item/I, mob/user)
+/obj/item/weapon/shield/riot/yautja/attackby(obj/item/attacking_item, mob/user)
if(cooldown < world.time - 25)
- if(istype(I, /obj/item/weapon) && (I.flags_item & ITEM_PREDATOR))
- user.visible_message(SPAN_WARNING("[user] bashes \the [src] with \the [I]!"))
+ if(istype(attacking_item, /obj/item/weapon) && (attacking_item.flags_item & ITEM_PREDATOR))
+ user.visible_message(SPAN_WARNING("[user] bashes [src] with [attacking_item]!"))
playsound(user.loc, 'sound/effects/shieldbash.ogg', 25, 1)
cooldown = world.time
else
diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm
index 40006dafe60b..986b30c27ddf 100644
--- a/code/modules/cm_preds/yaut_weapons.dm
+++ b/code/modules/cm_preds/yaut_weapons.dm
@@ -891,7 +891,7 @@
/obj/item/weapon/gun/energy/yautja/plasmarifle/load_into_chamber()
if(charge_time >= 80)
ammo = GLOB.ammo_list[/datum/ammo/energy/yautja/rifle/blast]
- charge_time = 0
+ charge_time -= 80
else
ammo = GLOB.ammo_list[/datum/ammo/energy/yautja/rifle/bolt]
charge_time -= 10
@@ -912,6 +912,8 @@
if(refund) charge_time *= 2
return TRUE
+#define FIRE_MODE_STANDARD "Standard"
+#define FIRE_MODE_INCENDIARY "Incendiary"
/obj/item/weapon/gun/energy/yautja/plasmapistol
name = "plasma pistol"
desc = "A plasma pistol capable of rapid fire. It has an integrated battery. Can be used to set fires, either to braziers or on people."
@@ -924,7 +926,12 @@
ammo = /datum/ammo/energy/yautja/pistol
muzzle_flash = null // TO DO, add a decent one.
w_class = SIZE_MEDIUM
+ /// Max amount of shots
var/charge_time = 40
+ /// Amount of charge_time drained per shot
+ var/shot_cost = 1
+ /// standard (sc = 1) or incendiary (sc = 5)
+ var/mode = FIRE_MODE_STANDARD
flags_gun_features = GUN_UNUSUAL_DESIGN
flags_item = ITEM_PREDATOR|IGNITING_ITEM|TWOHANDED
@@ -965,9 +972,14 @@
if(isyautja(user))
. = ..()
. += SPAN_NOTICE("It currently has [charge_time]/40 charge.")
+
+ if(mode == FIRE_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.")
+ . += SPAN_NOTICE("This thing looks like an alien gun of some kind. Strange.")
/obj/item/weapon/gun/energy/yautja/plasmapistol/able_to_fire(mob/user)
@@ -983,7 +995,7 @@
var/obj/item/projectile/projectile = create_bullet(ammo, initial(name))
projectile.SetLuminosity(1)
in_chamber = projectile
- charge_time--
+ charge_time -= shot_cost
return in_chamber
/obj/item/weapon/gun/energy/yautja/plasmapistol/has_ammunition()
@@ -995,9 +1007,30 @@
/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 += shot_cost
+ log_debug("Plasma Pistol refunded shot.")
return TRUE
+/obj/item/weapon/gun/energy/yautja/plasmapistol/use_unique_action()
+ switch(mode)
+ if(FIRE_MODE_STANDARD)
+ mode = FIRE_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(FIRE_MODE_INCENDIARY)
+ mode = FIRE_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]
+
+#undef FIRE_MODE_STANDARD
+#undef FIRE_MODE_INCENDIARY
+
/obj/item/weapon/gun/energy/yautja/plasma_caster
name = "plasma caster"
desc = "A powerful, shoulder-mounted energy weapon."
diff --git a/code/modules/projectiles/ammo_datums.dm b/code/modules/projectiles/ammo_datums.dm
index 7114c924fe61..f97195d5ac32 100644
--- a/code/modules/projectiles/ammo_datums.dm
+++ b/code/modules/projectiles/ammo_datums.dm
@@ -2217,12 +2217,27 @@
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)
))
+/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/hit_mob, obj/item/projectile/hit_projectile)
+ hit_mob.apply_effect(2, WEAKEN)
+
/datum/ammo/energy/yautja/caster
name = "root caster bolt"
icon_state = "ion"
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