From ea84bd036ce4a451588d93ef7a06f405f7b1ecd5 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Thu, 5 Nov 2020 01:32:30 +0100 Subject: [PATCH] [MIRROR] [READY] Swarmer QOL and Balance Update (#1554) * [READY] Swarmer QOL and Balance Update * Update swarmer.dm Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> Co-authored-by: Azarak --- .../dynamic/dynamic_rulesets_midround.dm | 38 ++++++++++++++++++- code/modules/events/swarmer.dm | 9 ++--- code/modules/swarmers/swarmer.dm | 33 ++++++++-------- code/modules/swarmers/swarmer_objs.dm | 2 +- 4 files changed, 58 insertions(+), 24 deletions(-) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index 9b053298cbb..0239b15f64e 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -551,7 +551,7 @@ log_game("DYNAMIC: [key_name(S)] was spawned as a Space Dragon by the midround ruleset.") priority_announce("A large organic energy flux has been recorded near of [station_name()], please stand-by.", "Lifesign Alert") return S - + ////////////////////////////////////////////// // // // ABDUCTORS (GHOST) // @@ -589,3 +589,39 @@ new_character.mind.add_antag_datum(new_role, new_team) #undef ABDUCTOR_MAX_TEAMS + +////////////////////////////////////////////// +// // +// SWARMERS (GHOST) // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/midround/swarmers + name = "Swarmers" + antag_datum = /datum/antagonist/swarmer + antag_flag = "Swarmer" + antag_flag_override = ROLE_ALIEN + required_type = /mob/dead/observer + enemy_roles = list("Security Officer", "Detective", "Head of Security", "Captain") + required_enemies = list(2,2,1,1,1,1,1,0,0,0) + required_candidates = 0 + weight = 3 + cost = 10 + requirements = list(101,101,101,80,60,50,30,20,10,10) + repeatable = TRUE + var/list/spawn_locs = list() + +/datum/dynamic_ruleset/midround/swarmers/execute() + var/list/spawn_locs = list() + for(var/x in GLOB.xeno_spawn) + var/turf/spawn_turf = x + var/light_amount = spawn_turf.get_lumcount() + if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) + spawn_locs += spawn_turf + if(!spawn_locs.len) + message_admins("No valid spawn locations found in GLOB.xeno_spawn, aborting swarmer spawning...") + return MAP_ERROR + var/obj/structure/swarmer_beacon/new_beacon = new /obj/structure/swarmer_beacon(pick(spawn_locs)) + log_game("A Swarmer Beacon was spawned via Dynamic Mode.") + notify_ghosts("\A Swarmer Beacon has spawned!", source = new_beacon, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Swarmer Beacon Spawned") + return ..() diff --git a/code/modules/events/swarmer.dm b/code/modules/events/swarmer.dm index 6417886ec17..2212b271019 100644 --- a/code/modules/events/swarmer.dm +++ b/code/modules/events/swarmer.dm @@ -1,11 +1,10 @@ /datum/round_event_control/spawn_swarmer name = "Spawn Swarmer Beacon" typepath = /datum/round_event/spawn_swarmer - weight = 8 - //max_occurrences = 1 //Only once okay fam //ORIGINAL - max_occurrences = 0 //SKYRAT EDIT CHANGE - EVENTS - earliest_start = 30 MINUTES - min_players = 15 + //weight = 10 //ORIGINAL + weight = 3 //SKYRAT EDIT CHANGE - EVENTS - same as the dynamic ruleset + max_occurrences = 1 //Only once okay fam + min_players = 20 /datum/round_event/spawn_swarmer/announce(fake) priority_announce("Our long-range sensors have detected that your station's defenses have been breached by some sort of alien device. We suggest searching for and destroying it as soon as possible.", "[command_name()] High-Priority Update") diff --git a/code/modules/swarmers/swarmer.dm b/code/modules/swarmers/swarmer.dm index d6bc0a8bde1..1f93f2d5a48 100644 --- a/code/modules/swarmers/swarmer.dm +++ b/code/modules/swarmers/swarmer.dm @@ -52,13 +52,12 @@ AIStatus = AI_OFF pass_flags = PASSTABLE mob_size = MOB_SIZE_TINY - ventcrawler = VENTCRAWLER_ALWAYS - ranged = 1 + ranged = TRUE projectiletype = /obj/projectile/beam/disabler/swarmer ranged_cooldown_time = 20 projectilesound = 'sound/weapons/taser2.ogg' loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/stack/ore/bluespace_crystal) - del_on_death = 1 + del_on_death = TRUE deathmessage = "explodes with a sharp pop!" light_system = MOVABLE_LIGHT light_range = 3 @@ -66,7 +65,7 @@ hud_type = /datum/hud/swarmer speech_span = SPAN_ROBOT ///Resource points, generated by consuming metal/glass - var/resources = 0 + var/resources = 20 ///Maximum amount of resources a swarmer can store var/max_resources = 100 ///List used for player swarmers to keep track of their drones @@ -81,6 +80,14 @@ for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) diag_hud.add_to_hud(src) +/mob/living/simple_animal/hostile/swarmer/Move() + . = ..() + if(!LAZYLEN(dronelist)) + return + for(var/d in dronelist) + var/mob/living/simple_animal/hostile/drone = d + if(!drone.target && !HAS_TRAIT(drone, TRAIT_IMMOBILIZED) && isturf(drone.loc)) + step_to(drone, src) /mob/living/simple_animal/hostile/swarmer/med_hud_set_health() var/image/holder = hud_list[DIAG_HUD] @@ -123,18 +130,6 @@ borg.adjustBruteLoss(melee_damage_lower) return ..() -/mob/living/simple_animal/hostile/swarmer/MiddleClickOn(atom/A) - . = ..() - if(!LAZYLEN(dronelist)) - return - var/turf/clicked_turf = get_turf(A) - if(!clicked_turf) - return - for(var/d in dronelist) - var/mob/living/simple_animal/hostile/drone = d - drone.LoseTarget() - drone.Goto(clicked_turf, drone.move_to_delay) - /mob/living/simple_animal/hostile/swarmer/CtrlClickOn(atom/target) face_atom(target) if(!istype(target, /mob/living)) @@ -465,7 +460,11 @@ . = ..() if(!.) return - if(!istype(target, /mob/living/simple_animal) || !istype(firer, /mob/living/simple_animal/hostile/swarmer)) + if((!istype(target, /mob/living/simple_animal) && !ishuman(target)) || !istype(firer, /mob/living/simple_animal/hostile/swarmer)) return + if(ishuman(target)) + var/mob/living/carbon/human/possibleHulk = target + if(!possibleHulk.dna || !possibleHulk.dna.check_mutation(HULK)) + return var/mob/living/simple_animal/hostile/swarmer/swarmer = firer swarmer.teleport_target(target) diff --git a/code/modules/swarmers/swarmer_objs.dm b/code/modules/swarmers/swarmer_objs.dm index 8b165f0689d..12f4c17fa66 100644 --- a/code/modules/swarmers/swarmer_objs.dm +++ b/code/modules/swarmers/swarmer_objs.dm @@ -93,7 +93,7 @@ 3. BIOLOGICAL RESOURCES WILL BE HARVESTED AT A LATER DATE: DO NOT HARM THEM\n\ OPERATOR NOTES:\n\ - CONSUME RESOURCES TO CONSTRUCT TRAPS, BARRIERS, AND FOLLOWER DRONES\n\ - - FOLLOWER DRONES CAN BE ORDERED TO MOVE VIA MIDDLE CLICKING ON A TILE. WHILE DRONES CANNOT ASSIST IN RESOURCE HARVESTING, THEY CAN PROTECT YOU FROM THREATS\n\ + - FOLLOWER DRONES WILL FOLLOW YOU AUTOMATCIALLY UNLESS THEY POSSESS A TARGET. WHILE DRONES CANNOT ASSIST IN RESOURCE HARVESTING, THEY CAN PROTECT YOU FROM THREATS\n\ - LCTRL + ATTACKING AN ORGANIC WILL ALOW YOU TO REMOVE SAID ORGANIC FROM THE AREA\n\ - YOU AND YOUR DRONES HAVE A STUN EFFECT ON MELEE. YOU ARE ALSO ARMED WITH A DISABLER PROJECTILE, USE THESE TO PREVENT ORGANICS FROM HALTING YOUR PROGRESS\n\ GLORY TO !*# $*#^")