diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm index bef6e8d9b55..cd42b018d94 100644 --- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm +++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm @@ -762,7 +762,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space, +/mob/living/basic/syndicate/ranged/smg/space, /turf/open/floor/iron/airless, /area/shuttle/ruin/caravan/freighter3) "Cj" = ( @@ -1029,7 +1029,7 @@ /area/shuttle/ruin/caravan/freighter3) "PF" = ( /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space, +/mob/living/basic/syndicate/ranged/smg/space, /turf/open/floor/iron/airless, /area/shuttle/ruin/caravan/freighter3) "PY" = ( @@ -1186,7 +1186,7 @@ /obj/effect/turf_decal/box/white/corners{ dir = 4 }, -/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space/stormtrooper, +/mob/living/basic/syndicate/ranged/shotgun/space/stormtrooper, /turf/open/floor/iron/dark/airless, /area/shuttle/ruin/caravan/freighter3) "Zz" = ( diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm index c0835b89ba2..9b9127925d2 100644 --- a/_maps/RandomZLevels/research.dmm +++ b/_maps/RandomZLevels/research.dmm @@ -76,7 +76,7 @@ /turf/closed/wall/r_wall, /area/awaymission/research/interior/engineering) "as" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/smg, +/mob/living/basic/syndicate/ranged/smg, /turf/open/floor/mineral/plastitanium/red, /area/awaymission/research/interior/engineering) "at" = ( @@ -120,7 +120,7 @@ /obj/structure/chair{ dir = 8 }, -/mob/living/simple_animal/hostile/syndicate, +/mob/living/basic/syndicate, /turf/open/floor/mineral/plastitanium/red, /area/awaymission/research/interior/engineering) "az" = ( @@ -216,7 +216,7 @@ /turf/open/floor/plating, /area/awaymission/research/interior/engineering) "aT" = ( -/mob/living/simple_animal/hostile/syndicate/melee/sword, +/mob/living/basic/syndicate/melee/sword, /turf/open/floor/plating, /area/awaymission/research/interior/engineering) "aU" = ( @@ -631,7 +631,7 @@ /area/awaymission/research/interior/maint) "cz" = ( /obj/structure/cable, -/mob/living/simple_animal/hostile/syndicate/ranged/smg, +/mob/living/basic/syndicate/ranged/smg, /turf/open/floor/plating, /area/awaymission/research/interior/maint) "cA" = ( @@ -662,7 +662,7 @@ /area/awaymission/research/interior/gateway) "cL" = ( /obj/structure/cable, -/mob/living/simple_animal/hostile/syndicate/ranged, +/mob/living/basic/syndicate/ranged, /turf/open/floor/plating, /area/awaymission/research/interior/maint) "cM" = ( @@ -798,7 +798,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/mob/living/simple_animal/hostile/syndicate, +/mob/living/basic/syndicate, /turf/open/floor/iron/white, /area/awaymission/research/interior) "do" = ( @@ -883,7 +883,7 @@ /area/awaymission/research/interior/secure) "dP" = ( /obj/effect/turf_decal/tile/blue/fourcorners, -/mob/living/simple_animal/hostile/syndicate/ranged/smg, +/mob/living/basic/syndicate/ranged/smg, /turf/open/floor/iron/white, /area/awaymission/research/interior/medbay) "dR" = ( @@ -929,7 +929,7 @@ /turf/open/floor/iron/stairs, /area/awaymission/research/interior/genetics) "ec" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/smg, +/mob/living/basic/syndicate/ranged/smg, /turf/open/floor/plating, /area/awaymission/research/interior/maint) "ed" = ( @@ -1135,7 +1135,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/mob/living/simple_animal/hostile/syndicate, +/mob/living/basic/syndicate, /turf/open/floor/iron/white, /area/awaymission/research/interior) "eN" = ( @@ -1296,7 +1296,7 @@ /turf/open/floor/iron/white, /area/awaymission/research/interior) "fn" = ( -/mob/living/simple_animal/hostile/syndicate/melee/sword, +/mob/living/basic/syndicate/melee/sword, /turf/open/floor/iron/white, /area/awaymission/research/interior) "fo" = ( @@ -2248,7 +2248,7 @@ /obj/effect/turf_decal/tile/green{ dir = 4 }, -/mob/living/simple_animal/hostile/syndicate, +/mob/living/basic/syndicate, /turf/open/floor/iron/white, /area/awaymission/research/interior) "iR" = ( @@ -3682,7 +3682,7 @@ /area/awaymission/research/interior/security) "sn" = ( /obj/effect/turf_decal/tile/green/fourcorners, -/mob/living/simple_animal/hostile/syndicate/ranged/smg, +/mob/living/basic/syndicate/ranged/smg, /turf/open/floor/iron/white, /area/awaymission/research/interior) "sq" = ( @@ -3866,7 +3866,7 @@ pixel_y = 26 }, /obj/effect/turf_decal/tile/green/fourcorners, -/mob/living/simple_animal/hostile/syndicate/ranged/smg, +/mob/living/basic/syndicate/ranged/smg, /turf/open/floor/iron/white, /area/awaymission/research/interior) "yM" = ( @@ -4463,7 +4463,7 @@ /area/awaymission/research/interior/cryo) "Th" = ( /obj/effect/turf_decal/tile/blue/fourcorners, -/mob/living/simple_animal/hostile/syndicate, +/mob/living/basic/syndicate, /turf/open/floor/iron/white, /area/awaymission/research/interior/medbay) "Tj" = ( @@ -4524,7 +4524,7 @@ /turf/open/floor/plating, /area/awaymission/research/interior/maint) "Uq" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space, +/mob/living/basic/syndicate/ranged/smg/space, /turf/open/misc/asteroid/airless, /area/awaymission/research/exterior) "Uu" = ( diff --git a/_maps/shuttles/ruin_caravan_victim.dmm b/_maps/shuttles/ruin_caravan_victim.dmm index 9fef1d9f7ad..d1e9b856825 100644 --- a/_maps/shuttles/ruin_caravan_victim.dmm +++ b/_maps/shuttles/ruin_caravan_victim.dmm @@ -14,7 +14,7 @@ /area/shuttle/ruin/caravan/freighter1) "cu" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space, +/mob/living/basic/syndicate/ranged/smg/space, /turf/open/floor/iron/dark/airless, /area/shuttle/ruin/caravan/freighter1) "cC" = ( @@ -491,7 +491,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space, +/mob/living/basic/syndicate/ranged/smg/space, /turf/open/floor/iron{ initial_gas_mix = "TEMP=2.7" }, @@ -501,7 +501,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/mob/living/simple_animal/hostile/syndicate/melee/sword/space/stormtrooper, +/mob/living/basic/syndicate/melee/sword/space/stormtrooper, /turf/open/floor/iron/dark{ initial_gas_mix = "TEMP=2.7" }, @@ -642,7 +642,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space, +/mob/living/basic/syndicate/ranged/smg/space, /turf/open/floor/iron/airless, /area/shuttle/ruin/caravan/freighter1) "Ld" = ( diff --git a/_maps/shuttles/ruin_syndicate_dropship.dmm b/_maps/shuttles/ruin_syndicate_dropship.dmm index 20bbb5afe53..53bdeade915 100644 --- a/_maps/shuttles/ruin_syndicate_dropship.dmm +++ b/_maps/shuttles/ruin_syndicate_dropship.dmm @@ -233,7 +233,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/mob/living/simple_animal/hostile/syndicate/ranged/smg/pilot{ +/mob/living/basic/syndicate/ranged/smg/pilot{ environment_smash = 0 }, /turf/open/floor/iron/dark, diff --git a/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm b/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm index 5cbe9852f2e..cab4b074cc0 100644 --- a/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm +++ b/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm @@ -20,7 +20,7 @@ req_access = list("syndicate") }, /obj/structure/cable, -/mob/living/simple_animal/hostile/syndicate/ranged/smg/pilot{ +/mob/living/basic/syndicate/ranged/smg/pilot{ environment_smash = 0 }, /turf/open/floor/mineral/plastitanium/red, diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm index 8cd87078044..b423cf447a0 100644 --- a/_maps/shuttles/whiteship_meta.dmm +++ b/_maps/shuttles/whiteship_meta.dmm @@ -288,7 +288,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/mob/living/simple_animal/hostile/syndicate/ranged{ +/mob/living/basic/syndicate/ranged{ environment_smash = 0; name = "Syndicate Salvage Worker" }, @@ -1725,7 +1725,7 @@ }, /obj/effect/decal/cleanable/blood/gibs/old, /obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/simple_animal/hostile/syndicate/melee{ +/mob/living/basic/syndicate/melee{ environment_smash = 0 }, /turf/open/floor/iron/dark, @@ -1786,7 +1786,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/simple_animal/hostile/syndicate/melee{ +/mob/living/basic/syndicate/melee{ environment_smash = 0 }, /turf/open/floor/iron/dark, @@ -1805,7 +1805,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/hostile/syndicate/melee{ +/mob/living/basic/syndicate/melee{ environment_smash = 0 }, /turf/open/floor/iron/dark, diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm index 6548f28da35..bfe343cdc58 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm @@ -45,6 +45,10 @@ action_cooldown = 0.6 SECONDS behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM required_distance = 3 + /// How many shots to fire + var/shots = 1 + /// The interval between individual shots in a burst + var/burst_interval = 0.2 SECONDS /datum/ai_behavior/basic_ranged_attack/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) . = ..() @@ -70,10 +74,13 @@ controller.blackboard[hiding_location_key] = WEAKREF(hiding_target) - if(hiding_target) //Shoot it! - basic_mob.RangedAttack(hiding_target) + if(shots>1) + var/atom/burst_target = hiding_target ? hiding_target : target + var/datum/callback/callback = CALLBACK(basic_mob, TYPE_PROC_REF(/mob/living/basic,RangedAttack), burst_target) + for(var/i in 1 to shots) + addtimer(callback, (i - 1) * burst_interval) else - basic_mob.RangedAttack(target) + basic_mob.RangedAttack(hiding_target ? hiding_target : target) /datum/ai_behavior/basic_ranged_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, targetting_datum_key, hiding_location_key) . = ..() diff --git a/code/datums/ai/basic_mobs/targetting_datums/basic_targetting_datum.dm b/code/datums/ai/basic_mobs/targetting_datums/basic_targetting_datum.dm index 86fa48b377a..ea89b4b39c8 100644 --- a/code/datums/ai/basic_mobs/targetting_datums/basic_targetting_datum.dm +++ b/code/datums/ai/basic_mobs/targetting_datums/basic_targetting_datum.dm @@ -15,6 +15,8 @@ /datum/targetting_datum/basic /// When we do our basic faction check, do we look for exact faction matches? var/check_factions_exactly = FALSE + /// Minimum status to attack living beings + var/stat_attack = CONSCIOUS /datum/targetting_datum/basic/can_attack(mob/living/living_mob, atom/the_target) if(isturf(the_target) || !the_target) // bail out on invalids @@ -33,7 +35,7 @@ if(isliving(the_target)) //Targeting vs living mobs var/mob/living/L = the_target - if(faction_check(living_mob, L) || L.stat) + if(faction_check(living_mob, L) || (L.stat > stat_attack)) return FALSE return TRUE diff --git a/code/datums/components/fantasy/suffixes.dm b/code/datums/components/fantasy/suffixes.dm index 11b232f3ede..1c49bace23e 100644 --- a/code/datums/components/fantasy/suffixes.dm +++ b/code/datums/components/fantasy/suffixes.dm @@ -104,7 +104,6 @@ /datum/species = TRUE, // Some types to remove them and their subtypes /mob/living/carbon/human/species = FALSE, - /mob/living/simple_animal/hostile/syndicate/mecha_pilot = FALSE, /mob/living/simple_animal/hostile/asteroid/elite = FALSE, /mob/living/simple_animal/hostile/megafauna = FALSE, )) diff --git a/code/game/machinery/computer/arcade/orion.dm b/code/game/machinery/computer/arcade/orion.dm index 8fee6ca5d57..4669254622c 100644 --- a/code/game/machinery/computer/arcade/orion.dm +++ b/code/game/machinery/computer/arcade/orion.dm @@ -503,12 +503,11 @@ GLOBAL_LIST_INIT(orion_events, generate_orion_events()) newgame() obj_flags |= EMAGGED -/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion +/mob/living/basic/syndicate/ranged/smg/orion name = "spaceport security" desc = "Premier corporate security forces for all spaceports found along the Orion Trail." faction = list("orion") loot = list() - del_on_death = TRUE /obj/item/orion_ship name = "model settler ship" diff --git a/code/game/machinery/computer/arcade/orion_event.dm b/code/game/machinery/computer/arcade/orion_event.dm index 0e812492577..ad13c6632e4 100644 --- a/code/game/machinery/computer/arcade/orion_event.dm +++ b/code/game/machinery/computer/arcade/orion_event.dm @@ -525,7 +525,7 @@ game.say("WEEWOO! WEEWOO! Spaceport security en route!") playsound(game, 'sound/items/weeoo1.ogg', 100, FALSE) for(var/i in 1 to 3) - var/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion/spaceport_security = new(get_turf(game)) - spaceport_security.GiveTarget(usr) + var/mob/living/basic/syndicate/ranged/smg/orion/spaceport_security = new(get_turf(game)) + spaceport_security.ai_controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] = REF(usr) game.fuel += fuel game.food += food diff --git a/code/game/objects/items/grenades/spawnergrenade.dm b/code/game/objects/items/grenades/spawnergrenade.dm index 9a3b888a765..94533025a61 100644 --- a/code/game/objects/items/grenades/spawnergrenade.dm +++ b/code/game/objects/items/grenades/spawnergrenade.dm @@ -31,7 +31,7 @@ /obj/item/grenade/spawnergrenade/manhacks name = "viscerator delivery grenade" - spawner_type = /mob/living/simple_animal/hostile/viscerator + spawner_type = /mob/living/basic/viscerator deliveryamt = 10 /obj/item/grenade/spawnergrenade/spesscarp diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index 7d600234c30..61baa0a5297 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -30,7 +30,7 @@ icon = 'icons/obj/device.dmi' icon_state = "syndbeacon" spawn_text = "warps in from" - mob_types = list(/mob/living/simple_animal/hostile/syndicate/ranged) + mob_types = list(/mob/living/basic/syndicate/ranged) faction = list(ROLE_SYNDICATE) /obj/structure/spawner/skeleton diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index a334d5b1d70..f8d0b124a7a 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -8,9 +8,9 @@ description = "Syndicate troops pour out of portals." /datum/round_event/portal_storm/syndicate_shocktroop - boss_types = list(/mob/living/simple_animal/hostile/syndicate/melee/space/stormtrooper = 2) - hostile_types = list(/mob/living/simple_animal/hostile/syndicate/melee/space = 8,\ - /mob/living/simple_animal/hostile/syndicate/ranged/space = 2) + boss_types = list(/mob/living/basic/syndicate/melee/space/stormtrooper = 2) + hostile_types = list(/mob/living/basic/syndicate/melee/space = 8,\ + /mob/living/basic/syndicate/ranged/space = 2) /datum/round_event_control/portal_storm_narsie name = "Portal Storm: Constructs" diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index 52a4c1d7e4a..bea38262ab9 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -182,12 +182,12 @@ var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/emergency/specialops] pack.generate(pick_n_take(empty_shuttle_turfs)) - shuttle_spawns.Add(/mob/living/simple_animal/hostile/syndicate/ranged/infiltrator) - shuttle_spawns.Add(/mob/living/simple_animal/hostile/syndicate/ranged/infiltrator) + shuttle_spawns.Add(/mob/living/basic/syndicate/ranged/infiltrator) + shuttle_spawns.Add(/mob/living/basic/syndicate/ranged/infiltrator) if(prob(75)) - shuttle_spawns.Add(/mob/living/simple_animal/hostile/syndicate/ranged/infiltrator) + shuttle_spawns.Add(/mob/living/basic/syndicate/ranged/infiltrator) if(prob(50)) - shuttle_spawns.Add(/mob/living/simple_animal/hostile/syndicate/ranged/infiltrator) + shuttle_spawns.Add(/mob/living/basic/syndicate/ranged/infiltrator) if(RUSKY_PARTY) var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/service/party] diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/basic/syndicate/syndicate.dm similarity index 53% rename from code/modules/mob/living/simple_animal/hostile/syndicate.dm rename to code/modules/mob/living/basic/syndicate/syndicate.dm index e1636d680a9..e8eebfae7f6 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/basic/syndicate/syndicate.dm @@ -1,20 +1,11 @@ -/* - CONTENTS - LINE 10 - BASE MOB - LINE 52 - SWORD AND SHIELD - LINE 164 - GUNS - LINE 267 - MISC -*/ +///////////////Base Mob//////////// - -///////////////Base mob//////////// /obj/effect/light_emitter/red_energy_sword //used so there's a combination of both their head light and light coming off the energy sword set_luminosity = 2 set_cap = 2.5 light_color = COLOR_SOFT_RED - -/mob/living/simple_animal/hostile/syndicate +/mob/living/basic/syndicate name = "Syndicate Operative" desc = "Death to Nanotrasen." icon = 'icons/mob/simple/simple_human.dmi' @@ -24,56 +15,54 @@ icon_gib = "syndicate_gib" mob_biotypes = MOB_ORGANIC|MOB_HUMANOID sentience_type = SENTIENCE_HUMANOID - speak_chance = 0 - turns_per_move = 5 - speed = 0 - stat_attack = HARD_CRIT - robust_searching = 1 maxHealth = 100 health = 100 - harm_intent_damage = 5 + basic_mob_flags = DEL_ON_DEATH + speed = 1.1 + environment_smash = ENVIRONMENT_SMASH_STRUCTURES melee_damage_lower = 10 melee_damage_upper = 10 attack_verb_continuous = "punches" attack_verb_simple = "punch" attack_sound = 'sound/weapons/punch1.ogg' combat_mode = TRUE - loot = list(/obj/effect/mob_spawn/corpse/human/syndicatesoldier) - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 7.5 + unsuitable_cold_damage = 7.5 + unsuitable_heat_damage = 7.5 faction = list(ROLE_SYNDICATE) - check_friendly_fire = 1 - status_flags = CANPUSH - del_on_death = 1 - dodging = TRUE - rapid_melee = 2 - footstep_type = FOOTSTEP_MOB_SHOE + ai_controller = /datum/ai_controller/basic_controller/syndicate + + var/loot = list(/obj/effect/mob_spawn/corpse/human/syndicatesoldier) -///////////////Melee//////////// +/mob/living/basic/syndicate/Initialize(mapload) + . = ..() + if(LAZYLEN(loot)) + AddElement(/datum/element/death_drops, loot) + AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_SHOE) -/mob/living/simple_animal/hostile/syndicate/space +/mob/living/basic/syndicate/space icon_state = "syndicate_space" icon_living = "syndicate_space" name = "Syndicate Commando" maxHealth = 170 health = 170 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - speed = 1 + loot = list(/obj/effect/gibspawner/human) + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = 0 -/mob/living/simple_animal/hostile/syndicate/space/Initialize(mapload) +/mob/living/basic/syndicate/space/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) set_light(4) -/mob/living/simple_animal/hostile/syndicate/space/stormtrooper +/mob/living/basic/syndicate/space/stormtrooper icon_state = "syndicate_stormtrooper" icon_living = "syndicate_stormtrooper" name = "Syndicate Stormtrooper" maxHealth = 250 health = 250 -/mob/living/simple_animal/hostile/syndicate/melee //dude with a knife and no shields +/mob/living/basic/syndicate/melee //dude with a knife and no shields melee_damage_lower = 15 melee_damage_upper = 15 icon_state = "syndicate_knife" @@ -83,34 +72,36 @@ attack_verb_simple = "slash" attack_sound = 'sound/weapons/bladeslice.ogg' attack_vis_effect = ATTACK_EFFECT_SLASH - status_flags = 0 var/projectile_deflect_chance = 0 -/mob/living/simple_animal/hostile/syndicate/melee/space +/mob/living/basic/syndicate/melee/bullet_act(obj/projectile/projectile) + if(prob(projectile_deflect_chance)) + visible_message(span_danger("[src] blocks [projectile] with its shield!")) + return BULLET_ACT_BLOCK + return ..() + +/mob/living/basic/syndicate/melee/space icon_state = "syndicate_space_knife" icon_living = "syndicate_space_knife" name = "Syndicate Commando" maxHealth = 170 health = 170 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - speed = 1 - projectile_deflect_chance = 50 + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = 0 -/mob/living/simple_animal/hostile/syndicate/melee/space/Initialize(mapload) +/mob/living/basic/syndicate/melee/space/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) set_light(4) -/mob/living/simple_animal/hostile/syndicate/melee/space/stormtrooper +/mob/living/basic/syndicate/melee/space/stormtrooper icon_state = "syndicate_stormtrooper_knife" icon_living = "syndicate_stormtrooper_knife" name = "Syndicate Stormtrooper" maxHealth = 250 health = 250 - projectile_deflect_chance = 50 -/mob/living/simple_animal/hostile/syndicate/melee/sword +/mob/living/basic/syndicate/melee/sword melee_damage_lower = 30 melee_damage_upper = 30 icon_state = "syndicate_sword" @@ -120,46 +111,33 @@ attack_sound = 'sound/weapons/blade1.ogg' armour_penetration = 35 light_color = COLOR_SOFT_RED - status_flags = 0 - var/obj/effect/light_emitter/red_energy_sword/sord projectile_deflect_chance = 50 -/mob/living/simple_animal/hostile/syndicate/melee/sword/Initialize(mapload) +/mob/living/basic/syndicate/melee/sword/Initialize(mapload) . = ..() set_light(2) -/mob/living/simple_animal/hostile/syndicate/melee/sword/Destroy() - QDEL_NULL(sord) - return ..() - -/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(obj/projectile/Proj) - if(prob(projectile_deflect_chance)) - visible_message(span_danger("[src] blocks [Proj] with its shield!")) - return BULLET_ACT_BLOCK - return ..() - -/mob/living/simple_animal/hostile/syndicate/melee/sword/space +/mob/living/basic/syndicate/melee/sword/space icon_state = "syndicate_space_sword" icon_living = "syndicate_space_sword" name = "Syndicate Commando" maxHealth = 170 health = 170 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - speed = 1 + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = 0 projectile_deflect_chance = 50 + var/obj/effect/light_emitter/red_energy_sword/sord -/mob/living/simple_animal/hostile/syndicate/melee/sword/space/Initialize(mapload) +/mob/living/basic/syndicate/melee/sword/space/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) sord = new(src) set_light(4) - -/mob/living/simple_animal/hostile/syndicate/melee/sword/space/Destroy() +/mob/living/basic/syndicate/melee/sword/space/Destroy() QDEL_NULL(sord) return ..() -/mob/living/simple_animal/hostile/syndicate/melee/sword/space/stormtrooper +/mob/living/basic/syndicate/melee/sword/space/stormtrooper icon_state = "syndicate_stormtrooper_sword" icon_living = "syndicate_stormtrooper_sword" name = "Syndicate Stormtrooper" @@ -169,101 +147,97 @@ ///////////////Guns//////////// -/mob/living/simple_animal/hostile/syndicate/ranged - ranged = 1 - retreat_distance = 5 - minimum_distance = 5 +/mob/living/basic/syndicate/ranged icon_state = "syndicate_pistol" icon_living = "syndicate_pistol" - casingtype = /obj/item/ammo_casing/c9mm - projectilesound = 'sound/weapons/gun/pistol/shot.ogg' + var/casingtype = /obj/item/ammo_casing/c9mm + var/projectilesound = 'sound/weapons/gun/pistol/shot.ogg' loot = list(/obj/effect/gibspawner/human) - dodging = FALSE - rapid_melee = 1 + ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged -/mob/living/simple_animal/hostile/syndicate/ranged/infiltrator //shuttle loan event +/mob/living/basic/syndicate/ranged/Initialize(mapload) + . = ..() + AddElement(/datum/element/ranged_attacks, casingtype, projectilesound) + +/mob/living/basic/syndicate/ranged/infiltrator //shuttle loan event projectilesound = 'sound/weapons/gun/smg/shot_suppressed.ogg' loot = list(/obj/effect/mob_spawn/corpse/human/syndicatesoldier) -/mob/living/simple_animal/hostile/syndicate/ranged/space +/mob/living/basic/syndicate/ranged/space icon_state = "syndicate_space_pistol" icon_living = "syndicate_space_pistol" name = "Syndicate Commando" maxHealth = 170 health = 170 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - speed = 1 + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = 0 -/mob/living/simple_animal/hostile/syndicate/ranged/space/Initialize(mapload) +/mob/living/basic/syndicate/ranged/space/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) set_light(4) -/mob/living/simple_animal/hostile/syndicate/ranged/space/stormtrooper +/mob/living/basic/syndicate/ranged/space/stormtrooper icon_state = "syndicate_stormtrooper_pistol" icon_living = "syndicate_stormtrooper_pistol" name = "Syndicate Stormtrooper" maxHealth = 250 health = 250 -/mob/living/simple_animal/hostile/syndicate/ranged/smg - rapid = 2 +/mob/living/basic/syndicate/ranged/smg icon_state = "syndicate_smg" icon_living = "syndicate_smg" casingtype = /obj/item/ammo_casing/c45 projectilesound = 'sound/weapons/gun/smg/shot.ogg' + ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged/burst -/mob/living/simple_animal/hostile/syndicate/ranged/smg/pilot //caravan ambush ruin +/mob/living/basic/syndicate/ranged/smg/pilot //caravan ambush ruin name = "Syndicate Salvage Pilot" loot = list(/obj/effect/mob_spawn/corpse/human/syndicatesoldier) -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space +/mob/living/basic/syndicate/ranged/smg/space icon_state = "syndicate_space_smg" icon_living = "syndicate_space_smg" name = "Syndicate Commando" maxHealth = 170 health = 170 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - speed = 1 + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = 0 -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space/Initialize(mapload) +/mob/living/basic/syndicate/ranged/smg/space/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) set_light(4) -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space/stormtrooper +/mob/living/basic/syndicate/ranged/smg/space/stormtrooper icon_state = "syndicate_stormtrooper_smg" icon_living = "syndicate_stormtrooper_smg" name = "Syndicate Stormtrooper" maxHealth = 250 health = 250 -/mob/living/simple_animal/hostile/syndicate/ranged/shotgun - rapid = 2 - rapid_fire_delay = 6 - minimum_distance = 3 +/mob/living/basic/syndicate/ranged/shotgun icon_state = "syndicate_shotgun" icon_living = "syndicate_shotgun" casingtype = /obj/item/ammo_casing/shotgun/buckshot //buckshot (up to 72.5 brute) fired in a two-round burst + ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged/shotgunner -/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space +/mob/living/basic/syndicate/ranged/shotgun/space icon_state = "syndicate_space_shotgun" icon_living = "syndicate_space_shotgun" name = "Syndicate Commando" maxHealth = 170 health = 170 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = 0 speed = 1 -/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space/Initialize(mapload) +/mob/living/basic/syndicate/ranged/shotgun/space/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) set_light(4) -/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space/stormtrooper +/mob/living/basic/syndicate/ranged/shotgun/space/stormtrooper icon_state = "syndicate_stormtrooper_shotgun" icon_living = "syndicate_stormtrooper_shotgun" name = "Syndicate Stormtrooper" @@ -272,19 +246,7 @@ ///////////////Misc//////////// -/mob/living/simple_animal/hostile/syndicate/civilian - minimum_distance = 10 - retreat_distance = 10 - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - -/mob/living/simple_animal/hostile/syndicate/civilian/Aggro() - ..() - summon_backup(15) - say("GUARDS!!") - - -/mob/living/simple_animal/hostile/viscerator +/mob/living/basic/viscerator name = "viscerator" desc = "A small, twin-bladed machine capable of inflicting very deadly lacerations." icon_state = "viscerator_attack" @@ -292,6 +254,11 @@ pass_flags = PASSTABLE | PASSMOB combat_mode = TRUE mob_biotypes = MOB_ROBOTIC + basic_mob_flags = DEL_ON_DEATH + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = 0 + maximum_survivable_temperature = 700 + unsuitable_cold_damage = 0 health = 25 maxHealth = 25 melee_damage_lower = 15 @@ -300,23 +267,20 @@ bare_wound_bonus = 20 sharpness = SHARP_EDGED obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE attack_verb_continuous = "cuts" attack_verb_simple = "cut" attack_sound = 'sound/weapons/bladeslice.ogg' attack_vis_effect = ATTACK_EFFECT_SLASH faction = list(ROLE_SYNDICATE) - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 mob_size = MOB_SIZE_TINY limb_destroyer = 1 speak_emote = list("states") bubble_icon = "syndibot" gold_core_spawnable = HOSTILE_SPAWN - del_on_death = 1 death_message = "is smashed into pieces!" + ai_controller = /datum/ai_controller/basic_controller/viscerator -/mob/living/simple_animal/hostile/viscerator/Initialize(mapload) +/mob/living/basic/viscerator/Initialize(mapload) . = ..() AddElement(/datum/element/simple_flying) AddComponent(/datum/component/swarming) diff --git a/code/modules/mob/living/basic/syndicate/syndicate_ai.dm b/code/modules/mob/living/basic/syndicate/syndicate_ai.dm new file mode 100644 index 00000000000..151e10017af --- /dev/null +++ b/code/modules/mob/living/basic/syndicate/syndicate_ai.dm @@ -0,0 +1,71 @@ +/datum/ai_controller/basic_controller/syndicate + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/syndicate() + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree/syndicate + ) + +/datum/targetting_datum/basic/syndicate + stat_attack = HARD_CRIT + +/datum/ai_planning_subtree/basic_melee_attack_subtree/syndicate + melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/syndicate + +/datum/ai_behavior/basic_melee_attack/syndicate + action_cooldown = 1.2 SECONDS + +/datum/ai_controller/basic_controller/syndicate/ranged + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_ranged_attack_subtree/syndicate + ) +/datum/ai_planning_subtree/basic_ranged_attack_subtree/syndicate + ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/syndicate + +/datum/ai_behavior/basic_ranged_attack/syndicate + required_distance = 5 + +/datum/ai_controller/basic_controller/syndicate/ranged/burst + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_ranged_attack_subtree/syndicate_burst + ) + +/datum/ai_planning_subtree/basic_ranged_attack_subtree/syndicate_burst + ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/syndicate_burst + +/datum/ai_behavior/basic_ranged_attack/syndicate_burst + shots = 3 + action_cooldown = 3 SECONDS + +/datum/ai_controller/basic_controller/syndicate/ranged/shotgunner + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_ranged_attack_subtree/syndicate_shotgun + ) + +/datum/ai_planning_subtree/basic_ranged_attack_subtree/syndicate_shotgun + ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/syndicate_shotgun + +/datum/ai_behavior/basic_ranged_attack/syndicate_shotgun + shots = 2 + burst_interval = 0.6 SECONDS + action_cooldown = 3 SECONDS + required_distance = 1 + +/datum/ai_controller/basic_controller/viscerator + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic() + ) + + ai_movement = /datum/ai_movement/dumb + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree/syndicate + ) diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm deleted file mode 100644 index 0ed06f8dfad..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm +++ /dev/null @@ -1,295 +0,0 @@ - -/** - * Mecha Pilots! - * By Remie Richards - * - * Mecha pilot mobs are able to pilot Mecha to a rudimentary level - * this allows for certain mobs to be more of a threat (Because they're in a MECH) - * - * Mecha Pilots can either spawn with one, or steal one! - * - * Inherits from syndicate just to avoid copy-paste) - * - * Featuring: - * * Mecha piloting skills - * * Uses Mecha equipment - * * Uses Mecha special abilities in specific situations - * * Pure Evil Incarnate - */ -/mob/living/simple_animal/hostile/syndicate/mecha_pilot - name = "Syndicate Mecha Pilot" - desc = "Death to Nanotrasen. This variant comes in MECHA DEATH flavour." - wanted_objects = list() - search_objects = 0 - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - - var/spawn_mecha_type = /obj/vehicle/sealed/mecha/marauder/mauler/loaded - var/obj/vehicle/sealed/mecha/mecha //Ref to pilot's mecha instance - var/required_mecha_charge = 7500 //If the pilot doesn't have a mecha, what charge does a potential Grand Theft Mecha need? (Defaults to half a battery) - var/mecha_charge_evacuate = 50 //Amount of charge at which the pilot tries to abandon the mecha - - //Vars that control when the pilot uses their mecha's abilities (if the mecha has that ability) - var/threat_use_mecha_smoke = 5 //5 mobs is enough to engage crowd control - var/defense_mode_chance = 35 //Chance to engage Defense mode when damaged - var/smoke_chance = 20 //Chance to deploy smoke for crowd control - var/retreat_chance = 40 //Chance to run away - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech - spawn_mecha_type = null - search_objects = 2 - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/Initialize(mapload) - . = ..() - wanted_objects = typecacheof(/obj/vehicle/sealed/mecha, TRUE) - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/nanotrasen //nanotrasen are syndies! no it's just a weird path. - name = "\improper Nanotrasen Mecha Pilot" - desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour." - icon_living = "nanotrasen" - icon_state = "nanotrasen" - faction = list("nanotrasen") - spawn_mecha_type = /obj/vehicle/sealed/mecha/marauder/loaded - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/nanotrasen - name = "\improper Nanotrasen Mecha Pilot" - desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour." - icon_living = "nanotrasen" - icon_state = "nanotrasen" - faction = list("nanotrasen") - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Initialize(mapload) - . = ..() - if(spawn_mecha_type) - var/obj/vehicle/sealed/mecha/M = new spawn_mecha_type (get_turf(src)) - if(istype(M)) - INVOKE_ASYNC(src, PROC_REF(enter_mecha), M) - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/enter_mecha(obj/vehicle/sealed/mecha/M) - if(!M) - return 0 - LoseTarget() //Target was our mecha, so null it out - M.aimob_enter_mech(src) - targets_from = WEAKREF(M) - allow_movement_on_non_turfs = TRUE //duh - var/do_ranged = 0 - for(var/equip in mecha.flat_equipment) - var/obj/item/mecha_parts/mecha_equipment/ME = equip - if(ME.range & MECHA_RANGED) - do_ranged = 1 - break - if(do_ranged) - minimum_distance = 5 - ranged = 1 - else - minimum_distance = 1 - ranged = 0 - wanted_objects = list() - search_objects = 0 - if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_defense_mode) && !mecha.defense_mode) - var/datum/action/vehicle/sealed/mecha/mech_defense_mode/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_defense_mode] - action.Trigger(forced_state = TRUE) - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/exit_mecha(obj/vehicle/sealed/mecha/M) - if(!M) - return 0 - - mecha.aimob_exit_mech(src) - allow_movement_on_non_turfs = FALSE - targets_from = null - - //Find a new mecha - wanted_objects = typecacheof(/obj/vehicle/sealed/mecha, TRUE) - var/search_aggressiveness = 2 - for(var/obj/vehicle/sealed/mecha/C in range(vision_range,src)) - if(is_valid_mecha(C)) - GiveTarget(C) - search_aggressiveness = 3 //We can see a mech? RUN FOR IT, IGNORE MOBS! - break - search_objects = search_aggressiveness - ranged = 0 - minimum_distance = 1 - - SSmove_manager.stop_looping(src)//end any lingering movement loops, to prevent the haunted mecha bug - -//Checks if a mecha is valid for theft -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/is_valid_mecha(obj/vehicle/sealed/mecha/M) - if(!M) - return FALSE - if(LAZYLEN(M.occupants)) - return FALSE - if(!M.has_charge(required_mecha_charge)) - return FALSE - if(M.get_integrity() < M.max_integrity*0.5) - return FALSE - return TRUE - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/mecha_face_target(atom/A) - if(mecha) - var/dirto = get_dir(mecha,A) - if(mecha.dir != dirto) //checking, because otherwise the mecha makes too many turn noises - mecha.vehicle_move(dirto, TRUE) - - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/mecha_reload() - if(mecha) - for(var/equip in mecha.flat_equipment) - var/obj/item/mecha_parts/mecha_equipment/ME = equip - if(ME.needs_rearm()) - ME.rearm() - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/get_mecha_equip_by_flag(flag = MECHA_RANGED) - . = list() - if(mecha) - for(var/equip in mecha.flat_equipment) - var/obj/item/mecha_parts/mecha_equipment/ME = equip - if((ME.range & flag) && ME.action_checks(ME)) //this looks weird, but action_checks() just needs any atom, so I spoofed it here - . += ME - - - -//Pick a ranged weapon/tool -//Fire it -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/OpenFire(atom/A) - if(mecha) - mecha_reload() - mecha_face_target(A) - var/list/possible_weapons = get_mecha_equip_by_flag(MECHA_RANGED) - if(possible_weapons.len) - var/obj/item/mecha_parts/mecha_equipment/ME = pick(possible_weapons) //so we don't favor mecha.equipment[1] forever - if(ME.action(src,A)) - return - - else - ..() - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/AttackingTarget() - if(mecha) - var/list/possible_weapons = get_mecha_equip_by_flag(MECHA_MELEE) - if(possible_weapons.len) - var/obj/item/mecha_parts/mecha_equipment/ME = pick(possible_weapons) - mecha_face_target(target) - if(ME.action(src,target)) - return - - if(!TIMER_COOLDOWN_CHECK(mecha, COOLDOWN_MECHA_MELEE_ATTACK)) - mecha_face_target(target) - target.mech_melee_attack(mecha, src) - else - if(ismecha(target)) - var/obj/vehicle/sealed/mecha/M = target - if(is_valid_mecha(M)) - enter_mecha(M) - return - else - if(!CanAttack(M)) - LoseTarget() - return - - return target.attack_animal(src) - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/handle_automated_action() - . = ..() - if(!.) - return - if(!mecha) - for(var/obj/vehicle/sealed/mecha/mecha_in_range in range(src,vision_range)) - if(is_valid_mecha(mecha_in_range)) - GiveTarget(mecha_in_range) //Let's nab it! - minimum_distance = 1 - ranged = 0 - break - if(mecha) - var/list/L = PossibleThreats() - var/threat_count = L.len - - //Low Charge - Eject - if(!mecha.has_charge(mecha_charge_evacuate)) - exit_mecha(mecha) - return - - //Too Much Damage - Eject - if(mecha.get_integrity() < mecha.max_integrity*0.1) - exit_mecha(mecha) - return - - //Smoke if there's too many targets - Smoke Power - if(threat_count >= threat_use_mecha_smoke && prob(smoke_chance)) - if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_smoke) && !mecha.smoke_charges) - var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_smoke] - action.Trigger() - - //Heavy damage - Defense Power or Retreat - if(mecha.get_integrity() < mecha.max_integrity*0.25) - if(prob(defense_mode_chance)) - if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_defense_mode) && !mecha.defense_mode) - var/datum/action/vehicle/sealed/mecha/mech_defense_mode/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_defense_mode] - action.Trigger(forced_state = TRUE) - addtimer(CALLBACK(action, TYPE_PROC_REF(/datum/action/vehicle/sealed/mecha/mech_defense_mode, Trigger), FALSE), 100) //10 seconds of defense, then toggle off - - else if(prob(retreat_chance)) - //Speed boost if possible - if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_overload_mode) && !mecha.leg_overload_mode) - var/datum/action/vehicle/sealed/mecha/mech_overload_mode/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_overload_mode] - mecha.leg_overload_mode = FALSE - action.Trigger(forced_state = TRUE) - addtimer(CALLBACK(action, TYPE_PROC_REF(/datum/action/vehicle/sealed/mecha/mech_overload_mode, Trigger), FALSE), 100) //10 seconds of speeeeed, then toggle off - - retreat_distance = 50 - addtimer(VARSET_CALLBACK(src, retreat_distance, 0), 10 SECONDS) - - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/death(gibbed) - if(mecha) - mecha.aimob_exit_mech(src) - ..() - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/gib() - if(mecha) - mecha.aimob_exit_mech(src) - ..() - - -//Yes they actually try and pull this shit -//~simple animals~ -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/CanAttack(atom/the_target) - if(ismecha(the_target)) - var/obj/vehicle/sealed/mecha/M = the_target - if(mecha) - if(M == mecha) //Dont kill yourself - return FALSE - else //we're not in a mecha, so we check if we can steal it instead. - if(is_valid_mecha(M)) - return TRUE - for(var/occupant in M.occupants) - if(CanAttack(occupant)) - return TRUE - return FALSE - - . = ..() - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/EscapeConfinement() - if(mecha && loc == mecha) - return 0 - ..() - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Move(NewLoc,Dir=0,step_x=0,step_y=0) - if(mecha && loc == mecha) - return mecha.relaymove(src, Dir) - return ..() - - -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Goto(target, delay, minimum_distance) - if(mecha) - SSmove_manager.move_to(mecha, target, minimum_distance, mecha.movedelay) - else - ..() diff --git a/code/modules/mob_spawn/ghost_roles/space_roles.dm b/code/modules/mob_spawn/ghost_roles/space_roles.dm index 05850a17590..397e01534f6 100644 --- a/code/modules/mob_spawn/ghost_roles/space_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/space_roles.dm @@ -97,7 +97,7 @@ /obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms/space/Initialize(mapload) . = ..() if(prob(85)) //only has a 15% chance of existing, otherwise it'll just be a NPC syndie. - new /mob/living/simple_animal/hostile/syndicate/ranged(get_turf(src)) + new /mob/living/basic/syndicate/ranged(get_turf(src)) return INITIALIZE_HINT_QDEL ///battlecruiser stuff diff --git a/code/modules/procedural_mapping/mapGenerators/syndicate.dm b/code/modules/procedural_mapping/mapGenerators/syndicate.dm index 7b9b405eaca..b9dc00e1364 100644 --- a/code/modules/procedural_mapping/mapGenerators/syndicate.dm +++ b/code/modules/procedural_mapping/mapGenerators/syndicate.dm @@ -17,10 +17,10 @@ /obj/structure/closet/syndicate = 25, /obj/machinery/suit_storage_unit/syndicate = 15) /datum/map_generator_module/splatter_layer/syndie_mobs - spawnableAtoms = list(/mob/living/simple_animal/hostile/syndicate = 30, \ - /mob/living/simple_animal/hostile/syndicate/melee = 20, \ - /mob/living/simple_animal/hostile/syndicate/ranged = 20, \ - /mob/living/simple_animal/hostile/viscerator = 30) + spawnableAtoms = list(/mob/living/basic/syndicate = 30, \ + /mob/living/basic/syndicate/melee = 20, \ + /mob/living/basic/syndicate/ranged = 20, \ + /mob/living/basic/viscerator = 30) spawnableTurfs = list() // Generators diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm index 49ef767dac8..4ba79bdf8e4 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -309,37 +309,10 @@ /mob/living/simple_animal/hostile/smspider, /mob/living/simple_animal/hostile/smspider/overcharged, /mob/living/simple_animal/hostile/space_dragon, - /mob/living/simple_animal/hostile/syndicate, - /mob/living/simple_animal/hostile/syndicate/civilian, - /mob/living/simple_animal/hostile/syndicate/mecha_pilot, - /mob/living/simple_animal/hostile/syndicate/mecha_pilot/nanotrasen, - /mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech, - /mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/nanotrasen, - /mob/living/simple_animal/hostile/syndicate/melee, - /mob/living/simple_animal/hostile/syndicate/melee/space, - /mob/living/simple_animal/hostile/syndicate/melee/space/stormtrooper, - /mob/living/simple_animal/hostile/syndicate/melee/sword, - /mob/living/simple_animal/hostile/syndicate/melee/sword/space, - /mob/living/simple_animal/hostile/syndicate/melee/sword/space/stormtrooper, - /mob/living/simple_animal/hostile/syndicate/ranged, - /mob/living/simple_animal/hostile/syndicate/ranged/infiltrator, - /mob/living/simple_animal/hostile/syndicate/ranged/shotgun, - /mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space, - /mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space/stormtrooper, - /mob/living/simple_animal/hostile/syndicate/ranged/smg, - /mob/living/simple_animal/hostile/syndicate/ranged/smg/orion, - /mob/living/simple_animal/hostile/syndicate/ranged/smg/pilot, - /mob/living/simple_animal/hostile/syndicate/ranged/smg/space, - /mob/living/simple_animal/hostile/syndicate/ranged/smg/space/stormtrooper, - /mob/living/simple_animal/hostile/syndicate/ranged/space, - /mob/living/simple_animal/hostile/syndicate/ranged/space/stormtrooper, - /mob/living/simple_animal/hostile/syndicate/space, - /mob/living/simple_animal/hostile/syndicate/space/stormtrooper, /mob/living/simple_animal/hostile/tree, /mob/living/simple_animal/hostile/tree/festivus, /mob/living/simple_animal/hostile/vatbeast, /mob/living/simple_animal/hostile/venus_human_trap, - /mob/living/simple_animal/hostile/viscerator, /mob/living/simple_animal/hostile/wizard, /mob/living/simple_animal/hostile/zombie, /mob/living/simple_animal/parrot, diff --git a/code/modules/vehicles/mecha/mecha_ai_interaction.dm b/code/modules/vehicles/mecha/mecha_ai_interaction.dm index 3ad393e3757..dffe5a53c4e 100644 --- a/code/modules/vehicles/mecha/mecha_ai_interaction.dm +++ b/code/modules/vehicles/mecha/mecha_ai_interaction.dm @@ -105,23 +105,3 @@ to_chat(AI, AI.can_dominate_mechs ? span_greenannounce("Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!") :\ span_notice("You have been uploaded to a mech's onboard computer.")) to_chat(AI, "Use Middle-Mouse to toggle equipment safety. Clicks with safety enabled will pass AI commands.") - - -///Handles an actual AI (simple_animal mecha pilot) entering the mech -/obj/vehicle/sealed/mecha/proc/aimob_enter_mech(mob/living/simple_animal/hostile/syndicate/mecha_pilot/pilot_mob) - if(!pilot_mob?.Adjacent(src)) - return - if(LAZYLEN(occupants)) - return - LAZYSET(occupants, pilot_mob, NONE) - pilot_mob.mecha = src - pilot_mob.forceMove(src) - update_appearance() - -///Handles an actual AI (simple_animal mecha pilot) exiting the mech -/obj/vehicle/sealed/mecha/proc/aimob_exit_mech(mob/living/simple_animal/hostile/syndicate/mecha_pilot/pilot_mob) - LAZYREMOVE(occupants, pilot_mob) - if(pilot_mob.mecha == src) - pilot_mob.mecha = null - pilot_mob.forceMove(get_turf(src)) - update_appearance() diff --git a/tgstation.dme b/tgstation.dme index 342657b503a..db377e52e12 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3636,6 +3636,8 @@ #include "code\modules\mob\living\basic\pets\dog.dm" #include "code\modules\mob\living\basic\pets\pet.dm" #include "code\modules\mob\living\basic\ruin_defender\stickman.dm" +#include "code\modules\mob\living\basic\syndicate\syndicate.dm" +#include "code\modules\mob\living\basic\syndicate\syndicate_ai.dm" #include "code\modules\mob\living\basic\vermin\axolotl.dm" #include "code\modules\mob\living\basic\vermin\cockroach.dm" #include "code\modules\mob\living\basic\vermin\mothroach.dm" @@ -3855,7 +3857,6 @@ #include "code\modules\mob\living\simple_animal\hostile\illusion.dm" #include "code\modules\mob\living\simple_animal\hostile\killertomato.dm" #include "code\modules\mob\living\simple_animal\hostile\lightgeist.dm" -#include "code\modules\mob\living\simple_animal\hostile\mecha_pilot.dm" #include "code\modules\mob\living\simple_animal\hostile\mimic.dm" #include "code\modules\mob\living\simple_animal\hostile\mushroom.dm" #include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm" @@ -3868,7 +3869,6 @@ #include "code\modules\mob\living\simple_animal\hostile\smspider.dm" #include "code\modules\mob\living\simple_animal\hostile\space_dragon.dm" #include "code\modules\mob\living\simple_animal\hostile\statue.dm" -#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm" #include "code\modules\mob\living\simple_animal\hostile\tree.dm" #include "code\modules\mob\living\simple_animal\hostile\vatbeast.dm" #include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm" diff --git a/tools/UpdatePaths/Scripts/71871_syndicate_basicmob.txt b/tools/UpdatePaths/Scripts/71871_syndicate_basicmob.txt new file mode 100644 index 00000000000..11186a8f557 --- /dev/null +++ b/tools/UpdatePaths/Scripts/71871_syndicate_basicmob.txt @@ -0,0 +1,6 @@ +#comment Repaths simpleanimal syndicates to basicmob syndicates and deletes mecha pilots and civilians + +/mob/living/simple_animal/hostile/syndicate/mecha_pilot : @DELETE +/mob/living/simple_animal/hostile/syndicate/civilian : @DELETE +/mob/living/simple_animal/hostile/syndicate/@SUBTYPES : /mob/living/basic/syndicate/@SUBTYPES{@OLD} +/mob/living/simple_animal/hostile/viscerator : /mob/living/basic/viscerator{@OLD} \ No newline at end of file