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 5c4079b2be23..caaf94ef1497 100644 --- a/code/modules/cm_preds/yaut_bracers.dm +++ b/code/modules/cm_preds/yaut_bracers.dm @@ -421,15 +421,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++ @@ -441,6 +443,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) @@ -472,9 +475,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