From 5d2363949fcda59637a527af61176cd6a1582434 Mon Sep 17 00:00:00 2001 From: Kyep <16434066+Kyep@users.noreply.github.com> Date: Wed, 16 Sep 2020 15:25:34 +0000 Subject: [PATCH] Fixes & Reworks Rogue Combat Drone Event (#14040) * combat drone rework Co-authored-by: Kyep --- code/modules/events/rogue_drones.dm | 21 +- .../simple_animal/hostile/retaliate/drone.dm | 379 +++++++----------- 2 files changed, 155 insertions(+), 245 deletions(-) diff --git a/code/modules/events/rogue_drones.dm b/code/modules/events/rogue_drones.dm index 02fa69b7c3e..f3ea93c80c4 100644 --- a/code/modules/events/rogue_drones.dm +++ b/code/modules/events/rogue_drones.dm @@ -4,24 +4,16 @@ var/list/drones_list = list() /datum/event/rogue_drone/start() - //spawn them at the same place as carp var/list/possible_spawns = list() for(var/thing in GLOB.landmarks_list) var/obj/effect/landmark/C = thing - if(C.name == "carpspawn") + if(C.name == "carpspawn") //spawn them at the same place as carp possible_spawns.Add(C) - //25% chance for this to be a false alarm - var/num - if(prob(25)) - num = 0 - else - num = rand(2,6) - for(var/i=0, i 0) - stat = UNCONSCIOUS - icon_state = "drone_dead" - disabled-- - wander = 0 - speak_chance = 0 - if(disabled <= 0) - stat = CONSCIOUS - icon_state = "drone0" - wander = 1 - speak_chance = 5 - - //repair a bit of damage - if(prob(1)) - src.visible_message("[bicon(src)] [src] shudders and shakes as some of it's damaged systems come back online.") - do_sparks(3, 1, src) - health += rand(25,100) - - //spark for no reason - if(prob(5)) - do_sparks(3, 1, src) - - //sometimes our targetting sensors malfunction, and we attack anyone nearby - if(prob(disabled ? 0 : 1)) - if(hostile_drone) - src.visible_message("[bicon(src)] [src] retracts several targetting vanes, and dulls it's running lights.") - hostile_drone = 0 - else - src.visible_message("[bicon(src)] [src] suddenly lights up, and additional targetting vanes slide into place.") - hostile_drone = 1 - - if(health / maxHealth > 0.9) - icon_state = "drone3" - explode_chance = 0 - else if(health / maxHealth > 0.7) - icon_state = "drone2" - explode_chance = 0 - else if(health / maxHealth > 0.5) - icon_state = "drone1" - explode_chance = 0.5 - else if(health / maxHealth > 0.3) - icon_state = "drone0" - explode_chance = 5 - else if(health > 0) - //if health gets too low, shut down - icon_state = "drone_dead" - exploding = 0 - if(!disabled) - if(prob(50)) - src.visible_message("[bicon(src)] [src] suddenly shuts down!") - else - src.visible_message("[bicon(src)] [src] suddenly lies still and quiet.") - disabled = rand(150, 600) - walk(src,0) - - if(exploding && prob(20)) - if(prob(50)) - src.visible_message("[bicon(src)] [src] begins to spark and shake violenty!") - else - src.visible_message("[bicon(src)] [src] sparks and shakes like it's about to explode!") - do_sparks(3, 1, src) - - if(!exploding && !disabled && prob(explode_chance)) - exploding = 1 - stat = UNCONSCIOUS - wander = 1 - walk(src,0) - spawn(rand(50,150)) - if(!disabled && exploding) - explosion(get_turf(src), 0, 1, 4, 7) - //proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1) - ..() - -//ion rifle! -/mob/living/simple_animal/hostile/retaliate/malf_drone/emp_act(severity) - health -= rand(3,15) * (severity + 1) - disabled = rand(150, 600) - hostile_drone = 0 - walk(src,0) - -/mob/living/simple_animal/hostile/retaliate/malf_drone/Destroy() //Seriously, what the actual hell. - //some random debris left behind - if(has_loot) - do_sparks(3, 1, src) - var/obj/O - - //shards - O = new /obj/item/shard(loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(75)) - O = new /obj/item/shard(loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(50)) - O = new /obj/item/shard(loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(25)) - O = new /obj/item/shard(loc) - step_to(O, get_turf(pick(view(7, src)))) - - //rods - O = new /obj/item/stack/rods(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(75)) - O = new /obj/item/stack/rods(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(50)) - O = new /obj/item/stack/rods(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(25)) - O = new /obj/item/stack/rods(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - - //plasteel - O = new /obj/item/stack/sheet/plasteel(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(75)) - O = new /obj/item/stack/sheet/plasteel(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(50)) - O = new /obj/item/stack/sheet/plasteel(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(25)) - O = new /obj/item/stack/sheet/plasteel(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - - //also drop dummy circuit boards deconstructable for research (loot) - var/obj/item/circuitboard/C - - //spawn 1-4 boards of a random type - var/spawnees = 0 - var/num_boards = rand(1,4) - var/list/options = list(1,2,4,8,16,32,64,128,256, 512) - for(var/i=0, i 0.9) + icon_state = "drone3" + else if(health / maxHealth > 0.7) + icon_state = "drone2" + else if(health / maxHealth > 0.5) + icon_state = "drone1" + else + icon_state = "drone0" + +/mob/living/simple_animal/hostile/malf_drone/adjustHealth(damage, updating_health) + do_sparks(3, 1, src) + passive_mode = FALSE + update_icons() + . = ..() // this will handle finding a target if there is a valid one nearby + +/mob/living/simple_animal/hostile/malf_drone/Life(seconds, times_fired) + . = ..() + if(.) // mob is alive. We check this just in case Life() can fire for qdel'ed mobs. + if(times_fired % 15 == 0) // every 15 cycles, aka 30 seconds, 50% chance to switch between modes + scramble_settings() + +/mob/living/simple_animal/hostile/malf_drone/proc/scramble_settings() + if(prob(50)) + do_sparks(3, 1, src) + passive_mode = !passive_mode + if(passive_mode) + visible_message("[src] retracts several targetting vanes.") + if(target) + LoseTarget() + else + visible_message("[src] suddenly lights up, and additional targetting vanes slide into place.") + update_icons() + +/mob/living/simple_animal/hostile/malf_drone/emp_act(severity) + adjustHealth(100 / severity) // takes the same damage as a mining drone from emp + +/mob/living/simple_animal/hostile/malf_drone/drop_loot() + do_sparks(3, 1, src) + + var/turf/T = get_turf(src) + + //shards + var/obj/O = new /obj/item/shard(T) + step_to(O, get_turf(pick(view(7, src)))) + if(prob(75)) + O = new /obj/item/shard(T) + step_to(O, get_turf(pick(view(7, src)))) + if(prob(50)) + O = new /obj/item/shard(T) + step_to(O, get_turf(pick(view(7, src)))) + if(prob(25)) + O = new /obj/item/shard(T) + step_to(O, get_turf(pick(view(7, src)))) + + //rods + var/obj/item/stack/K = new /obj/item/stack/rods(T) + step_to(K, get_turf(pick(view(7, src)))) + K.amount = pick(1, 2, 3, 4) + K.update_icon() + + //plasteel + K = new /obj/item/stack/sheet/plasteel(T) + step_to(K, get_turf(pick(view(7, src)))) + K.amount = pick(1, 2, 3, 4) + K.update_icon() + + //also drop dummy circuit boards deconstructable for research (loot) + var/obj/item/circuitboard/C + + //spawn 1-4 boards of a random type + var/spawnees = 0 + var/num_boards = rand(1, 4) + var/list/options = list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512) + for(var/i=0, i