From 78425b0f3c04dd4becccbc08a68b282a9e670af4 Mon Sep 17 00:00:00 2001 From: xDanilcusx Date: Mon, 9 Sep 2024 19:57:16 +0300 Subject: [PATCH 01/11] fixing AI not fully appraising equip sometimes --- code/modules/mob/living/carbon/human/ai/ai_equipment.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/mob/living/carbon/human/ai/ai_equipment.dm b/code/modules/mob/living/carbon/human/ai/ai_equipment.dm index be27f6be54..8a4132da66 100644 --- a/code/modules/mob/living/carbon/human/ai/ai_equipment.dm +++ b/code/modules/mob/living/carbon/human/ai/ai_equipment.dm @@ -23,3 +23,8 @@ spawn_rebel_rifle(new_human) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/CLF(new_human), WEAR_L_EAR) + +/datum/equipment_preset/clf/soldier/ai/load_preset(mob/living/carbon/human/new_human, randomise, count_participant, client/mob_client, show_job_gear) + . = ..() + if(new_human.ai_brain) + new_human.ai_brain.appraise_inventory() From 0f41636f073f8ea34dc3962881ae6fc227f5cb4b Mon Sep 17 00:00:00 2001 From: xDanilcusx Date: Fri, 13 Sep 2024 01:25:01 +0300 Subject: [PATCH 02/11] don't spawn AI human if action is cancelled --- code/modules/admin/verbs/select_equipment.dm | 2 +- code/modules/mob/living/carbon/human/ai/ai_management_menu.dm | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/verbs/select_equipment.dm b/code/modules/admin/verbs/select_equipment.dm index 83a9cb1a06..8e6f445b87 100644 --- a/code/modules/admin/verbs/select_equipment.dm +++ b/code/modules/admin/verbs/select_equipment.dm @@ -131,7 +131,7 @@ arm_equipment(M, dresscode, FALSE, count_participant) if(!no_logs) message_admins("[key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].") - return + return TRUE /client/proc/cmd_admin_dress_all() set category = "Debug" diff --git a/code/modules/mob/living/carbon/human/ai/ai_management_menu.dm b/code/modules/mob/living/carbon/human/ai/ai_management_menu.dm index b11b4f070b..43e1d0205e 100644 --- a/code/modules/mob/living/carbon/human/ai/ai_management_menu.dm +++ b/code/modules/mob/living/carbon/human/ai/ai_management_menu.dm @@ -135,5 +135,7 @@ return var/mob/living/carbon/human/ai/ai_human = new() - cmd_admin_dress_human(ai_human) + if(!cmd_admin_dress_human(ai_human)) + qdel(ai_human) + return ai_human.forceMove(get_turf(mob)) From 4ef8055a3981c294affb70a2e76f2e372901a9af Mon Sep 17 00:00:00 2001 From: xDanilcusx Date: Fri, 13 Sep 2024 01:25:13 +0300 Subject: [PATCH 03/11] face target when firing --- .../mob/living/carbon/human/ai/brain/ai_brain_targeting.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/carbon/human/ai/brain/ai_brain_targeting.dm b/code/modules/mob/living/carbon/human/ai/brain/ai_brain_targeting.dm index 430c8d9281..bc0555841c 100644 --- a/code/modules/mob/living/carbon/human/ai/brain/ai_brain_targeting.dm +++ b/code/modules/mob/living/carbon/human/ai/brain/ai_brain_targeting.dm @@ -244,6 +244,7 @@ addtimer(CALLBACK(primary_weapon, TYPE_PROC_REF(/obj/item/weapon/gun, start_fire), null, current_target, null, null, null, TRUE), primary_weapon.get_fire_delay()) target_floor = get_turf(current_target) + tied_human.face_atom(target_floor) /datum/human_ai_brain/proc/end_gun_fire() primary_weapon?.set_target(null) From de732a4169a52a26aa054db84e8591cff7acc481 Mon Sep 17 00:00:00 2001 From: xDanilcusx Date: Fri, 13 Sep 2024 05:06:16 +0300 Subject: [PATCH 04/11] AI not considering utility pouch fix --- code/modules/mob/living/carbon/human/ai/brain/ai_brain_items.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/ai/brain/ai_brain_items.dm b/code/modules/mob/living/carbon/human/ai/brain/ai_brain_items.dm index 2cddf0a4d7..c6af584f79 100644 --- a/code/modules/mob/living/carbon/human/ai/brain/ai_brain_items.dm +++ b/code/modules/mob/living/carbon/human/ai/brain/ai_brain_items.dm @@ -116,7 +116,7 @@ tried_reload = FALSE // We don't really need to do this in a smart way if(belt) - if(!istype(tied_human.belt, /obj/item/storage/belt)) + if(!istype(tied_human.belt, /obj/item/storage)) // belts can be backpacks, don't ask return for(var/id in equipment_map) From 8d41918c424e8f1e8daa6f7cfb142cc78acaa85d Mon Sep 17 00:00:00 2001 From: xDanilcusx Date: Fri, 13 Sep 2024 06:26:19 +0300 Subject: [PATCH 05/11] AI flamer fix --- code/modules/projectiles/guns/flamer/flamer.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/projectiles/guns/flamer/flamer.dm b/code/modules/projectiles/guns/flamer/flamer.dm index 634807805a..6286f2e482 100644 --- a/code/modules/projectiles/guns/flamer/flamer.dm +++ b/code/modules/projectiles/guns/flamer/flamer.dm @@ -143,6 +143,8 @@ else user.track_shot(initial(name)) unleash_flame(target, user) + current_mag.current_rounds = current_mag.get_ammo_percent() + SEND_SIGNAL(user, COMSIG_MOB_FIRED_GUN, src) // required by human AI return AUTOFIRE_CONTINUE return NONE From 79b9e9538a89acfcb7e45f4f2229d9be33434ccc Mon Sep 17 00:00:00 2001 From: xDanilcusx Date: Fri, 13 Sep 2024 06:27:59 +0300 Subject: [PATCH 06/11] firearm appraisal add-ons and facing targets --- .../living/carbon/human/ai/ai_equipment.dm | 9 +++ .../human/ai/brain/ai_brain_targeting.dm | 23 ++----- .../carbon/human/ai/firearm_appraisal.dm | 63 +++++++++++++++++-- 3 files changed, 74 insertions(+), 21 deletions(-) diff --git a/code/modules/mob/living/carbon/human/ai/ai_equipment.dm b/code/modules/mob/living/carbon/human/ai/ai_equipment.dm index 8a4132da66..3df549d8a8 100644 --- a/code/modules/mob/living/carbon/human/ai/ai_equipment.dm +++ b/code/modules/mob/living/carbon/human/ai/ai_equipment.dm @@ -16,6 +16,15 @@ //new_human.equip_to_slot_or_del(new /obj/item/storage/belt/shotgun/full/random(new_human), WEAR_WAIST) //new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/shotgun/pump/dual_tube/cmb(new_human), WEAR_BACK) + + //new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/general_belt(new_human), WEAR_WAIST) + //new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/flamer_tank(new_human), WEAR_IN_BELT) + //new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/flamer(new_human), WEAR_BACK) + + //new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/general_belt(new_human), WEAR_WAIST) + //new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/rocket/anti_tank(new_human), WEAR_IN_BELT) + //new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/launcher/rocket/anti_tank(new_human), WEAR_R_HAND) + new_human.equip_to_slot_or_del(new /obj/item/storage/belt/marine(new_human), WEAR_WAIST) if(prob(50)) spawn_rebel_smg(new_human) diff --git a/code/modules/mob/living/carbon/human/ai/brain/ai_brain_targeting.dm b/code/modules/mob/living/carbon/human/ai/brain/ai_brain_targeting.dm index 7809fec5a3..81d654bde7 100644 --- a/code/modules/mob/living/carbon/human/ai/brain/ai_brain_targeting.dm +++ b/code/modules/mob/living/carbon/human/ai/brain/ai_brain_targeting.dm @@ -140,32 +140,21 @@ primary_weapon.wield_time = world.time primary_weapon.pull_time = world.time + tied_human.face_atom(current_target) + if(get_dist(tied_human, current_target) > gun_data.maximum_range) currently_busy = FALSE return primary_weapon.set_target(current_target) - ensure_primary_hand(primary_weapon) - if(primary_weapon.flags_item & TWOHANDED && !(primary_weapon.flags_item & WIELDED)) - primary_weapon.wield(tied_human) - sleep(max(primary_weapon.wield_delay, short_action_delay * action_delay_mult)) - if(istype(primary_weapon, /obj/item/weapon/gun/shotgun/pump) && !primary_weapon.in_chamber) - var/obj/item/weapon/gun/shotgun/pump/shotgun = primary_weapon - shotgun.pump_shotgun(tied_human) - shotgun.recent_pump = world.time - else if(istype(primary_weapon, /obj/item/weapon/gun/boltaction) && !primary_weapon.in_chamber) - var/obj/item/weapon/gun/boltaction/bolt = primary_weapon - bolt.unique_action(tied_human) - bolt.recent_cycle = world.time - bolt.unique_action(tied_human) - bolt.recent_cycle = world.time - if(!primary_weapon.in_chamber || !friendly_check()) + gun_data.before_fire(primary_weapon, tied_human, src) + if(!primary_weapon.current_mag || !primary_weapon.current_mag.current_rounds || !friendly_check()) end_gun_fire() return currently_firing = TRUE enter_combat() - RegisterSignal(tied_human, COMSIG_MOB_FIRED_GUN, PROC_REF(on_gun_fire)) + RegisterSignal(tied_human, COMSIG_MOB_FIRED_GUN, PROC_REF(on_gun_fire), TRUE) primary_weapon.start_fire(object = current_target, bypass_checks = TRUE) /datum/human_ai_brain/proc/friendly_check() @@ -216,7 +205,7 @@ end_gun_fire() return - if(primary_weapon.current_mag?.current_rounds <= 0) + if(primary_weapon.current_mag?.current_rounds <= 1) // bullet removal comes after comsig is triggered end_gun_fire() return diff --git a/code/modules/mob/living/carbon/human/ai/firearm_appraisal.dm b/code/modules/mob/living/carbon/human/ai/firearm_appraisal.dm index 85caacba45..1a3a420dba 100644 --- a/code/modules/mob/living/carbon/human/ai/firearm_appraisal.dm +++ b/code/modules/mob/living/carbon/human/ai/firearm_appraisal.dm @@ -8,14 +8,24 @@ GLOBAL_LIST_INIT_TYPED(firearm_appraisals, /datum/firearm_appraisal, build_firea /datum/firearm_appraisal /// Minimum engagement range with weapon type - var/minimum_range = 0 - /// Maximum engagement range - var/maximum_range = 7 + var/minimum_range = 1 + /// Optimal engagement range, try to approach if further than this + var/optimal_range = 6 + /// Maximum engagement range, stop firing at this distance + var/maximum_range = 9 /// How many rounds to fire in 1 burst at most var/burst_amount_max = 8 /// List of types that set the human AI to this appraisal type var/list/gun_types = list() +/// List of things we do before our next fire based on weapon type +/datum/firearm_appraisal/proc/before_fire(obj/item/weapon/gun/firearm, mob/living/carbon/user, datum/human_ai_brain/AI) + SHOULD_CALL_PARENT(TRUE) // Every weapon can be twohanded + AI.ensure_primary_hand(firearm) + if(firearm.flags_item & TWOHANDED && !(firearm.flags_item & WIELDED)) + firearm.wield(user) + sleep(max(firearm.wield_delay, AI.short_action_delay * AI.action_delay_mult)) + /datum/firearm_appraisal/rifle burst_amount_max = 8 gun_types = list( @@ -24,14 +34,59 @@ GLOBAL_LIST_INIT_TYPED(firearm_appraisals, /datum/firearm_appraisal, build_firea /datum/firearm_appraisal/smg burst_amount_max = 10 - maximum_range = 6 + optimal_range = 5 + maximum_range = 7 gun_types = list( /obj/item/weapon/gun/smg, ) /datum/firearm_appraisal/shotgun burst_amount_max = 2 + optimal_range = 1 // point-blank our beloved maximum_range = 3 gun_types = list( /obj/item/weapon/gun/shotgun, ) + +/datum/firearm_appraisal/shotgun/before_fire(obj/item/weapon/gun/shotgun/pump/firearm, mob/living/carbon/user, datum/human_ai_brain/AI) + . = ..() + if(firearm.in_chamber) + return + firearm.unique_action(user) + firearm.recent_pump = world.time + +/datum/firearm_appraisal/boltaction + gun_types = list( + /obj/item/weapon/gun/boltaction, + ) + +/datum/firearm_appraisal/boltaction/before_fire(obj/item/weapon/gun/boltaction/firearm, mob/living/carbon/user, datum/human_ai_brain/AI) + . = ..() + if(firearm.in_chamber) + return + firearm.unique_action(user) + firearm.recent_cycle = world.time + firearm.unique_action(user) + firearm.recent_cycle = world.time + +/datum/firearm_appraisal/flamer + burst_amount_max = 1 + minimum_range = 5 // To not try and walk into our flames in tight spaces + optimal_range = 5 + maximum_range = 5 + gun_types = list( + /obj/item/weapon/gun/flamer, + ) + +/datum/firearm_appraisal/flamer/before_fire(obj/item/weapon/gun/flamer/firearm, mob/living/carbon/user, datum/human_ai_brain/AI) + . = ..() + if(firearm.flags_gun_features & GUN_TRIGGER_SAFETY) + firearm.flags_gun_features ^= GUN_TRIGGER_SAFETY + firearm.gun_safety_handle(user) + +/datum/firearm_appraisal/rpg + minimum_range = 5 + optimal_range = 6 + gun_types = list( + /obj/item/weapon/gun/launcher/rocket, + ) From c70ae4a79a92596da96265c421a18d415f186afd Mon Sep 17 00:00:00 2001 From: xDanilcusx Date: Fri, 13 Sep 2024 06:28:36 +0300 Subject: [PATCH 07/11] approach target when it's seems incapicated --- code/modules/mob/living/carbon/human/ai/brain/ai_brain.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/ai/brain/ai_brain.dm b/code/modules/mob/living/carbon/human/ai/brain/ai_brain.dm index 2e791e7c53..2590dca042 100644 --- a/code/modules/mob/living/carbon/human/ai/brain/ai_brain.dm +++ b/code/modules/mob/living/carbon/human/ai/brain/ai_brain.dm @@ -92,9 +92,11 @@ GLOBAL_LIST_EMPTY(human_ai_brains) if(!currently_busy && primary_weapon && current_target && !currently_firing && COOLDOWN_FINISHED(src, fire_overload_cooldown) && primary_weapon.has_ammunition()) currently_busy = TRUE - if(get_dist(tied_human, current_target) > gun_data.maximum_range) + var/target_futile = HAS_TRAIT(current_target, TRAIT_INCAPACITATED) + if(get_dist(tied_human, current_target) > gun_data.optimal_range || target_futile) if(!has_ongoing_action(/datum/ongoing_action/approach_target) && !in_cover) - ADD_ONGOING_ACTION(src, /datum/ongoing_action/approach_target, current_target, gun_data.maximum_range) + var/walk_distance = target_futile ? gun_data.minimum_range : gun_data.optimal_range + ADD_ONGOING_ACTION(src, /datum/ongoing_action/approach_target, current_target, walk_distance) attack_target() if(!currently_busy && healing_start_check()) @@ -294,6 +296,8 @@ GLOBAL_LIST_EMPTY(human_ai_brains) if(firer?.faction in neutral_factions) on_neutral_faction_betray(firer.faction) + if(!faction_check(firer)) + current_target = firer /datum/human_ai_brain/proc/on_neutral_faction_betray(faction) if(!tied_human.faction) From 0c6d6da69de5c3274ee42c2f914925e827401180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BA=D1=82=D0=BE?= <65656972+xDanilcusx@users.noreply.github.com> Date: Fri, 13 Sep 2024 14:51:45 +0300 Subject: [PATCH 08/11] Update code/modules/mob/living/carbon/human/ai/ai_equipment.dm Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com> --- code/modules/mob/living/carbon/human/ai/ai_equipment.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/ai/ai_equipment.dm b/code/modules/mob/living/carbon/human/ai/ai_equipment.dm index 3df549d8a8..23b88c4858 100644 --- a/code/modules/mob/living/carbon/human/ai/ai_equipment.dm +++ b/code/modules/mob/living/carbon/human/ai/ai_equipment.dm @@ -35,5 +35,4 @@ /datum/equipment_preset/clf/soldier/ai/load_preset(mob/living/carbon/human/new_human, randomise, count_participant, client/mob_client, show_job_gear) . = ..() - if(new_human.ai_brain) - new_human.ai_brain.appraise_inventory() + new_human.ai_brain?.appraise_inventory() From e03d688342ef4d9aa26bbd48c415e9c61836802d Mon Sep 17 00:00:00 2001 From: xDanilcusx Date: Fri, 13 Sep 2024 14:53:47 +0300 Subject: [PATCH 09/11] Update ai_brain.dm --- code/modules/mob/living/carbon/human/ai/brain/ai_brain.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/ai/brain/ai_brain.dm b/code/modules/mob/living/carbon/human/ai/brain/ai_brain.dm index 2590dca042..b77429dd3a 100644 --- a/code/modules/mob/living/carbon/human/ai/brain/ai_brain.dm +++ b/code/modules/mob/living/carbon/human/ai/brain/ai_brain.dm @@ -92,7 +92,7 @@ GLOBAL_LIST_EMPTY(human_ai_brains) if(!currently_busy && primary_weapon && current_target && !currently_firing && COOLDOWN_FINISHED(src, fire_overload_cooldown) && primary_weapon.has_ammunition()) currently_busy = TRUE - var/target_futile = HAS_TRAIT(current_target, TRAIT_INCAPACITATED) + var/target_futile = current_target.is_mob_incapacitated() if(get_dist(tied_human, current_target) > gun_data.optimal_range || target_futile) if(!has_ongoing_action(/datum/ongoing_action/approach_target) && !in_cover) var/walk_distance = target_futile ? gun_data.minimum_range : gun_data.optimal_range From 126d51141b43e5903f15989245af4d9748076da1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BA=D1=82=D0=BE?= <65656972+xDanilcusx@users.noreply.github.com> Date: Fri, 13 Sep 2024 15:10:27 +0300 Subject: [PATCH 10/11] Update code/modules/mob/living/carbon/human/ai/firearm_appraisal.dm Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com> --- code/modules/mob/living/carbon/human/ai/firearm_appraisal.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/ai/firearm_appraisal.dm b/code/modules/mob/living/carbon/human/ai/firearm_appraisal.dm index 1a3a420dba..5d484c8902 100644 --- a/code/modules/mob/living/carbon/human/ai/firearm_appraisal.dm +++ b/code/modules/mob/living/carbon/human/ai/firearm_appraisal.dm @@ -22,7 +22,7 @@ GLOBAL_LIST_INIT_TYPED(firearm_appraisals, /datum/firearm_appraisal, build_firea /datum/firearm_appraisal/proc/before_fire(obj/item/weapon/gun/firearm, mob/living/carbon/user, datum/human_ai_brain/AI) SHOULD_CALL_PARENT(TRUE) // Every weapon can be twohanded AI.ensure_primary_hand(firearm) - if(firearm.flags_item & TWOHANDED && !(firearm.flags_item & WIELDED)) + if((firearm.flags_item & TWOHANDED) && !(firearm.flags_item & WIELDED)) firearm.wield(user) sleep(max(firearm.wield_delay, AI.short_action_delay * AI.action_delay_mult)) From 2843d745286f49aa8eebd56ffca69e6d28c58278 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BA=D1=82=D0=BE?= <65656972+xDanilcusx@users.noreply.github.com> Date: Fri, 13 Sep 2024 15:10:42 +0300 Subject: [PATCH 11/11] Update code/modules/projectiles/guns/flamer/flamer.dm Co-authored-by: Zonespace <41448081+Zonespace27@users.noreply.github.com> --- code/modules/projectiles/guns/flamer/flamer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/guns/flamer/flamer.dm b/code/modules/projectiles/guns/flamer/flamer.dm index 6286f2e482..d9574c70b3 100644 --- a/code/modules/projectiles/guns/flamer/flamer.dm +++ b/code/modules/projectiles/guns/flamer/flamer.dm @@ -144,7 +144,7 @@ user.track_shot(initial(name)) unleash_flame(target, user) current_mag.current_rounds = current_mag.get_ammo_percent() - SEND_SIGNAL(user, COMSIG_MOB_FIRED_GUN, src) // required by human AI + SEND_SIGNAL(user, COMSIG_MOB_FIRED_GUN, src) return AUTOFIRE_CONTINUE return NONE